Source code for marsha.core.admin

"""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]