allow accessing admin change pages by .abid as well as .id

This commit is contained in:
Nick Sweeting 2024-09-04 23:42:55 -07:00
parent cbf2a8fdc3
commit 0c236b034b
No known key found for this signature in database
3 changed files with 23 additions and 5 deletions

View file

@ -108,6 +108,15 @@ class ABIDModelAdmin(admin.ModelAdmin):
def change_view(self, request, object_id, form_url="", extra_context=None): def change_view(self, request, object_id, form_url="", extra_context=None):
self.request = request 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) return super().change_view(request, object_id, form_url, extra_context)
def get_form(self, request, obj=None, **kwargs): def get_form(self, request, obj=None, **kwargs):
@ -117,7 +126,9 @@ class ABIDModelAdmin(admin.ModelAdmin):
form.base_fields['created_by'].initial = request.user form.base_fields['created_by'].initial = request.user
return form return form
# def save_model(self, request, obj, form, change): def save_model(self, request, obj, form, change):
# if getattr(obj, 'created_by_id', None) in (None, get_or_create_system_user_pk()): old_abid = obj.abid
# obj.created_by = request.user super().save_model(request, obj, form, change)
# obj.save() 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)")

View file

@ -78,6 +78,9 @@ class MinimalArchiveResultSchema(Schema):
status: str status: str
output: str output: str
start_ts: Optional[datetime]
end_ts: Optional[datetime]
@staticmethod @staticmethod
def resolve_created_by_id(obj): def resolve_created_by_id(obj):
return str(obj.created_by_id) return str(obj.created_by_id)

View file

@ -21,6 +21,7 @@ from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin from django.contrib.auth.admin import UserAdmin
from django.core.paginator import Paginator from django.core.paginator import Paginator
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.template import Template, RequestContext
from django.conf import settings from django.conf import settings
from django import forms from django import forms
@ -250,7 +251,10 @@ class ArchiveResultInline(admin.TabularInline):
def get_parent_object_from_request(self, request): def get_parent_object_from_request(self, request):
resolved = resolve(request.path_info) 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( @admin.display(
description='Completed', description='Completed',