rankmodel.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. from django.db import models, transaction
  2. from django.utils.translation import ugettext_lazy as _
  3. from misago.admin import site
  4. from misago.acl import cachebuster
  5. from misago.core.utils import slugify
  6. class RankManager(models.Manager):
  7. def default(self):
  8. return self.get(is_default=True)
  9. def make_rank_default(self, rank):
  10. with transaction.atomic():
  11. self.filter(is_default=True).update(is_default=False)
  12. rank.is_default = True
  13. rank.save(update_fields=['is_default'])
  14. class Rank(models.Model):
  15. name = models.CharField(max_length=255)
  16. slug = models.CharField(max_length=255)
  17. description = models.TextField(null=True, blank=True)
  18. title = models.CharField(max_length=255, null=True, blank=True)
  19. roles = models.ManyToManyField('acl.Role', null=True, blank=True)
  20. css_class = models.CharField(max_length=255, null=True, blank=True)
  21. is_default = models.BooleanField(default=False)
  22. is_tab = models.BooleanField(default=False)
  23. is_on_index = models.BooleanField(default=False)
  24. order = models.IntegerField(default=0)
  25. objects = RankManager()
  26. class Meta:
  27. app_label = 'users'
  28. get_latest_by = 'order'
  29. def __unicode__(self):
  30. return unicode(_(self.name))
  31. def save(self, *args, **kwargs):
  32. if not self.pk:
  33. self.set_order()
  34. else:
  35. cachebuster.invalidate()
  36. return super(Rank, self).save(*args, **kwargs)
  37. def delete(self, *args, **kwargs):
  38. cachebuster.invalidate()
  39. return super(Rank, self).delete(*args, **kwargs)
  40. def set_name(self, name):
  41. self.name = name
  42. self.slug = slugify(name)
  43. def set_order(self):
  44. try:
  45. self.order = Rank.objects.latest('order').order + 1
  46. except Rank.DoesNotExist:
  47. self.order = 0
  48. def next(self):
  49. try:
  50. return Rank.objects.filter(order__gt=self.order).earliest('order')
  51. except Rank.DoesNotExist:
  52. return None
  53. def prev(self):
  54. try:
  55. return Rank.objects.filter(order__lt=self.order).latest('order')
  56. except Rank.DoesNotExist:
  57. return None
  58. """register model in misago admin"""
  59. site.add_node(
  60. parent='misago:admin:users',
  61. namespace='misago:admin:users:ranks',
  62. link='misago:admin:users:ranks:index',
  63. name=_("Ranks"),
  64. after='misago:admin:users:accounts:index',
  65. icon='fa fa-graduation-cap')