From a6dc8653afb2808b1eeeb98bae853893e7fb5545 Mon Sep 17 00:00:00 2001 From: Alexandre Iooss Date: Sat, 10 Aug 2019 10:44:17 +0200 Subject: [PATCH] Django upgrade --- README.md | 15 +++ logs/urls.py | 1 + med/urls.py | 27 +++-- media/admin.py | 5 + media/locale/fr/LC_MESSAGES/django.po | 78 +------------- media/urls.py | 1 + media/views.py | 10 +- requirements.txt | 2 +- theme/locale/fr/LC_MESSAGES/django.po | 114 +++++++++++++++++--- theme/static/css/admin.css | 6 -- theme/tests/test_templates.py | 6 +- users/__init__.py | 5 + users/admin.py | 5 +- users/apps.py | 19 ++++ users/forms.py | 6 ++ users/locale/fr/LC_MESSAGES/django.po | 36 +++---- users/migrations/0028_auto_20190810_1003.py | 18 ++++ users/signals.py | 14 +++ users/views.py | 9 +- 19 files changed, 240 insertions(+), 137 deletions(-) create mode 100644 users/apps.py create mode 100644 users/migrations/0028_auto_20190810_1003.py create mode 100644 users/signals.py diff --git a/README.md b/README.md index 20d9ff6..159335a 100644 --- a/README.md +++ b/README.md @@ -39,29 +39,44 @@ FLUSH PRIVILEGES; ``` bureau + Can view borrowed item Can add borrowed item Can change borrowed item Can delete borrowed item + Can view adhesion Can add adhesion Can change adhesion Can delete adhesion + Can view clef Can add clef Can change clef Can delete clef + Can view user Can add user Can change user keyholder + Can view auteur Can add auteur Can change auteur Can delete auteur + Can view media Can add media Can change media Can delete media + Can view jeu Can add jeu Can change jeu Can delete jeu + Can view emprunt Can add emprunt Can change emprunt Can delete emprunt + Can view user + Can view clef + +users + Can view auteur + Can view media + Can view jeu ``` diff --git a/logs/urls.py b/logs/urls.py index 533fe25..92aad92 100644 --- a/logs/urls.py +++ b/logs/urls.py @@ -6,6 +6,7 @@ from django.conf.urls import url from . import views +app_name = 'logs' urlpatterns = [ url(r'^$', views.index, name='index'), url(r'^stats_actions/$', views.stats_actions, name='stats-actions'), diff --git a/med/urls.py b/med/urls.py index 4b957cb..b422376 100644 --- a/med/urls.py +++ b/med/urls.py @@ -2,28 +2,27 @@ # Copyright (C) 2017-2019 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later -from django.conf.urls import include, url -from django.contrib.auth.views import password_reset +from django.contrib.auth.views import PasswordResetView +from django.urls import include, path from django.views.generic import RedirectView from media.views import index from .admin import admin_site urlpatterns = [ - url(r'^$', index, name='index'), + path('', index, name='index'), # Include project routers - url(r'^users/', include('users.urls', namespace='users')), - url(r'^media/', include('media.urls', namespace='media')), - url(r'^logs/', include('logs.urls', namespace='logs')), + path('users/', include('users.urls')), + path('media/', include('media.urls')), + path('logs/', include('logs.urls')), # Include Django Contrib and Core routers - url(r'^accounts/password_reset/$', - password_reset, name='admin_password_reset'), - url(r'^i18n/', include('django.conf.urls.i18n')), - url(r'^accounts/', include('django.contrib.auth.urls')), - url(r'^accounts/profile/', - RedirectView.as_view(pattern_name='index')), - url(r'^database/doc/', include('django.contrib.admindocs.urls')), - url(r'^database/', admin_site.urls), + path('accounts/password_reset/', PasswordResetView.as_view(), + name='admin_password_reset'), + path('i18n/', include('django.conf.urls.i18n')), + path('accounts/', include('django.contrib.auth.urls')), + path('accounts/profile/', RedirectView.as_view(pattern_name='index')), + path('database/doc/', include('django.contrib.admindocs.urls')), + path('database/', admin_site.urls), ] diff --git a/media/admin.py b/media/admin.py index e65454a..fcbe875 100644 --- a/media/admin.py +++ b/media/admin.py @@ -10,10 +10,12 @@ from .models import Auteur, Emprunt, Jeu, Media class AuteurAdmin(VersionAdmin): list_display = ('nom',) + search_fields = ('nom',) class MediaAdmin(VersionAdmin): list_display = ('titre', 'authors', 'cote') + search_fields = ('titre', 'authors', 'cote') def authors(self, obj): return ", ".join([a.nom for a in obj.auteur.all()]) @@ -22,11 +24,14 @@ class MediaAdmin(VersionAdmin): class EmpruntAdmin(VersionAdmin): list_display = ('media', 'user', 'date_emprunt', 'date_rendu', 'permanencier_emprunt', 'permanencier_rendu') + search_fields = ('media', 'user', 'date_emprunt', 'date_rendu') + date_hierarchy = 'date_emprunt' class JeuAdmin(VersionAdmin): list_display = ('nom', 'proprietaire', 'duree', 'nombre_joueurs_min', 'nombre_joueurs_max', 'comment') + search_fields = ('nom', 'proprietaire', 'duree', 'comment') admin_site.register(Auteur, AuteurAdmin) diff --git a/media/locale/fr/LC_MESSAGES/django.po b/media/locale/fr/LC_MESSAGES/django.po index 5284baf..3915b8f 100644 --- a/media/locale/fr/LC_MESSAGES/django.po +++ b/media/locale/fr/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-09 22:25+0200\n" +"POT-Creation-Date: 2019-08-10 10:24+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -45,78 +45,10 @@ msgstr "jeu" msgid "games" msgstr "jeux" -#: templates/media/index.html:41 -msgid "My profile" -msgstr "Mon profil" - -#: templates/media/index.html:43 -msgid "Edit" -msgstr "Éditer" - -#: templates/media/index.html:47 -msgid "username" -msgstr "" - -#: templates/media/index.html:48 -msgid "email" -msgstr "" - -#: templates/media/index.html:49 -msgid "comment" -msgstr "" - -#: templates/media/index.html:50 -msgid "date joined" -msgstr "" - -#: templates/media/index.html:51 -msgid "last login" -msgstr "" - -#: templates/media/index.html:52 -msgid "address" -msgstr "" - -#: templates/media/index.html:53 -msgid "phone number" -msgstr "" - -#: templates/media/index.html:54 -msgid "groups" -msgstr "" - -#: templates/media/index.html:55 -msgid "maximum borrowed" -msgstr "emprunts maximal" - -#: templates/media/index.html:57 -msgid "membership for current year" -msgstr "membre pour cette année" - -#: templates/media/index.html:59 -msgid "yes" -msgstr "oui" - -#: templates/media/index.html:61 -msgid "no" -msgstr "non" - -#: templates/media/index.html:66 -msgid "Current borrowed items" -msgstr "Emprunts en cours" - -#: templates/media/index.html:70 -msgid "since" -msgstr "depuis" - -#: templates/media/index.html:74 -msgid "No current borrowed items." -msgstr "Pas d'emprunts en cours." - -#: templates/media/index.html:77 -msgid "You are not logged in." -msgstr "Vous n'êtes pas identifié." - #: templates/media/media.html:37 msgid "Save" msgstr "Enregistrer" + +#: views.py:80 +msgid "Welcome to the Mediatek database" +msgstr "Bienvenue sur la base de données de la Mediatek" diff --git a/media/urls.py b/media/urls.py index 2e62a3e..429fd4f 100644 --- a/media/urls.py +++ b/media/urls.py @@ -6,6 +6,7 @@ from django.conf.urls import url from . import views +app_name = 'media' urlpatterns = [ url(r'^add_emprunt/(?P[0-9]+)$', views.add_emprunt, name='add-emprunt'), diff --git a/media/views.py b/media/views.py index f20c942..2e6950d 100644 --- a/media/views.py +++ b/media/views.py @@ -29,14 +29,14 @@ def add_emprunt(request, userid): user = User.objects.get(pk=userid) except User.DoesNotExist: messages.error(request, u"Entrée inexistante") - return redirect("/") + return redirect("admin:media_emprunt_changelist") emprunts_en_cours = Emprunt.objects.filter(date_rendu=None, user=user).count() if emprunts_en_cours >= user.maxemprunt: messages.error(request, "Maximum d'emprunts atteint de " "l'user %s" % user.maxemprunt) - return redirect("/") + return redirect("admin:media_emprunt_changelist") emprunt = EmpruntForm(request.POST or None) if emprunt.is_valid(): emprunt = emprunt.save(commit=False) @@ -48,7 +48,7 @@ def add_emprunt(request, userid): reversion.set_user(request.user) reversion.set_comment("Création") messages.success(request, "Le emprunt a été ajouté") - return redirect("/") + return redirect("admin:media_emprunt_changelist") return form({'form': emprunt}, 'media/media.html', request) @@ -59,14 +59,14 @@ def retour_emprunt(request, empruntid): emprunt_instance = Emprunt.objects.get(pk=empruntid) except Emprunt.DoesNotExist: messages.error(request, u"Entrée inexistante") - return redirect("/") + 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("/") + return redirect("admin:media_emprunt_changelist") def index(request): diff --git a/requirements.txt b/requirements.txt index 869f0c4..87bf784 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -Django==1.11.22 +Django==2.2.4 docutils==0.14 Pillow==5.4.1 pytz==2019.1 diff --git a/theme/locale/fr/LC_MESSAGES/django.po b/theme/locale/fr/LC_MESSAGES/django.po index c93b2a3..190321d 100644 --- a/theme/locale/fr/LC_MESSAGES/django.po +++ b/theme/locale/fr/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-09 22:14+0200\n" +"POT-Creation-Date: 2019-08-10 10:24+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,26 +17,119 @@ msgstr "" msgid "Welcome," msgstr "" -#: templates/admin/base_site.html:30 -msgid "Explore the library" -msgstr "Explorer la médiatèque" - -#: templates/admin/base_site.html:50 templates/admin/base_site.html:69 +#: templates/admin/base_site.html:31 templates/admin/base_site.html:51 msgid "Explore database" msgstr "Explorer la base de données" -#: templates/admin/base_site.html:62 +#: templates/admin/base_site.html:44 msgid "Documentation" msgstr "" -#: templates/admin/base_site.html:71 +#: templates/admin/base_site.html:54 msgid "Log out" msgstr "" -#: templates/admin/base_site.html:73 templates/registration/login.html:8 +#: templates/admin/base_site.html:56 templates/registration/login.html:8 msgid "Log in" msgstr "" +#: templates/admin/index.html:23 +#, python-format +msgid "Models in the %(name)s application" +msgstr "" + +#: templates/admin/index.html:34 +msgid "Add" +msgstr "" + +#: templates/admin/index.html:40 +msgid "Change" +msgstr "" + +#: templates/admin/index.html:63 +msgid "My profile" +msgstr "Mon profil" + +#: templates/admin/index.html:65 +msgid "Edit" +msgstr "Éditer" + +#: templates/admin/index.html:69 +msgid "username" +msgstr "" + +#: templates/admin/index.html:70 +msgid "email" +msgstr "" + +#: templates/admin/index.html:71 +msgid "comment" +msgstr "" + +#: templates/admin/index.html:72 +msgid "date joined" +msgstr "" + +#: templates/admin/index.html:73 +msgid "last login" +msgstr "" + +#: templates/admin/index.html:74 +msgid "address" +msgstr "" + +#: templates/admin/index.html:75 +msgid "phone number" +msgstr "" + +#: templates/admin/index.html:76 +msgid "groups" +msgstr "" + +#: templates/admin/index.html:78 +msgid "maximum borrowed" +msgstr "emprunts maximal" + +#: templates/admin/index.html:80 +msgid "membership for current year" +msgstr "membre pour cette année" + +#: templates/admin/index.html:82 +msgid "yes" +msgstr "oui" + +#: templates/admin/index.html:84 +msgid "no" +msgstr "non" + +#: templates/admin/index.html:89 +msgid "Current borrowed items" +msgstr "Emprunts en cours" + +#: templates/admin/index.html:93 +msgid "since" +msgstr "depuis" + +#: templates/admin/index.html:97 +msgid "No current borrowed items." +msgstr "Pas d'emprunts en cours." + +#: templates/admin/index.html:100 +msgid "My actions" +msgstr "" + +#: templates/admin/index.html:104 +msgid "None available" +msgstr "" + +#: templates/admin/index.html:119 +msgid "Unknown content" +msgstr "" + +#: templates/admin/index.html:126 +msgid "You are not logged in." +msgstr "Vous n'êtes pas identifié." + #: templates/base.html:10 templates/registration/logged_out.html:9 #: templates/registration/password_change_done.html:9 #: templates/registration/password_change_form.html:9 @@ -89,6 +182,3 @@ msgstr "" #, python-format msgid "The %(site_name)s team" msgstr "" - -#~ msgid "View admin" -#~ msgstr "Administration" diff --git a/theme/static/css/admin.css b/theme/static/css/admin.css index 0fb636e..f17aa66 100644 --- a/theme/static/css/admin.css +++ b/theme/static/css/admin.css @@ -128,12 +128,6 @@ input[type=button]:focus, .button:hover, input[type=submit]:hover, input[type=bu min-height: 0; } -/* Recenter login button */ -.login .submit-row { - padding: 1em 0 0 0 !important; - text-align: center !important; -} - /* Branding logo */ #branding img { vertical-align: middle; diff --git a/theme/tests/test_templates.py b/theme/tests/test_templates.py index b40029c..95c1a75 100644 --- a/theme/tests/test_templates.py +++ b/theme/tests/test_templates.py @@ -11,7 +11,7 @@ Test that every themed page still works class TemplateLoggedOutTests(TestCase): def test_login_page(self): - response = self.client.get('/admin/login/') + response = self.client.get('/database/login/') self.assertEqual(response.status_code, 200) @@ -28,11 +28,11 @@ class TemplateLoggedInTests(TestCase): """ Login page should redirect """ - response = self.client.get('/admin/login/') + response = self.client.get('/database/login/') self.assertEqual(response.status_code, 302) def test_admin_index(self): - response = self.client.get('/admin/') + response = self.client.get('/database/') self.assertEqual(response.status_code, 200) def test_accounts_password_reset(self): diff --git a/users/__init__.py b/users/__init__.py index e69de29..42e5170 100644 --- a/users/__init__.py +++ b/users/__init__.py @@ -0,0 +1,5 @@ +# -*- mode: python; coding: utf-8 -*- +# Copyright (C) 2017-2019 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +default_app_config = 'users.apps.UsersConfig' diff --git a/users/admin.py b/users/admin.py index 01d5095..17f03c0 100644 --- a/users/admin.py +++ b/users/admin.py @@ -6,19 +6,20 @@ from django.contrib import admin from django.contrib import messages from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from django.contrib.auth.forms import PasswordResetForm -from django.core.urlresolvers import reverse +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, Clef, User -from med.admin import admin_site class ClefAdmin(VersionAdmin): list_display = ('nom', 'proprio', 'commentaire') ordering = ('nom',) + search_fields = ('nom', 'proprio', 'commentaire') class AdhesionAdmin(VersionAdmin): diff --git a/users/apps.py b/users/apps.py new file mode 100644 index 0000000..783f727 --- /dev/null +++ b/users/apps.py @@ -0,0 +1,19 @@ +# -*- mode: python; coding: utf-8 -*- +# Copyright (C) 2017-2019 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from django.apps import AppConfig +from django.conf import settings +from django.db.models.signals import post_save +from django.utils.translation import ugettext_lazy as _ + +from .signals import add_to_default_group + + +class UsersConfig(AppConfig): + name = 'users' + verbose_name = _('users') + + def ready(self): + post_save.connect(add_to_default_group, + sender=settings.AUTH_USER_MODEL) diff --git a/users/forms.py b/users/forms.py index b7518c0..41f0a9b 100644 --- a/users/forms.py +++ b/users/forms.py @@ -44,6 +44,12 @@ class UserCreationAdminForm(ModelForm): from the given information. """ + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['email'].required = True + self.fields['first_name'].required = True + self.fields['last_name'].required = True + class Meta: model = User fields = ("username", "email", "first_name", "last_name", "address", diff --git a/users/locale/fr/LC_MESSAGES/django.po b/users/locale/fr/LC_MESSAGES/django.po index 7823a41..07b9e91 100644 --- a/users/locale/fr/LC_MESSAGES/django.po +++ b/users/locale/fr/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-08-09 23:09+0200\n" +"POT-Creation-Date: 2019-08-10 10:21+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -13,71 +13,71 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: admin.py:32 +#: admin.py:29 msgid "adherent status" msgstr "statut adhérent" -#: admin.py:37 +#: admin.py:34 msgid "Yes" msgstr "" -#: admin.py:54 +#: admin.py:51 msgid "Personal info" msgstr "" -#: admin.py:56 +#: admin.py:53 msgid "Permissions" msgstr "" -#: admin.py:59 +#: admin.py:56 msgid "Important dates" msgstr "" -#: admin.py:89 +#: admin.py:86 msgid "An email to set the password was sent." msgstr "Un mail pour initialiser le mot de passe a été envoyé." -#: admin.py:92 +#: admin.py:89 msgid "The email is invalid." msgstr "L'adresse mail est invalide." -#: admin.py:111 +#: admin.py:108 msgid "Adhere" msgstr "Adhérer" -#: admin.py:114 +#: admin.py:111 msgid "is adherent" msgstr "statut adhérent" -#: admin.py:122 +#: admin.py:119 msgid "Register borrowed item" msgstr "Enregistrer emprunt" -#: admin.py:125 +#: admin.py:122 msgid "actions" msgstr "actions" -#: models.py:18 +#: models.py:14 msgid "phone number" msgstr "numéro de téléphone" -#: models.py:24 +#: models.py:20 msgid "address" msgstr "adresse" -#: models.py:30 +#: models.py:26 msgid "maximum borrowed" msgstr "emprunts maximal" -#: models.py:31 +#: models.py:27 msgid "Maximal amount of simultaneous borrowed item authorized." msgstr "Nombre maximal d'objets empruntés en même temps." -#: models.py:36 +#: models.py:32 msgid "comment" msgstr "commentaire" -#: models.py:37 +#: models.py:33 msgid "Promotion..." msgstr "" diff --git a/users/migrations/0028_auto_20190810_1003.py b/users/migrations/0028_auto_20190810_1003.py new file mode 100644 index 0000000..82c8d25 --- /dev/null +++ b/users/migrations/0028_auto_20190810_1003.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.4 on 2019-08-10 08:03 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0027_auto_20190809_2317'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='last_name', + field=models.CharField(blank=True, max_length=150, verbose_name='last name'), + ), + ] diff --git a/users/signals.py b/users/signals.py new file mode 100644 index 0000000..948dacf --- /dev/null +++ b/users/signals.py @@ -0,0 +1,14 @@ +# -*- mode: python; coding: utf-8 -*- +# Copyright (C) 2017-2019 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + + +def add_to_default_group(sender, **kwargs): + """ + When creating a new user, add it to users group + """ + user = kwargs["instance"] + if kwargs["created"]: + from django.contrib.auth.models import Group + group, group_created = Group.objects.get_or_create(name='users') + user.groups.add(group) diff --git a/users/views.py b/users/views.py index 12ccfd5..c5152da 100644 --- a/users/views.py +++ b/users/views.py @@ -33,7 +33,7 @@ def edit_info(request): reversion.set_comment("Champs modifié(s) : %s" % ', '.join( field for field in user.changed_data)) messages.success(request, "L'user a bien été modifié") - return redirect("/") + return redirect("index") return form({ 'form': user, 'password_change': True, @@ -48,12 +48,15 @@ def adherer(request, userid): users = User.objects.get(pk=userid) except User.DoesNotExist: messages.error(request, "Utilisateur inexistant") - return redirect("/") + return redirect("admin:users_user_changelist") adh_year = Adhesion.objects.all().order_by('annee_debut').reverse().first() + if not adh_year: + messages.error(request, "Année d'adhésion non définie") + return redirect("admin:users_user_changelist") with transaction.atomic(), reversion.create_revision(): reversion.set_user(request.user) adh_year.adherent.add(users) adh_year.save() reversion.set_comment("Adhesion de %s" % users) messages.success(request, "Adhesion effectuee") - return redirect("/") + return redirect("admin:users_user_changelist")