mark collections

This commit is contained in:
Your Name 2022-05-12 08:14:05 -04:00
parent 3780ccc85d
commit c7da95a060
8 changed files with 133 additions and 98 deletions

View file

@ -76,3 +76,17 @@ class CollectionItem(models.Model):
self.song = None
self.game = None
setattr(self, new_item.__class__.__name__.lower(), new_item)
class CollectionMark(UserOwnedEntity):
collection = models.ForeignKey(
Collection, on_delete=models.CASCADE, related_name='collection_marks', null=True)
class Meta:
constraints = [
models.UniqueConstraint(
fields=['owner', 'collection'], name="unique_collection_mark")
]
def __str__(self):
return f"CollectionMark({self.id} {self.owner} {self.collection})"

View file

@ -93,6 +93,23 @@
</h5>
</div>
</div>
{% if request.user != collection.owner %}
<div class="action-panel">
<div class="action-panel__button-group action-panel__button-group--center">
{% if following %}
<form action="{% url 'collection:unfollow' collection.id %}" method="post">
{% csrf_token %}
<button class="action-panel__button">{% trans '取消关注' %}</button>
</form>
{% else %}
<form action="{% url 'collection:follow' collection.id %}" method="post">
{% csrf_token %}
<button class="action-panel__button">{% trans '关注' %}</button>
</form>
{% endif %}
</div>
</div>
{% endif %}
</div>
</div>
</div>

View file

@ -14,7 +14,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ site_name }} - {{ request.user.mastodon_username }}{% trans '的收藏' %}</title>
<title>{{ site_name }} - {{ title }}</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="{% static 'lib/js/rating-star.js' %}"></script>
<script src="{% static 'js/rating-star-readonly.js' %}"></script>
@ -33,7 +33,7 @@
<div class="main-section-wrapper">
<div class="entity-reviews">
<h5 class="entity-reviews__title entity-reviews__title--stand-alone">
{{ request.user.mastodon_username }}{% trans '的收藏单' %}
{{ title }}
</h5>
<ul class="entity-reviews__review-list">

View file

@ -152,8 +152,11 @@ def retrieve(request, id):
raise PermissionDenied()
form = CollectionForm(instance=collection)
followers = []
if request.user.is_authenticated:
following = True if CollectionMark.objects.filter(owner=request.user, collection=collection).first() is not None else False
followers = []
else:
following = False
followers = []
return render(
@ -164,7 +167,7 @@ def retrieve(request, id):
'form': form,
'editable': collection.is_editable_by(request.user),
'followers': followers,
'following': following,
}
)
else:
@ -219,28 +222,37 @@ def delete(request, id):
@login_required
def follow(request, id):
pass
CollectionMark.objects.create(owner=request.user, collection=Collection.objects.get(id=id))
return redirect(reverse("collection:retrieve", args=[id]))
@login_required
def unfollow(request, id):
pass
CollectionMark.objects.filter(owner=request.user, collection=Collection.objects.get(id=id)).delete()
return redirect(reverse("collection:retrieve", args=[id]))
@login_required
def list(request, user_id=None):
def list(request, user_id=None, marked=False):
if request.method == 'GET':
queryset = Collection.objects.filter(owner=request.user if user_id is None else User.objects.get(id=user_id))
user = request.user if user_id is None else User.objects.get(id=user_id)
if marked:
title = user.mastodon_username + _('关注的收藏单')
queryset = Collection.objects.filter(pk__in=CollectionMark.objects.filter(owner=user).values_list('collection', flat=True))
else:
title = user.mastodon_username + _('创建的收藏单')
queryset = Collection.objects.filter(owner=user)
paginator = Paginator(queryset, REVIEW_PER_PAGE)
page_number = request.GET.get('page', default=1)
reviews = paginator.get_page(page_number)
reviews.pagination = PageLinksGenerator(
collections = paginator.get_page(page_number)
collections.pagination = PageLinksGenerator(
PAGE_LINK_NUMBER, page_number, paginator.num_pages)
return render(
request,
'list.html',
{
'collections': queryset,
'collections': collections,
'title': title,
}
)
else:

View file

@ -38,7 +38,7 @@ from books.models import BookMark, BookReview
from movies.models import MovieMark, MovieReview
from games.models import GameMark, GameReview
from music.models import AlbumMark, SongMark, AlbumReview, SongReview
from collection.models import Collection #, CollectionMark
from collection.models import Collection, CollectionMark
from common.importers.goodreads import GoodreadsImporter
from common.importers.douban import DoubanImporter
@ -233,7 +233,7 @@ def clear_data(request):
GameReview.objects.filter(owner=request.user).delete()
AlbumReview.objects.filter(owner=request.user).delete()
SongReview.objects.filter(owner=request.user).delete()
# CollectionMark.objects.filter(owner=request.user).delete()
CollectionMark.objects.filter(owner=request.user).delete()
Collection.objects.filter(owner=request.user).delete()
request.user.first_name = request.user.username
request.user.last_name = request.user.mastodon_site

View file

@ -563,6 +563,35 @@
</ul>
</div>
<div class="entity-sort" id="collectionMarked">
<h5 class="entity-sort__label">
{% trans '关注的收藏单' %}
</h5>
<span class="entity-sort__count">
{{ marked_collections_count }}
</span>
{% if marked_collections_more %}
<a href="{% url 'users:marked_collection_list' user.mastodon_username %}"
class="entity-sort__more-link">{% trans '更多' %}</a>
{% endif %}
<ul class="entity-sort__entity-list">
{% for collection in marked_collections %}
<li class="entity-sort__entity">
<a href="{% url 'collection:retrieve' collection.id %}">
<img src="{{ collection.cover|thumb:'normal' }}"
alt="{{collection.title}}" class="entity-sort__entity-img">
<span class="entity-sort__entity-name"
title="{{collection.title}}">{{ collection.title }}</span>
</a>
</li>
{% empty %}
<div>暂无记录</div>
{% endfor %}
</ul>
</div>
</div>
{% if user == request.user %}

View file

@ -31,6 +31,7 @@ urlpatterns = [
path('<str:id>/followers/', followers, name='followers'),
path('<str:id>/following/', following, name='following'),
path('<str:id>/collections/', collection_list, name='collection_list'),
path('<str:id>/collections/marked/', marked_collection_list, name='marked_collection_list'),
path('<str:id>/book/<str:status>/', book_list, name='book_list'),
path('<str:id>/movie/<str:status>/', movie_list, name='movie_list'),
path('<str:id>/music/<str:status>/', music_list, name='music_list'),

View file

@ -43,6 +43,19 @@ from common.importers.goodreads import GoodreadsImporter
from common.importers.douban import DoubanImporter
def render_user_not_found(request):
msg = _("😖哎呀这位用户还没有加入本站快去联邦宇宙呼唤TA来注册吧")
sec_msg = _("")
return render(
request,
'common/error.html',
{
'msg': msg,
'secondary_msg': sec_msg,
}
)
def home_redirect(request, id):
try:
query_kwargs = {'pk': id}
@ -83,16 +96,7 @@ def home(request, id):
try:
user = User.objects.get(**query_kwargs)
except ObjectDoesNotExist:
msg = _("😖哎呀这位用户还没有加入本站快去联邦宇宙呼唤TA来注册吧")
sec_msg = _("目前支持来自Mastodon和Pleroma实例的用户注册")
return render(
request,
'common/error.html',
{
'msg': msg,
'secondary_msg': sec_msg,
}
)
return render_user_not_found(request)
# access one's own home page
if user == request.user:
@ -118,11 +122,8 @@ def home(request, id):
song_reviews = request.user.user_songreviews.all()
game_reviews = request.user.user_gamereviews.all()
latest_task = user.user_synctasks.order_by("-id").first()
# visit other's home page
else:
latest_task = None
# no these value on other's home page
reports = None
unread_announcements = None
@ -154,6 +155,8 @@ def home(request, id):
game_reviews = GameReview.get_available_by_user(user, relation['following'])
collections = Collection.objects.filter(owner=user)
marked_collections = Collection.objects.filter(pk__in=CollectionMark.objects.filter(owner=user).values_list('collection', flat=True))
# book marks
filtered_book_marks = filter_marks(book_marks, BOOKS_PER_SET, 'book')
book_marks_count = count_marks(book_marks, "book")
@ -225,10 +228,13 @@ def home(request, id):
'collections_count': collections.count(),
'collections_more': collections.count() > BOOKS_PER_SET,
'marked_collections': marked_collections.order_by("-edited_time")[:BOOKS_PER_SET],
'marked_collections_count': marked_collections.count(),
'marked_collections_more': marked_collections.count() > BOOKS_PER_SET,
'layout': layout,
'reports': reports,
'unread_announcements': unread_announcements,
'latest_task': latest_task,
}
)
else:
@ -296,16 +302,7 @@ def followers(request, id):
try:
user = User.objects.get(**query_kwargs)
except ObjectDoesNotExist:
msg = _("😖哎呀这位用户还没有加入本站快去联邦宇宙呼唤TA来注册吧")
sec_msg = _("目前只开放本站用户注册")
return render(
request,
'common/error.html',
{
'msg': msg,
'secondary_msg': sec_msg,
}
)
return render_user_not_found(request)
# mastodon request
if not user == request.user:
relation = get_relationship(request.user, user, request.user.mastodon_token)[0]
@ -348,16 +345,7 @@ def following(request, id):
try:
user = User.objects.get(**query_kwargs)
except ObjectDoesNotExist:
msg = _("😖哎呀这位用户还没有加入本站快去联邦宇宙呼唤TA来注册吧")
sec_msg = _("目前只开放本站用户注册")
return render(
request,
'common/error.html',
{
'msg': msg,
'secondary_msg': sec_msg,
}
)
return render_user_not_found(request)
# mastodon request
if not user == request.user:
relation = get_relationship(request.user, user, request.user.mastodon_token)[0]
@ -403,16 +391,7 @@ def book_list(request, id, status):
try:
user = User.objects.get(**query_kwargs)
except ObjectDoesNotExist:
msg = _("😖哎呀这位用户还没有加入本站快去联邦宇宙呼唤TA来注册吧")
sec_msg = _("目前只开放本站用户注册")
return render(
request,
'common/error.html',
{
'msg': msg,
'secondary_msg': sec_msg,
}
)
return render_user_not_found(request)
tag = request.GET.get('t', default='')
if user != request.user:
# mastodon request
@ -489,16 +468,7 @@ def movie_list(request, id, status):
try:
user = User.objects.get(**query_kwargs)
except ObjectDoesNotExist:
msg = _("😖哎呀这位用户还没有加入本站快去联邦宇宙呼唤TA来注册吧")
sec_msg = _("目前只开放本站用户注册")
return render(
request,
'common/error.html',
{
'msg': msg,
'secondary_msg': sec_msg,
}
)
return render_user_not_found(request)
tag = request.GET.get('t', default='')
if user != request.user:
# mastodon request
@ -575,16 +545,7 @@ def game_list(request, id, status):
try:
user = User.objects.get(**query_kwargs)
except ObjectDoesNotExist:
msg = _("😖哎呀这位用户还没有加入本站快去联邦宇宙呼唤TA来注册吧")
sec_msg = _("目前只开放本站用户注册")
return render(
request,
'common/error.html',
{
'msg': msg,
'secondary_msg': sec_msg,
}
)
return render_user_not_found(request)
tag = request.GET.get('t', default='')
if user != request.user:
# mastodon request
@ -661,16 +622,7 @@ def music_list(request, id, status):
try:
user = User.objects.get(**query_kwargs)
except ObjectDoesNotExist:
msg = _("😖哎呀这位用户还没有加入本站快去联邦宇宙呼唤TA来注册吧")
sec_msg = _("目前只开放本站用户注册")
return render(
request,
'common/error.html',
{
'msg': msg,
'secondary_msg': sec_msg,
}
)
return render_user_not_found(request)
tag = request.GET.get('t', default='')
if not user == request.user:
# mastodon request
@ -807,7 +759,7 @@ def manage_report(request):
@login_required
def collection_list(request, id):
from collection.views import list
from collection.views import list
if isinstance(id, str):
try:
username = id.split('@')[0]
@ -820,14 +772,24 @@ def collection_list(request, id):
try:
user = User.objects.get(**query_kwargs)
except ObjectDoesNotExist:
msg = _("😖哎呀这位用户还没有加入本站快去联邦宇宙呼唤TA来注册吧")
sec_msg = _("目前只开放本站用户注册")
return render(
request,
'common/error.html',
{
'msg': msg,
'secondary_msg': sec_msg,
}
)
return render_user_not_found(request)
return list(request, user.id)
@login_required
def marked_collection_list(request, id):
from collection.views import list
if isinstance(id, str):
try:
username = id.split('@')[0]
site = id.split('@')[1]
except IndexError as e:
return HttpResponseBadRequest("Invalid user id")
query_kwargs = {'username': username, 'mastodon_site': site}
elif isinstance(id, int):
query_kwargs = {'pk': id}
try:
user = User.objects.get(**query_kwargs)
except ObjectDoesNotExist:
return render_user_not_found(request)
return list(request, user.id, True)