X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/106aa5a8226eb09b4c59c55662b7903a01108f71..bbf9e601991d5d90ed55ee9d5c9d3018afc95d3a:/src/bookmarks/models.py?ds=sidebyside diff --git a/src/bookmarks/models.py b/src/bookmarks/models.py index 88b3e8553..583cd55c7 100644 --- a/src/bookmarks/models.py +++ b/src/bookmarks/models.py @@ -1,20 +1,65 @@ import uuid +from django.apps import apps from django.db import models +from django.utils.timezone import now +from social.syncable import Syncable -class Bookmark(models.Model): +class Bookmark(Syncable, models.Model): uuid = models.UUIDField(unique=True, default=uuid.uuid4, editable=False) user = models.ForeignKey('auth.User', models.CASCADE) book = models.ForeignKey('catalogue.Book', models.CASCADE) anchor = models.CharField(max_length=100, blank=True) created_at = models.DateTimeField(auto_now_add=True) note = models.TextField(blank=True) + updated_at = models.DateTimeField(auto_now=True) + reported_timestamp = models.DateTimeField(default=now) + deleted = models.BooleanField(default=False) + + syncable_fields = [ + 'deleted', 'note', + ] def __str__(self): return str(self.uuid) + @classmethod + def create_from_data(cls, user, data): + if data.get('location'): + return cls.get_by_location(user, data['location'], create=True) + elif data.get('book') and data.get('anchor'): + return cls.objects.create(user=user, book=data['book'], anchor=data['anchor']) + + @property + def timestamp(self): + return self.updated_at.timestamp() + def location(self): return f'{self.book.slug}/{self.anchor}' + + @classmethod + def get_by_location(cls, user, location, create=False): + Book = apps.get_model('catalogue', 'Book') + try: + slug, anchor = location.split('/') + except: + return None + instance = cls.objects.filter( + user=user, + book__slug=slug, + anchor=anchor + ).first() + if instance is None and create: + try: + book = Book.objects.get(slug=slug) + except Book.DoesNotExist: + return None + instance = cls.objects.create( + user=user, + book=book, + anchor=anchor + ) + return instance def get_for_json(self): return {