mark collections
This commit is contained in:
parent
3780ccc85d
commit
c7da95a060
8 changed files with 133 additions and 98 deletions
|
@ -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})"
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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'),
|
||||
|
|
132
users/views.py
132
users/views.py
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue