post.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. from django.core.urlresolvers import reverse
  2. from django.db import models
  3. from django.dispatch import receiver
  4. from django.utils import timezone
  5. from misago.conf import settings
  6. from misago.threads import threadtypes
  7. from misago.threads.checksums import update_post_checksum, is_post_valid
  8. class Post(models.Model):
  9. forum = models.ForeignKey('misago_forums.Forum')
  10. thread = models.ForeignKey('misago_threads.Thread')
  11. poster = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True,
  12. on_delete=models.SET_NULL)
  13. poster_name = models.CharField(max_length=255)
  14. poster_ip = models.GenericIPAddressField()
  15. original = models.TextField()
  16. parsed = models.TextField()
  17. checksum = models.CharField(max_length=64, default='-')
  18. mentions = models.ManyToManyField(settings.AUTH_USER_MODEL,
  19. related_name="mention_set")
  20. has_attachments = models.BooleanField(default=False)
  21. pickled_attachments = models.TextField(null=True, blank=True)
  22. posted_on = models.DateTimeField()
  23. updated_on = models.DateTimeField()
  24. edits = models.PositiveIntegerField(default=0)
  25. last_editor = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='+',
  26. null=True, blank=True,
  27. on_delete=models.SET_NULL)
  28. last_editor_name = models.CharField(max_length=255, null=True, blank=True)
  29. last_editor_slug = models.SlugField(max_length=255, null=True, blank=True)
  30. hidden_by = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='+',
  31. null=True, blank=True,
  32. on_delete=models.SET_NULL)
  33. hidden_by_name = models.CharField(max_length=255, null=True, blank=True)
  34. hidden_by_slug = models.SlugField(max_length=255, null=True, blank=True)
  35. hidden_on = models.DateTimeField(default=timezone.now)
  36. has_reports = models.BooleanField(default=False)
  37. has_open_reports = models.BooleanField(default=False)
  38. is_moderated = models.BooleanField(default=False, db_index=True)
  39. is_hidden = models.BooleanField(default=False)
  40. is_protected = models.BooleanField(default=False)
  41. def __unicode__(self):
  42. return '%s...' % self.original[10:].strip()
  43. def delete(self, *args, **kwargs):
  44. from misago.threads.signals import delete_post
  45. delete_post.send(sender=self)
  46. super(Post, self).delete(*args, **kwargs)
  47. def merge(self, other_post):
  48. if self.thread_id != other_post.thread_id:
  49. message = "only posts belonging to same thread can be merged"
  50. raise ValueError(message)
  51. message = "posts made by different authors can't be merged"
  52. if self.poster_id and other_post.poster_id:
  53. if self.poster_id != other_post.poster_id:
  54. raise ValueError(message)
  55. else:
  56. raise ValueError(message)
  57. if self.pk == other_post.pk:
  58. raise ValueError("post can't be merged with itself")
  59. other_post.original = '%s\n\n%s' % (other_post.original, self.original)
  60. other_post.parsed = '%s\n%s' % (other_post.parsed, self.parsed)
  61. update_post_checksum(other_post)
  62. from misago.threads.signals import merge_post
  63. merge_post.send(sender=self, other_thread=other_post)
  64. def move(self, new_thread):
  65. from misago.threads.signals import move_post
  66. self.forum = new_thread.forum
  67. self.thread = new_thread
  68. move_post.send(sender=self)
  69. @property
  70. def thread_type(self):
  71. return self.forum.thread_type
  72. def get_absolute_url(self):
  73. return self.thread_type.get_post_absolute_url(self)
  74. def get_quote_url(self):
  75. return self.thread_type.get_post_quote_url(self)
  76. def get_approve_url(self):
  77. return self.thread_type.get_post_approve_url(self)
  78. def get_unhide_url(self):
  79. return self.thread_type.get_post_unhide_url(self)
  80. def get_hide_url(self):
  81. return self.thread_type.get_post_hide_url(self)
  82. def get_delete_url(self):
  83. return self.thread_type.get_post_delete_url(self)
  84. def get_report_url(self):
  85. return self.thread_type.get_post_report_url(self)
  86. @property
  87. def short(self):
  88. if self.is_valid:
  89. if len(self.original) > 150:
  90. return '%s...' % self.original[:150].strip()
  91. else:
  92. return self.original
  93. else:
  94. return ''
  95. @property
  96. def is_valid(self):
  97. return is_post_valid(self)