diff --git a/journal/models.py b/journal/models.py index 99f40d7e..bcdc6b99 100644 --- a/journal/models.py +++ b/journal/models.py @@ -358,27 +358,33 @@ class List(Piece): def get_member_for_item(self, item): return self.members.filter(item=item).first() + def get_summary(self): + summary = {k: 0 for k in ItemCategory.values} + for c in self.recent_items: + summary[c.category] += 1 + return summary + def append_item(self, item, **params): """ named metadata fields should be specified directly, not in metadata dict! e.g. collection.append_item(item, note="abc") works, but collection.append_item(item, metadata={"note":"abc"}) doesn't """ - if item is None or self.get_member_for_item(item): + if item is None: return None - else: - ml = self.ordered_members - p = {"parent": self} - p.update(params) - member = self.MEMBER_CLASS.objects.create( - owner=self.owner, - position=ml.last().position + 1 if ml.count() else 1, - item=item, - **p, - ) - list_add.send( - sender=self.__class__, instance=self, item=item, member=member - ) + member = self.get_member_for_item(item) + if member: return member + ml = self.ordered_members + p = {"parent": self} + p.update(params) + member = self.MEMBER_CLASS.objects.create( + owner=self.owner, + position=ml.last().position + 1 if ml.count() else 1, + item=item, + **p, + ) + list_add.send(sender=self.__class__, instance=self, item=item, member=member) + return member def remove_item(self, item): member = self.get_member_for_item(item) diff --git a/journal/templates/add_to_collection.html b/journal/templates/add_to_collection.html index 363f96aa..02cd7768 100644 --- a/journal/templates/add_to_collection.html +++ b/journal/templates/add_to_collection.html @@ -34,7 +34,7 @@
- +
diff --git a/journal/templates/collection.html b/journal/templates/collection.html index 7f46f180..bc7cbd7e 100644 --- a/journal/templates/collection.html +++ b/journal/templates/collection.html @@ -7,6 +7,7 @@ {% load oauth_token %} {% load truncate %} {% load thumb %} +{% load collection %} @@ -87,6 +88,13 @@ {% if follower_count %} 被 {{ follower_count }} 人关注 {% endif %} +

+ {% for cat, count in collection.get_summary.items %} + {% if count %} + {{count}}{{cat|prural_items}} + {% endif %} + {% endfor %} +

@@ -151,7 +159,7 @@ {% endif %} {% if request.user.is_authenticated %} - + {% endif %} diff --git a/journal/templates/collection_share.html b/journal/templates/collection_share.html new file mode 100644 index 00000000..02bd7ec9 --- /dev/null +++ b/journal/templates/collection_share.html @@ -0,0 +1,56 @@ +{% load static %} +{% load i18n %} +{% load l10n %} +{% load humanize %} +{% load admin_url %} +{% load mastodon %} +{% load oauth_token %} +{% load truncate %} +{% load highlight %} +{% load thumb %} + + diff --git a/journal/templatetags/collection.py b/journal/templatetags/collection.py index b1b61bfc..44558142 100644 --- a/journal/templatetags/collection.py +++ b/journal/templatetags/collection.py @@ -1,6 +1,6 @@ from django import template from journal.models import Collection, Like -from django.shortcuts import reverse +from django.template.defaultfilters import stringfilter register = template.Library() @@ -16,3 +16,26 @@ def user_progress_of(collection, user): return ( collection.get_progress_for_user(user) if user and user.is_authenticated else 0 ) + + +@register.filter(is_safe=True) +@stringfilter +def prural_items(category): + # TODO support i18n here + # return _(f"items of {category}") + if category == "book": + return "本书" + elif category == "movie": + return "部电影" + elif category == "tv": + return "部剧集" + elif category == "album": + return "张专辑" + elif category == "game": + return "个游戏" + elif category == "podcast": + return "个播客" + elif category == "performance": + return "场演出" + else: + return category diff --git a/journal/views.py b/journal/views.py index 0256e9f7..6c0c3f85 100644 --- a/journal/views.py +++ b/journal/views.py @@ -21,7 +21,7 @@ from django.db.models import Q from management.models import Announcement from django.utils.baseconv import base62 from .forms import * -from mastodon.api import share_review +from mastodon.api import share_review, share_collection from users.views import render_user_blocked, render_user_not_found from users.models import User, Report, Preference from common.utils import PageLinksGenerator @@ -91,7 +91,7 @@ def add_to_collection(request, item_uuid): owner=request.user, title=f"{request.user.username}的收藏单" ).id collection = Collection.objects.get(owner=request.user, id=cid) - collection.append_item(item, metadata={"comment": request.POST.get("comment")}) + collection.append_item(item, note=request.POST.get("note")) return HttpResponseRedirect(request.META.get("HTTP_REFERER")) @@ -240,7 +240,24 @@ def collection_remove_featured(request, collection_uuid): def collection_share(request, collection_uuid): - pass + collection = ( + get_object_or_404(Collection, uid=base62.decode(collection_uuid)) + if collection_uuid + else None + ) + if collection and not collection.is_visible_to(request.user): + raise PermissionDenied() + if request.method == "GET": + return render(request, "collection_share.html", {"collection": collection}) + elif request.method == "POST": + visibility = int(request.POST.get("visibility", default=0)) + comment = request.POST.get("comment") + if share_collection(collection, comment, request.user, visibility): + return HttpResponseRedirect(request.META.get("HTTP_REFERER")) + else: + return render_relogin(request) + else: + return HttpResponseBadRequest() def collection_retrieve_items(request, collection_uuid, edit=False, msg=None): diff --git a/mastodon/api.py b/mastodon/api.py index 32f89627..9149ad7d 100644 --- a/mastodon/api.py +++ b/mastodon/api.py @@ -555,18 +555,14 @@ def share_collection(collection, comment, user, visibility_no): if user.get_preference().mastodon_append_tag else "" ) - content = f"分享收藏单《{collection.title}》\n{collection.absolute_url}\n{comment}{tags}" + user_str = ( + "我" + if user == collection.owner + else " @" + collection.owner.mastodon_username + " " + ) + content = f"分享{user_str}的收藏单《{collection.title}》\n{collection.absolute_url}\n{comment}{tags}" response = post_toot(user.mastodon_site, content, visibility, user.mastodon_token) if response and response.status_code in [200, 201]: - j = response.json() - if "url" in j: - shared_link = j["url"] - elif "data" in j: - shared_link = ( - f"https://twitter.com/{user.username}/status/{j['data']['id']}" - ) - if shared_link: - pass return True else: return False