X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/d9c51b94bfe6b1cda1790d57a9108b83c6e1643b..f7d8acded4a58d423035c5759f6dee9a34396959:/src/bookmarks/views.py diff --git a/src/bookmarks/views.py b/src/bookmarks/views.py new file mode 100644 index 000000000..7d83818c1 --- /dev/null +++ b/src/bookmarks/views.py @@ -0,0 +1,137 @@ +from django.http import Http404, JsonResponse +from django.shortcuts import render, get_object_or_404 +from django.views.decorators import cache +import catalogue.models +from wolnelektury.utils import is_ajax +from . import models +from lxml import html +import re + + +# login required + +@cache.never_cache +def bookmarks(request): + try: + slug = request.headers['Referer'].rsplit('.', 1)[0].rsplit('/', 1)[-1] + except: + slug = 'w-80-dni-dookola-swiata' +# raise Http404() + try: + book = catalogue.models.Book.objects.get(slug=slug) + except catalogue.models.Book.DoesNotExist: + raise Http404() + + if request.method == 'POST': + # TODO test + bm, created = models.Bookmark.objects.update_or_create( + user=request.user, + book=book, + anchor=request.POST.get('anchor', ''), + defaults={ + 'note': request.POST.get('note', ''), + } + ) + return JsonResponse(bm.get_for_json()) + else: + return JsonResponse({ + bm.anchor: bm.get_for_json() + for bm in models.Bookmark.objects.filter( + user=request.user, + book=book, + ) + }) + + +def bookmark(request, uuid): + bm = get_object_or_404(models.Bookmark, user=request.user, uuid=uuid) + if request.method == 'POST': + bm.note = request.POST.get('note', '') + bm.save() + return JsonResponse(bm.get_for_json()) + + +def bookmark_delete(request, uuid): + models.Bookmark.objects.filter(user=request.user, uuid=uuid).delete() + return JsonResponse({}) + + + + +@cache.never_cache +def quotes(request): + try: + slug = request.headers['Referer'].rsplit('.', 1)[0].rsplit('/', 1)[-1] + except: + slug = 'w-80-dni-dookola-swiata' +# raise Http404() + try: + book = catalogue.models.Book.objects.get(slug=slug) + except catalogue.models.Book.DoesNotExist: + raise Http404() + + if request.method == 'POST': + # TODO test + # ensure unique? or no? + + text = request.POST.get('text', '') + text = text.strip() + + stext = re.sub(r'\s+', ' ', text) + ## verify + print(text) + + + # find out + with book.html_file.open('r') as f: + ht = f.read() + tree = html.fromstring(ht) + # TODO: clear + for sel in ('.//a[@class="theme-begin"]', + './/a[@class="anchor"]', + ): + for e in tree.xpath(sel): + e.clear(keep_tail=True) + htext = html.tostring(tree, encoding='unicode', method='text') + htext = re.sub(r'\s+', ' ', htext) + + print(htext) + + otext = stext + if stext not in htext: + # raise 401 + raise Http404() + + # paths? + # start elem? + q = models.Quote.objects.create( + user=request.user, + book=book, + start_elem=request.POST.get('startElem', ''), + end_elem=request.POST.get('startElem', ''), + start_offset=request.POST.get('startOffset', None), + end_offset=request.POST.get('startOffset', None), + text=text, + ) + return JsonResponse(q.get_for_json()) + else: + return JsonResponse({ + q.start_elem: q.get_for_json() + for q in models.Quote.objects.filter( + user=request.user, + book=book, + ) + }) + + + +def quote(request, uuid): + q = get_object_or_404(models.Quote, user=request.user, uuid=uuid) + if is_ajax(request): + return JsonResponse(q.get_for_json()) + else: + return render(request, 'bookmarks/quote_detail.html', { + 'object': q, + }) + +