From 0c236b034bc2ab83f2ea0d860adb6a1e5b47be2a Mon Sep 17 00:00:00 2001 From: Nick Sweeting Date: Wed, 4 Sep 2024 23:42:55 -0700 Subject: [PATCH] allow accessing admin change pages by .abid as well as .id --- archivebox/abid_utils/admin.py | 19 +++++++++++++++---- archivebox/api/v1_core.py | 3 +++ archivebox/core/admin.py | 6 +++++- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/archivebox/abid_utils/admin.py b/archivebox/abid_utils/admin.py index 66e53bc7..6b8e949c 100644 --- a/archivebox/abid_utils/admin.py +++ b/archivebox/abid_utils/admin.py @@ -108,6 +108,15 @@ class ABIDModelAdmin(admin.ModelAdmin): def change_view(self, request, object_id, form_url="", extra_context=None): self.request = request + + if object_id: + try: + object_uuid = str(self.model.objects.only('pk').get(abid=self.model.abid_prefix + object_id.split('_', 1)[-1]).pk) + if object_id != object_uuid: + return redirect(self.request.path.replace(object_id, object_uuid), permanent=False) + except (self.model.DoesNotExist, ValidationError): + pass + return super().change_view(request, object_id, form_url, extra_context) def get_form(self, request, obj=None, **kwargs): @@ -117,7 +126,9 @@ class ABIDModelAdmin(admin.ModelAdmin): form.base_fields['created_by'].initial = request.user return form - # def save_model(self, request, obj, form, change): - # if getattr(obj, 'created_by_id', None) in (None, get_or_create_system_user_pk()): - # obj.created_by = request.user - # obj.save() + def save_model(self, request, obj, form, change): + old_abid = obj.abid + super().save_model(request, obj, form, change) + new_abid = obj.abid + if new_abid != old_abid: + messages.warning(request, f"The object's ABID has been updated! {old_abid} -> {new_abid} (any references to the old ABID will need to be updated)") diff --git a/archivebox/api/v1_core.py b/archivebox/api/v1_core.py index cc13b203..471ddbe7 100644 --- a/archivebox/api/v1_core.py +++ b/archivebox/api/v1_core.py @@ -78,6 +78,9 @@ class MinimalArchiveResultSchema(Schema): status: str output: str + start_ts: Optional[datetime] + end_ts: Optional[datetime] + @staticmethod def resolve_created_by_id(obj): return str(obj.created_by_id) diff --git a/archivebox/core/admin.py b/archivebox/core/admin.py index ca1adac4..46abfa07 100644 --- a/archivebox/core/admin.py +++ b/archivebox/core/admin.py @@ -21,6 +21,7 @@ from django.contrib.auth import get_user_model from django.contrib.auth.admin import UserAdmin from django.core.paginator import Paginator from django.core.exceptions import ValidationError +from django.template import Template, RequestContext from django.conf import settings from django import forms @@ -250,7 +251,10 @@ class ArchiveResultInline(admin.TabularInline): def get_parent_object_from_request(self, request): resolved = resolve(request.path_info) - return self.parent_model.objects.get(pk=resolved.kwargs['object_id']) + try: + return self.parent_model.objects.get(pk=resolved.kwargs['object_id']) + except (self.parent_model.DoesNotExist, ValidationError): + return self.parent_model.objects.get(abid=self.parent_model.abid_prefix + resolved.kwargs['object_id'].split('_', 1)[-1]) @admin.display( description='Completed',