2022-12-15 17:29:35 -05:00
|
|
|
import logging
|
|
|
|
from django.shortcuts import render, get_object_or_404, redirect, reverse
|
|
|
|
from django.contrib.auth.decorators import login_required, permission_required
|
|
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from django.http import HttpResponseBadRequest, HttpResponseServerError, HttpResponse
|
|
|
|
from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
|
|
|
|
from django.db import IntegrityError, transaction
|
|
|
|
from django.db.models import Count
|
|
|
|
from django.utils import timezone
|
|
|
|
from django.core.paginator import Paginator
|
|
|
|
from mastodon import mastodon_request_included
|
|
|
|
from mastodon.models import MastodonApplication
|
|
|
|
from mastodon.api import share_mark, share_review
|
|
|
|
from common.utils import PageLinksGenerator
|
|
|
|
from common.views import PAGE_LINK_NUMBER, jump_or_scrape, go_relogin
|
|
|
|
from common.models import SourceSiteEnum
|
|
|
|
from .models import *
|
|
|
|
# from .forms import *
|
|
|
|
# from .forms import BookMarkStatusTranslator
|
|
|
|
from django.conf import settings
|
|
|
|
from collection.models import CollectionItem
|
|
|
|
from common.scraper import get_scraper_by_url, get_normalized_url
|
|
|
|
from django.utils.baseconv import base62
|
|
|
|
from journal.models import Mark
|
2022-12-07 19:09:05 -05:00
|
|
|
|
2022-12-15 17:29:35 -05:00
|
|
|
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
2022-12-16 01:08:10 -05:00
|
|
|
def retrieve(request, item_path, item_uid):
|
2022-12-15 17:29:35 -05:00
|
|
|
if request.method == 'GET':
|
2022-12-16 01:08:10 -05:00
|
|
|
item = get_object_or_404(Item, uid=base62.decode(item_uid))
|
|
|
|
item_url = f'/{item_path}/{item_uid}/'
|
|
|
|
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
|
|
|
|
mark_list_more = None
|
|
|
|
review_list_more = None
|
|
|
|
collection_list = []
|
|
|
|
mark_form = None
|
|
|
|
if request.user.is_authenticated:
|
|
|
|
mark = Mark(request.user, item)
|
|
|
|
review = mark.review
|
|
|
|
|
|
|
|
# # retreive tags
|
|
|
|
# book_tag_list = book.book_tags.values('content').annotate(
|
|
|
|
# tag_frequency=Count('content')).order_by('-tag_frequency')[:TAG_NUMBER]
|
|
|
|
|
|
|
|
# # retrieve user mark and initialize mark form
|
|
|
|
# try:
|
|
|
|
# if request.user.is_authenticated:
|
|
|
|
# mark = BookMark.objects.get(owner=request.user, book=book)
|
|
|
|
# except ObjectDoesNotExist:
|
|
|
|
# mark = None
|
|
|
|
# if mark:
|
|
|
|
# mark_tags = mark.bookmark_tags.all()
|
|
|
|
# mark.get_status_display = BookMarkStatusTranslator(mark.status)
|
|
|
|
# mark_form = BookMarkForm(instance=mark, initial={
|
|
|
|
# 'tags': mark_tags
|
|
|
|
# })
|
|
|
|
# else:
|
|
|
|
# mark_form = BookMarkForm(initial={
|
|
|
|
# 'book': book,
|
|
|
|
# 'visibility': request.user.get_preference().default_visibility if request.user.is_authenticated else 0,
|
|
|
|
# 'tags': mark_tags
|
|
|
|
# })
|
|
|
|
|
|
|
|
# # retrieve user review
|
|
|
|
# try:
|
|
|
|
# if request.user.is_authenticated:
|
|
|
|
# review = BookReview.objects.get(owner=request.user, book=book)
|
|
|
|
# except ObjectDoesNotExist:
|
|
|
|
# review = None
|
|
|
|
|
|
|
|
# # retrieve other related reviews and marks
|
|
|
|
# if request.user.is_anonymous:
|
|
|
|
# # hide all marks and reviews for anonymous user
|
|
|
|
# mark_list = None
|
|
|
|
# review_list = None
|
|
|
|
# mark_list_more = None
|
|
|
|
# review_list_more = None
|
|
|
|
# else:
|
|
|
|
# mark_list = BookMark.get_available_for_identicals(book, request.user)
|
|
|
|
# review_list = BookReview.get_available_for_identicals(book, request.user)
|
|
|
|
# mark_list_more = True if len(mark_list) > MARK_NUMBER else False
|
|
|
|
# mark_list = mark_list[:MARK_NUMBER]
|
|
|
|
# for m in mark_list:
|
|
|
|
# m.get_status_display = BookMarkStatusTranslator(m.status)
|
|
|
|
# review_list_more = True if len(
|
|
|
|
# review_list) > REVIEW_NUMBER else False
|
|
|
|
# review_list = review_list[:REVIEW_NUMBER]
|
|
|
|
# all_collections = CollectionItem.objects.filter(book=book).annotate(num_marks=Count('collection__collection_marks')).order_by('-num_marks')[:20]
|
|
|
|
# collection_list = filter(lambda c: c.is_visible_to(request.user), map(lambda i: i.collection, all_collections))
|
|
|
|
|
|
|
|
# def strip_html_tags(text):
|
|
|
|
# import re
|
|
|
|
# regex = re.compile('<.*?>')
|
|
|
|
# return re.sub(regex, '', text)
|
|
|
|
|
|
|
|
# for r in review_list:
|
|
|
|
# r.content = strip_html_tags(r.content)
|
|
|
|
|
|
|
|
return render(request, item.class_name + '.html', {
|
|
|
|
'item': item,
|
|
|
|
'mark': mark,
|
|
|
|
'review': review,
|
|
|
|
'mark_form': mark_form,
|
|
|
|
'mark_list': mark_list,
|
|
|
|
'mark_list_more': mark_list_more,
|
|
|
|
'review_list': review_list,
|
|
|
|
'review_list_more': review_list_more,
|
|
|
|
'collection_list': collection_list,
|
|
|
|
}
|
|
|
|
)
|
|
|
|
else:
|
|
|
|
logger.warning('non-GET method at /book/<id>')
|
|
|
|
return HttpResponseBadRequest()
|