lib.itmens/journal/views/common.py

143 lines
4.4 KiB
Python
Raw Normal View History

2023-10-30 00:59:54 -04:00
import datetime
2023-08-10 14:56:38 -04:00
from django.contrib.auth.decorators import login_required
2024-07-03 00:07:07 -04:00
from django.core.exceptions import BadRequest, PermissionDenied
2023-12-30 22:20:15 -05:00
from django.db.models import F, Min, OuterRef, Subquery
2023-08-10 14:56:38 -04:00
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse
2024-06-07 22:29:10 -04:00
from django.utils.translation import gettext as _
2024-04-23 23:57:49 -04:00
from django.views.decorators.http import require_http_methods
2023-08-10 14:56:38 -04:00
from catalog.models import *
2023-08-13 23:11:12 -04:00
from common.utils import (
AuthedHttpRequest,
2024-10-27 14:45:18 -04:00
CustomPaginator,
2023-08-13 23:11:12 -04:00
PageLinksGenerator,
get_uuid_or_404,
target_identity_required,
)
2023-08-10 14:56:38 -04:00
from ..forms import *
from ..models import *
PAGE_SIZE = 10
def render_relogin(request):
return render(
request,
"common/error.html",
{
2024-07-03 00:07:07 -04:00
"url": reverse("mastodon:connect")
+ "?domain="
+ request.user.mastodon.domain,
2024-06-16 21:54:20 -04:00
"msg": _("Data saved but unable to crosspost to Fediverse instance."),
2023-08-10 14:56:38 -04:00
"secondary_msg": _(
2024-05-25 23:38:11 -04:00
"Redirecting to your Fediverse instance now to re-authenticate."
2023-08-10 14:56:38 -04:00
),
},
)
def render_list_not_found(request):
2024-03-24 22:28:22 -04:00
msg = _("List not found.")
2023-08-10 14:56:38 -04:00
return render(
request,
"common/error.html",
{
"msg": msg,
},
)
2023-07-20 21:59:49 -04:00
@login_required
@target_identity_required
2023-08-10 14:56:38 -04:00
def render_list(
2023-07-20 21:59:49 -04:00
request: AuthedHttpRequest,
user_name,
type,
2023-12-02 15:24:07 -05:00
shelf_type: ShelfType | None = None,
2023-07-20 21:59:49 -04:00
item_category=None,
tag_title=None,
2023-10-30 00:59:54 -04:00
year=None,
2023-12-30 22:20:15 -05:00
sort="time",
2023-08-10 14:56:38 -04:00
):
2023-07-20 21:59:49 -04:00
target = request.target_identity
viewer = request.user.identity
2023-08-10 14:56:38 -04:00
tag = None
2023-12-30 22:20:15 -05:00
sort = request.GET.get("sort")
year = request.GET.get("year")
2023-12-02 15:24:07 -05:00
if type == "mark" and shelf_type:
2023-12-30 22:20:15 -05:00
queryset = target.shelf_manager.get_members(shelf_type, item_category)
2023-08-10 14:56:38 -04:00
elif type == "tagmember":
2023-07-20 21:59:49 -04:00
tag = Tag.objects.filter(owner=target, title=tag_title).first()
2023-08-10 14:56:38 -04:00
if not tag:
return render_list_not_found(request)
2023-07-20 21:59:49 -04:00
if tag.visibility != 0 and target != viewer:
2023-08-10 14:56:38 -04:00
return render_list_not_found(request)
queryset = TagMember.objects.filter(parent=tag)
2023-07-20 21:59:49 -04:00
elif type == "review" and item_category:
queryset = Review.objects.filter(q_item_in_category(item_category))
2023-08-10 14:56:38 -04:00
else:
2024-04-23 23:57:49 -04:00
raise BadRequest(_("Invalid parameter"))
2023-12-30 22:20:15 -05:00
if sort == "rating":
rating = Rating.objects.filter(
owner_id=OuterRef("owner_id"), item_id=OuterRef("item_id")
)
queryset = queryset.alias(
rating_grade=Subquery(rating.values("grade"))
).order_by(F("rating_grade").desc(nulls_last=True))
else:
queryset = queryset.order_by("-created_time")
2023-10-30 00:59:54 -04:00
start_date = queryset.aggregate(Min("created_time"))["created_time__min"]
if start_date:
start_year = start_date.year
current_year = datetime.datetime.now().year
years = reversed(range(start_year, current_year + 1))
else:
years = []
2023-12-30 22:20:15 -05:00
queryset = queryset.filter(q_owned_piece_visible_to_user(request.user, target))
2023-10-30 00:59:54 -04:00
if year:
year = int(year)
queryset = queryset.filter(created_time__year=year)
2024-10-27 14:45:18 -04:00
paginator = CustomPaginator(queryset, request) # type:ignore
2023-07-20 21:59:49 -04:00
page_number = int(request.GET.get("page", default=1))
2023-08-10 14:56:38 -04:00
members = paginator.get_page(page_number)
2023-12-30 22:20:15 -05:00
pagination = PageLinksGenerator(page_number, paginator.num_pages, request.GET)
2024-04-03 23:10:21 -04:00
shelf_labels = (
ShelfManager.get_labels_for_category(item_category) if item_category else []
)
2023-08-10 14:56:38 -04:00
return render(
request,
f"user_{type}_list.html",
2023-08-13 18:00:10 -04:00
{
"user": target.user,
"identity": target,
"members": members,
"tag": tag,
"pagination": pagination,
2023-10-30 00:59:54 -04:00
"years": years,
"year": year,
2023-12-30 22:20:15 -05:00
"sort": sort,
2023-10-30 00:59:54 -04:00
"shelf": shelf_type,
2023-12-03 12:38:45 -05:00
"shelf_labels": shelf_labels,
2023-10-30 00:59:54 -04:00
"category": item_category,
2023-08-13 18:00:10 -04:00
},
2023-08-10 14:56:38 -04:00
)
@login_required
2024-04-23 23:57:49 -04:00
@require_http_methods(["GET", "POST"])
2023-08-10 14:56:38 -04:00
def piece_delete(request, piece_uuid):
piece = get_object_or_404(Piece, uid=get_uuid_or_404(piece_uuid))
return_url = request.GET.get("return_url", None) or "/"
if not piece.is_editable_by(request.user):
2024-04-23 23:57:49 -04:00
raise PermissionDenied(_("Insufficient permission"))
2023-08-10 14:56:38 -04:00
if request.method == "GET":
return render(
request, "piece_delete.html", {"piece": piece, "return_url": return_url}
)
2024-04-23 23:57:49 -04:00
else:
2023-08-10 14:56:38 -04:00
piece.delete()
return redirect(return_url)