lib.itmens/journal/views/profile.py

113 lines
4 KiB
Python
Raw Normal View History

2023-08-10 14:56:38 -04:00
from django.contrib.auth.decorators import login_required
from django.core.exceptions import BadRequest, ObjectDoesNotExist, PermissionDenied
from django.http import Http404, HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, redirect, render
from django.utils.translation import gettext_lazy as _
from user_messages import api as msg
from catalog.models import *
2023-07-20 21:59:49 -04:00
from common.utils import AuthedHttpRequest
from users.models import APIdentity, User
2023-08-10 14:56:38 -04:00
from users.views import render_user_blocked, render_user_not_found
from ..forms import *
from ..models import *
2023-07-20 21:59:49 -04:00
from .common import render_list, target_identity_required
2023-08-10 14:56:38 -04:00
2023-07-20 21:59:49 -04:00
@target_identity_required
def profile(request: AuthedHttpRequest, user_name):
2023-08-10 14:56:38 -04:00
if request.method != "GET":
raise BadRequest()
2023-07-20 21:59:49 -04:00
target = request.target_identity
# if user.mastodon_acct != user_name and user.username != user_name:
# return redirect(user.url)
if not request.user.is_authenticated and target.preference.no_anonymous_view:
return render(request, "users/home_anonymous.html", {"user": target.user})
me = target.user == request.user
if not me and (
target.is_blocked_by(request.user.identity)
or target.is_blocking(request.user.identity)
2023-08-10 14:56:38 -04:00
):
return render_user_blocked(request)
2023-07-20 21:59:49 -04:00
qv = q_owned_piece_visible_to_user(request.user, target)
2023-08-10 14:56:38 -04:00
shelf_list = {}
visbile_categories = [
ItemCategory.Book,
ItemCategory.Movie,
ItemCategory.TV,
ItemCategory.Music,
ItemCategory.Podcast,
ItemCategory.Game,
ItemCategory.Performance,
]
for category in visbile_categories:
shelf_list[category] = {}
for shelf_type in ShelfType:
2023-07-20 21:59:49 -04:00
label = target.shelf_manager.get_label(shelf_type, category)
2023-08-10 14:56:38 -04:00
if label is not None:
2023-07-20 21:59:49 -04:00
members = target.shelf_manager.get_latest_members(
2023-08-10 14:56:38 -04:00
shelf_type, category
).filter(qv)
shelf_list[category][shelf_type] = {
"title": label,
"count": members.count(),
"members": members[:10].prefetch_related("item"),
}
2023-07-20 21:59:49 -04:00
reviews = Review.objects.filter(q_item_in_category(category)).order_by(
"-created_time"
2023-08-10 14:56:38 -04:00
)
shelf_list[category]["reviewed"] = {
"title": "评论过的" + category.label,
"count": reviews.count(),
"members": reviews[:10].prefetch_related("item"),
}
2023-07-20 21:59:49 -04:00
collections = Collection.objects.filter(qv).order_by("-created_time")
2023-08-10 14:56:38 -04:00
liked_collections = (
2023-07-20 21:59:49 -04:00
Like.user_likes_by_class(target, Collection)
2023-08-10 14:56:38 -04:00
.order_by("-edited_time")
.values_list("target_id", flat=True)
)
2023-07-20 21:59:49 -04:00
if not me:
liked_collections = liked_collections.filter(
q_piece_visible_to_user(request.user)
)
top_tags = target.tag_manager.public_tags[:10]
2023-08-10 14:56:38 -04:00
else:
2023-07-20 21:59:49 -04:00
top_tags = target.tag_manager.all_tags[:10]
2023-08-10 14:56:38 -04:00
return render(
request,
"profile.html",
{
2023-07-20 21:59:49 -04:00
"user": target.user,
2023-08-10 14:56:38 -04:00
"top_tags": top_tags,
"shelf_list": shelf_list,
"collections": collections[:10],
"collections_count": collections.count(),
"liked_collections": [
Collection.objects.get(id=i)
for i in liked_collections.order_by("-edited_time")[:10]
],
"liked_collections_count": liked_collections.count(),
2023-07-20 21:59:49 -04:00
"layout": target.preference.profile_layout,
2023-08-10 14:56:38 -04:00
},
)
def user_calendar_data(request, user_name):
if request.method != "GET":
raise BadRequest()
user = User.get(user_name)
if user is None or not request.user.is_authenticated:
return HttpResponse("")
2023-07-20 21:59:49 -04:00
max_visiblity = max_visiblity_to_user(request.user, user.identity)
2023-08-10 14:56:38 -04:00
calendar_data = user.shelf_manager.get_calendar_data(max_visiblity)
return render(
request,
"calendar_data.html",
{
"calendar_data": calendar_data,
},
)