diff --git a/media/admin.py b/media/admin.py index c423547..fc4416f 100644 --- a/media/admin.py +++ b/media/admin.py @@ -3,7 +3,7 @@ from reversion.admin import VersionAdmin from django.contrib import admin from django.contrib.auth.models import Group -from .models import Auteur, Emprunt, Media +from .models import Auteur, Emprunt, Media, Jeu class AuteurAdmin(VersionAdmin): list_display = ('nom',) @@ -14,7 +14,10 @@ class MediaAdmin(VersionAdmin): class EmpruntAdmin(VersionAdmin): list_display = ('media','user','date_emprunt', 'date_rendu', 'permanencier_emprunt', 'permanencier_rendu') +class JeuAdmin(VersionAdmin): + list_display = ('nom','proprietaire', 'duree', 'nombre_joueurs_min', 'nombre_joueurs_max', 'comment') admin.site.register(Auteur, AuteurAdmin) admin.site.register(Media, MediaAdmin) admin.site.register(Emprunt, EmpruntAdmin) +admin.site.register(Jeu, JeuAdmin) diff --git a/media/forms.py b/media/forms.py index 9657d74..4d8286c 100644 --- a/media/forms.py +++ b/media/forms.py @@ -22,7 +22,7 @@ from django.forms import ModelForm, Form, ValidationError from django import forms -from .models import Auteur, Media, Emprunt +from .models import Auteur, Media, Jeu, Emprunt class AuteurForm(ModelForm): class Meta: @@ -34,6 +34,11 @@ class MediaForm(ModelForm): model = Media fields = '__all__' +class JeuForm(ModelForm): + class Meta: + model = Jeu + fields = '__all__' + class EmpruntForm(ModelForm): class Meta: model = Emprunt diff --git a/media/templates/media/aff_jeux.html b/media/templates/media/aff_jeux.html new file mode 100644 index 0000000..d33c7b9 --- /dev/null +++ b/media/templates/media/aff_jeux.html @@ -0,0 +1,54 @@ +{% comment %} +Re2o est un logiciel d'administration développé initiallement au rezometz. Il +se veut agnostique au réseau considéré, de manière à être installable en +quelques clics. + +Copyright © 2017 Gabriel Détraz +Copyright © 2017 Goulven Kermarec +Copyright © 2017 Augustin Lemesle + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +{% endcomment %} + +{% if jeux_list.paginator %} +{% include "pagination.html" with list=jeux_list %} +{% endif %} + + + + + + + + + + + + + + {% for jeu in jeux_list %} + + + + + + + + + + {% endfor %} +
NomProprietaireDuréeJoueurs minJoueurs maxComment
{{ jeu.nom }}{{ jeu.proprietaire }}{{ jeu.duree }}{{ jeu.nombre_joueurs_min }}{{ jeu.nombre_joueurs_max }}{{ jeu.comment }}{% include 'buttons/edit.html' with href='media:edit-jeu' id=jeu.id %} + {% include 'buttons/suppr.html' with href='media:del-jeu' id=jeu.id %} + {% include 'buttons/history.html' with href='media:history' name='jeu' id=jeu.id %}
diff --git a/media/templates/media/index_jeux.html b/media/templates/media/index_jeux.html new file mode 100644 index 0000000..0c130c2 --- /dev/null +++ b/media/templates/media/index_jeux.html @@ -0,0 +1,39 @@ +{% extends "media/sidebar.html" %} +{% comment %} +Re2o est un logiciel d'administration développé initiallement au rezometz. Il +se veut agnostique au réseau considéré, de manière à être installable en +quelques clics. + +Copyright © 2017 Gabriel Détraz +Copyright © 2017 Goulven Kermarec +Copyright © 2017 Augustin Lemesle + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +{% endcomment %} + +{% load bootstrap3 %} + +{% block title %}Jeux{% endblock %} + +{% block content %} +

Liste des jeux

+ {% if is_perm %} + Ajouter un jeu + {% endif %} + {% include "media/aff_jeux.html" with jeux_list=jeux_list %} +
+
+
+{% endblock %} diff --git a/media/templates/media/sidebar.html b/media/templates/media/sidebar.html index 9f34165..a63b8dc 100644 --- a/media/templates/media/sidebar.html +++ b/media/templates/media/sidebar.html @@ -37,5 +37,9 @@ with this program; if not, write to the Free Software Foundation, Inc., Medias + + + Jeux + {% endblock %} diff --git a/media/urls.py b/media/urls.py index 9cd5ae4..cfc21f4 100644 --- a/media/urls.py +++ b/media/urls.py @@ -30,6 +30,11 @@ urlpatterns = [ url(r'^del_auteur/(?P[0-9]+)$', views.del_auteur, name='del-auteur'), url(r'^index_auteurs/$', views.index_auteurs, name='index-auteurs'), url(r'^history/(?Pauteur)/(?P[0-9]+)$', views.history, name='history'), + url(r'^add_jeu/$', views.add_jeu, name='add-jeu'), + url(r'^edit_jeu/(?P[0-9]+)$', views.edit_jeu, name='edit-jeu'), + url(r'^del_jeu/(?P[0-9]+)$', views.del_jeu, name='del-jeu'), + url(r'^index_jeux/$', views.index_jeux, name='index-jeux'), + url(r'^history/(?Pjeu)/(?P[0-9]+)$', views.history, name='history'), url(r'^add_media/$', views.add_media, name='add-media'), url(r'^edit_media/(?P[0-9]+)$', views.edit_media, name='edit-media'), url(r'^del_media/(?P[0-9]+)$', views.del_media, name='del-media'), diff --git a/media/views.py b/media/views.py index 9efd126..4f2f46d 100644 --- a/media/views.py +++ b/media/views.py @@ -9,8 +9,8 @@ from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.contrib.auth import authenticate, login from django.views.decorators.csrf import csrf_exempt from django.utils import timezone -from .forms import AuteurForm, MediaForm, EmpruntForm, EditEmpruntForm -from .models import Auteur, Media, Emprunt +from .forms import AuteurForm, MediaForm, JeuForm, EmpruntForm, EditEmpruntForm +from .models import Auteur, Media, Jeu, Emprunt from users.models import User from django.db import transaction from reversion import revisions as reversion @@ -118,6 +118,53 @@ def del_media(request, mediaid): return redirect("/media/index_medias") return form({'objet': media_instance, 'objet_name': 'media'}, 'media/delete.html', request) +@login_required +@permission_required('perm') +def add_jeu(request): + jeu = JeuForm(request.POST or None) + if jeu.is_valid(): + with transaction.atomic(), reversion.create_revision(): + jeu.save() + reversion.set_user(request.user) + reversion.set_comment("Création") + messages.success(request, "Le jeu a été ajouté") + return redirect("/media/index_jeux/") + return form({'mediaform': jeu}, 'media/media.html', request) + +@login_required +@permission_required('perm') +def edit_jeu(request, jeuid): + try: + jeu_instance = Jeu.objects.get(pk=jeuid) + except Jeu.DoesNotExist: + messages.error(request, u"Entrée inexistante" ) + return redirect("/media/index_jeux/") + jeu = JeuForm(request.POST or None, instance=jeu_instance) + if jeu.is_valid(): + with transaction.atomic(), reversion.create_revision(): + jeu.save() + reversion.set_user(request.user) + reversion.set_comment("Champs modifié(s) : %s" % ', '.join(field for field in jeu.changed_data)) + messages.success(request, "Media modifié") + return redirect("/media/index_jeux/") + return form({'mediaform': jeu}, 'media/media.html', request) + +@login_required +@permission_required('perm') +def del_jeu(request, jeuid): + try: + jeu_instance = Jeu.objects.get(pk=jeuid) + except Jeu.DoesNotExist: + messages.error(request, u"Entrée inexistante" ) + return redirect("/media/index_jeux/") + if request.method == "POST": + with transaction.atomic(), reversion.create_revision(): + jeu_instance.delete() + reversion.set_user(request.user) + messages.success(request, "Le jeu a été détruit") + return redirect("/media/index_jeux") + return form({'objet': jeu_instance, 'objet_name': 'jeu'}, 'media/delete.html', request) + @login_required @permission_required('perm') def add_emprunt(request, userid): @@ -197,6 +244,21 @@ def del_emprunt(request, empruntid): +@login_required +def index_jeux(request): + jeux_list = Jeu.objects.all() + paginator = Paginator(jeux_list, PAGINATION_NUMBER) + page = request.GET.get('page') + try: + jeux_list = paginator.page(page) + except PageNotAnInteger: + # If page is not an integer, deliver first page. + jeux_list = paginator.page(1) + except EmptyPage: + # If page is out of range (e.g. 9999), deliver last page of results. + jeux_list = paginator.page(paginator.num_pages) + return render(request, 'media/index_jeux.html', {'jeux_list':jeux_list}) + @login_required def index_auteurs(request): auteurs_list = Auteur.objects.all() @@ -267,6 +329,12 @@ def history(request, object, id): except Emprunt.DoesNotExist: messages.error(request, "Emprunt inexistant") return redirect("/media/index_emprunts") + elif object == 'jeu': + try: + object_instance = Jeu.objects.get(pk=id) + except Jeu.DoesNotExist: + messages.error(request, "Jeu inexistant") + return redirect("/media/index_jeux") reversions = Version.objects.get_for_object(object_instance) paginator = Paginator(reversions, PAGINATION_NUMBER) page = request.GET.get('page')