models.py 2.8 KB

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