Source code for squaresdb.membership.models

import datetime
import logging
import random
import string

from django.contrib.auth import get_user_model
from django.db import models
from django.urls import reverse
from django.utils import timezone
import django.utils.crypto

import reversion

logger = logging.getLogger(__name__)

[docs] @reversion.register class SquareLevel(models.Model): slug = models.SlugField(primary_key=True) name = models.CharField(max_length=50) order = models.IntegerField(db_index=True) def __str__(self): return self.name
[docs] @reversion.register class PersonStatus(models.Model): # graduated Tech Squares class # admitted by EC # member, unknown method # prospective -- routinely attends, probably on mailing list, "on checkin sheet" # guest -- attended maybe once, plausibly/likely has multiple entries in DB # system? placeholder people slug = models.SlugField(primary_key=True) name = models.CharField(max_length=50) member = models.BooleanField() def __str__(self): return self.name
[docs] def full_str(self): if "member" in self.name: return self.name short = "member" if self.member else "non-member" return "%s (%s)" % (short, self.name)
class Meta: verbose_name_plural = "person statuses"
[docs] @reversion.register class MITAffil(models.Model): slug = models.SlugField(primary_key=True) name = models.CharField(max_length=50) student = models.BooleanField() def __str__(self): return self.name
[docs] def full_str(self): short = "student" if self.student else "non-student" return "%s (%s)" % (self.name, short, )
class Meta: verbose_name = "MIT affiliation"
[docs] @reversion.register class FeeCategory(models.Model): slug = models.SlugField(primary_key=True) name = models.CharField(max_length=50) def __str__(self): return self.name class Meta: verbose_name_plural = "fee categories"
[docs] @reversion.register class PersonFrequency(models.Model): slug = models.SlugField(primary_key=True) name = models.CharField(max_length=50) order = models.IntegerField(db_index=True) def __str__(self): return self.slug class Meta: verbose_name_plural = "person frequencies"
[docs] @reversion.register class Person(models.Model): name = models.CharField(max_length=100) email = models.EmailField(blank=True) level = models.ForeignKey(SquareLevel, on_delete=models.PROTECT, verbose_name='highest level', blank=True) status = models.ForeignKey(PersonStatus, on_delete=models.PROTECT, verbose_name='membership status') join_date = models.DateTimeField(default=None, null=True, blank=True) mit_affil = models.ForeignKey(MITAffil, on_delete=models.PROTECT, verbose_name='MIT affiliation') grad_year_verbose = 'year (expected or actual) graduated from MIT' grad_year = models.IntegerField(default=None, null=True, blank=True, verbose_name=grad_year_verbose) fee_cat = models.ForeignKey(FeeCategory, on_delete=models.PROTECT) frequency = models.ForeignKey(PersonFrequency, on_delete=models.PROTECT, verbose_name='attendance frequency') last_marked_correct = models.DateTimeField(default=None, null=True, blank=True)
[docs] def get_absolute_url(self): return reverse('membership:person', args=[str(self.id)])
def __str__(self): return self.name class Meta: verbose_name_plural = "people"
[docs] @reversion.register class PersonComment(models.Model): author = models.ForeignKey(get_user_model(), on_delete=models.PROTECT, related_name='comments_written') timestamp = models.DateTimeField(auto_now_add=True) body = models.TextField() person = models.ForeignKey(Person, on_delete=models.PROTECT, related_name='comments') def __str__(self): # pylint:disable=no-member # can't follow the ForeignKey due to get_user_model? data = (self.person.name, self.author.first_name, self.author.last_name) return "comment on %s (by %s %s)" % data
[docs] @reversion.register class TSClass(models.Model): label = models.CharField(max_length=20) coordinator = models.ForeignKey(Person, on_delete=models.PROTECT, related_name='class_coord') assistants = models.ManyToManyField(Person, through='membership.TSClassAssist', related_name='class_assist') students = models.ManyToManyField(Person, through='membership.TSClassMember', related_name='classes') start_date = models.DateField(null=True, blank=True) end_date = models.DateField(null=True, blank=True)
[docs] def get_absolute_url(self): return reverse('membership:class-detail', args=[str(self.pk)])
def __str__(self): return self.label class Meta: verbose_name = "Tech Squares class" verbose_name_plural = "Tech Squares classes"
[docs] @reversion.register class TSClassAssist(models.Model): assistant = models.ForeignKey(Person, on_delete=models.PROTECT) clas = models.ForeignKey(TSClass, on_delete=models.PROTECT, verbose_name='class') role = models.CharField(max_length=255, blank=True) class Meta: verbose_name = "Tech Squares class assistant"
[docs] @reversion.register class TSClassMember(models.Model): student = models.ForeignKey(Person, on_delete=models.PROTECT) clas = models.ForeignKey(TSClass, on_delete=models.PROTECT, verbose_name='class') pe = models.BooleanField(verbose_name='taking class as PE student?') class Meta: verbose_name = "Tech Squares class member"