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()