models.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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.admin import site
  6. from misago.core.utils import subset_markdown, slugify
  7. FORUMS_TREE_ID = 1
  8. class ForumManager(TreeManager):
  9. def private_threads(self):
  10. return self.get(special_role='private_threads')
  11. def root_category(self):
  12. return self.get(special_role='root_category')
  13. def all_forums(self, include_root=False):
  14. qs = self.filter(tree_id=FORUMS_TREE_ID)
  15. if not include_root:
  16. qs = self.filter(lft__gt=3)
  17. return qs.order_by('lft')
  18. class Forum(MPTTModel):
  19. parent = TreeForeignKey(
  20. 'self', null=True, blank=True, related_name='children')
  21. special_role = models.CharField(max_length=255, null=True, blank=True)
  22. role = models.CharField(max_length=255, null=True, blank=True)
  23. name = models.CharField(max_length=255)
  24. slug = models.SlugField(max_length=255)
  25. description = models.TextField(null=True, blank=True)
  26. description_as_html = models.TextField(null=True, blank=True)
  27. is_closed = models.BooleanField(default=False)
  28. redirect_url = models.CharField(max_length=255, null=True, blank=True)
  29. redirects_count = models.PositiveIntegerField(default=0)
  30. threads = models.PositiveIntegerField(default=0)
  31. threads_count = models.PositiveIntegerField(default=0)
  32. posts = models.PositiveIntegerField(default=0)
  33. posts_count = models.PositiveIntegerField(default=0)
  34. prune_started_after = models.PositiveIntegerField(default=0)
  35. prune_replied_after = models.PositiveIntegerField(default=0)
  36. archive_pruned_in = models.ForeignKey(
  37. 'self',
  38. related_name='pruned_archive',
  39. null=True,
  40. blank=True,
  41. on_delete=models.SET_NULL)
  42. css_class = models.CharField(max_length=255, null=True, blank=True)
  43. objects = ForumManager()
  44. def __unicode__(self):
  45. if self.special_role == 'root_category':
  46. return unicode(_('None (will become top level category)'))
  47. elif self.special_role == 'private_threads':
  48. return unicode(_('Private Threads'))
  49. else:
  50. return self.name
  51. def set_name(self, name):
  52. self.name = name
  53. self.slug = slugify(name)
  54. def set_description(self, description):
  55. self.description = description
  56. self.description_as_html = subset_markdown(description)
  57. def has_child(self, child):
  58. return child.lft > self.lft and child.rght < self.rght
  59. """register model in misago admin"""
  60. site.add_node(
  61. parent='misago:admin',
  62. before='misago:admin:permissions:users:index',
  63. namespace='misago:admin:forums',
  64. link='misago:admin:forums:nodes:index',
  65. name=_("Forums"),
  66. icon='fa fa-comment')
  67. site.add_node(
  68. parent='misago:admin:forums',
  69. namespace='misago:admin:forums:nodes',
  70. link='misago:admin:forums:nodes:index',
  71. name=_("Forums Hierarchy"),
  72. icon='fa fa-comment')