models.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. from django.db import models
  2. from django.utils.translation import ugettext_lazy as _
  3. from mptt.managers import TreeManager
  4. from mptt.models import MPTTModel, TreeForeignKey
  5. from misago.acl import version as acl_version
  6. from misago.acl.models import BaseRole
  7. from misago.admin import site
  8. from misago.core.utils import subset_markdown, slugify
  9. FORUMS_TREE_ID = 1
  10. class ForumManager(TreeManager):
  11. def private_threads(self):
  12. return self.get(special_role='private_threads')
  13. def root_category(self):
  14. return self.get(special_role='root_category')
  15. def all_forums(self, include_root=False):
  16. qs = self.filter(tree_id=FORUMS_TREE_ID)
  17. if not include_root:
  18. qs = self.filter(lft__gt=3)
  19. return qs.order_by('lft')
  20. class Forum(MPTTModel):
  21. parent = TreeForeignKey(
  22. 'self', null=True, blank=True, related_name='children')
  23. special_role = models.CharField(max_length=255, null=True, blank=True)
  24. role = models.CharField(max_length=255, null=True, blank=True)
  25. name = models.CharField(max_length=255)
  26. slug = models.SlugField(max_length=255)
  27. description = models.TextField(null=True, blank=True)
  28. description_as_html = models.TextField(null=True, blank=True)
  29. is_closed = models.BooleanField(default=False)
  30. redirect_url = models.CharField(max_length=255, null=True, blank=True)
  31. redirects_count = models.PositiveIntegerField(default=0)
  32. threads = models.PositiveIntegerField(default=0)
  33. threads_count = models.PositiveIntegerField(default=0)
  34. posts = models.PositiveIntegerField(default=0)
  35. posts_count = models.PositiveIntegerField(default=0)
  36. prune_started_after = models.PositiveIntegerField(default=0)
  37. prune_replied_after = models.PositiveIntegerField(default=0)
  38. archive_pruned_in = models.ForeignKey(
  39. 'self',
  40. related_name='pruned_archive',
  41. null=True,
  42. blank=True,
  43. on_delete=models.SET_NULL)
  44. css_class = models.CharField(max_length=255, null=True, blank=True)
  45. objects = ForumManager()
  46. def __unicode__(self):
  47. if self.special_role == 'root_category':
  48. return unicode(_('None (will become top level category)'))
  49. elif self.special_role == 'private_threads':
  50. return unicode(_('Private Threads'))
  51. else:
  52. return self.name
  53. def save(self, *args, **kwargs):
  54. if self.pk:
  55. acl_version.invalidate()
  56. return super(Forum, self).save(*args, **kwargs)
  57. def delete(self, *args, **kwargs):
  58. acl_version.invalidate()
  59. return super(Forum, self).delete(*args, **kwargs)
  60. def set_name(self, name):
  61. self.name = name
  62. self.slug = slugify(name)
  63. def set_description(self, description):
  64. self.description = description
  65. self.description_as_html = subset_markdown(description)
  66. def has_child(self, child):
  67. return child.lft > self.lft and child.rght < self.rght
  68. class ForumRole(BaseRole):
  69. pass
  70. class RoleForumACL(models.Model):
  71. role = models.ForeignKey('acl.Role', related_name='forums_acls')
  72. forum = models.ForeignKey('Forum')
  73. forum_role = models.ForeignKey(ForumRole)
  74. def save(self, *args, **kwargs):
  75. if not self.pk:
  76. acl_version.invalidate()
  77. return super(RoleForumACL, self).save(*args, **kwargs)
  78. def delete(self, *args, **kwargs):
  79. acl_version.invalidate()
  80. return super(RoleForumACL, self).delete(*args, **kwargs)
  81. """register model in misago admin"""
  82. site.add_node(
  83. parent='misago:admin',
  84. before='misago:admin:permissions:users:index',
  85. namespace='misago:admin:forums',
  86. link='misago:admin:forums:nodes:index',
  87. name=_("Forums"),
  88. icon='fa fa-comments')
  89. site.add_node(
  90. parent='misago:admin:forums',
  91. namespace='misago:admin:forums:nodes',
  92. link='misago:admin:forums:nodes:index',
  93. name=_("Forums Hierarchy"),
  94. icon='fa fa-sitemap')
  95. site.add_node(
  96. parent='misago:admin:permissions',
  97. namespace='misago:admin:permissions:forums',
  98. after='misago:admin:permissions:users:index',
  99. link='misago:admin:permissions:forums:index',
  100. name=_("Forum roles"),
  101. icon='fa fa-comments-o')