X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/e977f7187b10b1bc0a30794cd585c6b840568996..cea1338141dcef9834201621c6a2b2cd9ee6b546:/src/documents/templatetags/book_list.py diff --git a/src/documents/templatetags/book_list.py b/src/documents/templatetags/book_list.py index acd22083..2261f5d6 100644 --- a/src/documents/templatetags/book_list.py +++ b/src/documents/templatetags/book_list.py @@ -1,12 +1,12 @@ # This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later. # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. # -from re import split -from django.db.models import Q, Count +import re +from django.db.models import Q, Count, F, Max from django import template -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.contrib.auth.models import User -from documents.models import Chunk, Image, Project +from documents.models import Book, Chunk, Image, Project register = template.Library() @@ -70,10 +70,20 @@ def foreign_filter(qs, value, filter_field, model, model_field='slug', unset='-' def search_filter(qs, value, filter_fields): if not value: return qs - q = Q(**{"%s__icontains" % filter_fields[0]: value}) - for field in filter_fields[1:]: - q |= Q(**{"%s__icontains" % field: value}) - return qs.filter(q) + + for word in value.split(): + m = re.match(r'(.+):(.+)', word) + if m is not None: + field = m.group(1) + value = m.group(2) + q = Book.q_dc(field, field + 's', value, 'book__') + else: + q = Q(**{"%s__icontains" % filter_fields[0]: value}) + for field in filter_fields[1:]: + q |= Q(**{"%s__icontains" % field: value}) + qs = qs.filter(q) + + return qs _states = [ @@ -127,9 +137,9 @@ def book_list(context, user=None): count=Count('chunk')).filter(count__gt=0).order_by( '-count', 'last_name', 'first_name'), "other_users": User.objects.annotate( - count=Count('chunk')).filter(count=0).order_by( - 'last_name', 'first_name'), - } + count=Count('chunk')).filter(count=0).annotate(m=Max('chunkchange__created_at')).order_by(F('m').desc(nulls_last=True), 'last_name', 'first_name'), + "active_users": User.objects.annotate(m=Max('chunkchange__created_at')).order_by(F('m').desc(nulls_last=True), 'last_name', 'first_name'), + } new_context.update({ "filters": True,