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