# -*- mode: python; coding: utf-8 -*- # Copyright (C) 2017-2019 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later from http.client import NO_CONTENT from django.contrib import messages from django.contrib.auth.decorators import login_required, permission_required from django.contrib.auth.mixins import LoginRequiredMixin from django.http import HttpResponse from django_filters.rest_framework import DjangoFilterBackend from django.db import transaction from django.shortcuts import redirect, render from django.utils import timezone from django.utils.translation import gettext_lazy as _ from django.views.generic import TemplateView, DetailView from rest_framework import viewsets from rest_framework.filters import SearchFilter from reversion import revisions as reversion from .models import Auteur, BD, CD, Emprunt, FutureMedia, Jeu, Manga, Revue, Roman, Vinyle from .serializers import AuteurSerializer, BDSerializer, CDSerializer, EmpruntSerializer, FutureMediaSerializer, \ JeuSerializer, MangaSerializer, RevueSerializer, RomanSerializer, VinyleSerializer @login_required @permission_required('media.change_emprunt') def retour_emprunt(request, empruntid): try: emprunt_instance = Emprunt.objects.get(pk=empruntid) except Emprunt.DoesNotExist: messages.error(request, u"Entrée inexistante") return redirect("admin:media_emprunt_changelist") with transaction.atomic(), reversion.create_revision(): emprunt_instance.permanencier_rendu = request.user emprunt_instance.date_rendu = timezone.now() emprunt_instance.save() reversion.set_user(request.user) messages.success(request, "Retour enregistré") return redirect("admin:media_emprunt_changelist") def index(request): """ Home page which redirect to admin when logged in """ if request.user.is_authenticated: return redirect('admin:index') else: return render(request, 'admin/index.html', { 'title': _('Welcome to the Mediatek database'), }) class FindMediumView(LoginRequiredMixin, TemplateView): template_name = "media/find_medium.html" class MarkMediumAsPresent(LoginRequiredMixin, DetailView): def dispatch(self, request, *args, **kwargs): object = self.get_object() object.present = not request.GET.get("absent", False) object.save() return HttpResponse("", content_type=204) class MarkBDAsPresent(MarkMediumAsPresent): model = BD class MarkMangaAsPresent(MarkMediumAsPresent): model = Manga class MarkCDAsPresent(MarkMediumAsPresent): model = CD class MarkVinyleAsPresent(MarkMediumAsPresent): model = Vinyle class MarkRomanAsPresent(MarkMediumAsPresent): model = Roman class MarkRevueAsPresent(MarkMediumAsPresent): model = Revue class MarkFutureAsPresent(MarkMediumAsPresent): model = FutureMedia class AuteurViewSet(viewsets.ModelViewSet): """ API endpoint that allows authors to be viewed or edited. """ queryset = Auteur.objects.all() serializer_class = AuteurSerializer class BDViewSet(viewsets.ModelViewSet): """ API endpoint that allows media to be viewed or edited. """ queryset = BD.objects.all() serializer_class = BDSerializer filter_backends = [DjangoFilterBackend, SearchFilter] filterset_fields = ["isbn", "side_identifier"] search_fields = ["=isbn", "title", "subtitle", "side_identifier", "authors__name"] class MangaViewSet(viewsets.ModelViewSet): """ API endpoint that allows media to be viewed or edited. """ queryset = Manga.objects.all() serializer_class = MangaSerializer filter_backends = [DjangoFilterBackend, SearchFilter] filterset_fields = ["isbn", "side_identifier"] search_fields = ["=isbn", "title", "subtitle", "side_identifier", "authors__name"] class CDViewSet(viewsets.ModelViewSet): """ API endpoint that allows media to be viewed or edited. """ queryset = CD.objects.all() serializer_class = CDSerializer filter_backends = [DjangoFilterBackend, SearchFilter] filterset_fields = ["side_identifier"] search_fields = ["title", "side_identifier", "authors__name"] class VinyleViewSet(viewsets.ModelViewSet): """ API endpoint that allows media to be viewed or edited. """ queryset = Vinyle.objects.all() serializer_class = VinyleSerializer filter_backends = [DjangoFilterBackend, SearchFilter] filterset_fields = ["side_identifier", "rpm"] search_fields = ["title", "side_identifier", "authors__name"] class RomanViewSet(viewsets.ModelViewSet): """ API endpoint that allows media to be viewed or edited. """ queryset = Roman.objects.all() serializer_class = RomanSerializer filter_backends = [DjangoFilterBackend, SearchFilter] filterset_fields = ["isbn", "side_identifier", "number_of_pages"] search_fields = ["=isbn", "title", "subtitle", "side_identifier", "authors__name"] class RevueViewSet(viewsets.ModelViewSet): """ API endpoint that allows media to be viewed or edited. """ queryset = Revue.objects.all() serializer_class = RevueSerializer filter_backends = [DjangoFilterBackend, SearchFilter] filterset_fields = ["number", "year", "month", "day", "double"] search_fields = ["title"] class FutureMediaViewSet(viewsets.ModelViewSet): """ API endpoint that allows media to be viewed or edited. """ queryset = FutureMedia.objects.all() serializer_class = FutureMediaSerializer filter_backends = [DjangoFilterBackend, SearchFilter] filterset_fields = ["isbn"] search_fields = ["=isbn"] class EmpruntViewSet(viewsets.ModelViewSet): """ API endpoint that allows borrowed items to be viewed or edited. """ queryset = Emprunt.objects.all() serializer_class = EmpruntSerializer class JeuViewSet(viewsets.ModelViewSet): """ API endpoint that allows games to be viewed or edited. """ queryset = Jeu.objects.all() serializer_class = JeuSerializer