warnlevelmodel.py 2.0 KB

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