various collection fixes

This commit is contained in:
Your Name 2023-01-16 14:03:27 -05:00 committed by Henri Dickson
parent 733129c025
commit 3c078aa2bc
7 changed files with 137 additions and 31 deletions

View file

@ -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)

View file

@ -34,7 +34,7 @@
<option value="0">新建收藏单</option>
</select>
<div>
<textarea type="text" name="comment" placeholder="条目备注"></textarea>
<textarea type="text" name="note" placeholder="条目备注"></textarea>
</div>
<div class="add-to-list-modal__confirm-button">
<input type="submit" class="button float-right" value="{% trans '提交' %}">

View file

@ -7,6 +7,7 @@
{% load oauth_token %}
{% load truncate %}
{% load thumb %}
{% load collection %}
<!DOCTYPE html>
<html lang="en">
@ -87,6 +88,13 @@
{% if follower_count %}
被 {{ follower_count }} 人关注
{% endif %}
<p>
{% for cat, count in collection.get_summary.items %}
{% if count %}
{{count}}{{cat|prural_items}}
{% endif %}
{% endfor %}
</p>
</div>
</div>
</div>
@ -151,7 +159,7 @@
{% endif %}
{% if request.user.is_authenticated %}
<!-- <div class="aside-section-wrapper">
<div class="aside-section-wrapper">
<div class="action-panel">
<div class="action-panel__button-group action-panel__button-group--center">
<form>
@ -159,7 +167,7 @@
</form>
</div>
</div>
</div> -->
</div>
{% endif %}
</div>

View file

@ -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 %}
<div id="modal" _="on closeModal add .closing then wait for animationend then remove me">
<div class="modal-underlay" _="on click trigger closeModal"></div>
<div class="modal-content">
<div class="add-to-list-modal__head">
<span class="add-to-list-modal__title">{% trans '分享收藏单' %} - {{ collection.title }}</span>
<span class="add-to-list-modal__close-button modal-close" _="on click trigger closeModal">
<span class="icon-cross">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
<polygon
points="20 2.61 17.39 0 10 7.39 2.61 0 0 2.61 7.39 10 0 17.39 2.61 20 10 12.61 17.39 20 20 17.39 12.61 10 20 2.61">
</polygon>
</svg>
</span>
</span>
</div>
<div class="add-to-list-modal__body">
<form action="{% url 'journal:collection_share' collection.uuid %}" method="post">
{% csrf_token %}
<div>
<label for="id_visibility_0">分享可见性(不同于收藏单本身的权限):</label>
<ul id="id_visibility">
<li><label for="id_visibility_0"><input type="radio" name="visibility" value="0" required="" id="id_visibility_0" {% if collection.visibility == 0 %}checked{% endif %}>
公开</label>
</li>
<li><label for="id_visibility_1"><input type="radio" name="visibility" value="1" required="" id="id_visibility_1" {% if collection.visibility == 1 %}checked{% endif %}>
仅关注者</label>
</li>
<li><label for="id_visibility_2"><input type="radio" name="visibility" value="2" required="" id="id_visibility_2" {% if collection.visibility == 2 %}checked{% endif %}>
仅自己</label>
</li>
</ul>
</div>
<div>
<textarea type="text" name="comment" placeholder="分享附言"></textarea>
</div>
<div class="add-to-list-modal__confirm-button">
<input type="submit" class="button float-right" value="{% trans '提交' %}">
</div>
</form>
</div>
</div>
</div>

View file

@ -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

View file

@ -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):

View file

@ -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