warnlevelmodel.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from django.core.cache import cache
  2. from django.db import models
  3. from django.utils.datastructures import SortedDict
  4. from misago.thread import local
  5. _thread_local = local()
  6. class WarnLevelManager(models.Manager):
  7. def get_levels(self):
  8. try:
  9. return _thread_local._misago_warning_levels
  10. except AttributeError:
  11. _thread_local._misago_warning_levels = self.fetch_levels()
  12. return _thread_local._misago_warning_levels
  13. def get_level(self, level):
  14. return self.get_levels().get(level)
  15. def fetch_levels(self):
  16. from_cache = cache.get('warning_levels', 'nada')
  17. if from_cache != 'nada':
  18. return from_cache
  19. from_db = self.fetch_levels_from_db()
  20. cache.set('warning_levels', from_db)
  21. return from_db
  22. def fetch_levels_from_db(self):
  23. fetched_levels = SortedDict()
  24. for level in self.order_by('warning_level').iterator():
  25. fetched_levels[level.warning_level] = level
  26. return fetched_levels
  27. class WarnLevel(models.Model):
  28. RESTRICT_NO = 0
  29. RESTRICT_MODERATOR_REVIEW = 1
  30. RESTRICT_DISALLOW = 2
  31. name = models.CharField(max_length=255)
  32. slug = models.SlugField(max_length=255)
  33. description = models.TextField(null=True, blank=True)
  34. warning_level = models.PositiveIntegerField(default=1, db_index=True)
  35. expires_after_minutes = models.PositiveIntegerField(default=0)
  36. restrict_posting_replies = models.PositiveIntegerField(default=RESTRICT_NO)
  37. restrict_posting_threads = models.PositiveIntegerField(default=RESTRICT_NO)
  38. objects = WarnLevelManager()
  39. class Meta:
  40. app_label = 'misago'
  41. def save(self, *args, **kwargs):
  42. super(WarnLevel, self).save(*args, **kwargs)
  43. cache.delete('warning_levels')
  44. def delete(self, *args, **kwargs):
  45. super(WarnLevel, self).delete(*args, **kwargs)
  46. cache.delete('warning_levels')