models.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. from django.conf import settings
  2. from django.db import models
  3. from django.utils.translation import ugettext_lazy as _
  4. from mptt.models import MPTTModel, TreeForeignKey
  5. class Forum(MPTTModel):
  6. parent = TreeForeignKey('self', null=True, blank=True, related_name='children')
  7. position = models.IntegerField()
  8. role = models.CharField(max_length=12, choices=(
  9. ('cat', 'Category'),
  10. ('for', 'Forum'),
  11. ('red', 'Redirect')
  12. ))
  13. special = models.CharField(max_length=255,null=True, blank=True)
  14. name = models.CharField(max_length=255)
  15. slug = models.SlugField(max_length=255)
  16. style = models.CharField(max_length=255)
  17. description = models.TextField(null=True, blank=True)
  18. description_preparsed = models.TextField(null=True, blank=True)
  19. threads = models.PositiveIntegerField(default=0)
  20. posts = models.PositiveIntegerField(default=0)
  21. last_thread = models.ForeignKey('Thread', related_name='+', null=True, blank=True)
  22. last_thread_name = models.CharField(max_length=255, null=True, blank=True)
  23. last_thread_slug = models.SlugField(null=True, blank=True)
  24. last_thread_date = models.DateTimeField(null=True, blank=True)
  25. last_poster = models.ForeignKey('users.User', related_name='+')
  26. last_poster_name = models.CharField(max_length=255, null=True, blank=True)
  27. last_poster_slug = models.SlugField(max_length=255, null=True, blank=True)
  28. last_poster_style = models.CharField(max_length=255, null=True, blank=True)
  29. closed = models.BooleanField(default=False)
  30. class MPTTMeta:
  31. order_insertion_by = ['position']
  32. class ThreadManager(models.Manager):
  33. def filter_overview(self, start, end):
  34. return self.filter(start__gte=start).filter(start__lte=end)
  35. class Thread(models.Model):
  36. forum = models.ForeignKey(Forum, related_name='+')
  37. name = models.CharField(max_length=255)
  38. slug = models.SlugField(max_length=255)
  39. replies = models.PositiveIntegerField()
  40. views = models.PositiveIntegerField(default=0)
  41. start = models.DateTimeField(default=0)
  42. start_post = models.ForeignKey('Post', related_name='+', null=True, blank=True)
  43. start_poster = models.ForeignKey('users.User', related_name='+', null=True, blank=True)
  44. start_poster_name = models.CharField(max_length=255)
  45. start_poster_slug = models.SlugField(max_length=255)
  46. start_poster_style = models.CharField(max_length=255)
  47. last = models.DateTimeField()
  48. last_post = models.ForeignKey('Post', related_name='+', null=True, blank=True)
  49. last_poster = models.ForeignKey('users.User', related_name='+', null=True, blank=True)
  50. last_poster_name = models.CharField(max_length=255, null=True, blank=True)
  51. last_poster_slug = models.SlugField(max_length=255, null=True, blank=True)
  52. last_poster_style = models.CharField(max_length=255, null=True, blank=True)
  53. poster_styles_list = models.CharField(max_length=255, null=True, blank=True)
  54. hidden = models.BooleanField(default=False)
  55. closed = models.BooleanField(default=False)
  56. objects = ThreadManager()
  57. statistics_name = _('New Threads')
  58. def get_date(self):
  59. return self.start
  60. class PostManager(models.Manager):
  61. def filter_overview(self, start, end):
  62. return self.filter(date__gte=start).filter(date__lte=end)
  63. class Post(models.Model):
  64. forum = models.ForeignKey(Forum, related_name='+')
  65. thread = models.ForeignKey(Thread, related_name='+')
  66. user = models.ForeignKey('users.User', related_name='+', null=True, blank=True)
  67. user_name = models.CharField(max_length=255)
  68. ip = models.GenericIPAddressField()
  69. agent = models.CharField(max_length=255)
  70. post = models.TextField()
  71. post_preparsed = models.TextField()
  72. upvotes = models.IntegerField(default=0)
  73. downvotes = models.IntegerField(default=0)
  74. date = models.DateTimeField()
  75. attachments = models.BooleanField(default=False)
  76. attachments_list = models.CommaSeparatedIntegerField(max_length=255)
  77. edited = models.BooleanField(default=False)
  78. edits = models.PositiveIntegerField(default=0)
  79. edit_date = models.DateTimeField(null=True, blank=True)
  80. edit_reason = models.CharField(max_length=255, null=True, blank=True)
  81. edit_user = models.ForeignKey('users.User', related_name='+', null=True)
  82. edit_user_name = models.CharField(max_length=255, null=True, blank=True)
  83. edit_user_slug = models.SlugField(max_length=255, null=True, blank=True)
  84. reported = models.BooleanField(default=False)
  85. hidden = models.BooleanField(default=False)
  86. protected = models.BooleanField(default=False)
  87. objects = PostManager()
  88. statistics_name = _('New Posts')
  89. def get_date(self):
  90. return self.date
  91. class AttachmentType(models.Model):
  92. mime = models.CharField(max_length=255)
  93. extension = models.CharField(max_length=255)
  94. class Attachment(models.Model):
  95. forum = models.ForeignKey(Forum, related_name='+')
  96. thread = models.ForeignKey(Thread, related_name='+')
  97. post = models.ForeignKey(Post, related_name='+')
  98. type = models.ForeignKey(AttachmentType, related_name='+')
  99. user = models.ForeignKey('users.User', related_name='+', null=True, blank=True)
  100. created = models.DateTimeField()
  101. size = models.PositiveIntegerField(default=0)
  102. name = models.CharField(max_length=255)
  103. file = models.FileField(upload_to=settings.MEDIA_ROOT + '/attachments/%m_%Y/',max_length=255)
  104. downloads = models.PositiveIntegerField(default=0)
  105. class Poll(models.Model):
  106. forum = models.ForeignKey(Forum, related_name='+')
  107. thread = models.ForeignKey(Thread, related_name='+')
  108. name = models.CharField(max_length=255)
  109. name_slug = models.SlugField(max_length=255)
  110. user = models.ForeignKey('users.User', related_name='+')
  111. user_name = models.CharField(max_length=255)
  112. user_slug = models.SlugField(max_length=255)
  113. public = models.BooleanField(default=False)
  114. multiple = models.BooleanField(default=False)
  115. changing = models.BooleanField(default=False)
  116. created = models.DateTimeField()
  117. length = models.PositiveIntegerField(default=0)
  118. votes = models.PositiveIntegerField(default=0)
  119. class Vote(models.Model):
  120. forum = models.ForeignKey(Forum, related_name='+')
  121. thread = models.ForeignKey(Thread, related_name='+')
  122. poll = models.ForeignKey(Poll, related_name='+')
  123. user = models.ForeignKey('users.User', related_name='+', null=True, blank=True)
  124. ip = models.GenericIPAddressField()
  125. option = models.PositiveIntegerField()
  126. class Moderator(models.Model):
  127. forum = models.ForeignKey(Forum, related_name='+')
  128. group = models.ForeignKey('users.Group', related_name='+', null=True, blank=True)
  129. user = models.ForeignKey('users.User', related_name='+', null=True, blank=True)
  130. class Report(models.Model):
  131. forum = models.ForeignKey(Forum, related_name='+')
  132. thread = models.ForeignKey(Thread, related_name='+')
  133. post = models.ForeignKey(Post, related_name='+')
  134. class Edit(models.Model):
  135. forum = models.ForeignKey(Forum, related_name='+')
  136. thread = models.ForeignKey(Thread, related_name='+')
  137. post = models.ForeignKey(Post, related_name='+')