From 796c985ffb3c665f0f30ad9ba50aa14b51c5c136 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 25 Sep 2020 10:27:43 +0200 Subject: [PATCH] Add page to search a media by its ISBN --- logs/tests/test_templates.py | 1 - logs/views.py | 1 - med/settings.py | 1 + med/urls.py | 11 ++- media/admin.py | 2 +- media/management/commands/import_cds.py | 1 - .../commands/import_future_media.py | 1 - media/management/commands/import_isbn.py | 1 - .../commands/import_no_isbn_roman.py | 1 - media/management/commands/import_vinyles.py | 1 - .../management/commands/split_media_types.py | 1 - media/scraper.py | 1 - media/serializers.py | 46 ++++++++-- media/templates/media/find_medium.html | 92 +++++++++++++++++++ media/tests/test_templates.py | 1 - media/urls.py | 2 + media/views.py | 88 +++++++++++++++++- requirements.txt | 2 +- theme/templates/admin/base_site.html | 2 + users/admin.py | 2 +- users/models.py | 1 - users/tests/test_templates.py | 1 - users/views.py | 2 +- 23 files changed, 232 insertions(+), 30 deletions(-) create mode 100644 media/templates/media/find_medium.html diff --git a/logs/tests/test_templates.py b/logs/tests/test_templates.py index 9c6b0e9..d953ff5 100644 --- a/logs/tests/test_templates.py +++ b/logs/tests/test_templates.py @@ -3,7 +3,6 @@ from django.test import TestCase from django.urls import reverse - from users.models import User """ diff --git a/logs/views.py b/logs/views.py index 4eac1a9..0b45c67 100644 --- a/logs/views.py +++ b/logs/views.py @@ -9,7 +9,6 @@ from django.db.models import Count from django.shortcuts import render from django.utils.translation import gettext_lazy as _ from reversion.models import Revision - from med.settings import PAGINATION_NUMBER from users.models import User diff --git a/med/settings.py b/med/settings.py index b9b08cd..0786c1b 100644 --- a/med/settings.py +++ b/med/settings.py @@ -45,6 +45,7 @@ INSTALLED_APPS = [ 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', + 'django_filters', # Med apps 'users', diff --git a/med/urls.py b/med/urls.py index 51e3f3d..32cee63 100644 --- a/med/urls.py +++ b/med/urls.py @@ -2,10 +2,9 @@ # Copyright (C) 2017-2019 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later -from django.contrib.auth.decorators import login_required from django.contrib.auth.views import PasswordResetView from django.urls import include, path -from django.views.generic import RedirectView, TemplateView +from django.views.generic import RedirectView from rest_framework import routers import media.views @@ -15,7 +14,13 @@ from .admin import admin_site # API router router = routers.DefaultRouter() router.register(r'authors', media.views.AuteurViewSet) -router.register(r'media', media.views.MediaViewSet) +router.register(r'media/bd', media.views.BDViewSet) +router.register(r'media/manga', media.views.MangaViewSet) +router.register(r'media/cd', media.views.CDViewSet) +router.register(r'media/vinyle', media.views.VinyleViewSet) +router.register(r'media/roman', media.views.RomanViewSet) +router.register(r'media/revue', media.views.RevueViewSet) +router.register(r'media/future', media.views.FutureMediaViewSet) router.register(r'borrowed_items', media.views.EmpruntViewSet) router.register(r'games', media.views.JeuViewSet) router.register(r'users', users.views.UserViewSet) diff --git a/media/admin.py b/media/admin.py index 3ecbab2..0a832e3 100644 --- a/media/admin.py +++ b/media/admin.py @@ -6,8 +6,8 @@ from django.urls import reverse from django.utils.html import format_html from django.utils.translation import ugettext_lazy as _ from reversion.admin import VersionAdmin - from med.admin import admin_site + from .forms import MediaAdminForm from .models import Auteur, BD, CD, Emprunt, FutureMedia, Jeu, Manga,\ Revue, Roman, Vinyle diff --git a/media/management/commands/import_cds.py b/media/management/commands/import_cds.py index d783a12..3498958 100644 --- a/media/management/commands/import_cds.py +++ b/media/management/commands/import_cds.py @@ -2,7 +2,6 @@ from argparse import FileType from sys import stdin from django.core.management import BaseCommand - from media.models import Auteur, CD diff --git a/media/management/commands/import_future_media.py b/media/management/commands/import_future_media.py index 3e39022..d028b4e 100644 --- a/media/management/commands/import_future_media.py +++ b/media/management/commands/import_future_media.py @@ -2,7 +2,6 @@ from time import sleep from django.core.exceptions import ValidationError from django.core.management import BaseCommand - from media.forms import MediaAdminForm from media.models import BD, FutureMedia, Manga, Roman diff --git a/media/management/commands/import_isbn.py b/media/management/commands/import_isbn.py index 9db98cb..c7bd893 100644 --- a/media/management/commands/import_isbn.py +++ b/media/management/commands/import_isbn.py @@ -3,7 +3,6 @@ from sys import stdin from django.core.exceptions import ValidationError from django.core.management import BaseCommand - from media.models import BD, FutureMedia, Manga, Roman from media.validators import isbn_validator diff --git a/media/management/commands/import_no_isbn_roman.py b/media/management/commands/import_no_isbn_roman.py index 5e822fc..64d5811 100644 --- a/media/management/commands/import_no_isbn_roman.py +++ b/media/management/commands/import_no_isbn_roman.py @@ -4,7 +4,6 @@ from argparse import FileType from sys import stdin from django.core.management import BaseCommand - from media.models import Auteur, Roman diff --git a/media/management/commands/import_vinyles.py b/media/management/commands/import_vinyles.py index dc64372..029fbff 100644 --- a/media/management/commands/import_vinyles.py +++ b/media/management/commands/import_vinyles.py @@ -2,7 +2,6 @@ from argparse import FileType from sys import stdin from django.core.management import BaseCommand - from media.models import Auteur, Vinyle diff --git a/media/management/commands/split_media_types.py b/media/management/commands/split_media_types.py index 823009a..fe7fd7d 100644 --- a/media/management/commands/split_media_types.py +++ b/media/management/commands/split_media_types.py @@ -1,7 +1,6 @@ from time import sleep from django.core.management import BaseCommand - from media.forms import MediaAdminForm from media.models import BD, Manga diff --git a/media/scraper.py b/media/scraper.py index 84de5a8..0026d61 100644 --- a/media/scraper.py +++ b/media/scraper.py @@ -4,7 +4,6 @@ import re import requests - from media.models import Auteur diff --git a/media/serializers.py b/media/serializers.py index bbdce2e..53cb0ea 100644 --- a/media/serializers.py +++ b/media/serializers.py @@ -1,20 +1,54 @@ from rest_framework import serializers -from .models import Auteur, BD, Emprunt, Jeu +from .models import Auteur, BD, CD, FutureMedia, Manga, Emprunt, Jeu, Revue, Roman, Vinyle -class AuteurSerializer(serializers.HyperlinkedModelSerializer): +class AuteurSerializer(serializers.ModelSerializer): class Meta: model = Auteur fields = ['url', 'name'] -class MediaSerializer(serializers.HyperlinkedModelSerializer): +class BDSerializer(serializers.ModelSerializer): class Meta: model = BD - fields = ['url', 'isbn', 'title', 'subtitle', 'external_url', - 'side_identifier', 'authors', 'number_of_pages', - 'publish_date'] + fields = '__all__' + + +class MangaSerializer(serializers.ModelSerializer): + class Meta: + model = Manga + fields = '__all__' + + +class CDSerializer(serializers.ModelSerializer): + class Meta: + model = CD + fields = '__all__' + + +class VinyleSerializer(serializers.ModelSerializer): + class Meta: + model = Vinyle + fields = '__all__' + + +class RomanSerializer(serializers.ModelSerializer): + class Meta: + model = Roman + fields = '__all__' + + +class RevueSerializer(serializers.ModelSerializer): + class Meta: + model = Revue + fields = '__all__' + + +class FutureMediaSerializer(serializers.ModelSerializer): + class Meta: + model = FutureMedia + fields = '__all__' class EmpruntSerializer(serializers.HyperlinkedModelSerializer): diff --git a/media/templates/media/find_medium.html b/media/templates/media/find_medium.html new file mode 100644 index 0000000..0e406d4 --- /dev/null +++ b/media/templates/media/find_medium.html @@ -0,0 +1,92 @@ +{% extends "base.html" %} + +{% block content %} +
+ + + +
+ +{% endblock %} + +{% block extrajavascript %} + +{% endblock %} diff --git a/media/tests/test_templates.py b/media/tests/test_templates.py index c103359..bdea46d 100644 --- a/media/tests/test_templates.py +++ b/media/tests/test_templates.py @@ -3,7 +3,6 @@ from django.test import TestCase from django.urls import reverse - from media.models import Auteur, BD from users.models import User diff --git a/media/urls.py b/media/urls.py index 1e7a45a..348189a 100644 --- a/media/urls.py +++ b/media/urls.py @@ -3,6 +3,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later from django.conf.urls import url +from django.urls import path from . import views @@ -10,4 +11,5 @@ app_name = 'media' urlpatterns = [ url(r'^retour_emprunt/(?P[0-9]+)$', views.retour_emprunt, name='retour-emprunt'), + path('find/', views.FindMediumView.as_view()), ] diff --git a/media/views.py b/media/views.py index e6ac52f..b68ebc3 100644 --- a/media/views.py +++ b/media/views.py @@ -4,16 +4,20 @@ from django.contrib import messages from django.contrib.auth.decorators import login_required, permission_required +from django.contrib.auth.mixins import LoginRequiredMixin +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 from rest_framework import viewsets +from rest_framework.filters import SearchFilter from reversion import revisions as reversion -from .models import Auteur, BD, Emprunt, Jeu -from .serializers import AuteurSerializer, EmpruntSerializer, \ - JeuSerializer, MediaSerializer +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 @@ -45,6 +49,10 @@ def index(request): }) +class FindMediumView(LoginRequiredMixin, TemplateView): + template_name = "media/find_medium.html" + + class AuteurViewSet(viewsets.ModelViewSet): """ API endpoint that allows authors to be viewed or edited. @@ -53,12 +61,82 @@ class AuteurViewSet(viewsets.ModelViewSet): serializer_class = AuteurSerializer -class MediaViewSet(viewsets.ModelViewSet): +class BDViewSet(viewsets.ModelViewSet): """ API endpoint that allows media to be viewed or edited. """ queryset = BD.objects.all() - serializer_class = MediaSerializer + 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 = ["$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): diff --git a/requirements.txt b/requirements.txt index b07f6e7..8b17ee6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ Pillow~=5.4.1 pytz~=2019.1 six~=1.12.0 sqlparse~=0.2.4 -django-cas-client~=1.2.0 +django-filter~=2.1.0 django-reversion~=3.0.3 python-stdnum~=1.10 djangorestframework~=3.9.0 diff --git a/theme/templates/admin/base_site.html b/theme/templates/admin/base_site.html index 2082f73..acec203 100644 --- a/theme/templates/admin/base_site.html +++ b/theme/templates/admin/base_site.html @@ -115,4 +115,6 @@ SPDX-License-Identifier: GPL-3.0-or-later }); } + + {% block extrajavascript %}{% endblock %} {% endblock %} diff --git a/users/admin.py b/users/admin.py index effd1c0..e8d3a7c 100644 --- a/users/admin.py +++ b/users/admin.py @@ -10,8 +10,8 @@ from django.urls import reverse from django.utils.html import format_html from django.utils.translation import ugettext_lazy as _ from reversion.admin import VersionAdmin - from med.admin import admin_site + from .forms import UserCreationAdminForm from .models import Adhesion, User diff --git a/users/models.py b/users/models.py index e333b58..bdd5092 100644 --- a/users/models.py +++ b/users/models.py @@ -6,7 +6,6 @@ from django.contrib.auth.models import AbstractUser from django.db import models from django.utils import timezone from django.utils.translation import gettext_lazy as _ - from med.settings import MAX_EMPRUNT diff --git a/users/tests/test_templates.py b/users/tests/test_templates.py index 1a8b9c9..f94e9b7 100644 --- a/users/tests/test_templates.py +++ b/users/tests/test_templates.py @@ -4,7 +4,6 @@ from django.core import mail from django.test import TestCase from django.urls import reverse - from users.models import User """ diff --git a/users/views.py b/users/views.py index 08e8238..1673ce0 100644 --- a/users/views.py +++ b/users/views.py @@ -11,9 +11,9 @@ from django.template.context_processors import csrf from django.utils.translation import ugettext_lazy as _ from rest_framework import viewsets from reversion import revisions as reversion - from users.forms import BaseInfoForm from users.models import Adhesion, User + from .serializers import GroupSerializer, UserSerializer