"""Admin of the ``core`` app of the Marsha project."""
from typing import List, Sequence, Type
from django.contrib import admin
from django.contrib.admin.options import InlineModelAdmin
from django.contrib.auth.admin import UserAdmin as DefaultUserAdmin
from django.db.models import Model
from django.utils.translation import gettext_lazy as _
from safedelete.admin import SafeDeleteAdmin
from marsha.core.models import (
AudioTrack,
Authoring,
ConsumerSite,
Organization,
OrganizationManager,
Playlist,
PlaylistAccess,
PlaylistVideo,
SignTrack,
SiteAdmin,
SiteOrganization,
SubtitleTrack,
User,
Video,
)
[docs]class MarshaAdminSite(admin.AdminSite):
"""Admin site for Marsha."""
site_title: str = _("{marsha_name} administration").format(marsha_name="Marsha")
site_header: str = "Marsha"
admin_site = MarshaAdminSite(name="admin")
[docs]class BaseTabularInline(admin.TabularInline):
"""Base for all our tabular inlines."""
model: Type[Model]
verbose_name: str
verbose_name_plural: str
[docs]class BaseModelAdmin(SafeDeleteAdmin):
"""Base for all our model admins."""
list_display: Sequence[str]
inlines: List[InlineModelAdmin]
exclude: Sequence[str]
[docs]class OrganizationManagersInline(BaseTabularInline):
"""Inline for managers in an organization."""
model = OrganizationManager
verbose_name = _("manager")
verbose_name_plural = _("managers")
[docs]class ManagedOrganizationsInline(BaseTabularInline):
"""Inline for organizations managed by a user."""
model = OrganizationManager
verbose_name = _("managed organization")
verbose_name_plural = _("managed organizations")
[docs]class AuthorOrganizationsInline(BaseTabularInline):
"""Inline for organizations the user is an author of."""
model = Authoring
verbose_name = _("authoring organization")
verbose_name_plural = _("authoring organizations")
[docs]class OrganizationAuthorsInline(BaseTabularInline):
"""Inline for authors in an organization."""
model = Authoring
verbose_name = _("author")
verbose_name_plural = _("authors")
[docs]@admin.register(User, site=admin_site)
class UserAdmin(DefaultUserAdmin):
"""Admin class for the User model."""
inlines = DefaultUserAdmin.inlines + [
ManagedOrganizationsInline,
AuthorOrganizationsInline,
]
[docs]class SiteAdminsInline(BaseTabularInline):
"""Inline for admins of a site."""
model = SiteAdmin
verbose_name = _("admin")
verbose_name_plural = _("admins")
[docs]class SiteOrganizationsInline(BaseTabularInline):
"""Inline for organizations in a site."""
model = SiteOrganization
verbose_name = _("organization")
verbose_name_plural = _("organizations")
[docs]class OrganizationSitesInline(BaseTabularInline):
"""Inline for sites for an organization."""
model = SiteOrganization
verbose_name = _("site")
verbose_name_plural = _("sites")
[docs]@admin.register(ConsumerSite, site=admin_site)
class ConsumerSiteAdmin(BaseModelAdmin):
"""Admin class for the ConsumerSite model."""
list_display = ("name",)
inlines = [SiteAdminsInline, SiteOrganizationsInline]
[docs]@admin.register(Organization, site=admin_site)
class OrganizationAdmin(BaseModelAdmin):
"""Admin class for the Organization model."""
list_display = ("name",)
inlines = [
OrganizationManagersInline,
OrganizationSitesInline,
OrganizationAuthorsInline,
]
[docs]class AudioTrackInline(BaseTabularInline):
"""Inline for audio tracks of a video."""
model = AudioTrack
[docs]class SubtitleTrackInline(BaseTabularInline):
"""Inline for subtitle tracks of a video."""
model = SubtitleTrack
[docs]class SignTrackInline(BaseTabularInline):
"""Inline for sign tracks of a video."""
model = SignTrack
[docs]@admin.register(Video, site=admin_site)
class VideoAdmin(BaseModelAdmin):
"""Admin class for the Video model."""
list_display = ("name", "author", "language")
exclude = ("duplicated_from",)
inlines = [AudioTrackInline, SubtitleTrackInline, SignTrackInline]
[docs]class PlaylistVideosInline(BaseTabularInline):
"""Inline for videos in a playlist."""
model = PlaylistVideo
verbose_name = _("video")
verbose_name_plural = _("videos")
[docs]class PlaystlistAccessesInline(BaseTabularInline):
"""Inline for with right to write access to a playlist."""
model = PlaylistAccess
verbose_name = _("user access")
verbose_name_plural = _("users accesses")
[docs]@admin.register(Playlist, site=admin_site)
class PlaylistAdmin(BaseModelAdmin):
"""Admin class for the Playlist model."""
list_display = ("name", "organization", "author", "is_public")
exclude = ("duplicated_from",)
inlines = [PlaylistVideosInline, PlaystlistAccessesInline]