diff --git a/catalog/templates/_item_card_metadata_collection.html b/catalog/templates/_item_card_metadata_collection.html index 9fcc2644..cc722b35 100644 --- a/catalog/templates/_item_card_metadata_collection.html +++ b/catalog/templates/_item_card_metadata_collection.html @@ -1,13 +1,23 @@ {% extends "_item_card_metadata_base.html" %} {% load humanize %} +{% load collection %} {% load i18n %} {% block brief %} -
- {% if item.rating %} - {{ item.rating | floatformat:1 }} ({{ item.rating_count }} {% trans "ratings" %}) - {% endif %} - {% include '_people.html' with people=item.host role='host' max=5 %} -
+ {% with collection=item.journal_item %} +
+ + {{ collection.owner.display_name }} + @{{ collection.owner.handle }} + + + {% for cat, count in collection.get_summary.items %} + {% if count %} + {% prural_items count cat %}   + {% endif %} + {% endfor %} + +
+ {% endwith %} {% endblock brief %} {% block full %}
diff --git a/journal/models/index.py b/journal/models/index.py index 75f5fae9..e9dd21d3 100644 --- a/journal/models/index.py +++ b/journal/models/index.py @@ -1,9 +1,12 @@ import re +from datetime import datetime from functools import cached_property, reduce from typing import TYPE_CHECKING, Iterable +from dateutil.relativedelta import relativedelta from django.db.models import QuerySet +from catalog.common.models import item_categories from catalog.models import Item from common.models import Index, SearchResult, int_, uniq from takahe.models import Post @@ -305,7 +308,7 @@ class JournalIndex(Index): class QueryParser: - fields = ["status", "rating", "tag", "category", "type"] + fields = ["status", "rating", "tag", "category", "type", "date"] @classmethod def re(cls): @@ -326,7 +329,7 @@ class QueryParser: v = list( set(self.filters.get("status", "").split(",")) - & {"wishlist", "progress", "complete"} + & {"wishlist", "progress", "complete", "dropped"} ) if v: self.filter_by["shelf_type"] = v @@ -349,8 +352,77 @@ class QueryParser: v = self.filters.get("rating", "").split("..") if len(v) == 2: v = map(int_, v) - self.filter_by["rating"] = ["..".join(map(str, v))] + if all([i >= 0 and i <= 10 for i in v]): + self.filter_by["rating"] = ["..".join(map(str, v))] elif len(v) == 1: - v = int_(v[0]) - if v: + v = int_(v[0], -1) + if v >= 0 and v <= 10: self.filter_by["rating"] = [v] + + # v = self.filters.get("category", "").split(",") + + v = self.filters.get("date", "").split("..") + if len(v) == 2: + start = self.start_date_to_int(v[0]) + end = self.end_date_to_int(v[1]) + elif len(v) == 1: + start, end = self.date_to_int_range(v[0]) + else: + start, end = 0, 0 + if start and end: + self.filter_by["created"] = [f"{start}..{end}"] + + v = self.filters.get("category", "").split(",") + if v: + cats = { + c.value: [ic.__name__ for ic in cl] + for c, cl in item_categories().items() + } + v = list(set(v) & cats.keys()) + v = reduce(lambda a, b: a + b, [cats[i] for i in v], []) + self.filter_by["item_class"] = v + + def start_date_to_int(self, date: str) -> int: + try: + if re.match(r"\d{4}-\d{1,2}-\d{1,2}", date): + d = datetime.strptime(date, "%Y-%m-%d") + elif re.match(r"\d{4}-\d{1,2}", date): + d = datetime.strptime(date, "%Y-%m") + elif re.match(r"\d{4}", date): + d = datetime.strptime(date, "%Y") + else: + return 0 + return int(d.timestamp()) + except ValueError: + return 0 + + def end_date_to_int(self, date: str) -> int: + try: + if re.match(r"\d{4}-\d{1,2}-\d{1,2}", date): + d = datetime.strptime(date, "%Y-%m-%d") + relativedelta(days=1) + elif re.match(r"\d{4}-\d{1,2}", date): + d = datetime.strptime(date, "%Y-%m") + relativedelta(months=1) + elif re.match(r"\d{4}", date): + d = datetime.strptime(date, "%Y") + relativedelta(years=1) + else: + return 0 + return int(d.timestamp()) - 1 + except ValueError: + return 0 + + def date_to_int_range(self, date: str) -> tuple[int, int]: + try: + if re.match(r"\d{4}-\d{1,2}-\d{1,2}", date): + start = datetime.strptime(date, "%Y-%m-%d") + end = start + relativedelta(days=1) + elif re.match(r"\d{4}-\d{1,2}", date): + start = datetime.strptime(date, "%Y-%m") + end = start + relativedelta(months=1) + elif re.match(r"\d{4}", date): + start = datetime.strptime(date, "%Y") + end = start + relativedelta(years=1) + else: + return 0, 0 + return int(start.timestamp()), int(end.timestamp()) - 1 + except ValueError: + return 0, 0