# -*- mode: python; coding: utf-8 -*- # Copyright (C) 2017-2019 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from django.urls import reverse from django.utils.html import format_html from django.utils.translation import ugettext_lazy as _ from polymorphic.admin import PolymorphicChildModelAdmin, \ PolymorphicParentModelAdmin from med.admin import admin_site from reversion.admin import VersionAdmin from .forms import MediaAdminForm from .models import Author, Borrowable, CD, Comic, Emprunt, FutureMedium, \ Game, Manga, Novel, Review, Vinyl class AuthorAdmin(VersionAdmin): list_display = ('name',) search_fields = ('name',) class BorrowableAdmin(PolymorphicParentModelAdmin): search_fields = ('title',) child_models = (CD, Comic, Manga, Novel, Review, Vinyl,) def get_model_perms(self, request): # We don't want that the borrowable items appear directly in # main menu, but we still want search borrowable items. return {} class MediumAdmin(VersionAdmin, PolymorphicChildModelAdmin): list_display = ('__str__', 'authors_list', 'side_identifier', 'isbn', 'external_link') search_fields = ('title', 'authors__name', 'side_identifier', 'subtitle', 'isbn') autocomplete_fields = ('authors',) date_hierarchy = 'publish_date' form = MediaAdminForm show_in_index = True def authors_list(self, obj): return ", ".join([a.name for a in obj.authors.all()]) authors_list.short_description = _('authors') def external_link(self, obj): if obj.external_url: return format_html('{}', obj.external_url, obj.external_url) else: return "-" external_link.allow_tags = True external_link.short_description = _('external url') def get_form(self, request, obj=None, **kwargs): """ Pass request to form (for ISBN magic) """ form = super().get_form(request, obj=obj, **kwargs) form.request = request return form def changeform_view(self, request, object_id=None, form_url='', extra_context=None): """ We use _continue for ISBN fetching, so remove continue button """ extra_context = extra_context or {} extra_context['show_save_and_continue'] = False return super().changeform_view(request, object_id, form_url, extra_context=extra_context) class FutureMediumAdmin(VersionAdmin): list_display = ('isbn',) search_fields = ('isbn',) def changeform_view(self, request, object_id=None, form_url='', extra_context=None): """ We use _continue for ISBN fetching, so remove continue button """ extra_context = extra_context or {} extra_context['show_save_and_continue'] = False extra_context['show_save'] = False return super().changeform_view(request, object_id, form_url, extra_context=extra_context) class CDAdmin(VersionAdmin, PolymorphicChildModelAdmin): list_display = ('title', 'authors_list', 'side_identifier',) search_fields = ('title', 'authors__name', 'side_identifier',) autocomplete_fields = ('authors',) show_in_index = True def authors_list(self, obj): return ", ".join([a.name for a in obj.authors.all()]) authors_list.short_description = _('authors') class VinylAdmin(VersionAdmin, PolymorphicChildModelAdmin): list_display = ('title', 'authors_list', 'side_identifier', 'rpm',) search_fields = ('title', 'authors__name', 'side_identifier', 'rpm',) autocomplete_fields = ('authors',) show_in_index = True def authors_list(self, obj): return ", ".join([a.name for a in obj.authors.all()]) authors_list.short_description = _('authors') class ReviewAdmin(VersionAdmin, PolymorphicChildModelAdmin): list_display = ('__str__', 'number', 'year', 'month', 'day', 'double',) search_fields = ('title', 'number', 'year',) show_in_index = True class EmpruntAdmin(VersionAdmin): list_display = ('media', 'user', 'date_emprunt', 'date_rendu', 'permanencier_emprunt', 'permanencier_rendu_custom') search_fields = ('media__title', 'media__side_identifier', 'user__username', 'date_emprunt', 'date_rendu') date_hierarchy = 'date_emprunt' autocomplete_fields = ('media', 'user', 'permanencier_emprunt', 'permanencier_rendu') def permanencier_rendu_custom(self, obj): """ Show a button if item has not been returned yet """ if obj.permanencier_rendu: return obj.permanencier_rendu else: return format_html( '{}', reverse('media:retour-emprunt', args=[obj.pk]), _('Turn back') ) permanencier_rendu_custom.short_description = _('given back to') permanencier_rendu_custom.allow_tags = True def add_view(self, request, form_url='', extra_context=None): """ Autoselect keyholder registering a new borrowed item """ # Make GET data mutable data = request.GET.copy() data['permanencier_emprunt'] = request.user request.GET = data return super().add_view(request, form_url, extra_context) class GameAdmin(VersionAdmin, PolymorphicChildModelAdmin): list_display = ('title', 'owner', 'duration', 'players_min', 'players_max', 'comment') search_fields = ('name', 'owner__username', 'duration', 'comment') autocomplete_fields = ('owner',) admin_site.register(Author, AuthorAdmin) admin_site.register(Borrowable, BorrowableAdmin) admin_site.register(Comic, MediumAdmin) admin_site.register(Manga, MediumAdmin) admin_site.register(Novel, MediumAdmin) admin_site.register(CD, CDAdmin) admin_site.register(Vinyl, VinylAdmin) admin_site.register(Review, ReviewAdmin) admin_site.register(FutureMedium, FutureMediumAdmin) admin_site.register(Emprunt, EmpruntAdmin) admin_site.register(Game, GameAdmin)