from django.db import models from django.utils import timezone from django.utils.functional import cached_property from dateutil.relativedelta import relativedelta class Membership(models.Model): created_at = models.DateTimeField(auto_now_add=True) modified_at = models.DateTimeField(auto_now=True) renewed_at = models.DateTimeField(default=timezone.now) self_identification = models.CharField(max_length=255, null=True, blank=True) gender = models.CharField(max_length=255, null=True, blank=True) involvement = models.CharField(max_length=255, null=True, blank=True) member = models.ForeignKey( 'registration.Member', on_delete=models.CASCADE, related_name='memberships', blank=True, null=True ) payment = models.OneToOneField( 'Payment', on_delete=models.CASCADE, related_name='membership', blank=False, null=True ) @cached_property def expires_at(self): return self.renewed_at + relativedelta(years=1) class Payment(models.Model): payment_choices = ( ('NONE', 'None'), ('CASH', 'Cash'), ('CHEQUE', 'Cheque'), ('VOLUNTEERING', 'Volunteering'), ('SQUARE', 'Square'), ('PAYPAL', 'PayPal'), ('UNKNOWN', 'Unknown') ) type = models.CharField(max_length=12, choices=payment_choices, default='NONE') created_at = models.DateTimeField(auto_now_add=True) class Visit(models.Model): visit_choices = ( ('VOLUNTEER', 'volunteer'), ('FIX', 'fix bike'), # fix ('WORKSHOP', 'workshop'), ('VISIT', 'visit'), ('DONATE', 'donate'), ('STAFF', 'staff'), ) member = models.ForeignKey( 'registration.Member', on_delete=models.CASCADE ) created_at = models.DateTimeField(auto_now_add=True) purpose = models.CharField(max_length=50, choices=visit_choices)