"""File containing Members app models.""" from django.db import models from django.utils import timezone from django.utils.translation import ugettext_lazy as _ import csv class BaseMember(models.Model): """Abstract 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"), unique=True) 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: """Meta for base member model.""" abstract = True def __str__(self): """Return member last name, first name and email.""" return "{} {}, {}".format(self.last_name, self.first_name, self.email) @staticmethod def from_csv(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 member model as an array.""" 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(_('Submitted'), default=timezone.now) def to_member(self): """Convert array to member model.""" member = Member.from_array(self.as_array()) return member class Payment(models.Model): """Payment model representing one payment event.""" date = models.DateTimeField(_('Date'), default=timezone.now) source = models.CharField(_('Source'), choices=[ ('AYY', _('AYY')), ('cash', _('Cash')), ('bank_transfer', _('Bank transfer')), ], max_length=255) member = models.ForeignKey('Member', on_delete=models.PROTECT, blank=True, null=True, related_name='payments') def __str__(self): """Return payment id and date.""" return 'Payment no. {}, {}'.format(self.id, str(self.date)) class Member(BaseMember): """Member model represets one member on the registry.""" created = models.DateTimeField(_('Created'), default=timezone.now) def last_paid(self): """Return member's last payment.""" 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): """Create member from 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]), ) # To avoid problems with a cyclical import, this is at the bottom of the file from members.forms import MemberForm # nopep8