thread.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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)
  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.SlugField(max_length=255)
  16. replies = models.PositiveIntegerField(default=0)
  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.SlugField(max_length=255)
  29. last_post_on = models.DateTimeField()
  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.SlugField(max_length=255, null=True, blank=True)
  38. is_poll = models.BooleanField(default=False)
  39. is_moderated = models.BooleanField(default=False)
  40. is_hidden = models.BooleanField(default=False)
  41. is_closed = models.BooleanField(default=False)
  42. @property
  43. def is_announcement(self):
  44. return self.weight == ANNOUNCEMENT
  45. @property
  46. def is_pinned(self):
  47. return self.weight == PINNED
  48. @property
  49. def link_prefix(self):
  50. if self.forum.special_role == 'private_threads':
  51. return 'private_thread'
  52. else:
  53. return 'thread'
  54. def get_url(self, suffix=None):
  55. link = 'misago:%s' % self.link_prefix
  56. if suffix:
  57. link = '%s_%s' % (link, suffix)
  58. return reverse(link, kwargs={
  59. 'thread_slug': self.slug,
  60. 'thread_id': self.id
  61. })
  62. def get_absolute_url(self):
  63. return self.get_url()
  64. def get_new_reply_url(self):
  65. return self.get_url('new')
  66. def get_last_reply_url(self):
  67. return self.get_url('last')
  68. def set_title(self, title):
  69. self.title = title
  70. self.slug = slugify(title)
  71. def set_first_post(self, post):
  72. self.started_on = post.posted_on
  73. self.first_post = post
  74. self.starter = post.poster
  75. self.starter_name = post.poster_name
  76. if post.poster:
  77. self.starter_slug = post.poster.slug
  78. else:
  79. self.starter_slug = slugify(post.poster_name)
  80. def set_last_post(self, post):
  81. self.last_post_on = post.posted_on
  82. self.last_post = post
  83. self.last_poster = post.poster
  84. self.last_poster_name = post.poster_name
  85. if post.poster:
  86. self.last_poster_slug = post.poster.slug
  87. else:
  88. self.last_poster_slug = slugify(post.poster_name)