from django.core.cache import cache from django.db import models from django.utils.datastructures import SortedDict from misago.thread import local _thread_local = local() class WarnLevelManager(models.Manager): def get_levels(self): try: return _thread_local._misago_warning_levels except AttributeError: _thread_local._misago_warning_levels = self.fetch_levels() return _thread_local._misago_warning_levels def get_level(self, level): return self.get_levels().get(level) def fetch_levels(self): from_cache = cache.get('warning_levels', 'nada') if from_cache != 'nada': return from_cache from_db = self.fetch_levels_from_db() cache.set('warning_levels', from_db) return from_db def fetch_levels_from_db(self): fetched_levels = SortedDict() for level in self.order_by('warning_level').iterator(): fetched_levels[level.warning_level] = level return fetched_levels class WarnLevel(models.Model): name = models.CharField(max_length=255) slug = models.SlugField(max_length=255) description = models.TextField(null=True, blank=True) warning_level = models.PositiveIntegerField(default=1, db_index=True) expires_after_minutes = models.PositiveIntegerField(default=0) inhibit_posting_replies = models.PositiveIntegerField(default=0) inhibit_posting_threads = models.PositiveIntegerField(default=0) objects = WarnLevelManager() class Meta: app_label = 'misago' def save(self, *args, **kwargs): super(WarnLevel, self).save(*args, **kwargs) cache.delete('warning_levels') def delete(self, *args, **kwargs): super(WarnLevel, self).delete(*args, **kwargs) cache.delete('warning_levels')