djangocms_blog/djangocms_blog/managers.py

160 lines
5.8 KiB
Python
Raw Normal View History

2014-01-04 17:07:09 +01:00
# -*- coding: utf-8 -*-
2014-10-05 08:25:18 +02:00
import django
2014-10-04 19:22:22 +02:00
from django.contrib.sites.models import Site
from django.db.models import Q
2014-01-22 18:33:45 +01:00
try:
from collections import Counter
except ImportError:
from .compat import Counter
2014-01-04 17:07:09 +01:00
from django.db import models
2014-08-13 23:59:08 +02:00
from django.utils.timezone import now
2014-09-01 10:45:10 +02:00
from parler.managers import TranslationManager, TranslatableQuerySet
2014-01-04 17:07:09 +01:00
class TaggedFilterItem(object):
def tagged(self, other_model=None, queryset=None):
"""
Restituisce una queryset di elementi del model taggati,
o con gli stessi tag di un model o un queryset
"""
tags = self._taglist(other_model, queryset)
2014-06-09 23:29:34 +02:00
return self.get_queryset().filter(taglist__in=tags)
2014-01-04 17:07:09 +01:00
def _taglist(self, other_model=None, queryset=None):
"""
Restituisce una lista di id di tag comuni al model corrente e al model
o queryset passati come argomento
"""
from taggit.models import TaggedItem
filtro = None
if queryset is not None:
filtro = set()
for item in queryset.all():
filtro.update(item.tags.all())
filtro = set([tag.id for tag in filtro])
elif other_model is not None:
filtro = set(TaggedItem.objects.filter(content_type__model=other_model.__name__.lower()).values_list('tag_id', flat=True))
tags = set(TaggedItem.objects.filter(content_type__model=self.model.__name__.lower()).values_list('tag_id', flat=True))
if filtro is not None:
tags = tags.intersection(filtro)
return list(tags)
def tag_list(self, other_model=None, queryset=None):
"""
Restituisce un queryset di tag comuni al model corrente e
al model o queryset passati come argomento
"""
from taggit.models import Tag
return Tag.objects.filter(id__in=self._taglist(other_model, queryset))
def tag_list_slug(self, other_model=None, queryset=None):
2014-02-02 16:22:22 +01:00
queryset = self.tag_list(other_model, queryset)
2014-09-05 08:28:10 +02:00
return queryset.values('slug')
2014-01-04 17:07:09 +01:00
def tag_cloud(self, other_model=None, queryset=None, published=True):
2014-01-04 17:07:09 +01:00
from taggit.models import TaggedItem
tag_ids = self._taglist(other_model, queryset)
kwargs = {}
if published:
kwargs = TaggedItem.bulk_lookup_kwargs(self.model.objects.published())
kwargs['tag_id__in'] = tag_ids
counted_tags = dict(TaggedItem.objects
.filter(**kwargs)
.values('tag')
.annotate(count=models.Count('tag'))
.values_list('tag', 'count'))
tags = TaggedItem.tag_model().objects.filter(pk__in=counted_tags.keys())
for tag in tags:
tag.count = counted_tags[tag.pk]
return sorted(tags, key=lambda x: -x.count)
2014-01-04 17:07:09 +01:00
2014-09-01 10:45:10 +02:00
class GenericDateQuerySet(TranslatableQuerySet):
2014-09-05 08:28:10 +02:00
start_date_field = 'date_published'
end_date_field = 'date_published_end'
publish_field = 'publish'
2014-01-04 17:07:09 +01:00
2014-10-04 19:22:22 +02:00
def on_site(self):
2014-10-04 20:05:17 +02:00
return self.filter(Q(sites__isnull=True) | Q(sites=Site.objects.get_current().pk))
2014-10-04 19:22:22 +02:00
2014-09-01 10:45:10 +02:00
def published(self):
queryset = self.published_future()
2014-01-04 17:07:09 +01:00
if self.start_date_field:
2014-02-02 16:22:22 +01:00
return queryset.filter(
2014-09-05 08:28:10 +02:00
**{'%s__lte' % self.start_date_field: now()})
2014-01-04 17:07:09 +01:00
else:
2014-02-02 16:22:22 +01:00
return queryset
2014-01-04 17:07:09 +01:00
2014-09-01 10:45:10 +02:00
def published_future(self):
2014-10-04 19:22:22 +02:00
queryset = self.on_site()
2014-01-04 17:07:09 +01:00
if self.end_date_field:
qfilter = (
2014-09-05 08:28:10 +02:00
models.Q(**{'%s__gte' % self.end_date_field: now()})
| models.Q(**{'%s__isnull' % self.end_date_field: True})
2014-01-04 17:07:09 +01:00
)
2014-02-02 16:22:22 +01:00
queryset = queryset.filter(qfilter)
return queryset.filter(**{self.publish_field: True})
2014-01-04 17:07:09 +01:00
2014-09-01 10:45:10 +02:00
def archived(self):
2014-10-04 19:22:22 +02:00
queryset = self.on_site()
2014-01-04 17:07:09 +01:00
if self.end_date_field:
qfilter = (
2014-09-05 08:28:10 +02:00
models.Q(**{'%s__lte' % self.end_date_field: now()})
| models.Q(**{'%s__isnull' % self.end_date_field: False})
2014-01-04 17:07:09 +01:00
)
2014-02-02 16:22:22 +01:00
queryset = queryset.filter(qfilter)
return queryset.filter(**{self.publish_field: True})
2014-01-04 17:07:09 +01:00
2014-09-01 10:45:10 +02:00
def available(self):
2014-10-04 19:22:22 +02:00
return self.on_site().filter(**{self.publish_field: True})
2014-09-01 10:45:10 +02:00
def filter_by_language(self, language):
2014-10-04 19:22:22 +02:00
return self.active_translations(language_code=language).on_site()
2014-09-01 10:45:10 +02:00
class GenericDateTaggedManager(TaggedFilterItem, TranslationManager):
use_for_related_fields = True
queryset_class = GenericDateQuerySet
def get_queryset(self, *args, **kwargs):
try:
return super(GenericDateTaggedManager, self).get_queryset(*args, **kwargs)
2014-10-05 08:52:04 +02:00
except AttributeError: # pragma: no cover
2014-09-01 10:45:10 +02:00
return super(GenericDateTaggedManager, self).get_query_set(*args, **kwargs)
2014-10-05 08:25:18 +02:00
if django.VERSION < (1, 8):
get_query_set = get_queryset
2014-09-01 10:45:10 +02:00
def published(self):
return self.get_queryset().published()
def available(self):
return self.get_queryset().available()
def archived(self):
return self.get_queryset().archived()
def published_future(self):
return self.get_queryset().published_future()
2014-01-04 17:07:09 +01:00
def filter_by_language(self, language):
2014-09-01 10:45:10 +02:00
return self.get_queryset().filter_by_language(language)
2014-01-04 17:07:09 +01:00
def get_months(self, queryset=None):
2014-09-05 08:28:10 +02:00
"""
Get months with aggregate count (how much posts is in the month). Results are ordered by date.
"""
2014-02-02 16:22:22 +01:00
if queryset is None:
2014-06-09 23:29:34 +02:00
queryset = self.get_queryset()
2014-10-04 19:22:22 +02:00
queryset = queryset.on_site()
2014-09-01 10:45:10 +02:00
dates = queryset.values_list(queryset.start_date_field, flat=True)
2014-01-04 17:07:09 +01:00
dates = [(x.year, x.month) for x in dates]
date_counter = Counter(dates)
dates = set(dates)
dates = sorted(dates, reverse=True)
2014-08-13 23:59:08 +02:00
return [{'date': now().replace(year=year, month=month, day=1),
2014-01-04 17:07:09 +01:00
'count': date_counter[year, month]} for year, month in dates]