90177ab9fc
The last_paid method used DoesNotExist exception to handle situation where no proper payment models were found. However, the syntax was wrong and it should have used Payment.DoesNotExist. This was fixed.
122 lines
3.2 KiB
Python
122 lines
3.2 KiB
Python
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]),
|
|
)
|