photo26/photologue/admin.py
krek0 f7415fb5f6
All checks were successful
Docker / build (release) Successful in 9s
Sort gallery media by capture date instead of file name
2026-09-24 12:52:50 +02:00

80 lines
2.7 KiB
Python

# This file is part of photo21
# Copyright (C) 2022 Amicale des élèves de l'ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
from django.contrib import admin
from django.utils.translation import gettext_lazy as _
from .models import Gallery, Photo, Tag, Video
class GalleryAdmin(admin.ModelAdmin):
list_display = ("title", "date_start", "photo_count", "get_tags")
list_filter = ["date_start", "tags", "is_public"]
date_hierarchy = "date_start"
prepopulated_fields = {"slug": ("title",)}
model = Gallery
autocomplete_fields = ["tags"]
search_fields = ["title",]
filter_horizontal = ("photos",)
def get_tags(self, obj):
return ", ".join([t.name for t in obj.tags.all()])
get_tags.short_description = _("tags")
def get_queryset(self, request):
# Cette étape est correcte et essentielle
return super().get_queryset(request).prefetch_related("tags")
class MediaAdmin(admin.ModelAdmin):
"""Shared admin base for Photo and Video."""
list_filter = ["date_added", "is_public", "owner", "galleries"]
search_fields = ["title", "slug", "caption"]
list_per_page = 25
prepopulated_fields = {"slug": ("title",)}
def get_owner(self, obj):
return obj.owner.username
def get_galleries(self, obj):
return ", ".join([g.title for g in obj.galleries.all()])
def get_queryset(self, request):
return super().get_queryset(request).prefetch_related("owner", "galleries")
def get_date_source(self, obj):
return obj.get_date_source_display() or "-"
get_owner.admin_order_field = "owner"
get_owner.short_description = _("owner")
get_galleries.short_description = _("Gallery")
get_date_source.admin_order_field = "date_source"
get_date_source.short_description = _("date source")
class PhotoAdmin(MediaAdmin):
list_display = ("title", "date_taken", "get_date_source", "date_added", "is_public", "view_count", "admin_thumbnail", "get_owner", "get_galleries")
# The capture date is editable so that a camera set to the wrong time can be
# corrected; an edited date is then marked as manual and never overwritten.
model = Photo
class TagAdmin(admin.ModelAdmin):
list_display = ("name",)
search_fields = ("name",)
prepopulated_fields = {"slug": ("name",)}
model = Tag
class VideoAdmin(MediaAdmin):
list_display = ("title", "date_taken", "get_date_source", "date_added", "is_public", "get_owner", "get_galleries")
model = Video
admin.site.register(Gallery, GalleryAdmin)
admin.site.register(Photo, PhotoAdmin)
admin.site.register(Video, VideoAdmin)
admin.site.register(Tag, TagAdmin)