diff --git a/archivebox/abid_utils/admin.py b/archivebox/abid_utils/admin.py
new file mode 100644
index 00000000..31527983
--- /dev/null
+++ b/archivebox/abid_utils/admin.py
@@ -0,0 +1,18 @@
+from django.contrib import admin
+
+
+class ABIDModelAdmin(admin.ModelAdmin):
+ list_display = ('created', 'created_by', 'abid', '__str__')
+ sort_fields = ('created', 'created_by', 'abid', '__str__')
+ readonly_fields = ('abid', 'created', '__str__')
+
+ def get_form(self, request, obj=None, **kwargs):
+ form = super().get_form(request, obj, **kwargs)
+ if 'created_by' in form.base_fields:
+ 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()
diff --git a/archivebox/abid_utils/models.py b/archivebox/abid_utils/models.py
index 054336c5..e5502cea 100644
--- a/archivebox/abid_utils/models.py
+++ b/archivebox/abid_utils/models.py
@@ -93,7 +93,6 @@ class ABIDModel(models.Model):
super().save(*args, **kwargs)
assert str(self.id) == str(self.ABID.uuid), f'self.id {self.id} does not match self.ABID {self.ABID.uuid}'
assert str(self.abid) == str(self.ABID), f'self.abid {self.id} does not match self.ABID {self.ABID.uuid}'
-
@property
def abid_values(self) -> Dict[str, Any]:
diff --git a/archivebox/core/admin.py b/archivebox/core/admin.py
index 530e9b71..183bbb14 100644
--- a/archivebox/core/admin.py
+++ b/archivebox/core/admin.py
@@ -29,9 +29,10 @@ from ..util import htmldecode, urldecode, ansi_to_html
from core.models import Snapshot, ArchiveResult, Tag, SnapshotTag
from core.forms import AddLinkForm
-
from core.mixins import SearchResultsAdminMixin
from api.models import APIToken
+from abid_utils.models import get_or_create_system_user_pk
+from abid_utils.admin import ABIDModelAdmin
from index.html import snapshot_icons
from logging_util import printable_filesize
@@ -109,8 +110,6 @@ class ArchiveBoxAdmin(admin.AdminSite):
archivebox_admin = ArchiveBoxAdmin()
archivebox_admin.register(get_user_model())
-archivebox_admin.register(APIToken)
-archivebox_admin.register(get_webhook_model(), WebhookAdmin)
archivebox_admin.disable_action('delete_selected')
# archivebox_admin.register(CustomPlugin)
@@ -226,7 +225,7 @@ def get_abid_info(self, obj):
@admin.register(Snapshot, site=archivebox_admin)
-class SnapshotAdmin(SearchResultsAdminMixin, admin.ModelAdmin):
+class SnapshotAdmin(SearchResultsAdminMixin, ABIDModelAdmin):
class Meta:
model = Snapshot
@@ -519,7 +518,7 @@ class SnapshotAdmin(SearchResultsAdminMixin, admin.ModelAdmin):
# @admin.register(SnapshotTag, site=archivebox_admin)
-# class SnapshotTagAdmin(admin.ModelAdmin):
+# class SnapshotTagAdmin(ABIDModelAdmin):
# list_display = ('id', 'snapshot', 'tag')
# sort_fields = ('id', 'snapshot', 'tag')
# search_fields = ('id', 'snapshot_id', 'tag_id')
@@ -532,7 +531,7 @@ class SnapshotAdmin(SearchResultsAdminMixin, admin.ModelAdmin):
@admin.register(Tag, site=archivebox_admin)
-class TagAdmin(admin.ModelAdmin):
+class TagAdmin(ABIDModelAdmin):
list_display = ('abid', 'name', 'created', 'created_by', 'num_snapshots', 'snapshots')
sort_fields = ('name', 'slug', 'abid', 'created_by', 'created')
readonly_fields = ('slug', 'abid', 'created', 'modified', 'API', 'num_snapshots', 'snapshots')
@@ -568,7 +567,7 @@ class TagAdmin(admin.ModelAdmin):
@admin.register(ArchiveResult, site=archivebox_admin)
-class ArchiveResultAdmin(admin.ModelAdmin):
+class ArchiveResultAdmin(ABIDModelAdmin):
list_display = ('start_ts', 'snapshot_info', 'tags_str', 'extractor', 'cmd_str', 'status', 'output_str')
sort_fields = ('start_ts', 'extractor', 'status')
readonly_fields = ('cmd_str', 'snapshot_info', 'tags_str', 'created', 'modified', 'API', 'output_summary')
@@ -648,3 +647,23 @@ class ArchiveResultAdmin(admin.ModelAdmin):
output_str += format_html('{}{}
', int(not is_hidden), indentation_str, filename.strip())
return output_str + format_html('')
+
+
+
+@admin.register(APIToken, site=archivebox_admin)
+class APITokenAdmin(ABIDModelAdmin):
+ list_display = ('created', 'abid', 'created_by', 'token_redacted', 'expires')
+ sort_fields = ('abid', 'created', 'created_by', 'expires')
+ readonly_fields = ('abid', 'created')
+ search_fields = ('id', 'abid', 'created_by__username', 'token')
+ fields = ('created_by', 'token', 'expires', *readonly_fields)
+
+ list_filter = ('created_by',)
+ ordering = ['-created']
+ list_per_page = 100
+
+@admin.register(get_webhook_model(), site=archivebox_admin)
+class CustomWebhookAdmin(WebhookAdmin, ABIDModelAdmin):
+ list_display = ('created', 'created_by', 'abid', *WebhookAdmin.list_display)
+ sort_fields = ('created', 'created_by', 'abid', 'referenced_model', 'endpoint', 'last_success', 'last_error')
+ readonly_fields = ('abid', 'created', *WebhookAdmin.readonly_fields)