Initial bookmarks.
[wolnelektury.git] / src / bookmarks / views.py
diff --git a/src/bookmarks/views.py b/src/bookmarks/views.py
new file mode 100644 (file)
index 0000000..7d83818
--- /dev/null
@@ -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,
+        })
+
+