1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- from django.db import models
- from misago.core.cache import cache
- from misago.core.utils import slugify
- CACHE_NAME = 'misago_threads_labels'
- class LabelManager(models.Manager):
- def get_forum_labels(self, forum):
- labels = []
- for label in self.get_cached_labels():
- if forum.pk in label.forums_ids:
- labels.append(label)
- return labels
- def get_cached_labels_dict(self):
- return dict([(label.pk, label) for label in self.get_cached_labels()])
- def get_cached_labels(self):
- labels = cache.get(CACHE_NAME, 'nada')
- if labels == 'nada':
- labels = []
- labels_qs = self.all().prefetch_related('forums')
- for label in labels_qs.order_by('name'):
- label.forums_ids = [f.pk for f in label.forums.all()]
- labels.append(label)
- cache.set(CACHE_NAME, labels)
- return labels
- def clear_cache(self):
- cache.delete(CACHE_NAME)
- class Label(models.Model):
- forums = models.ManyToManyField('misago_forums.Forum')
- name = models.CharField(max_length=255)
- slug = models.SlugField(max_length=255)
- css_class = models.CharField(max_length=255, null=True, blank=True)
- objects = LabelManager()
- def __unicode__(self):
- return self.name
- def save(self, *args, **kwargs):
- if self.pk:
- self.strip_inavailable_labels()
- Label.objects.clear_cache()
- return super(Label, self).save(*args, **kwargs)
- def delete(self, *args, **kwargs):
- Label.objects.clear_cache()
- return super(Label, self).delete(*args, **kwargs)
- def strip_inavailable_labels(self):
- qs = self.thread_set
- if self.forums:
- qs = qs.exclude(forum__in=self.forums.all())
- qs.update(label=None)
- def set_name(self, name):
- self.name = name
- self.slug = slugify(name)
|