post.py 3.1 KB

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