Source code for shuup.core.utils.query

from collections import OrderedDict

from django.db import connection

from shuup.utils.dates import parse_date


[docs] def group_by_period(queryset, column, period, **annotate): """ Group and annotate given queryset by a given date period. :param queryset: Original queryset :type queryset: django.db.QuerySet :param column: Column for grouping :type column: str :param period: Period for grouping ('year', 'month', 'day') :type period: str :param annotate: Dict for `.annotate()` :type annotate: dict[str,str] :return: OrderedDict of period -> annotate columns :rtype: collections.OrderedDict """ # Based on http://stackoverflow.com/a/8746532/51685 d = OrderedDict() for line in ( queryset.extra({"period_group": connection.ops.date_trunc_sql(period, column)}) .values("period_group") .annotate(**annotate) .order_by("period_group") .values(*["period_group"] + list(annotate.keys())) ): d[parse_date(line.pop("period_group"))] = line return d