Skip to content

Instantly share code, notes, and snippets.

@GaretJax
Last active August 29, 2015 14:06
Show Gist options
  • Select an option

  • Save GaretJax/709681f67512ed49c4fa to your computer and use it in GitHub Desktop.

Select an option

Save GaretJax/709681f67512ed49c4fa to your computer and use it in GitHub Desktop.
class Group(models.Model):
students = models.ManyToManyField(Student, related_name='groups',
through='StudentGroupMembership')
@property
def active_students(self):
return Student.objects.filter(
StudentGroupMembership.get_active_lookup())
@property
def active_teachers(self):
return Teacher.objects.filter(
GroupSubjectTeacher.get_active_lookup())
class Klass(Group):
tutor = models.ForeignKey(Teacher)
class DateBoundMembership(models.Model):
start = models.DateField()
end = models.DateField(blank=True, null=True)
@classmethod
def get_active_lookup(self, date=None):
ptr_field = self._meta.fields.get(self.MembershipMeta.member_ptr)
k = lambda l: ptr_field.related_name + '__' + l
if date is None:
date = datetime.date.today()
return Q(**{k('start__lte'): date}) & (
Q(**{k('end__isnull'): True}) | Q(**{k('end__gte'): date})
)
class Meta:
abstract = True
class StudentGroupMembership(DateBoundMembership):
student = models.ForeignKey(Student, related_name='group_memberships')
group = models.ForeignKey(Group, related_name='student_memberships')
class MembershipMeta:
member_ptr = 'student'
group_ptr = 'group'
class GroupSubjectTeacher(make_date_bound_membership('teacher')):
teacher = models.ForeignKey(Teacher)
group = models.ForeignKey(Group)
#subject = models.ForeignKey(Subject)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment