Source code for evileg_core.managers

# -*- coding: utf-8 -*-


from django.db import models
from django.db.models import Q


[docs]class EPostManager(models.Manager): """ EPostManager is a manager for search in ESNF-C models. It is set to EAbstractPost. It searches content by lookup fields, related lookup fields, user, and pub_date range """ use_for_related_fields = True
[docs] def search(self, query=None, in_related=False, user=None, approved=True, date_from=None, date_to=None, select_related=None, prefetch_related=None, only=None, order_by=None, distinct=False, annotation=None, **kwargs): """ Method for search content :param query: search request :param in_related: True if you want search content by by fields in related content :param user: search by user :param approved: select only approved content :param date_from: "From date" for pub_date range searching :param date_to: "To date" for pub_date range searching :param select_related: list of select related query sets :param prefetch_related: list of prefetch related query sets :param order_by: list of fields for ordering :return: QuerySet of model objects """ qs = self.approved() if approved else self.get_queryset() if query is not None: or_lookup = Q() if self.model.lookup_fields: for field in self.model.lookup_fields: or_lookup |= Q(**{"{}__icontains".format(field): query}) if in_related and self.model.related_lookup_fields: for related_field in self.model.related_lookup_fields: or_lookup |= Q(**{"{}__icontains".format(related_field): query}) qs = qs.filter(or_lookup) if user is not None: qs = qs.filter(user=user) if date_from is not None and date_to is not None: qs = qs.filter(pub_date__range=[date_from, date_to]) if annotation: qs = qs.annotate(**annotation) if select_related: qs = qs.select_related(*select_related) if prefetch_related: qs = qs.prefetch_related(*prefetch_related) if only: qs = qs.only(*only) if order_by: qs = qs.order_by(*order_by) if distinct: qs = qs.distinct() return qs
[docs] def approved(self): """ Method for return approved content, like is published content or moderated content Override it by your needs :return: QuerySet of model objects """ return self.get_queryset()
[docs]class EActivityManager(models.Manager): """ EActivityManager is a manager for search in ESNF-C activity models. It is set to EAbstractActivity. It searches content by lookup fields, related lookup fields, and pub_date range in targeted model """ use_for_related_fields = True
[docs] def search(self, model=None, query=None, in_related=False, date_from=None, date_to=None, approved_dict=None, prefetch_related=None, only=None, **kwargs): model_name = model.__name__.lower() qs = self.get_queryset().filter(content_type__model=model_name).order_by("-{}s__pub_date".format(model_name)) if query is not None: or_lookup = Q() if model.lookup_fields: for field in model.lookup_fields: or_lookup |= Q(**{"{}s__{}__icontains".format(model_name, field): query}) if in_related and model.related_lookup_fields: for related_field in model.related_lookup_fields: or_lookup |= Q(**{"{}s__{}__icontains".format(model_name, related_field): query}) qs = qs.filter(or_lookup) if date_from is not None and date_to is not None: qs = qs.filter({"{}s__pub_date__range".format(model_name): [date_from, date_to]}) if approved_dict: qs = qs.filter(**{"{}s__{}".format(model_name, field_name): condition for field_name, condition in approved_dict.items()}) if prefetch_related: qs = qs.prefetch_related(*prefetch_related) if only: qs = qs.only(*only) return qs
[docs] def by_users(self, q, select_related=None, only=None): qs = self.get_queryset() if q: qs = qs.filter(Q(user__username__icontains=q) | Q(user__first_name__icontains=q) | Q(user__last_name__icontains=q)) if select_related: qs = qs.select_related(*select_related) if only: qs = qs.only(*only) return qs.order_by('user__username')