# Copyright (C) 2025 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU Affero General Public License version 3, or any later version
# See top-level LICENSE file for more information
"""Admin interfaces."""
import json
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.urls import reverse
from django.utils.html import format_html
from .forms import ActorChangeForm, ActorCreationForm
from .models import Actor, InboundNotification, Organization, OutboundNotification
[docs]
class ActorAdmin(UserAdmin):
add_form = ActorCreationForm
form = ActorChangeForm
model = Actor
list_display = (
"email",
"name",
"organization",
"is_staff",
"is_active",
)
# list_filter = ("email", "is_staff", "is_active",)
fieldsets = (
(None, {"fields": ("organization", "email", "name", "password")}),
("Permissions", {"fields": ("is_staff", "is_active")}),
)
add_fieldsets = (
(
None,
{
"classes": ("wide",),
"fields": (
"organization",
"email",
"password1",
"password2",
"is_staff",
"is_active",
),
},
),
)
search_fields = ["email", "name", "organization__name"]
ordering = ["name"]
admin.site.register(Actor, ActorAdmin)
[docs]
@admin.register(Organization)
class OrganizationAdmin(admin.ModelAdmin):
list_display = [
"id",
"name",
"url",
"inbox",
"created_at",
"updated_at",
]
search_fields = ["name", "url", "inbox"]
ordering = ["-name"]
[docs]
class NotificationAdmin(admin.ModelAdmin):
"""Base admin model for the CN."""
list_display = [
"created_at",
"status",
"get_payload",
"get_in_reply_to",
]
ordering = ["-created_at"]
list_filter = ["status"]
search_fields = ["payload"]
date_hierarchy = "created_at"
readonly_fields = ["payload", "in_reply_to", "id"]
[docs]
@admin.display(description="Payload")
def get_payload(self, obj):
return format_html("<pre>{}</pre>", json.dumps(obj.payload, indent=2))
[docs]
@admin.display(description="In reply to")
def get_in_reply_to(self, obj):
if obj.in_reply_to:
link = reverse(
f"admin:swh_coarnotify_server_{self.model.__qualname__.lower()}_change",
args=[obj.in_reply_to.id],
)
return format_html('<a href="{}">{}</a>', link, obj.in_reply_to)
else:
return "-"
[docs]
@admin.register(InboundNotification)
class InboundNotificationAdmin(NotificationAdmin):
pass
[docs]
@admin.register(OutboundNotification)
class OutboundNotificationAdmin(NotificationAdmin):
pass