133 lines
3.8 KiB
Python
133 lines
3.8 KiB
Python
"""File containing Members app models."""
|
|
|
|
from django.db import models
|
|
from django.utils import timezone
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from datetime import datetime
|
|
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=datetime.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=datetime.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
|