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 @@
-
+
@@ -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 %}
+
+
+
+
+
+
{% trans '分享收藏单' %} - {{ collection.title }}
+
+
+
+
+
+
+
+
+
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