label.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_labels'
  5. class LabelManager(models.Manager):
  6. def get_forum_labels(self, forum):
  7. labels = []
  8. for label in self.get_cached_labels():
  9. if forum.pk in label.forums_ids:
  10. labels.append(label)
  11. return labels
  12. def get_cached_labels_dict(self):
  13. return dict([(label.pk, label) for label in self.get_cached_labels()])
  14. def get_cached_labels(self):
  15. labels = cache.get(CACHE_NAME, 'nada')
  16. if labels == 'nada':
  17. labels = []
  18. labels_qs = self.all().prefetch_related('forums')
  19. for label in labels_qs.order_by('name'):
  20. label.forums_ids = [f.pk for f in label.forums.all()]
  21. labels.append(label)
  22. cache.set(CACHE_NAME, labels)
  23. return labels
  24. def clear_cache(self):
  25. cache.delete(CACHE_NAME)
  26. class Label(models.Model):
  27. forums = models.ManyToManyField('misago_forums.Forum')
  28. name = models.CharField(max_length=255)
  29. slug = models.SlugField(max_length=255)
  30. css_class = models.CharField(max_length=255, null=True, blank=True)
  31. objects = LabelManager()
  32. def __unicode__(self):
  33. return self.name
  34. def save(self, *args, **kwargs):
  35. if self.pk:
  36. self.strip_inavailable_labels()
  37. Label.objects.clear_cache()
  38. return super(Label, self).save(*args, **kwargs)
  39. def delete(self, *args, **kwargs):
  40. Label.objects.clear_cache()
  41. return super(Label, self).delete(*args, **kwargs)
  42. def strip_inavailable_labels(self):
  43. qs = self.thread_set
  44. if self.forums:
  45. qs = qs.exclude(forum__in=self.forums.all())
  46. qs.update(label=None)
  47. def set_name(self, name):
  48. self.name = name
  49. self.slug = slugify(name)