2022-12-15 17:29:35 -05:00
|
|
|
import logging
|
2023-04-24 00:56:13 -04:00
|
|
|
from django.contrib import messages
|
2023-01-01 23:50:57 -05:00
|
|
|
from django.shortcuts import render, get_object_or_404, redirect
|
2022-12-15 17:29:35 -05:00
|
|
|
from django.contrib.auth.decorators import login_required, permission_required
|
|
|
|
from django.utils.translation import gettext_lazy as _
|
2023-02-04 00:45:17 -05:00
|
|
|
from django.http import HttpResponseRedirect
|
2023-04-19 22:31:27 -04:00
|
|
|
from django.core.exceptions import BadRequest, PermissionDenied, ObjectDoesNotExist
|
2022-12-15 17:29:35 -05:00
|
|
|
from django.db.models import Count
|
|
|
|
from django.utils import timezone
|
|
|
|
from django.core.paginator import Paginator
|
2023-05-14 10:31:04 -04:00
|
|
|
from catalog.common.models import ExternalResource, IdealIdTypes
|
2022-12-15 17:29:35 -05:00
|
|
|
from .models import *
|
2023-02-10 15:56:13 -05:00
|
|
|
from django.views.decorators.clickjacking import xframe_options_exempt
|
2023-05-20 11:01:18 -04:00
|
|
|
from journal.models import Mark, ShelfMember, Review, Comment, query_item_category
|
2023-01-07 00:35:30 -05:00
|
|
|
from journal.models import (
|
|
|
|
query_visible,
|
|
|
|
query_following,
|
|
|
|
update_journal_for_merged_item,
|
|
|
|
)
|
2023-04-18 14:05:36 -04:00
|
|
|
from common.utils import PageLinksGenerator, get_uuid_or_404
|
2023-01-01 23:50:57 -05:00
|
|
|
from common.config import PAGE_LINK_NUMBER
|
2023-04-19 22:31:27 -04:00
|
|
|
from journal.models import ShelfTypeNames, ShelfType, ItemCategory
|
2023-01-05 03:06:13 -05:00
|
|
|
from .forms import *
|
|
|
|
from .search.views import *
|
2023-02-04 00:45:17 -05:00
|
|
|
from django.http import Http404
|
2023-04-19 22:31:27 -04:00
|
|
|
from management.models import Announcement
|
|
|
|
from django.core.cache import cache
|
|
|
|
import random
|
|
|
|
|
2022-12-15 17:29:35 -05:00
|
|
|
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
2022-12-24 01:28:24 -05:00
|
|
|
NUM_REVIEWS_ON_ITEM_PAGE = 5
|
|
|
|
NUM_REVIEWS_ON_LIST_PAGE = 20
|
|
|
|
|
|
|
|
|
|
|
|
def retrieve_by_uuid(request, item_uid):
|
|
|
|
item = get_object_or_404(Item, uid=item_uid)
|
2022-12-17 02:04:12 -05:00
|
|
|
return redirect(item.url)
|
|
|
|
|
|
|
|
|
2023-02-10 15:56:13 -05:00
|
|
|
@xframe_options_exempt
|
|
|
|
def embed(request, item_path, item_uuid):
|
|
|
|
if request.method != "GET":
|
|
|
|
raise BadRequest()
|
|
|
|
item = Item.get_by_url(item_uuid)
|
|
|
|
if item is None:
|
|
|
|
raise Http404()
|
|
|
|
if item.merged_to_item:
|
|
|
|
return redirect(item.merged_to_item.url)
|
|
|
|
if item.is_deleted:
|
|
|
|
raise Http404()
|
|
|
|
focus_item = None
|
|
|
|
if request.GET.get("focus"):
|
|
|
|
focus_item = get_object_or_404(
|
2023-04-18 14:05:36 -04:00
|
|
|
Item, uid=get_uuid_or_404(request.GET.get("focus"))
|
2022-12-15 17:29:35 -05:00
|
|
|
)
|
2023-02-10 15:56:13 -05:00
|
|
|
return render(
|
|
|
|
request,
|
|
|
|
"embed_" + item.class_name + ".html",
|
|
|
|
{"item": item, "focus_item": focus_item},
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
def retrieve(request, item_path, item_uuid):
|
|
|
|
if request.method != "GET":
|
2023-02-04 00:45:17 -05:00
|
|
|
raise BadRequest()
|
2023-04-18 14:05:36 -04:00
|
|
|
# item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid))
|
2023-02-10 15:56:13 -05:00
|
|
|
item = Item.get_by_url(item_uuid)
|
|
|
|
if item is None:
|
|
|
|
raise Http404()
|
|
|
|
item_url = f"/{item_path}/{item_uuid}"
|
|
|
|
if item.url != item_url:
|
|
|
|
return redirect(item.url)
|
|
|
|
skipcheck = request.GET.get("skipcheck", False) and request.user.is_staff
|
|
|
|
if not skipcheck and item.merged_to_item:
|
|
|
|
return redirect(item.merged_to_item.url)
|
|
|
|
if not skipcheck and item.is_deleted:
|
|
|
|
raise Http404()
|
|
|
|
focus_item = None
|
|
|
|
if request.GET.get("focus"):
|
|
|
|
focus_item = get_object_or_404(
|
2023-04-18 14:05:36 -04:00
|
|
|
Item, uid=get_uuid_or_404(request.GET.get("focus"))
|
2023-02-10 15:56:13 -05:00
|
|
|
)
|
|
|
|
mark = None
|
|
|
|
review = None
|
2023-05-20 11:01:18 -04:00
|
|
|
my_collections = []
|
2023-02-10 15:56:13 -05:00
|
|
|
collection_list = []
|
|
|
|
shelf_types = [(n[1], n[2]) for n in iter(ShelfTypeNames) if n[0] == item.category]
|
|
|
|
if request.user.is_authenticated:
|
|
|
|
visible = query_visible(request.user)
|
|
|
|
mark = Mark(request.user, item)
|
|
|
|
review = mark.review
|
2023-05-20 11:01:18 -04:00
|
|
|
my_collections = item.collections.all().filter(owner=request.user)
|
2023-02-10 15:56:13 -05:00
|
|
|
collection_list = (
|
|
|
|
item.collections.all()
|
2023-05-20 11:01:18 -04:00
|
|
|
.exclude(owner=request.user)
|
2023-02-10 15:56:13 -05:00
|
|
|
.filter(visible)
|
|
|
|
.annotate(like_counts=Count("likes"))
|
|
|
|
.order_by("-like_counts")
|
|
|
|
)
|
2023-05-20 11:01:18 -04:00
|
|
|
else:
|
|
|
|
collection_list = (
|
|
|
|
item.collections.all()
|
|
|
|
.filter(visibility=0)
|
|
|
|
.annotate(like_counts=Count("likes"))
|
|
|
|
.order_by("-like_counts")
|
2023-02-10 15:56:13 -05:00
|
|
|
)
|
|
|
|
return render(
|
|
|
|
request,
|
|
|
|
item.class_name + ".html",
|
|
|
|
{
|
|
|
|
"item": item,
|
|
|
|
"focus_item": focus_item,
|
|
|
|
"mark": mark,
|
|
|
|
"review": review,
|
2023-05-20 11:01:18 -04:00
|
|
|
"my_collections": my_collections,
|
2023-02-10 15:56:13 -05:00
|
|
|
"collection_list": collection_list,
|
|
|
|
"shelf_types": shelf_types,
|
|
|
|
},
|
|
|
|
)
|
2022-12-24 01:28:24 -05:00
|
|
|
|
|
|
|
|
2023-01-05 03:06:13 -05:00
|
|
|
@login_required
|
|
|
|
def create(request, item_model):
|
2023-06-05 18:57:52 -04:00
|
|
|
form_cls = CatalogForms.get(item_model)
|
|
|
|
if not form_cls:
|
|
|
|
raise BadRequest("Invalid item type")
|
2023-01-05 03:06:13 -05:00
|
|
|
if request.method == "GET":
|
2023-06-05 18:57:52 -04:00
|
|
|
form = form_cls(
|
|
|
|
initial={
|
|
|
|
"title": request.GET.get("title", ""),
|
|
|
|
}
|
|
|
|
)
|
2023-01-05 03:06:13 -05:00
|
|
|
return render(
|
|
|
|
request,
|
|
|
|
"catalog_edit.html",
|
|
|
|
{
|
|
|
|
"form": form,
|
|
|
|
},
|
|
|
|
)
|
|
|
|
elif request.method == "POST":
|
|
|
|
form = form_cls(request.POST, request.FILES)
|
2023-06-05 18:57:52 -04:00
|
|
|
parent = None
|
|
|
|
if request.GET.get("parent", ""):
|
|
|
|
parent = get_object_or_404(
|
|
|
|
Item, uid=get_uuid_or_404(request.GET.get("parent", ""))
|
|
|
|
)
|
|
|
|
if parent.child_class != form.instance.__class__.__name__:
|
|
|
|
raise BadRequest(
|
|
|
|
f"Invalid parent type: {form.instance.__class__} -> {parent.__class__}"
|
|
|
|
)
|
2023-01-05 03:06:13 -05:00
|
|
|
if form.is_valid():
|
|
|
|
form.instance.last_editor = request.user
|
|
|
|
form.instance.edited_time = timezone.now()
|
2023-06-05 18:57:52 -04:00
|
|
|
if parent:
|
|
|
|
form.instance.set_parent_item(parent)
|
2023-01-05 03:06:13 -05:00
|
|
|
form.instance.save()
|
|
|
|
return redirect(form.instance.url)
|
|
|
|
else:
|
2023-04-24 00:56:13 -04:00
|
|
|
raise BadRequest(form.errors)
|
2023-01-05 03:06:13 -05:00
|
|
|
else:
|
2023-06-05 18:57:52 -04:00
|
|
|
raise BadRequest("Invalid request method")
|
2023-01-05 03:06:13 -05:00
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
def edit(request, item_path, item_uuid):
|
|
|
|
if request.method == "GET":
|
2023-04-18 14:05:36 -04:00
|
|
|
item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid))
|
2023-01-05 03:06:13 -05:00
|
|
|
form_cls = CatalogForms[item.__class__.__name__]
|
|
|
|
form = form_cls(instance=item)
|
2023-05-14 10:31:04 -04:00
|
|
|
if (
|
|
|
|
item.external_resources.all().count() > 0
|
|
|
|
and item.primary_lookup_id_value
|
|
|
|
and item.primary_lookup_id_type in IdealIdTypes
|
|
|
|
):
|
2023-01-05 03:06:13 -05:00
|
|
|
form.fields["primary_lookup_id_type"].disabled = True
|
|
|
|
form.fields["primary_lookup_id_value"].disabled = True
|
2023-01-23 21:24:31 -05:00
|
|
|
return render(request, "catalog_edit.html", {"form": form, "item": item})
|
2023-01-05 03:06:13 -05:00
|
|
|
elif request.method == "POST":
|
2023-04-18 14:05:36 -04:00
|
|
|
item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid))
|
2023-01-05 03:06:13 -05:00
|
|
|
form_cls = CatalogForms[item.__class__.__name__]
|
|
|
|
form = form_cls(request.POST, request.FILES, instance=item)
|
2023-05-14 10:31:04 -04:00
|
|
|
if (
|
|
|
|
item.external_resources.all().count() > 0
|
|
|
|
and item.primary_lookup_id_value
|
|
|
|
and item.primary_lookup_id_type in IdealIdTypes
|
|
|
|
):
|
2023-01-05 03:06:13 -05:00
|
|
|
form.fields["primary_lookup_id_type"].disabled = True
|
|
|
|
form.fields["primary_lookup_id_value"].disabled = True
|
|
|
|
if form.is_valid():
|
|
|
|
form.instance.last_editor = request.user
|
|
|
|
form.instance.edited_time = timezone.now()
|
|
|
|
form.instance.save()
|
|
|
|
return redirect(form.instance.url)
|
|
|
|
else:
|
2023-06-05 17:22:34 -04:00
|
|
|
e = form.errors
|
|
|
|
e.additonal_detail = []
|
|
|
|
for f, v in e.as_data().items():
|
|
|
|
for validation_error in v:
|
|
|
|
if hasattr(validation_error, "error_map"):
|
|
|
|
for f2, v2 in validation_error.error_map.items():
|
|
|
|
e.additonal_detail.append(f"{f}§{f2}: {'; '.join(v2)}")
|
|
|
|
raise BadRequest(e)
|
2023-01-05 03:06:13 -05:00
|
|
|
else:
|
2023-02-04 00:45:17 -05:00
|
|
|
raise BadRequest()
|
2023-01-05 03:06:13 -05:00
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
def delete(request, item_path, item_uuid):
|
2023-01-07 00:35:30 -05:00
|
|
|
if request.method != "POST":
|
2023-02-04 00:45:17 -05:00
|
|
|
raise BadRequest()
|
2023-04-18 14:05:36 -04:00
|
|
|
item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid))
|
2023-06-02 21:54:48 -04:00
|
|
|
if not request.user.is_staff and item.journal_exist:
|
2023-05-13 14:10:25 -04:00
|
|
|
raise PermissionDenied()
|
2023-01-23 16:31:30 -05:00
|
|
|
for res in item.external_resources.all():
|
|
|
|
res.item = None
|
|
|
|
res.save()
|
|
|
|
item.delete()
|
|
|
|
return (
|
|
|
|
redirect(item.url + "?skipcheck=1") if request.user.is_staff else redirect("/")
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2023-01-23 21:24:31 -05:00
|
|
|
@login_required
|
|
|
|
def recast(request, item_path, item_uuid):
|
|
|
|
if request.method != "POST":
|
2023-02-04 00:45:17 -05:00
|
|
|
raise BadRequest()
|
2023-04-18 14:05:36 -04:00
|
|
|
item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid))
|
2023-01-23 21:24:31 -05:00
|
|
|
cls = request.POST.get("class")
|
2023-06-06 01:36:07 -04:00
|
|
|
model = (
|
|
|
|
TVShow
|
|
|
|
if cls == "tvshow"
|
|
|
|
else (Movie if cls == "movie" else (TVSeason if cls == "tvseason" else None))
|
|
|
|
)
|
2023-01-23 21:24:31 -05:00
|
|
|
if not model:
|
2023-06-06 13:06:03 -04:00
|
|
|
raise BadRequest("Invalid target type")
|
|
|
|
if isinstance(item, model):
|
|
|
|
raise BadRequest("Same target type")
|
2023-06-06 01:36:07 -04:00
|
|
|
_logger.warn(f"{request.user} recasting {item} to {model}")
|
2023-06-06 13:06:03 -04:00
|
|
|
if isinstance(item, TVShow):
|
2023-06-06 01:36:07 -04:00
|
|
|
for season in item.seasons.all():
|
|
|
|
_logger.warn(f"{request.user} recast orphaning season {season}")
|
|
|
|
season.show = None
|
|
|
|
season.save(update_fields=["show"])
|
2023-01-23 21:24:31 -05:00
|
|
|
new_item = item.recast_to(model)
|
|
|
|
return redirect(new_item.url)
|
|
|
|
|
|
|
|
|
2023-01-23 16:31:30 -05:00
|
|
|
@login_required
|
|
|
|
def unlink(request):
|
|
|
|
if request.method != "POST":
|
2023-02-04 00:45:17 -05:00
|
|
|
raise BadRequest()
|
2023-01-23 16:31:30 -05:00
|
|
|
if not request.user.is_staff:
|
|
|
|
raise PermissionDenied()
|
|
|
|
res_id = request.POST.get("id")
|
|
|
|
if not res_id:
|
2023-02-04 00:45:17 -05:00
|
|
|
raise BadRequest()
|
2023-01-23 16:31:30 -05:00
|
|
|
resource = get_object_or_404(ExternalResource, id=res_id)
|
|
|
|
resource.item = None
|
|
|
|
resource.save()
|
|
|
|
return HttpResponseRedirect(request.META.get("HTTP_REFERER"))
|
2023-01-05 03:06:13 -05:00
|
|
|
|
|
|
|
|
2023-01-07 00:35:30 -05:00
|
|
|
@login_required
|
2023-05-13 15:11:05 -04:00
|
|
|
def assign_parent(request, item_path, item_uuid):
|
2023-01-07 00:35:30 -05:00
|
|
|
if request.method != "POST":
|
2023-02-04 00:45:17 -05:00
|
|
|
raise BadRequest()
|
2023-05-13 15:11:05 -04:00
|
|
|
item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid))
|
2023-06-06 13:06:03 -04:00
|
|
|
parent_item = Item.get_by_url(request.POST.get("parent_item_url"))
|
|
|
|
if not parent_item or parent_item.is_deleted or parent_item.merged_to_item_id:
|
2023-05-13 15:11:05 -04:00
|
|
|
raise BadRequest("Can't assign parent to a deleted or redirected item")
|
2023-06-06 13:06:03 -04:00
|
|
|
if parent_item.child_class != item.__class__.__name__:
|
|
|
|
raise BadRequest("Incompatible child item type")
|
|
|
|
if not request.user.is_staff and item.parent_item:
|
|
|
|
raise BadRequest("Already assigned to a parent item")
|
|
|
|
_logger.warn(f"{request.user} assign {item} to {parent_item}")
|
|
|
|
item.set_parent_item(parent_item, save=True)
|
2023-05-13 15:11:05 -04:00
|
|
|
return redirect(item.url)
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
def merge(request, item_path, item_uuid):
|
|
|
|
if request.method != "POST":
|
|
|
|
raise BadRequest()
|
2023-04-18 14:05:36 -04:00
|
|
|
item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid))
|
2023-06-02 21:54:48 -04:00
|
|
|
if not request.user.is_staff and item.journal_exist:
|
2023-05-13 15:11:05 -04:00
|
|
|
raise PermissionDenied()
|
2023-05-22 19:49:02 -04:00
|
|
|
if request.POST.get("new_item_url"):
|
|
|
|
new_item = Item.get_by_url(request.POST.get("new_item_url"))
|
|
|
|
if not new_item or new_item.is_deleted or new_item.merged_to_item_id:
|
2023-06-06 13:06:03 -04:00
|
|
|
raise BadRequest(_("不能合并到一个被删除或合并过的条目。"))
|
|
|
|
if new_item.class_name != item.class_name:
|
|
|
|
raise BadRequest(
|
|
|
|
_("不能合并不同类的条目") + f" ({item.class_name} to {new_item.class_name})"
|
2023-05-22 19:49:02 -04:00
|
|
|
)
|
|
|
|
_logger.warn(f"{request.user} merges {item} to {new_item}")
|
|
|
|
item.merge_to(new_item)
|
|
|
|
update_journal_for_merged_item(item_uuid)
|
|
|
|
return redirect(new_item.url)
|
|
|
|
else:
|
|
|
|
if item.merged_to_item:
|
|
|
|
_logger.warn(f"{request.user} cancels merge for {item}")
|
|
|
|
item.merged_to_item = None
|
|
|
|
item.save()
|
2023-05-22 19:14:31 -04:00
|
|
|
return redirect(item.url)
|
2023-01-07 00:35:30 -05:00
|
|
|
|
|
|
|
|
2023-02-01 22:40:34 -05:00
|
|
|
def episode_data(request, item_uuid):
|
2023-04-18 14:05:36 -04:00
|
|
|
item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid))
|
2023-02-01 22:40:34 -05:00
|
|
|
qs = item.episodes.all().order_by("-pub_date")
|
|
|
|
if request.GET.get("last"):
|
|
|
|
qs = qs.filter(pub_date__lt=request.GET.get("last"))
|
|
|
|
return render(
|
2023-05-20 11:01:18 -04:00
|
|
|
request, "podcast_episode_data.html", {"item": item, "episodes": qs[:5]}
|
2023-02-01 22:40:34 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
|
2023-01-01 23:50:57 -05:00
|
|
|
@login_required
|
2022-12-24 01:28:24 -05:00
|
|
|
def mark_list(request, item_path, item_uuid, following_only=False):
|
2023-04-18 14:05:36 -04:00
|
|
|
item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid))
|
2022-12-24 01:28:24 -05:00
|
|
|
if not item:
|
2023-02-04 00:45:17 -05:00
|
|
|
raise Http404()
|
2022-12-29 23:57:02 -05:00
|
|
|
queryset = ShelfMember.objects.filter(item=item).order_by("-created_time")
|
2022-12-24 01:28:24 -05:00
|
|
|
if following_only:
|
|
|
|
queryset = queryset.filter(query_following(request.user))
|
|
|
|
else:
|
|
|
|
queryset = queryset.filter(query_visible(request.user))
|
|
|
|
paginator = Paginator(queryset, NUM_REVIEWS_ON_LIST_PAGE)
|
2022-12-29 23:57:02 -05:00
|
|
|
page_number = request.GET.get("page", default=1)
|
2022-12-24 01:28:24 -05:00
|
|
|
marks = paginator.get_page(page_number)
|
|
|
|
marks.pagination = PageLinksGenerator(
|
2022-12-29 23:57:02 -05:00
|
|
|
PAGE_LINK_NUMBER, page_number, paginator.num_pages
|
|
|
|
)
|
2022-12-24 01:28:24 -05:00
|
|
|
return render(
|
|
|
|
request,
|
2022-12-29 23:57:02 -05:00
|
|
|
"item_mark_list.html",
|
2022-12-24 01:28:24 -05:00
|
|
|
{
|
2022-12-29 23:57:02 -05:00
|
|
|
"marks": marks,
|
|
|
|
"item": item,
|
2023-05-20 14:17:02 -04:00
|
|
|
"followeing_only": following_only,
|
2022-12-29 23:57:02 -05:00
|
|
|
},
|
2022-12-24 01:28:24 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
def review_list(request, item_path, item_uuid):
|
2023-04-18 14:05:36 -04:00
|
|
|
item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid))
|
2022-12-24 01:28:24 -05:00
|
|
|
if not item:
|
2023-02-04 00:45:17 -05:00
|
|
|
raise Http404()
|
2022-12-29 23:57:02 -05:00
|
|
|
queryset = Review.objects.filter(item=item).order_by("-created_time")
|
2022-12-24 01:28:24 -05:00
|
|
|
queryset = queryset.filter(query_visible(request.user))
|
|
|
|
paginator = Paginator(queryset, NUM_REVIEWS_ON_LIST_PAGE)
|
2022-12-29 23:57:02 -05:00
|
|
|
page_number = request.GET.get("page", default=1)
|
2022-12-24 01:28:24 -05:00
|
|
|
reviews = paginator.get_page(page_number)
|
|
|
|
reviews.pagination = PageLinksGenerator(
|
2022-12-29 23:57:02 -05:00
|
|
|
PAGE_LINK_NUMBER, page_number, paginator.num_pages
|
|
|
|
)
|
2022-12-24 01:28:24 -05:00
|
|
|
return render(
|
|
|
|
request,
|
2022-12-29 23:57:02 -05:00
|
|
|
"item_review_list.html",
|
2022-12-24 01:28:24 -05:00
|
|
|
{
|
2022-12-29 23:57:02 -05:00
|
|
|
"reviews": reviews,
|
|
|
|
"item": item,
|
|
|
|
},
|
2022-12-24 01:28:24 -05:00
|
|
|
)
|
2023-04-19 22:31:27 -04:00
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-05-20 11:01:18 -04:00
|
|
|
def comments(request, item_path, item_uuid):
|
|
|
|
item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid))
|
|
|
|
if not item:
|
|
|
|
raise Http404()
|
2023-06-08 17:22:11 -04:00
|
|
|
ids = [i.id for i in item.child_items] + [item.id]
|
|
|
|
queryset = Comment.objects.filter(item_id__in=ids).order_by("-created_time")
|
2023-05-20 11:01:18 -04:00
|
|
|
queryset = queryset.filter(query_visible(request.user))
|
|
|
|
before_time = request.GET.get("last")
|
|
|
|
if before_time:
|
|
|
|
queryset = queryset.filter(created_time__lte=before_time)
|
|
|
|
return render(
|
|
|
|
request,
|
|
|
|
"item_comments.html",
|
|
|
|
{
|
2023-06-08 17:22:11 -04:00
|
|
|
"item": item,
|
2023-05-20 11:01:18 -04:00
|
|
|
"comments": queryset[:11],
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
def reviews(request, item_path, item_uuid):
|
|
|
|
item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid))
|
|
|
|
if not item:
|
|
|
|
raise Http404()
|
2023-06-08 17:22:11 -04:00
|
|
|
ids = [i.id for i in item.child_items] + [item.id]
|
|
|
|
queryset = Review.objects.filter(item_id__in=ids).order_by("-created_time")
|
2023-05-20 11:01:18 -04:00
|
|
|
queryset = queryset.filter(query_visible(request.user))
|
|
|
|
before_time = request.GET.get("last")
|
|
|
|
if before_time:
|
|
|
|
queryset = queryset.filter(created_time__lte=before_time)
|
|
|
|
return render(
|
|
|
|
request,
|
|
|
|
"item_reviews.html",
|
|
|
|
{
|
2023-06-08 17:22:11 -04:00
|
|
|
"item": item,
|
2023-05-20 11:01:18 -04:00
|
|
|
"reviews": queryset[:11],
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2023-04-19 22:31:27 -04:00
|
|
|
def discover(request):
|
|
|
|
if request.method != "GET":
|
|
|
|
raise BadRequest()
|
|
|
|
user = request.user
|
|
|
|
if user.is_authenticated:
|
|
|
|
layout = user.get_preference().discover_layout
|
|
|
|
else:
|
|
|
|
layout = []
|
|
|
|
|
2023-05-20 11:01:18 -04:00
|
|
|
cache_key = "public_gallery"
|
2023-04-19 22:31:27 -04:00
|
|
|
gallery_list = cache.get(cache_key, [])
|
|
|
|
|
2023-05-20 11:01:18 -04:00
|
|
|
# for gallery in gallery_list:
|
|
|
|
# ids = (
|
|
|
|
# random.sample(gallery["item_ids"], 10)
|
|
|
|
# if len(gallery["item_ids"]) > 10
|
|
|
|
# else gallery["item_ids"]
|
|
|
|
# )
|
|
|
|
# gallery["items"] = Item.objects.filter(id__in=ids)
|
2023-04-19 22:31:27 -04:00
|
|
|
|
|
|
|
if user.is_authenticated:
|
|
|
|
podcast_ids = [
|
|
|
|
p.item_id
|
2023-06-02 21:54:48 -04:00
|
|
|
for p in user.shelf_manager.get_latest_members(
|
2023-04-19 22:31:27 -04:00
|
|
|
ShelfType.PROGRESS, ItemCategory.Podcast
|
|
|
|
)
|
|
|
|
]
|
2023-05-20 11:01:18 -04:00
|
|
|
recent_podcast_episodes = PodcastEpisode.objects.filter(
|
|
|
|
program_id__in=podcast_ids
|
|
|
|
).order_by("-pub_date")[:10]
|
|
|
|
books_in_progress = Edition.objects.filter(
|
|
|
|
id__in=[
|
|
|
|
p.item_id
|
2023-06-02 21:54:48 -04:00
|
|
|
for p in user.shelf_manager.get_latest_members(
|
2023-05-20 11:01:18 -04:00
|
|
|
ShelfType.PROGRESS, ItemCategory.Book
|
2023-06-02 21:54:48 -04:00
|
|
|
)[:10]
|
2023-05-20 11:01:18 -04:00
|
|
|
]
|
2023-04-19 22:31:27 -04:00
|
|
|
)
|
2023-05-20 11:01:18 -04:00
|
|
|
tvshows_in_progress = Item.objects.filter(
|
|
|
|
id__in=[
|
|
|
|
p.item_id
|
2023-06-02 21:54:48 -04:00
|
|
|
for p in user.shelf_manager.get_latest_members(
|
2023-05-20 11:01:18 -04:00
|
|
|
ShelfType.PROGRESS, ItemCategory.TV
|
2023-06-02 21:54:48 -04:00
|
|
|
)[:10]
|
2023-05-20 11:01:18 -04:00
|
|
|
]
|
|
|
|
)
|
|
|
|
else:
|
|
|
|
recent_podcast_episodes = []
|
|
|
|
books_in_progress = []
|
|
|
|
tvshows_in_progress = []
|
2023-04-19 22:31:27 -04:00
|
|
|
|
|
|
|
return render(
|
|
|
|
request,
|
|
|
|
"discover.html",
|
|
|
|
{
|
|
|
|
"user": user,
|
|
|
|
"gallery_list": gallery_list,
|
2023-05-20 11:01:18 -04:00
|
|
|
"recent_podcast_episodes": recent_podcast_episodes,
|
|
|
|
"books_in_progress": books_in_progress,
|
|
|
|
"tvshows_in_progress": tvshows_in_progress,
|
2023-04-19 22:31:27 -04:00
|
|
|
"layout": layout,
|
|
|
|
},
|
|
|
|
)
|