post.py 3.7 KB

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