from django.db import models from django.utils import timezone from django.utils.translation import ugettext_lazy as _ from datetime import datetime import csv import logging memberlogger = logging.getLogger(__name__) class BaseMember(models.Model): ''' Base model for member. ''' first_name = models.CharField(_("First name"), max_length=127) last_name = models.CharField(_("Last name"), max_length=127) email = models.EmailField(_("Email")) POR = models.CharField(_("Place of residence"), max_length=255) # place of residence AYY = models.BooleanField(_("AYY"), default=False) jas = models.BooleanField(_("JAS"), default=False) class Meta: abstract = True def __str__(self): return "{} {}, {}".format(self.last_name, self.first_name, self.email) @staticmethod def from_csv(data): print("Imported CSV data: {}".format(data)) clean_data = data.strip().split('\n') csv_reader = csv.reader(clean_data) members = [] for line in csv_reader: try: line = list(map(lambda x: x.strip(), line)) print(line) member = Member.from_array([ line[0], line[1], line[2], line[3], bool(int(line[4])), bool(int(line[5])) ]) members.append(member) except: return False for member in members: member.save() return True def as_array(self): return [ self.first_name, self.last_name, self.email, self.POR, int(self.AYY), int(self.jas) ] class Request(BaseMember): ''' Member request model represents one member request. ''' submitted = models.DateTimeField(default=timezone.now) def to_member(self): member = Member.from_array(self.as_array()) return member class Payment(models.Model): ''' Payment model representing one payment event ''' date = models.DateTimeField(default=datetime.now) source = models.CharField(choices=[ ('AYY', _('AYY')), ('cash', _('Cash')), ('bank_transfer', _('Bank transfer')), ], max_length=255) member = models.ForeignKey('Member', on_delete=models.SET_NULL, blank=True, null=True) def __str__(self): return 'Payment no. {}, {}'.format(self.id, str(self.date)) class Member(BaseMember): ''' Member model represets one member on the registry. ''' created = models.DateTimeField(default=datetime.now) def last_paid(self): try: payments = Payment.objects.filter(member=self) latest = payments.latest('date') date = latest.date return date except Payment.DoesNotExist: return None @staticmethod def from_array(array): if len(array) != 6: raise Exception("Invalid array length for member instantiation") return Member.objects.create( first_name=array[0], last_name=array[1], email=array[2], POR=array[3], AYY=bool(array[4]), jas=bool(array[5]), )