prefix.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. from django.db import models
  2. from misago.core.cache import cache
  3. from misago.core.utils import slugify
  4. CACHE_NAME = 'misago_threads_prefixes'
  5. class PrefixManager(models.Manager):
  6. def get_forum_prefixes(self, forum):
  7. prefixes = []
  8. for prefix in self.get_cached_prefixes():
  9. if forum.pk in prefix.forums_ids:
  10. prefixes.append(prefix)
  11. return prefixes
  12. def get_cached_prefixes_dict(self):
  13. prefixes_dict = {}
  14. for prefix in self.get_cached_prefixes():
  15. prefixes_dict[prefix.pk] = prefix
  16. return prefixes_dict
  17. def get_cached_prefixes(self):
  18. prefixes = cache.get(CACHE_NAME, 'nada')
  19. if prefixes == 'nada':
  20. prefixes = []
  21. prefixes_qs = self.all().prefetch_related('forums')
  22. for prefix in prefixes_qs.order_by('name'):
  23. prefix.forums_ids = [f.pk for f in prefix.forums.all()]
  24. prefixes.append(prefix)
  25. cache.set(CACHE_NAME, prefixes)
  26. return prefixes
  27. def clear_cache(self):
  28. cache.delete(CACHE_NAME)
  29. class Prefix(models.Model):
  30. forums = models.ManyToManyField('misago_forums.Forum')
  31. name = models.CharField(max_length=255)
  32. slug = models.SlugField(max_length=255)
  33. css_class = models.CharField(max_length=255, null=True, blank=True)
  34. objects = PrefixManager()
  35. def save(self, *args, **kwargs):
  36. if self.pk:
  37. self.strip_inavailable_prefixes()
  38. Prefix.objects.clear_cache()
  39. return super(Prefix, self).save(*args, **kwargs)
  40. def delete(self, *args, **kwargs):
  41. Prefix.objects.clear_cache()
  42. return super(Prefix, self).delete(*args, **kwargs)
  43. def strip_inavailable_prefixes(self):
  44. qs = self.thread_set
  45. if self.forums:
  46. qs = qs.exclude(forum__in=self.forums.all())
  47. qs.update(prefix=None)
  48. def set_name(self, name):
  49. self.name = name
  50. self.slug = slugify(name)