from django.db import models from django.contrib.auth.models import User, Group from django.core.exceptions import ObjectDoesNotExist from mustardseed.auth.models import contact_columns, group_id STAFF_NEWS_CHOICES = ( ("STAFF", "Staff news"), ("FOO", "School-wide news"), ) class FooUser: def __init__(self, user): self.user = user def classrooms(self): return list(self.user.teacher_classroom_set.all()) + list(self.user.assistant_classroom_set.all()) def students(self): return self.user.student_set.all() def is_parent(self): return self._groups_include("Parents") def is_staff(self): return self._groups_include("Staff") def is_teacher(self): return self._groups_include("Teachers") def is_assistant(self): return self._groups_include("Assistants") def has_classroom(self): return len(self.classrooms()) > 0 def first_classroom(self): try: return self.classrooms()[0] except IndexError: return None def _groups_include(self, name): for g in self.user.groups.all(): if g.name == name: return True class UserEvent(models.Model): user = models.ForeignKey(User) event_name = models.CharField(maxlength=20) occurred_at = models.DateTimeField(auto_now_add=True) class Meta: get_latest_by = "occurred_at" ordering = ['-occurred_at'] class ClassroomManager(models.Manager): def sorted(self): return Classroom.objects.order_by('name') class Classroom(models.Model): name = models.CharField(maxlength=50) age = models.PositiveIntegerField(choices=((3,3),(4,4),(5,5))) info = models.TextField() teacher = models.ForeignKey(User, limit_choices_to={'groups__pk':group_id('Teachers')}, related_name="teacher_classroom_set") assistant = models.ForeignKey(User, limit_choices_to={'groups__pk':group_id('Assistants')}, related_name="assistant_classroom_set") objects = ClassroomManager() class Admin: ordering = ('name',) def __unicode__(self): return self.name def recent_newsletters(self, ct=1): try: news = self.newsletter_set.order_by('-publish_date')[0:ct] if ct == 1: return news[0] else: return news except IndexError: return None def most_recent_newsletter(self): return self.recent_newsletters(1) def students(self): return self.student_set.order_by('last_name', 'first_name') class StaffMemberManager(models.Manager): def sorted(self): staff = StaffMember.objects.all() staff = [[x.user.last_name, x.user.first_name, x] for x in staff] staff.sort() return [x[2] for x in staff] class StaffMember(models.Model): address, city, state, zip, phone_number = contact_columns() photo = models.ImageField(upload_to="images/staff", blank=True, null=True) user = models.ForeignKey(User, unique=True, limit_choices_to={'groups__pk':group_id('Staff')}) objects = StaffMemberManager() class Admin: pass def __unicode__(self): return self.user.username def foo_user(self): return FooUser(self.user) def role_str(self): l = [] if self.foo_user().is_teacher(): l.append("t") if self.foo_user().is_assistant(): l.append("a") if len(l) > 0: return "(" + ", ".join(l) + ")" else: return "" class Student(models.Model): first_name = models.CharField(maxlength=50) last_name = models.CharField(maxlength=50) address, city, state, zip, phone_number = contact_columns() born_on = models.DateField(blank=True, null=True, help_text="YYYY-MM-DD") photo = models.ImageField(upload_to="images/students", blank=True, null=True) parent = models.ForeignKey(User, limit_choices_to={'groups__pk':group_id('Parents')}) classroom = models.ForeignKey(Classroom) class Admin: list_display = ('sortable_name', 'classroom') list_filter = ('classroom',) ordering = ('last_name', 'first_name') def sortable_name(self): return "%s, %s" % (self.last_name, self.first_name) sortable_name.short_description = "Name" def __unicode__(self): return self.sortable_name() class Newsletter(models.Model): title = models.CharField(maxlength=100, blank=True, null=True) content = models.TextField() publish_date = models.DateField(help_text="YYYY-MM-DD") classroom = models.ForeignKey(Classroom) class Admin: list_display = ('title', 'publish_date', 'classroom',) list_filter = ('classroom',) ordering = ('-publish_date',) def __unicode__(self): return "%s (%s)" % (self.title, self.publish_date) def permalink(self): return "/class/%s/news/%s/%s/%s/%s/" % (self.classroom_id, self.id, self.publish_date.year, self.publish_date.month, self.publish_date.day) class FooNewsletter(models.Model): title = models.CharField(maxlength=100, blank=True, null=True) content = models.TextField() publish_date = models.DateField(help_text="YYYY-MM-DD") news_type = models.CharField(maxlength=10, choices=STAFF_NEWS_CHOICES) class Admin: list_display = ('title', 'publish_date') ordering = ('-publish_date',) def __unicode__(self): return self.title def permalink(self): return "/news/%s/%s/%s/" % (self.id, self.publish_date.year, self.publish_date.month)