models.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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, forums, parent=None):
  8. forums_list = []
  9. parents = {}
  10. for forum in Forum.objects.filter(pk__in=forums).filter(level__lte=3).order_by('lft'):
  11. forum.subforums = []
  12. parents[forum.pk] = forum
  13. if forum.parent_id in parents:
  14. parents[forum.parent_id].subforums.append(forum)
  15. else:
  16. forums_list.append(forum)
  17. return forums_list
  18. class Forum(MPTTModel):
  19. parent = TreeForeignKey('self', null=True, blank=True, related_name='children')
  20. type = models.CharField(max_length=12)
  21. token = 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_preparsed = models.TextField(null=True, blank=True)
  26. threads = models.PositiveIntegerField(default=0)
  27. threads_delta = models.PositiveIntegerField(default=0)
  28. posts = models.PositiveIntegerField(default=0)
  29. posts_delta = models.IntegerField(default=0)
  30. redirects = models.PositiveIntegerField(default=0)
  31. redirects_delta = models.IntegerField(default=0)
  32. #last_thread = models.ForeignKey('threads.Thread', related_name='+', null=True, blank=True)
  33. last_thread_name = models.CharField(max_length=255, null=True, blank=True)
  34. last_thread_slug = models.SlugField(null=True, blank=True)
  35. last_thread_date = models.DateTimeField(null=True, blank=True)
  36. last_poster = models.ForeignKey('users.User', related_name='+', null=True, blank=True)
  37. last_poster_name = models.CharField(max_length=255, null=True, blank=True)
  38. last_poster_slug = models.SlugField(max_length=255, null=True, blank=True)
  39. last_poster_style = models.CharField(max_length=255, null=True, blank=True)
  40. prune_start = models.PositiveIntegerField(default=0)
  41. prune_last = models.PositiveIntegerField(default=0)
  42. redirect = models.CharField(max_length=255, null=True, blank=True)
  43. style = models.CharField(max_length=255, null=True, blank=True)
  44. closed = models.BooleanField(default=False)
  45. objects = ForumManager()
  46. def __unicode__(self):
  47. if self.token == 'root':
  48. return unicode(_('Root Category'))
  49. return unicode(self.name)
  50. def set_description(self, description):
  51. self.description = description.strip()
  52. self.description_preparsed = ''
  53. if self.description:
  54. import markdown
  55. self.description_preparsed = markdown.markdown(description, safe_mode='escape', output_format=settings.OUTPUT_FORMAT)
  56. def copy_permissions(self, target):
  57. if target.pk != self.pk:
  58. for role in Role.objects.all():
  59. perms = role.get_permissions()
  60. try:
  61. perms['forums'][self.pk] = perms['forums'][target.pk]
  62. role.set_permissions(perms)
  63. role.save(force_update=True)
  64. except KeyError:
  65. pass
  66. def move_content(self, target):
  67. pass
  68. def prune(self):
  69. pass