From 29d40fe189077dcf224f88a4467696bf137e3869 Mon Sep 17 00:00:00 2001 From: Nikolai Kristiansen Date: Fri, 1 Feb 2013 17:00:41 +0100 Subject: [PATCH] Cleaned up models alot --- README.md | 5 ++ dusken/main/models.py | 171 ++++++++++++++++-------------------------- 2 files changed, 69 insertions(+), 107 deletions(-) diff --git a/README.md b/README.md index e8634a1..5af2cfc 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,8 @@ Installation * . venv/bin/activate * pip install -r requirements.txt +Database Diagram Generation +=========================== +* sudo apt-get install graphviz libgraphviz-dev +* pip install pygraphviz django-extensions +* python manage.py graph_models -o diagramfile.png main diff --git a/dusken/main/models.py b/dusken/main/models.py index a1fd575..9b8e2f8 100644 --- a/dusken/main/models.py +++ b/dusken/main/models.py @@ -1,137 +1,94 @@ -# FIXME -# - Reduce the database more? -# - ExpiresformanytomanymembershipDuration -# - Institution -# - Member has place of study? -# - Subgroups -# - Positions -# - Only one type of adress? YES -# - ExtendedMemberdetail? -# - Legacy_id as extended member detail? - # TODO # - autofields created, updated from django.db import models class Country(models.Model): - country_id = models.IntegerField(primary_key=True) name = models.CharField(max_length=50, unique=True) - class Meta: - db_table = u'country' class Address(models.Model): - address_id = models.IntegerField(primary_key=True) - addressline1 = models.CharField(max_length=255) - addressline2 = models.CharField(max_length=255) - placename = models.CharField(max_length=100) - country_id = models.ForeignKey(Country, db_column='country_id') - postalcode = models.CharField(max_length=10) - class Meta: - db_table = u'address' + street_address = models.CharField(max_length=255) + city = models.CharField(max_length=100) + country = models.ForeignKey(Country) + postal_code = models.CharField(max_length=10) + +class Institution(models.Model): + name = models.CharField(max_length=255) + +class PlaceOfStudy(models.Model): + from_date = models.DateField() + institution = models.ForeignKey(Institution) class Member(models.Model): - member_id = models.IntegerField(primary_key=True) email = models.CharField(max_length=150, unique=True) - username = models.CharField(max_length=40, unique=True) - phonenumber = models.IntegerField(unique=True, null=True, blank=True) - givenname = models.CharField(max_length=200, blank=True) - dateofbirth = models.DateField(null=True, blank=True) - surname = models.CharField(max_length=200, blank=True) - address_id = models.ForeignKey(Address, null=True, db_column='address_id', blank=True) - class Meta: - db_table = u'member' + password = models.CharField(max_length=255) + username = models.CharField(max_length=40, unique=True, null=True, blank=True) + phone_number = models.IntegerField(unique=True, null=True, blank=True) + first_name = models.CharField(max_length=200, blank=True, null=True) + last_name= models.CharField(max_length=200, blank=True, null=True) + date_of_birth = models.DateField(blank=True, null=True) + legacy_id = models.IntegerField(unique=True, null=True, blank=True) + address = models.ForeignKey(Address, null=True, blank=True) + place_of_study = models.ManyToManyField(PlaceOfStudy, null=True, blank=True) + +class FacebookAuth(models.Model): + token = models.CharField(max_length=255, unique=True, null=True, blank=True) + token_expires = models.DateTimeField(null=True, blank=True) + member = models.OneToOneField(Member, null=True, blank=True) + +class GoogleAuth(models.Model): + token = models.CharField(max_length=255, unique=True, null=True, blank=True) + token_expires = models.DateTimeField(null=True, blank=True) + member = models.OneToOneField(Member, null=True, blank=True) class ExtendedMemberDetail(models.Model): - member_id = models.ForeignKey(Member, primary_key=True, db_column='member_id') - class Meta: - db_table = u'extended_member_details' + pass class PaymentForMembership(models.Model): - payment_for_membership_id = models.IntegerField(primary_key=True) + # Note: More like tokens? sms_payment_id = models.IntegerField(unique=True, null=True, blank=True) webshop_payment_id = models.IntegerField(unique=True, null=True, blank=True) voucher_id = models.IntegerField(unique=True, null=True, blank=True) - class Meta: - db_table = u'payment_for_membership' -class MembershipDuration(models.Model): - membership_duration_id = models.IntegerField(primary_key=True) +''' + TODO: should validate end_day_of_month and end_month (use datetime exceptions) +''' +class MembershipType(models.Model): name = models.CharField(max_length=50, unique=True) - minimum_duration = models.CharField(max_length=30) - class Meta: - db_table = u'membership_duration' + duration_months = models.IntegerField(default=12) + end_day_of_month = models.IntegerField(default=31) + end_month = models.IntegerField(default=7) + + def end_date(self): + import datetime + now = datetime.datetime.now() + year = now.year + (now.month - 1 + self.duration_months) / 12 + month = (now.month - 1 + self.duration_months) % 12 + 1 + + end1 = datetime.datetime(year, month, now.day, 0, 0, 0) + end2 = None + # closest date which fullfills the day, month and duration specified + if now.month < self.end_month or (now.month == self.end_month and now.day < self.end_day_of_month): + end2 = datetime.datetime(now.year, self.end_month, self.end_day_of_month) + else: + end2 = datetime.datetime(now.year+1, self.end_month, self.end_day_of_month) + + return min(end1, end2) class Membership(models.Model): - membership_id = models.IntegerField(primary_key=True) start_date = models.DateField() - member_id = models.ForeignKey(Member, db_column='member_id') - membership_duration_id = models.ForeignKey(MembershipDuration, db_column='membership_duration_id') - payment_for_membership_id = models.ForeignKey(PaymentForMembership, unique=True, null=True, db_column='payment_for_membership_id', blank=True) - class Meta: - db_table = u'membership' + mtype = models.ForeignKey(MembershipType, db_column='type') + payment = models.ForeignKey(PaymentForMembership, unique=True, null=True, blank=True) + member = models.ForeignKey(Member) + + def expires(self): + return self.mtype.end_date() class Group(models.Model): - group_id = models.IntegerField(primary_key=True) name = models.CharField(max_length=50, unique=True) - class Meta: - db_table = u'group' - -class Expires(models.Model): - expires_id = models.IntegerField(primary_key=True) - monthofyear = models.IntegerField() - dayofmonth = models.IntegerField() - class Meta: - db_table = u'expires' - -class ExpiresformanytomanymembershipDuration(models.Model): - expires_id = models.ForeignKey(Expires, db_column='expires_id') - membership_duration_id = models.ForeignKey(MembershipDuration, db_column='membership_duration_id') - class Meta: - db_table = u'expiresformanytomanymembership_duration' - -class Legacy(models.Model): - legacy_id = models.IntegerField(primary_key=True) - member_id = models.ForeignKey(Member, unique=True, null=True, db_column='member_id', blank=True) - class Meta: - db_table = u'legacy' - -class Institution(models.Model): - institution_name = models.CharField(max_length=255, primary_key=True) - class Meta: - db_table = u'institution' - -class Subgroup(models.Model): - subgroup_id = models.IntegerField(primary_key=True) - name = models.CharField(max_length=50) - group_id = models.ForeignKey(Group, db_column='group_id') - class Meta: - db_table = u'subgroup' + posix_name = models.CharField(max_length=255, unique=True) class GroupMembership(models.Model): - group_membership_id = models.IntegerField(primary_key=True) start_date = models.DateField() - member_id = models.ForeignKey(Member, db_column='member_id') - group_id = models.ForeignKey(Group, db_column='group_id') - membership_duration_id = models.ForeignKey(MembershipDuration, db_column='membership_duration_id') - -class Position(models.Model): - position_id = models.IntegerField(primary_key=True) - name = models.CharField(max_length=50) - subgroup_id = models.ForeignKey(Subgroup, db_column='subgroup_id') - is_static = models.NullBooleanField(null=True, blank=True) - class Meta: - db_table = u'position' - -class PlaceOfStudy(models.Model): - place_of_study_id = models.IntegerField(primary_key=True) - from_date = models.DateField() - institution_name = models.ForeignKey(Institution, db_column='institution_name') - class Meta: - db_table = u'place_of_study' - -class MemberhasplaceOfStudy(models.Model): - member_id = models.ForeignKey(Member, db_column='member_id') - place_of_study_id = models.ForeignKey(PlaceOfStudy, db_column='place_of_study_id') - class Meta: - db_table = u'membershasplace_of_study' + member = models.ForeignKey(Member) + group = models.ForeignKey(Group)