Sync deleted bookmarks
[wolnelektury.git] / src / bookmarks / views.py
1 from django.http import Http404, JsonResponse
2 from django.shortcuts import render, get_object_or_404
3 from django.utils.timezone import now
4 from django.views.decorators import cache
5 import catalogue.models
6 from wolnelektury.utils import is_ajax
7 from . import models
8 from lxml import html
9 import re
10
11
12 # login required
13
14 @cache.never_cache
15 def bookmarks(request):
16     if not request.user.is_authenticated:
17         return JsonResponse({})
18     try:
19         slug = request.headers['Referer'].rsplit('.', 1)[0].rsplit('/', 1)[-1]
20     except:
21         slug = 'w-80-dni-dookola-swiata'
22 #        raise Http404()            
23     try:
24         book = catalogue.models.Book.objects.get(slug=slug)
25     except catalogue.models.Book.DoesNotExist:
26         raise Http404()
27
28     if request.method == 'POST':
29         # TODO test
30         bm, created = models.Bookmark.objects.update_or_create(
31             user=request.user,
32             book=book,
33             anchor=request.POST.get('anchor', ''),
34             defaults={
35                 'note': request.POST.get('note', ''),
36             }
37         )
38         return JsonResponse(bm.get_for_json())
39     else:
40         return JsonResponse({
41             bm.anchor: bm.get_for_json()
42             for bm in models.Bookmark.objects.filter(
43                     user=request.user,
44                     book=book,
45                     deleted=False
46             )
47         })
48
49
50 def bookmark(request, uuid):
51     bm = get_object_or_404(models.Bookmark, user=request.user, uuid=uuid)
52     if request.method == 'POST':
53         bm.note = request.POST.get('note', '')
54         bm.save()
55     return JsonResponse(bm.get_for_json())
56
57
58 def bookmark_delete(request, uuid):
59     models.Bookmark.objects.filter(user=request.user, uuid=uuid).update(
60         deleted=True,
61         updated_at=now()
62     )
63     return JsonResponse({})
64
65
66
67
68 @cache.never_cache
69 def quotes(request):
70     if not request.user.is_authenticated:
71         return JsonResponse({})
72     try:
73         slug = request.headers['Referer'].rsplit('.', 1)[0].rsplit('/', 1)[-1]
74     except:
75         slug = 'w-80-dni-dookola-swiata'
76 #        raise Http404()            
77     try:
78         book = catalogue.models.Book.objects.get(slug=slug)
79     except catalogue.models.Book.DoesNotExist:
80         raise Http404()
81
82     if request.method == 'POST':
83         # TODO test
84         # ensure unique? or no?
85
86         text = request.POST.get('text', '')
87         text = text.strip()
88
89         stext = re.sub(r'\s+', ' ', text)
90         ## verify
91         print(text)
92         
93
94         # find out
95         with book.html_file.open('r') as f:
96             ht = f.read()
97         tree = html.fromstring(ht)
98         # TODO: clear
99         for sel in ('.//a[@class="theme-begin"]',
100                     './/a[@class="anchor"]',
101                     ):
102             for e in tree.xpath(sel):
103                 e.clear(keep_tail=True)
104         htext = html.tostring(tree, encoding='unicode', method='text')
105         htext = re.sub(r'\s+', ' ', htext)
106
107         print(htext)
108
109         otext = stext
110         if stext not in htext:
111             # raise 401
112             raise Http404()            
113
114         # paths?
115         # start elem?
116         q = models.Quote.objects.create(
117             user=request.user,
118             book=book,
119             start_elem=request.POST.get('startElem', ''),
120             end_elem=request.POST.get('startElem', ''),
121             start_offset=request.POST.get('startOffset', None),
122             end_offset=request.POST.get('startOffset', None),
123             text=text,
124         )
125         return JsonResponse(q.get_for_json())
126     else:
127         return JsonResponse({
128             q.start_elem: q.get_for_json()
129             for q in models.Quote.objects.filter(
130                     user=request.user,
131                     book=book,
132             )
133         })
134
135
136
137 def quote(request, uuid):
138     q = get_object_or_404(models.Quote, user=request.user, uuid=uuid)
139     if is_ajax(request):
140         return JsonResponse(q.get_for_json())
141     else:
142         return render(request, 'bookmarks/quote_detail.html', {
143             'object': q,
144         })
145
146