From c6ed24a3bfbe36cc258ed6b75e0fa3eb02e653ce Mon Sep 17 00:00:00 2001 From: TheJoeCoder <joe@radialbog9.uk> Date: Sun, 25 Aug 2024 19:21:28 +0100 Subject: [PATCH] Prevent KoReader recursive writeback --- api_koreader/models.py | 8 ++++++++ api_koreader/views.py | 5 ++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/api_koreader/models.py b/api_koreader/models.py index 8ad3bc5..e51a94c 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 ebed2ec..c9299f7 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) -- GitLab