diff --git a/catalog/common/models.py b/catalog/common/models.py index f7d44734..c7b2291d 100644 --- a/catalog/common/models.py +++ b/catalog/common/models.py @@ -338,6 +338,11 @@ class Item(SoftDeleteMixin, PolymorphicModel): def parent_uuid(self): return self.parent_item.uuid if self.parent_item else None + def log_action(self, changes): + LogEntry.objects.log_create( + self, action=LogEntry.Action.UPDATE, changes=changes + ) + def merge_to(self, to_item): if to_item is None: raise ValueError("cannot merge to an empty item") @@ -525,7 +530,18 @@ class ExternalResource(models.Model): unique_together = [["id_type", "id_value"]] def __str__(self): - return f"{self.pk}:{self.id_type}:{self.id_value if self.id_value else ''} ({self.url})" + return f"{self.pk}:{self.id_type}:{self.id_value or ''} ({self.url})" + + def unlink_from_item(self): + LogEntry.objects.log_create( + self.item, + action=LogEntry.Action.UPDATE, + changes={ + "__unlink__": [str(self), None], + }, + ) + self.item = None + self.save() def get_site(self): """place holder only, this will be injected from SiteManager""" diff --git a/catalog/models.py b/catalog/models.py index 47b95e21..a16feae7 100644 --- a/catalog/models.py +++ b/catalog/models.py @@ -1,4 +1,4 @@ -from .common.models import Item, ItemSchema +from .common.models import ExternalResource, Item, ItemSchema from .book.models import Edition, Work, Series, EditionSchema, EditionInSchema from .movie.models import Movie, MovieSchema, MovieInSchema from .tv.models import ( @@ -92,7 +92,8 @@ def init_catalog_search_models(): def init_catalog_audit_log(): for cls in Item.__subclasses__(): auditlog.register( - cls, exclude_fields=["metadata", "created_time", "edited_time"] + cls, + exclude_fields=["metadata", "created_time", "edited_time", "last_editor"], ) auditlog.register( diff --git a/catalog/search/views.py b/catalog/search/views.py index 51f624d1..d6d2a6d2 100644 --- a/catalog/search/views.py +++ b/catalog/search/views.py @@ -62,6 +62,12 @@ def fetch(request, url, is_refetch: bool = False, site: AbstractSite | None = No item = site.get_item() if item and not is_refetch: return redirect(item.url) + if item and is_refetch: + item.log_action( + { + "__refetch__": [url, None], + } + ) job_id = enqueue_fetch(url, is_refetch) return render( request, diff --git a/catalog/templates/catalog_edit.html b/catalog/templates/catalog_edit.html index 8bf4a510..f8b49b7c 100644 --- a/catalog/templates/catalog_edit.html +++ b/catalog/templates/catalog_edit.html @@ -53,7 +53,7 @@ onclick="{% if item %}window.location='{{ item.url }}'{% else %}history.go(-1){% endif %}"> - {% if request.user.is_superuser %} + {% if request.user.is_staff %}
+ | ({{ log.id }}) {{ log.actor }} {{ log.get_action_display }} on {{ log.timestamp }} | ||||
{{ key }} | -{{ value.0|default:"None" }} | -{{ value.1|default:"None" }} | +{{ value.0|default:"-" }} | +{{ value.1|default:"-" }} |