273 lines
7.4 KiB
Python
273 lines
7.4 KiB
Python
"""Admin classes and registrations for People's core app."""
|
|
|
|
from django.contrib import admin, messages
|
|
from django.contrib.auth import admin as auth_admin
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from mailbox_manager.admin import MailDomainAccessInline
|
|
|
|
from . import models
|
|
from .plugins.loader import (
|
|
get_organization_plugins,
|
|
organization_plugins_run_after_create,
|
|
)
|
|
|
|
|
|
class TeamAccessInline(admin.TabularInline):
|
|
"""Inline admin class for team accesses."""
|
|
|
|
extra = 0
|
|
autocomplete_fields = ["user", "team"]
|
|
model = models.TeamAccess
|
|
readonly_fields = ("created_at", "updated_at")
|
|
|
|
|
|
class OrganizationAccessInline(admin.TabularInline):
|
|
"""Inline admin class for organization accesses."""
|
|
|
|
autocomplete_fields = ["user", "organization"]
|
|
extra = 0
|
|
model = models.OrganizationAccess
|
|
readonly_fields = ("created_at", "updated_at")
|
|
|
|
|
|
class TeamWebhookInline(admin.TabularInline):
|
|
"""Inline admin class for team webhooks."""
|
|
|
|
extra = 0
|
|
autocomplete_fields = ["team"]
|
|
model = models.TeamWebhook
|
|
readonly_fields = ("created_at", "updated_at")
|
|
|
|
|
|
@admin.register(models.User)
|
|
class UserAdmin(auth_admin.UserAdmin):
|
|
"""Admin class for the User model"""
|
|
|
|
autocomplete_fields = ["organization"]
|
|
fieldsets = (
|
|
(
|
|
None,
|
|
{
|
|
"fields": (
|
|
"id",
|
|
"sub",
|
|
"password",
|
|
"organization",
|
|
)
|
|
},
|
|
),
|
|
(_("Personal info"), {"fields": ("name", "email", "language", "timezone")}),
|
|
(
|
|
_("Permissions"),
|
|
{
|
|
"fields": (
|
|
"is_active",
|
|
"is_device",
|
|
"is_staff",
|
|
"is_superuser",
|
|
"groups",
|
|
"user_permissions",
|
|
),
|
|
},
|
|
),
|
|
(_("Important dates"), {"fields": ("created_at", "updated_at")}),
|
|
)
|
|
add_fieldsets = (
|
|
(
|
|
None,
|
|
{
|
|
"classes": ("wide",),
|
|
"fields": ("sub", "email", "password1", "password2"),
|
|
},
|
|
),
|
|
)
|
|
inlines = (TeamAccessInline, MailDomainAccessInline, OrganizationAccessInline)
|
|
list_display = (
|
|
"get_user",
|
|
"organization",
|
|
"created_at",
|
|
"updated_at",
|
|
"is_active",
|
|
"is_device",
|
|
"is_staff",
|
|
"is_superuser",
|
|
)
|
|
list_filter = ("is_staff", "is_superuser", "is_device", "is_active")
|
|
ordering = ("is_active", "-is_superuser", "-is_staff", "-is_device", "-updated_at")
|
|
readonly_fields = ["id", "created_at", "updated_at"]
|
|
search_fields = ("id", "email", "sub", "name")
|
|
|
|
def get_readonly_fields(self, request, obj=None):
|
|
"""The sub should only be editable for a create, not for updates."""
|
|
if obj:
|
|
return self.readonly_fields + ["sub"]
|
|
return self.readonly_fields
|
|
|
|
def get_user(self, obj):
|
|
"""Provide a nice display for user"""
|
|
return (
|
|
obj.name if obj.name else (obj.email if obj.email else f"[sub] {obj.sub}")
|
|
)
|
|
|
|
get_user.short_description = _("User")
|
|
|
|
|
|
class TeamServiceProviderInline(admin.TabularInline):
|
|
"""Inline admin class for service providers."""
|
|
|
|
can_delete = False
|
|
model = models.Team.service_providers.through
|
|
extra = 0
|
|
|
|
|
|
@admin.register(models.Team)
|
|
class TeamAdmin(admin.ModelAdmin):
|
|
"""Team admin interface declaration."""
|
|
|
|
inlines = (TeamAccessInline, TeamWebhookInline, TeamServiceProviderInline)
|
|
exclude = ("service_providers",) # Handled by the inline
|
|
list_display = (
|
|
"name",
|
|
"created_at",
|
|
"updated_at",
|
|
)
|
|
search_fields = ("name",)
|
|
|
|
|
|
@admin.register(models.TeamAccess)
|
|
class TeamAccessAdmin(admin.ModelAdmin):
|
|
"""Team access admin interface declaration."""
|
|
|
|
list_display = (
|
|
"user",
|
|
"team",
|
|
"role",
|
|
"created_at",
|
|
"updated_at",
|
|
)
|
|
|
|
|
|
@admin.register(models.Invitation)
|
|
class InvitationAdmin(admin.ModelAdmin):
|
|
"""Admin interface to handle invitations."""
|
|
|
|
fields = (
|
|
"email",
|
|
"team",
|
|
"role",
|
|
"created_at",
|
|
"issuer",
|
|
)
|
|
readonly_fields = (
|
|
"created_at",
|
|
"is_expired",
|
|
"issuer",
|
|
)
|
|
list_display = (
|
|
"email",
|
|
"team",
|
|
"created_at",
|
|
"is_expired",
|
|
)
|
|
|
|
def get_readonly_fields(self, request, obj=None):
|
|
"""Mark all fields read only, i.e. disable update."""
|
|
if obj:
|
|
return self.fields
|
|
return self.readonly_fields
|
|
|
|
def change_view(self, request, object_id, form_url="", extra_context=None):
|
|
"""Custom edit form. Remove 'save' buttons."""
|
|
extra_context = extra_context or {}
|
|
extra_context["show_save_and_continue"] = False
|
|
extra_context["show_save"] = False
|
|
extra_context["show_save_and_add_another"] = False
|
|
return super().change_view(request, object_id, extra_context=extra_context)
|
|
|
|
def save_model(self, request, obj, form, change):
|
|
"""Fill in current logged-in user as issuer."""
|
|
obj.issuer = request.user
|
|
obj.save()
|
|
|
|
|
|
@admin.register(models.Contact)
|
|
class ContactAdmin(admin.ModelAdmin):
|
|
"""Contact admin interface declaration."""
|
|
|
|
list_display = (
|
|
"full_name",
|
|
"owner",
|
|
"override",
|
|
)
|
|
|
|
|
|
class OrganizationServiceProviderInline(admin.TabularInline):
|
|
"""Inline admin class for service providers."""
|
|
|
|
can_delete = False
|
|
model = models.Organization.service_providers.through
|
|
extra = 0
|
|
|
|
|
|
@admin.action(description=_("Run post creation plugins"), permissions=["change"])
|
|
def run_post_creation_plugins(modeladmin, request, queryset): # pylint: disable=unused-argument
|
|
"""Run the post creation plugins for the selected organizations."""
|
|
for organization in queryset:
|
|
organization_plugins_run_after_create(organization)
|
|
|
|
messages.success(
|
|
request,
|
|
_("Post creation plugins have been run for the selected organizations."),
|
|
)
|
|
|
|
|
|
@admin.register(models.Organization)
|
|
class OrganizationAdmin(admin.ModelAdmin):
|
|
"""Admin interface for organizations."""
|
|
|
|
actions = [run_post_creation_plugins]
|
|
list_display = (
|
|
"name",
|
|
"created_at",
|
|
"updated_at",
|
|
)
|
|
search_fields = ("name",)
|
|
inlines = (OrganizationAccessInline, OrganizationServiceProviderInline)
|
|
exclude = ("service_providers",) # Handled by the inline
|
|
|
|
def get_actions(self, request):
|
|
"""Adapt actions list to the context."""
|
|
actions = super().get_actions(request)
|
|
if not get_organization_plugins():
|
|
actions.pop("run_post_creation_plugins", None)
|
|
return actions
|
|
|
|
|
|
@admin.register(models.OrganizationAccess)
|
|
class OrganizationAccessAdmin(admin.ModelAdmin):
|
|
"""Organization access admin interface declaration."""
|
|
|
|
autocomplete_fields = ("user", "organization")
|
|
list_display = (
|
|
"user",
|
|
"organization",
|
|
"role",
|
|
"created_at",
|
|
"updated_at",
|
|
)
|
|
|
|
|
|
@admin.register(models.ServiceProvider)
|
|
class ServiceProviderAdmin(admin.ModelAdmin):
|
|
"""Admin interface for service providers."""
|
|
|
|
list_display = (
|
|
"name",
|
|
"audience_id",
|
|
"created_at",
|
|
"updated_at",
|
|
)
|
|
search_fields = ("name", "audience_id")
|
|
readonly_fields = ("created_at", "updated_at")
|