models.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. from django.conf import settings
  2. from django.db import models
  3. from django.utils.translation import ugettext_lazy as _
  4. from mptt.models import MPTTModel,TreeForeignKey
  5. from misago.roles.models import Role
  6. class ForumManager(models.Manager):
  7. def treelist(self, acl, parent=None):
  8. complete_list = []
  9. forums_list = []
  10. parents = {}
  11. if parent:
  12. queryset = Forum.objects.filter(pk__in=acl.known_forums).filter(lft__gt=parent.lft).filter(rght__lt=parent.rght).order_by('lft')
  13. else:
  14. queryset = Forum.objects.filter(pk__in=acl.known_forums).order_by('lft')
  15. for forum in queryset:
  16. forum.subforums = []
  17. parents[forum.pk] = forum
  18. complete_list.append(forum)
  19. if forum.parent_id in parents:
  20. parents[forum.parent_id].subforums.append(forum)
  21. else:
  22. forums_list.append(forum)
  23. # Second iteration - sum up forum counters
  24. for forum in reversed(complete_list):
  25. if forum.parent_id in parents and parents[forum.parent_id].type != 'redirect':
  26. parents[forum.parent_id].threads += forum.threads
  27. parents[forum.parent_id].threads_delta += forum.threads_delta
  28. parents[forum.parent_id].posts += forum.posts
  29. parents[forum.parent_id].posts_delta += forum.posts_delta
  30. if acl.can_browse(forum.pk) and forum.last_thread_date and (not parents[forum.parent_id].last_thread_date or forum.last_thread_date > parents[forum.parent_id].last_thread_date):
  31. parents[forum.parent_id].last_thread = forum.last_thread
  32. parents[forum.parent_id].last_thread_name = forum.last_thread_name
  33. parents[forum.parent_id].last_thread_slug = forum.last_thread_slug
  34. parents[forum.parent_id].last_thread_date = forum.last_thread_date
  35. parents[forum.parent_id].last_poster = forum.last_poster
  36. parents[forum.parent_id].last_poster_name = forum.last_poster_name
  37. parents[forum.parent_id].last_poster_slug = forum.last_poster_slug
  38. parents[forum.parent_id].last_poster_style = forum.last_poster_style
  39. return forums_list
  40. class Forum(MPTTModel):
  41. parent = TreeForeignKey('self',null=True,blank=True,related_name='children')
  42. type = models.CharField(max_length=12)
  43. token = models.CharField(max_length=255,null=True,blank=True)
  44. name = models.CharField(max_length=255)
  45. slug = models.SlugField(max_length=255)
  46. description = models.TextField(null=True,blank=True)
  47. description_preparsed = models.TextField(null=True,blank=True)
  48. threads = models.PositiveIntegerField(default=0)
  49. threads_delta = models.PositiveIntegerField(default=0)
  50. posts = models.PositiveIntegerField(default=0)
  51. posts_delta = models.IntegerField(default=0)
  52. redirects = models.PositiveIntegerField(default=0)
  53. redirects_delta = models.IntegerField(default=0)
  54. last_thread = models.ForeignKey('threads.Thread',related_name='+',null=True,blank=True,on_delete=models.SET_NULL)
  55. last_thread_name = models.CharField(max_length=255,null=True,blank=True)
  56. last_thread_slug = models.SlugField(null=True,blank=True)
  57. last_thread_date = models.DateTimeField(null=True,blank=True)
  58. last_poster = models.ForeignKey('users.User',related_name='+',null=True,blank=True,on_delete=models.SET_NULL)
  59. last_poster_name = models.CharField(max_length=255,null=True,blank=True)
  60. last_poster_slug = models.SlugField(max_length=255,null=True,blank=True)
  61. last_poster_style = models.CharField(max_length=255,null=True,blank=True)
  62. prune_start = models.PositiveIntegerField(default=0)
  63. prune_last = models.PositiveIntegerField(default=0)
  64. redirect = models.CharField(max_length=255,null=True,blank=True)
  65. style = models.CharField(max_length=255,null=True,blank=True)
  66. closed = models.BooleanField(default=False)
  67. objects = ForumManager()
  68. def __unicode__(self):
  69. if self.token == 'root':
  70. return unicode(_('Root Category'))
  71. return unicode(self.name)
  72. def set_description(self, description):
  73. self.description = description.strip()
  74. self.description_preparsed = ''
  75. if self.description:
  76. import markdown
  77. self.description_preparsed = markdown.markdown(description,safe_mode='escape',output_format=settings.OUTPUT_FORMAT)
  78. def copy_permissions(self, target):
  79. if target.pk != self.pk:
  80. for role in Role.objects.all():
  81. perms = role.get_permissions()
  82. try:
  83. perms['forums'][self.pk] = perms['forums'][target.pk]
  84. role.set_permissions(perms)
  85. role.save(force_update=True)
  86. except KeyError:
  87. pass
  88. def move_content(self, target):
  89. pass
  90. def prune(self):
  91. pass