rank.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. from django.db import models, transaction
  2. from django.urls import reverse
  3. from misago.acl.cache import clear_acl_cache
  4. from misago.core.utils import slugify
  5. class RankManager(models.Manager):
  6. def get_default(self):
  7. return self.get(is_default=True)
  8. def make_rank_default(self, rank):
  9. with transaction.atomic():
  10. self.filter(is_default=True).update(is_default=False)
  11. rank.is_default = True
  12. rank.save(update_fields=['is_default'])
  13. class Rank(models.Model):
  14. name = models.CharField(max_length=255)
  15. slug = models.CharField(unique=True, max_length=255)
  16. description = models.TextField(null=True, blank=True)
  17. title = models.CharField(max_length=255, null=True, blank=True)
  18. roles = models.ManyToManyField('misago_acl.Role', blank=True)
  19. css_class = models.CharField(max_length=255, null=True, blank=True)
  20. is_default = models.BooleanField(default=False)
  21. is_tab = models.BooleanField(default=False)
  22. order = models.IntegerField(default=0)
  23. objects = RankManager()
  24. class Meta:
  25. get_latest_by = 'order'
  26. def __str__(self):
  27. return self.name
  28. def save(self, *args, **kwargs):
  29. if not self.pk:
  30. self.set_order()
  31. else:
  32. clear_acl_cache()
  33. if not self.slug:
  34. self.slug = slugify(self.name)
  35. return super().save(*args, **kwargs)
  36. def delete(self, *args, **kwargs):
  37. clear_acl_cache()
  38. return super().delete(*args, **kwargs)
  39. def get_absolute_url(self):
  40. return reverse('misago:users-rank', kwargs={'slug': self.slug})
  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