new sync
[wolnelektury.git] / src / bookmarks / models.py
1 import uuid
2 from django.db import models
3
4
5 class Bookmark(models.Model):
6     uuid = models.UUIDField(unique=True, default=uuid.uuid4, editable=False)
7     user = models.ForeignKey('auth.User', models.CASCADE)
8     book = models.ForeignKey('catalogue.Book', models.CASCADE)
9     anchor = models.CharField(max_length=100, blank=True)
10     created_at = models.DateTimeField(auto_now_add=True)
11     note = models.TextField(blank=True)
12
13     def __str__(self):
14         return str(self.uuid)
15
16     @property
17     def timestamp(self):
18         return self.created_at.timestamp()
19     
20     def location(self):
21         return f'{self.book.slug}/{self.anchor}'
22     
23     def get_for_json(self):
24         return {
25             'uuid': self.uuid,
26             'anchor': self.anchor,
27             'note': self.note,
28             'created_at': self.created_at,
29         }
30
31
32 class Quote(models.Model):
33     uuid = models.UUIDField(unique=True, default=uuid.uuid4, editable=False)
34     user = models.ForeignKey('auth.User', models.CASCADE)
35     book = models.ForeignKey('catalogue.Book', models.CASCADE)
36     created_at = models.DateTimeField(auto_now_add=True)
37     start_elem = models.CharField(max_length=100, blank=True)
38     end_elem = models.CharField(max_length=100, blank=True)
39     start_offset = models.IntegerField(null=True, blank=True)
40     end_offset = models.IntegerField(null=True, blank=True)
41     text = models.TextField(blank=True)
42
43     def __str__(self):
44         return str(self.uuid)
45
46     def get_for_json(self):
47         return {
48             'uuid': self.uuid,
49             'startElem': self.start_elem,
50             'endElem': self.end_elem,
51             'startOffset': self.start_offset,
52             'startOffset': self.end_offset,
53             'created_at': self.created_at,
54         }
55
56 def from_path(elem, path):
57     def child_nodes(e):
58         if e.text: yield (e, 'text')
59         for child in e:
60             if child.attrib.get('id') != 'toc':
61                 yield (child, None)
62             if child.tail:
63                 yield (child, 'tail')
64     while len(path) > 1:
65         n = path.pop(0)
66         elem = list(child_nodes(elem))[n]
67     return elem
68             
69             
70