lib.itmens/catalog/views.py

221 lines
7.3 KiB
Python
Raw Normal View History

2022-12-31 11:06:23 -05:00
import uuid
2022-12-15 17:29:35 -05:00
import logging
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 _
2022-12-31 11:06:23 -05:00
from django.http import (
HttpResponseBadRequest,
HttpResponseServerError,
HttpResponse,
HttpResponseRedirect,
HttpResponseNotFound,
2022-12-31 11:06:23 -05:00
)
from django.contrib.auth.decorators import login_required, permission_required
from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
2022-12-15 17:29:35 -05:00
from django.db import IntegrityError, transaction
from django.db.models import Count
from django.utils import timezone
from django.core.paginator import Paginator
2022-12-31 11:06:23 -05:00
from polymorphic.base import django
from catalog.common.sites import AbstractSite, SiteManager
2022-12-15 17:29:35 -05:00
from mastodon import mastodon_request_included
from mastodon.models import MastodonApplication
from mastodon.api import share_mark, share_review
from .models import *
from django.conf import settings
from django.utils.baseconv import base62
2022-12-24 01:28:24 -05:00
from journal.models import Mark, ShelfMember, Review
from journal.models import query_visible, query_following
from common.utils import PageLinksGenerator
from common.config import PAGE_LINK_NUMBER
2022-12-25 13:45:24 -05:00
from journal.models import ShelfTypeNames
2022-12-31 11:06:23 -05:00
import django_rq
from rq.job import Job
from .search.external import ExternalSources
2023-01-05 03:06:13 -05:00
from .forms import *
from .search.views import *
from pprint import pprint
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)
return redirect(item.url)
2022-12-24 01:28:24 -05:00
def retrieve(request, item_path, item_uuid):
2022-12-29 23:57:02 -05:00
if request.method == "GET":
2022-12-24 01:28:24 -05:00
item = get_object_or_404(Item, uid=base62.decode(item_uuid))
2022-12-29 23:57:02 -05:00
item_url = f"/{item_path}/{item_uuid}"
2022-12-16 01:08:10 -05:00
if item.url != item_url:
return redirect(item.url)
2022-12-15 17:29:35 -05:00
mark = None
review = None
mark_list = None
review_list = None
collection_list = []
2022-12-29 23:57:02 -05:00
shelf_types = [
(n[1], n[2]) for n in iter(ShelfTypeNames) if n[0] == item.category
]
2022-12-15 17:29:35 -05:00
if request.user.is_authenticated:
2022-12-24 01:28:24 -05:00
visible = query_visible(request.user)
2022-12-15 17:29:35 -05:00
mark = Mark(request.user, item)
2022-12-23 00:08:42 -05:00
_logger.info(mark.rating)
2022-12-15 17:29:35 -05:00
review = mark.review
2022-12-29 23:57:02 -05:00
collection_list = (
item.collections.all()
.filter(visible)
.annotate(like_counts=Count("likes"))
.order_by("-like_counts")
)
mark_query = (
ShelfMember.objects.filter(item=item)
.filter(visible)
.order_by("-created_time")
)
mark_list = [
member.mark for member in mark_query[:NUM_REVIEWS_ON_ITEM_PAGE]
]
review_list = (
Review.objects.filter(item=item)
.filter(visible)
.order_by("-created_time")[:NUM_REVIEWS_ON_ITEM_PAGE]
)
2022-12-15 17:29:35 -05:00
2022-12-29 23:57:02 -05:00
return render(
request,
item.class_name + ".html",
{
"item": item,
"mark": mark,
"review": review,
"mark_list": mark_list,
"review_list": review_list,
"collection_list": collection_list,
"shelf_types": shelf_types,
},
2022-12-15 17:29:35 -05:00
)
else:
return HttpResponseBadRequest()
2022-12-24 01:28:24 -05:00
2023-01-05 03:06:13 -05:00
@login_required
def create(request, item_model):
if request.method == "GET":
form_cls = CatalogForms[item_model]
form = form_cls()
return render(
request,
"catalog_edit.html",
{
"form": form,
},
)
elif request.method == "POST":
form_cls = CatalogForms[item_model]
form = form_cls(request.POST, request.FILES)
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:
pprint(form.errors)
return HttpResponseBadRequest(form.errors)
else:
return HttpResponseBadRequest()
@login_required
def edit(request, item_path, item_uuid):
if request.method == "GET":
item = get_object_or_404(Item, uid=base62.decode(item_uuid))
form_cls = CatalogForms[item.__class__.__name__]
form = form_cls(instance=item)
if item.external_resources.all().count() > 0:
form.fields["primary_lookup_id_type"].disabled = True
form.fields["primary_lookup_id_value"].disabled = True
return render(
request,
"catalog_edit.html",
{
"form": form,
"is_update": True,
},
)
elif request.method == "POST":
item = get_object_or_404(Item, uid=base62.decode(item_uuid))
form_cls = CatalogForms[item.__class__.__name__]
form = form_cls(request.POST, request.FILES, instance=item)
if item.external_resources.all().count() > 0:
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:
pprint(form.errors)
return HttpResponseBadRequest(form.errors)
else:
return HttpResponseBadRequest()
@login_required
def delete(request, item_path, item_uuid):
return HttpResponseBadRequest()
@login_required
2022-12-24 01:28:24 -05:00
def mark_list(request, item_path, item_uuid, following_only=False):
item = get_object_or_404(Item, uid=base62.decode(item_uuid))
if not item:
return HttpResponseNotFound(b"item not found")
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,
},
2022-12-24 01:28:24 -05:00
)
def review_list(request, item_path, item_uuid):
item = get_object_or_404(Item, uid=base62.decode(item_uuid))
if not item:
return HttpResponseNotFound(b"item not found")
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
)