Django upgrade

This commit is contained in:
Alexandre Iooss 2019-08-10 10:44:17 +02:00
parent 80055771e9
commit a6dc8653af
No known key found for this signature in database
GPG Key ID: 6C79278F3FCDCC02
19 changed files with 240 additions and 137 deletions

View File

@ -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
```

View File

@ -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'),

View File

@ -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),
]

View File

@ -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)

View File

@ -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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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"

View File

@ -6,6 +6,7 @@ from django.conf.urls import url
from . import views
app_name = 'media'
urlpatterns = [
url(r'^add_emprunt/(?P<userid>[0-9]+)$', views.add_emprunt,
name='add-emprunt'),

View File

@ -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):

View File

@ -1,4 +1,4 @@
Django==1.11.22
Django==2.2.4
docutils==0.14
Pillow==5.4.1
pytz==2019.1

View File

@ -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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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"

View File

@ -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;

View File

@ -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):

View File

@ -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'

View File

@ -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):

19
users/apps.py Normal file
View File

@ -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)

View File

@ -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",

View File

@ -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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""

View File

@ -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'),
),
]

14
users/signals.py Normal file
View File

@ -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)

View File

@ -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")