# -*- mode: python; coding: utf-8 -*- # Copyright (C) 2017-2019 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later 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 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 Author, CD, Comic, Emprunt, FutureMedium, Game, Manga,\ Novel, Review, Vinyl from .serializers import AuthorSerializer, ComicSerializer, CDSerializer,\ EmpruntSerializer, FutureMediumSerializer, GameSerializer, \ MangaSerializer, NovelSerializer, ReviewSerializer, VinylSerializer @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") class IndexView(TemplateView): """ Home page which redirect to admin when logged in """ extra_context = {'title': _('Welcome to the Mediatek database')} template_name = 'admin/index.html' def dispatch(self, request, *args, **kwargs): if request.user.is_authenticated: return redirect('admin:index') return super().dispatch(request, *args, **kwargs) 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 MarkComicAsPresent(MarkMediumAsPresent): model = Comic class MarkMangaAsPresent(MarkMediumAsPresent): model = Manga class MarkCDAsPresent(MarkMediumAsPresent): model = CD class MarkVinylAsPresent(MarkMediumAsPresent): model = Vinyl class MarkNovelAsPresent(MarkMediumAsPresent): model = Novel class MarkReviewAsPresent(MarkMediumAsPresent): model = Review class MarkFutureAsPresent(MarkMediumAsPresent): model = FutureMedium class AuthorViewSet(viewsets.ModelViewSet): """ API endpoint that allows authors to be viewed or edited. """ queryset = Author.objects.all() serializer_class = AuthorSerializer class ComicViewSet(viewsets.ModelViewSet): """ API endpoint that allows media to be viewed or edited. """ queryset = Comic.objects.all() serializer_class = ComicSerializer 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 VinylViewSet(viewsets.ModelViewSet): """ API endpoint that allows media to be viewed or edited. """ queryset = Vinyl.objects.all() serializer_class = VinylSerializer filter_backends = [DjangoFilterBackend, SearchFilter] filterset_fields = ["side_identifier", "rpm"] search_fields = ["title", "side_identifier", "authors__name"] class NovelViewSet(viewsets.ModelViewSet): """ API endpoint that allows media to be viewed or edited. """ queryset = Novel.objects.all() serializer_class = NovelSerializer filter_backends = [DjangoFilterBackend, SearchFilter] filterset_fields = ["isbn", "side_identifier", "number_of_pages"] search_fields = ["=isbn", "title", "subtitle", "side_identifier", "authors__name"] class ReviewViewSet(viewsets.ModelViewSet): """ API endpoint that allows media to be viewed or edited. """ queryset = Review.objects.all() serializer_class = ReviewSerializer filter_backends = [DjangoFilterBackend, SearchFilter] filterset_fields = ["number", "year", "month", "day", "double"] search_fields = ["title"] class FutureMediumViewSet(viewsets.ModelViewSet): """ API endpoint that allows media to be viewed or edited. """ queryset = FutureMedium.objects.all() serializer_class = FutureMediumSerializer 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 GameViewSet(viewsets.ModelViewSet): """ API endpoint that allows games to be viewed or edited. """ queryset = Game.objects.all() serializer_class = GameSerializer