from django.db import models from django.contrib.auth.models import User from django.db.models.signals import post_save """For now, all the models are just shoved into one file. Will seperate eventually.""" max_name_length = 25 max_location_length = 20 max_title_length = 30 max_post_length = 65000 class Player(models.Model): #name ia covered by the django.auth User object user = models.OneToOneField(User) friends = models.ManyToManyField("self", symmetrical=True) post_count = models.PositiveIntegerField(default=0) #Date joined also covered by user #date_joined = models.DateField() location = models.CharField(max_length=max_location_length) #Again, subsumed by user #groups = models.ManyToManyField("Group", related_name="groups", db_table=u"PLAYERS_TO_GROUPS") #size? #size = models.BigIntegerField() #Implemented by django.auth User #permissions = models.ForeignKey("Permission_Group") def create_user_profile(sender, instance, created, **kwargs): if created: Player.objects.create(user=instance) post_save.connect(create_user_profile, sender=User) class ManyToManyField_NoSyncdb(models.ManyToManyField): def __init__(self, *args, **kwargs): super(ManyToManyField_NoSyncdb, self).__init__(*args, **kwargs) self.creates_table = False class Group(models.Model): name = models.CharField(max_length=max_name_length) admins = models.ManyToManyField(Player, symmetrical=True) members = ManyToManyField_NoSyncdb(Player, related_name="members", db_table="PLAYERS_TO_GROUPS") description = models.TextField(max_length=max_post_length) class Section(models.Model): title = models.CharField(max_length=max_title_length) #Could have used inheritance. #Decided not to so all data is in one table. (Only one field is #shared anyway) Removed here because lots of forum data is expected class Subsection(models.Model): title = models.CharField(max_length=max_title_length) parent = models.ForeignKey(Section, related_name="children") class Thread(models.Model): description = models.CharField(max_length=max_title_length) author = models.ForeignKey(Player, related_name="threads") post_date = models.DateField() parent = models.ForeignKey(Subsection, related_name="threads") closed = models.BooleanField() #Message-based classes class Message(models.Model): title = models.CharField(max_length=max_title_length) author = models.ForeignKey(Player, related_name="messages") post_date = models.DateField() text = models.TextField(max_length=max_post_length) class Post(Message): flagged = models.BooleanField() class Pm(Message): read = models.BooleanField() starred = models.BooleanField() #Douibly implemented to avoid generic relation ugliness class Friend_Request(models.Model): author = models.ForeignKey(Player, related_name="sent_friend_requests") recipient = models.ForeignKey(Player, related_name="friend_requests") #None represents not-yet-answered #False transforms this into a block accepted = models.NullBooleanField() #Douibly implemented to avoid generic relation ugliness class Join_Group_Request(models.Model): author = models.ForeignKey(Player, related_name="sent_group_requests") recipient = models.ForeignKey(Group, related_name="membership_requests") #None represents not-yet-answered #False transforms this into a block accepted = models.NullBooleanField()