thread.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. from django.core.urlresolvers import reverse
  2. from django.db import models
  3. from misago.conf import settings
  4. from misago.core.utils import slugify
  5. __all__ = ['ANNOUNCEMENT', 'PINNED', 'Thread']
  6. ANNOUNCEMENT = 2
  7. PINNED = 1
  8. class Thread(models.Model):
  9. forum = models.ForeignKey('misago_forums.Forum')
  10. weight = models.PositiveIntegerField(default=0, db_index=True)
  11. prefix = models.ForeignKey('misago_threads.Prefix',
  12. null=True, blank=True,
  13. on_delete=models.SET_NULL)
  14. title = models.CharField(max_length=255)
  15. slug = models.CharField(max_length=255)
  16. replies = models.PositiveIntegerField(default=0, db_index=True)
  17. has_reported_posts = models.BooleanField(default=False)
  18. has_moderated_posts = models.BooleanField(default=False)
  19. has_hidden_posts = models.BooleanField(default=False)
  20. started_on = models.DateTimeField()
  21. first_post = models.ForeignKey('misago_threads.Post', related_name='+',
  22. null=True, blank=True,
  23. on_delete=models.SET_NULL)
  24. starter = models.ForeignKey(settings.AUTH_USER_MODEL,
  25. null=True, blank=True,
  26. on_delete=models.SET_NULL)
  27. starter_name = models.CharField(max_length=255)
  28. starter_slug = models.CharField(max_length=255)
  29. last_post_on = models.DateTimeField(db_index=True)
  30. last_post = models.ForeignKey('misago_threads.Post', related_name='+',
  31. null=True, blank=True,
  32. on_delete=models.SET_NULL)
  33. last_poster = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='+',
  34. null=True, blank=True,
  35. on_delete=models.SET_NULL)
  36. last_poster_name = models.CharField(max_length=255, null=True, blank=True)
  37. last_poster_slug = models.CharField(max_length=255, null=True, blank=True)
  38. is_poll = models.BooleanField(default=False)
  39. is_moderated = models.BooleanField(default=False, db_index=True)
  40. is_hidden = models.BooleanField(default=False)
  41. is_closed = models.BooleanField(default=False)
  42. class Meta:
  43. index_together = [
  44. ['forum', 'weight', 'id'],
  45. ['forum', 'weight', 'last_post'],
  46. ['forum', 'weight', 'replies'],
  47. ]
  48. @property
  49. def is_announcement(self):
  50. return self.weight == ANNOUNCEMENT
  51. @property
  52. def is_pinned(self):
  53. return self.weight == PINNED
  54. @property
  55. def link_prefix(self):
  56. if self.forum.special_role == 'private_threads':
  57. return 'private_thread'
  58. else:
  59. return 'thread'
  60. def get_url(self, suffix=None):
  61. link = 'misago:%s' % self.link_prefix
  62. if suffix:
  63. link = '%s_%s' % (link, suffix)
  64. return reverse(link, kwargs={
  65. 'thread_slug': self.slug,
  66. 'thread_id': self.id
  67. })
  68. def get_absolute_url(self):
  69. return self.get_url()
  70. def get_new_reply_url(self):
  71. return self.get_url('new')
  72. def get_last_reply_url(self):
  73. return self.get_url('last')
  74. def set_title(self, title):
  75. self.title = title
  76. self.slug = slugify(title)
  77. def set_first_post(self, post):
  78. self.started_on = post.posted_on
  79. self.first_post = post
  80. self.starter = post.poster
  81. self.starter_name = post.poster_name
  82. if post.poster:
  83. self.starter_slug = post.poster.slug
  84. else:
  85. self.starter_slug = slugify(post.poster_name)
  86. def set_last_post(self, post):
  87. self.last_post_on = post.posted_on
  88. self.last_post = post
  89. self.last_poster = post.poster
  90. self.last_poster_name = post.poster_name
  91. if post.poster:
  92. self.last_poster_slug = post.poster.slug
  93. else:
  94. self.last_poster_slug = slugify(post.poster_name)