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 %}
@@ -66,15 +66,15 @@ {% for log in item.history.all %} - {% for key, value in log.changes_dict.items %} - - + + {% empty %}

No data.

diff --git a/catalog/views.py b/catalog/views.py index 87d08318..98d09985 100644 --- a/catalog/views.py +++ b/catalog/views.py @@ -280,8 +280,7 @@ def unlink(request): if not res_id: raise BadRequest() resource = get_object_or_404(ExternalResource, id=res_id) - resource.item = None - resource.save() + resource.unlink_from_item() return HttpResponseRedirect(request.META.get("HTTP_REFERER")) @@ -308,9 +307,13 @@ def remove_unused_seasons(request, item_path, item_uuid): if request.method != "POST": raise BadRequest() item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid)) - for s in item.seasons.all(): + l = list(item.seasons.all()) + for s in l: if not s.journal_exists(): s.delete() + l = [s.id for s in l] + l2 = [s.id for s in item.seasons.all()] + item.log_action({"__remove_unused_seasons__": [l, l2]}) return redirect(item.url)
+ ({{ 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:"-" }}