diff --git a/api_koreader/models.py b/api_koreader/models.py index 8ad3bc5b8ca8a6d0c9e60c71741e8e3e4ffb537d..e51a94ca60bac5651569b56688a00ee4fcaf5344 100644 --- a/api_koreader/models.py +++ b/api_koreader/models.py @@ -1,3 +1,4 @@ +import hashlib import io from django.db import models @@ -24,6 +25,9 @@ class SyncDocumentEntry(models.Model): @receiver(post_save, sender=SyncDocumentEntry) def post_save_document(sender, instance: SyncDocumentEntry, **kwargs): + # Stop recursion + if not instance.device.startswith("KoReader"): + return book_matches: QuerySet[Book] = Book.objects.filter(partial_md5__iexact=instance.key) if book_matches: book = book_matches.first() @@ -43,6 +47,9 @@ def post_save_document(sender, instance: SyncDocumentEntry, **kwargs): @receiver(post_save, sender=UserBook) def post_save_userbook(sender, instance: UserBook, **kwargs): + # Stop recursion + if instance.last_progress_device.startswith("KoReader"): + return # Find the corresponding SyncDocumentEntry sync_doc_q: QuerySet[SyncDocumentEntry] = SyncDocumentEntry.objects.filter(user=instance.user, key__iexact=instance.book.partial_md5) if sync_doc_q.first(): @@ -54,4 +61,5 @@ def post_save_userbook(sender, instance: UserBook, **kwargs): sync_doc.percentage = instance.percentage_read sync_doc.device = instance.last_progress_device sync_doc.updated_at = instance.last_read + sync_doc.device_id = hashlib.md5(sync_doc.device.encode()).hexdigest() # Generate a device ID sync_doc.save() \ No newline at end of file diff --git a/api_koreader/views.py b/api_koreader/views.py index ebed2ecd1636045a8d114b43be394b060ec00757..c9299f77aea2270715931c3a1c525228852631dc 100644 --- a/api_koreader/views.py +++ b/api_koreader/views.py @@ -1,6 +1,7 @@ import json from json import JSONDecodeError +from django.db.transaction import commit from django.http import JsonResponse, HttpResponse from django.utils import timezone from django.views.decorators.csrf import csrf_exempt @@ -99,7 +100,9 @@ def update_progress(request): form = SyncDocumentEntryForm(body_object, instance=existing_object) if form.is_valid(): - obj = form.save() + obj: SyncDocumentEntry = form.save(commit=False) + obj.device = "KoReader - " + obj.device + obj.save() return JsonResponse({"document": obj.key, "timestamp": int(obj.updated_at.timestamp())}, status=200) print(form.errors)