various collection fixes
This commit is contained in:
parent
733129c025
commit
3c078aa2bc
7 changed files with 137 additions and 31 deletions
|
@ -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)
|
||||
|
|
|
@ -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 '提交' %}">
|
||||
|
|
|
@ -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>
|
||||
|
|
56
journal/templates/collection_share.html
Normal file
56
journal/templates/collection_share.html
Normal 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>
|
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue