from django import forms from django.utils.translation import ugettext_lazy as _ from members.models import Member, Payment, Request import csv import datetime import logging class CSVValidationError(Exception): def __init__(self, form_errors): self.form_errors = form_errors class MemberForm(forms.ModelForm): class Meta: model = Member fields = ['first_name', 'last_name', 'email', 'POR', 'AYY', 'jas'] class ImportResult: def __init__(self, members, payments): self.members = members self.payments = payments def clean_email(self): email = self.cleaned_data['email'] if Member.objects.filter(email=email).exists(): raise forms.ValidationError('Member with email "{}" already exists.'.format(email), code='exists') return email def clean_jas(self): return bool(int(self.data['jas'])) def clean_AYY(self): return bool(int(self.data['AYY'])) @staticmethod def csv_to_models(data, payment_source='AYY'): clean_data = data.strip().split('\n') clean_data = [row.rstrip(',') for row in clean_data] csv_reader = csv.DictReader(clean_data, fieldnames=MemberForm.Meta.fields) members = [] payments = [] for line in csv_reader: for key, value in line.items(): line[key] = value.strip() email = line['email'] member_exists = False if Member.objects.filter(email=email).exists(): member_exists = True if not member_exists: form = MemberForm(line) if not form.is_valid(): raise CSVValidationError(form.errors) model = form.save(commit=False) members.append(model) else: member = Member.objects.get(email=email) payment_data = { 'source': payment_source, 'member': member.id, 'date': datetime.datetime.now(), } form = PaymentForm(payment_data) if not form.is_valid(): raise CSVValidationError(form.errors) model = form.save(commit=False) payments.append(model) return MemberForm.ImportResult(members, payments) class PaymentForm(forms.ModelForm): class Meta: model = Payment fields = ['date', 'source', 'member'] labels = { 'member': _('Member') } class ApplicationForm(forms.ModelForm): class Meta: model = Request fields = ['first_name', 'last_name', 'email', 'AYY', 'jas', 'POR']