rank.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from django.db import models, transaction
  2. from misago.acl import version as acl_version
  3. from misago.core.cache import cache
  4. from misago.core.utils import slugify
  5. __all__ = [
  6. 'Rank'
  7. ]
  8. class RankManager(models.Manager):
  9. def get_default(self):
  10. return self.get(is_default=True)
  11. def make_rank_default(self, rank):
  12. with transaction.atomic():
  13. self.filter(is_default=True).update(is_default=False)
  14. rank.is_default = True
  15. rank.save(update_fields=['is_default'])
  16. class Rank(models.Model):
  17. name = models.CharField(max_length=255)
  18. slug = models.CharField(max_length=255)
  19. description = models.TextField(null=True, blank=True)
  20. title = models.CharField(max_length=255, null=True, blank=True)
  21. roles = models.ManyToManyField('misago_acl.Role', null=True, blank=True)
  22. css_class = models.CharField(max_length=255, null=True, blank=True)
  23. is_default = models.BooleanField(default=False)
  24. is_tab = models.BooleanField(default=False)
  25. is_on_index = models.BooleanField(default=False)
  26. order = models.IntegerField(default=0)
  27. objects = RankManager()
  28. class Meta:
  29. get_latest_by = 'order'
  30. def __unicode__(self):
  31. return self.name
  32. def save(self, *args, **kwargs):
  33. if not self.pk:
  34. self.set_order()
  35. else:
  36. acl_version.invalidate()
  37. return super(Rank, self).save(*args, **kwargs)
  38. def delete(self, *args, **kwargs):
  39. acl_version.invalidate()
  40. return super(Rank, self).delete(*args, **kwargs)
  41. def set_name(self, name):
  42. self.name = name
  43. self.slug = slugify(name)
  44. def set_order(self):
  45. try:
  46. self.order = Rank.objects.latest('order').order + 1
  47. except Rank.DoesNotExist:
  48. self.order = 0