models.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. from django.db import models
  2. from django.utils import timezone
  3. from django.utils.translation import ugettext_lazy as _
  4. from misago.utils import slugify
  5. class ThreadManager(models.Manager):
  6. def filter_stats(self, start, end):
  7. return self.filter(start__gte=start).filter(start__lte=end)
  8. class Thread(models.Model):
  9. forum = models.ForeignKey('forums.Forum')
  10. weight = models.PositiveIntegerField(default=0,db_index=True)
  11. type = models.PositiveIntegerField(default=0)
  12. name = models.CharField(max_length=255)
  13. slug = models.SlugField(max_length=255)
  14. replies = models.PositiveIntegerField(default=0)
  15. replies_reported = models.PositiveIntegerField(default=0)
  16. replies_moderated = models.PositiveIntegerField(default=0)
  17. replies_deleted = models.PositiveIntegerField(default=0)
  18. merges = models.PositiveIntegerField(default=0,db_index=True)
  19. score = models.PositiveIntegerField(default=30,db_index=True)
  20. upvotes = models.PositiveIntegerField(default=0)
  21. downvotes = models.PositiveIntegerField(default=0)
  22. start = models.DateTimeField(db_index=True)
  23. start_post = models.ForeignKey('Post',related_name='+',null=True,blank=True,on_delete=models.SET_NULL)
  24. start_poster = models.ForeignKey('users.User',null=True,blank=True)
  25. start_poster_name = models.CharField(max_length=255)
  26. start_poster_slug = models.SlugField(max_length=255)
  27. start_poster_style = models.CharField(max_length=255,null=True,blank=True)
  28. last = models.DateTimeField(db_index=True)
  29. last_post = models.ForeignKey('Post',related_name='+',null=True,blank=True,on_delete=models.SET_NULL)
  30. last_poster = models.ForeignKey('users.User',related_name='+',null=True,blank=True)
  31. last_poster_name = models.CharField(max_length=255,null=True,blank=True)
  32. last_poster_slug = models.SlugField(max_length=255,null=True,blank=True)
  33. last_poster_style = models.CharField(max_length=255,null=True,blank=True)
  34. moderated = models.BooleanField(default=False,db_index=True)
  35. deleted = models.BooleanField(default=False,db_index=True)
  36. closed = models.BooleanField(default=False)
  37. objects = ThreadManager()
  38. statistics_name = _('New Threads')
  39. def get_date(self):
  40. return self.start
  41. def sync(self):
  42. # Counters
  43. self.replies = self.post_set.filter(moderated=False).filter(deleted=False).count() - 1
  44. if self.replies < 0:
  45. self.replies = 0
  46. self.replies_reported = self.post_set.filter(reported=True).count()
  47. self.replies_moderated = self.post_set.filter(moderated=True).count()
  48. self.replies_deleted = self.post_set.filter(deleted=True).count()
  49. # First post
  50. start_post = self.post_set.order_by('merge', 'id')[0:][0]
  51. self.start = start_post.date
  52. self.start_post = start_post
  53. self.start_poster = start_post.user
  54. self.start_poster_name = start_post.user_name
  55. self.start_poster_slug = slugify(start_post.user_name)
  56. self.start_poster_style = start_post.user.rank.style if start_post.user else ''
  57. self.upvotes = start_post.upvotes
  58. self.downvotes = start_post.downvotes
  59. # Last post
  60. if self.replies > 0:
  61. last_post = self.post_set.order_by('-merge', '-id').filter(moderated=False).filter(deleted=False)[0:][0]
  62. else:
  63. last_post = start_post
  64. self.last = last_post.date
  65. self.last_post = last_post
  66. self.last_poster = last_post.user
  67. self.last_poster_name = last_post.user_name
  68. self.last_poster_slug = slugify(last_post.user_name)
  69. self.last_poster_style = last_post.user.rank.style if last_post.user else ''
  70. # Flags
  71. self.moderated = start_post.moderated
  72. self.deleted = start_post.deleted
  73. self.merges = last_post.merge
  74. class PostManager(models.Manager):
  75. def filter_stats(self, start, end):
  76. return self.filter(date__gte=start).filter(date__lte=end)
  77. class Post(models.Model):
  78. forum = models.ForeignKey('forums.Forum')
  79. thread = models.ForeignKey(Thread)
  80. merge = models.PositiveIntegerField(default=0,db_index=True)
  81. user = models.ForeignKey('users.User',null=True,blank=True)
  82. user_name = models.CharField(max_length=255)
  83. ip = models.GenericIPAddressField()
  84. agent = models.CharField(max_length=255)
  85. post = models.TextField()
  86. post_preparsed = models.TextField()
  87. upvotes = models.PositiveIntegerField(default=0)
  88. downvotes = models.PositiveIntegerField(default=0)
  89. date = models.DateTimeField()
  90. edits = models.PositiveIntegerField(default=0)
  91. edit_date = models.DateTimeField(null=True,blank=True)
  92. edit_reason = models.CharField(max_length=255,null=True,blank=True)
  93. edit_user = models.ForeignKey('users.User',related_name='+',null=True)
  94. edit_user_name = models.CharField(max_length=255,null=True,blank=True)
  95. edit_user_slug = models.SlugField(max_length=255,null=True,blank=True)
  96. reported = models.BooleanField(default=False)
  97. moderated = models.BooleanField(default=False,db_index=True)
  98. deleted = models.BooleanField(default=False,db_index=True)
  99. protected = models.BooleanField(default=False)
  100. objects = PostManager()
  101. statistics_name = _('New Posts')
  102. def get_date(self):
  103. return self.date
  104. def set_checkpoint(self, request, action):
  105. if request.user.is_authenticated():
  106. self.checkpoint_set.create(
  107. forum=self.forum,
  108. thread=self.thread,
  109. post=self,
  110. action=action,
  111. user=request.user,
  112. user_name=request.user.username,
  113. user_slug=request.user.username_slug,
  114. date=timezone.now(),
  115. ip=request.session.get_ip(request),
  116. agent=request.META.get('HTTP_USER_AGENT'),
  117. )
  118. class Change(models.Model):
  119. forum = models.ForeignKey('forums.Forum')
  120. thread = models.ForeignKey(Thread)
  121. post = models.ForeignKey(Post)
  122. user = models.ForeignKey('users.User',null=True,blank=True)
  123. user_name = models.CharField(max_length=255)
  124. user_slug = models.CharField(max_length=255)
  125. date = models.DateTimeField()
  126. ip = models.GenericIPAddressField()
  127. agent = models.CharField(max_length=255)
  128. reason = models.CharField(max_length=255,null=True,blank=True)
  129. thread_name_new = models.CharField(max_length=255,null=True,blank=True)
  130. thread_name_old = models.CharField(max_length=255,null=True,blank=True)
  131. post_content = models.TextField()
  132. size = models.IntegerField(default=0)
  133. change = models.IntegerField(default=0)
  134. class Checkpoint(models.Model):
  135. forum = models.ForeignKey('forums.Forum')
  136. thread = models.ForeignKey(Thread)
  137. post = models.ForeignKey(Post)
  138. action = models.CharField(max_length=255)
  139. user = models.ForeignKey('users.User',null=True,blank=True)
  140. user_name = models.CharField(max_length=255)
  141. user_slug = models.CharField(max_length=255)
  142. date = models.DateTimeField()
  143. ip = models.GenericIPAddressField()
  144. agent = models.CharField(max_length=255)