mirror of
https://gitlab2.federez.net/re2o/re2o
synced 2024-11-27 15:12:25 +00:00
Utilisation de preferences pour les applications de la première page
This commit is contained in:
parent
22062e7792
commit
f6d7e02b0c
12 changed files with 208 additions and 37 deletions
|
@ -63,7 +63,10 @@ class EditAssoOptionForm(ModelForm):
|
||||||
model = AssoOption
|
model = AssoOption
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
class Service(ModelForm):
|
class ServiceForm(ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Service
|
model = Service
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
|
class DelServiceForm(Form):
|
||||||
|
services = forms.ModelMultipleChoiceField(queryset=Service.objects.all(), label="Enregistrements service actuels", widget=forms.CheckboxSelectMultiple)
|
||||||
|
|
|
@ -59,6 +59,9 @@ class Service(models.Model):
|
||||||
description = models.TextField()
|
description = models.TextField()
|
||||||
image = models.ImageField(upload_to='logo', blank=True)
|
image = models.ImageField(upload_to='logo', blank=True)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return str(self.name)
|
||||||
|
|
||||||
class AssoOption(models.Model):
|
class AssoOption(models.Model):
|
||||||
PRETTY_NAME = "Options de l'association"
|
PRETTY_NAME = "Options de l'association"
|
||||||
|
|
||||||
|
|
51
preferences/templates/preferences/aff_service.html
Normal file
51
preferences/templates/preferences/aff_service.html
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
{% 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 %}
|
||||||
|
|
||||||
|
<table class="table table-striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Nom</th>
|
||||||
|
<th>Url</th>
|
||||||
|
<th>Description</th>
|
||||||
|
<th>Image</th>
|
||||||
|
<th></th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
{% for service in service_list %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ service.name }}</td>
|
||||||
|
<td>{{ service.url }}</td>
|
||||||
|
<td>{{ service.description }}</td>
|
||||||
|
<td>{{ service.image }}</td>
|
||||||
|
<td class="text-right">
|
||||||
|
{% if is_admin %}
|
||||||
|
{% include 'buttons/edit.html' with href='preferences:edit-services' id=service.id %}
|
||||||
|
{% endif %}
|
||||||
|
{% include 'buttons/history.html' with href='preferences:history' name='service' id=service.id %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
|
|
@ -124,6 +124,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<td>{{ assooptions.utilisateur_asso }}</td>
|
<td>{{ assooptions.utilisateur_asso }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
<h2>Liste des services page d'accueil</h2>
|
||||||
|
{% if is_infra %}
|
||||||
|
<a class="btn btn-primary btn-sm" role="button" href="{% url 'preferences:add-services' %}"><i class="glyphicon glyphicon-plus"></i> Ajouter un service</a>
|
||||||
|
<a class="btn btn-danger btn-sm" role="button" href="{% url 'preferences:del-services' %}"><i class="glyphicon glyphicon-trash"></i> Supprimer un ou plusieurs service</a>
|
||||||
|
{% endif %}
|
||||||
|
{% include "preferences/aff_service.html" with service_list=service_list %}
|
||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
<br />
|
<br />
|
||||||
|
|
46
preferences/templates/preferences/preferences.html
Normal file
46
preferences/templates/preferences/preferences.html
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
{% extends "preferences/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 %}Création et modification des preferences{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
{% if preferenceform %}
|
||||||
|
{% bootstrap_form_errors preferenceform %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
|
<form class="form" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
{% if preferenceform %}
|
||||||
|
{% bootstrap_form preferenceform %}
|
||||||
|
{% endif %}
|
||||||
|
{% bootstrap_button "Créer ou modifier" button_type="submit" icon="star" %}
|
||||||
|
</form>
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
{% endblock %}
|
|
@ -30,5 +30,9 @@ urlpatterns = [
|
||||||
url(r'^edit_options/(?P<section>OptionalMachine)$', views.edit_options, name='edit-options'),
|
url(r'^edit_options/(?P<section>OptionalMachine)$', views.edit_options, name='edit-options'),
|
||||||
url(r'^edit_options/(?P<section>GeneralOption)$', views.edit_options, name='edit-options'),
|
url(r'^edit_options/(?P<section>GeneralOption)$', views.edit_options, name='edit-options'),
|
||||||
url(r'^edit_options/(?P<section>AssoOption)$', views.edit_options, name='edit-options'),
|
url(r'^edit_options/(?P<section>AssoOption)$', views.edit_options, name='edit-options'),
|
||||||
|
url(r'^add_services/$', views.add_services, name='add-services'),
|
||||||
|
url(r'^edit_services/(?P<servicesid>[0-9]+)$', views.edit_services, name='edit-services'),
|
||||||
|
url(r'^del_services/$', views.del_services, name='del-services'),
|
||||||
|
url(r'^history/(?P<object>service)/(?P<id>[0-9]+)$', views.history, name='history'),
|
||||||
url(r'^$', views.display_options, name='display-options'),
|
url(r'^$', views.display_options, name='display-options'),
|
||||||
]
|
]
|
||||||
|
|
|
@ -42,7 +42,8 @@ from django.db import transaction
|
||||||
from reversion.models import Version
|
from reversion.models import Version
|
||||||
from reversion import revisions as reversion
|
from reversion import revisions as reversion
|
||||||
|
|
||||||
from .models import OptionalUser, OptionalMachine, AssoOption, GeneralOption
|
from .forms import ServiceForm, DelServiceForm
|
||||||
|
from .models import Service, OptionalUser, OptionalMachine, AssoOption, GeneralOption
|
||||||
from . import models
|
from . import models
|
||||||
from . import forms
|
from . import forms
|
||||||
|
|
||||||
|
@ -59,7 +60,8 @@ def display_options(request):
|
||||||
machineoptions, created = OptionalMachine.objects.get_or_create()
|
machineoptions, created = OptionalMachine.objects.get_or_create()
|
||||||
generaloptions, created = GeneralOption.objects.get_or_create()
|
generaloptions, created = GeneralOption.objects.get_or_create()
|
||||||
assooptions, crated = AssoOption.objects.get_or_create()
|
assooptions, crated = AssoOption.objects.get_or_create()
|
||||||
return form({'useroptions': useroptions, 'machineoptions': machineoptions, 'generaloptions': generaloptions, 'assooptions' : assooptions}, 'preferences/display_preferences.html', request)
|
service_list = Service.objects.all()
|
||||||
|
return form({'useroptions': useroptions, 'machineoptions': machineoptions, 'generaloptions': generaloptions, 'assooptions' : assooptions, 'service_list':service_list}, 'preferences/display_preferences.html', request)
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@permission_required('admin')
|
@permission_required('admin')
|
||||||
|
@ -82,3 +84,74 @@ def edit_options(request, section):
|
||||||
messages.error(request, "Objet inconnu")
|
messages.error(request, "Objet inconnu")
|
||||||
return redirect("/preferences/")
|
return redirect("/preferences/")
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
@permission_required('admin')
|
||||||
|
def add_services(request):
|
||||||
|
services = ServiceForm(request.POST or None)
|
||||||
|
if services.is_valid():
|
||||||
|
with transaction.atomic(), reversion.create_revision():
|
||||||
|
services.save()
|
||||||
|
reversion.set_user(request.user)
|
||||||
|
reversion.set_comment("Création")
|
||||||
|
messages.success(request, "Cet enregistrement ns a été ajouté")
|
||||||
|
return redirect("/preferences/")
|
||||||
|
return form({'preferenceform': services}, 'preferences/preferences.html', request)
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
@permission_required('admin')
|
||||||
|
def edit_services(request, servicesid):
|
||||||
|
try:
|
||||||
|
services_instance = Service.objects.get(pk=servicesid)
|
||||||
|
except Service.DoesNotExist:
|
||||||
|
messages.error(request, u"Entrée inexistante" )
|
||||||
|
return redirect("/preferences/")
|
||||||
|
services = ServiceForm(request.POST or None, instance=services_instance)
|
||||||
|
if services.is_valid():
|
||||||
|
with transaction.atomic(), reversion.create_revision():
|
||||||
|
services.save()
|
||||||
|
reversion.set_user(request.user)
|
||||||
|
reversion.set_comment("Champs modifié(s) : %s" % ', '.join(field for field in services.changed_data))
|
||||||
|
messages.success(request, "Service modifié")
|
||||||
|
return redirect("/preferences/")
|
||||||
|
return form({'preferenceform': services}, 'preferences/preferences.html', request)
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
@permission_required('admin')
|
||||||
|
def del_services(request):
|
||||||
|
services = DelServiceForm(request.POST or None)
|
||||||
|
if services.is_valid():
|
||||||
|
services_dels = services.cleaned_data['services']
|
||||||
|
for services_del in services_dels:
|
||||||
|
try:
|
||||||
|
with transaction.atomic(), reversion.create_revision():
|
||||||
|
services_del.delete()
|
||||||
|
reversion.set_user(request.user)
|
||||||
|
messages.success(request, "Le services a été supprimée")
|
||||||
|
except ProtectedError:
|
||||||
|
messages.error(request, "Erreur le service suivant %s ne peut être supprimé" % services_del)
|
||||||
|
return redirect("/preferences/")
|
||||||
|
return form({'preferenceform': services}, 'preferences/preferences.html', request)
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
@permission_required('cableur')
|
||||||
|
def history(request, object, id):
|
||||||
|
if object == 'service':
|
||||||
|
try:
|
||||||
|
object_instance = Service.objects.get(pk=id)
|
||||||
|
except Service.DoesNotExist:
|
||||||
|
messages.error(request, "Service inexistant")
|
||||||
|
return redirect("/preferences/")
|
||||||
|
options, created = GeneralOption.objects.get_or_create()
|
||||||
|
pagination_number = options.pagination_number
|
||||||
|
reversions = Version.objects.get_for_object(object_instance)
|
||||||
|
paginator = Paginator(reversions, pagination_number)
|
||||||
|
page = request.GET.get('page')
|
||||||
|
try:
|
||||||
|
reversions = paginator.page(page)
|
||||||
|
except PageNotAnInteger:
|
||||||
|
# If page is not an integer, deliver first page.
|
||||||
|
reversions = paginator.page(1)
|
||||||
|
except EmptyPage:
|
||||||
|
# If page is out of range (e.g. 9999), deliver last page of results.
|
||||||
|
reversions = paginator.page(paginator.num_pages)
|
||||||
|
return render(request, 're2o/history.html', {'reversions': reversions, 'object': object_instance})
|
||||||
|
|
|
@ -32,6 +32,7 @@ def context_user(request):
|
||||||
is_bofh = user.is_bofh
|
is_bofh = user.is_bofh
|
||||||
is_trez = user.is_trez
|
is_trez = user.is_trez
|
||||||
is_infra = user.is_infra
|
is_infra = user.is_infra
|
||||||
|
is_admin = user.is_admin
|
||||||
else:
|
else:
|
||||||
interfaces = None
|
interfaces = None
|
||||||
is_cableur = False
|
is_cableur = False
|
||||||
|
@ -39,6 +40,7 @@ def context_user(request):
|
||||||
is_bofh = False
|
is_bofh = False
|
||||||
is_trez = False
|
is_trez = False
|
||||||
is_infra = False
|
is_infra = False
|
||||||
|
is_admin = False
|
||||||
return {
|
return {
|
||||||
'request_user': user,
|
'request_user': user,
|
||||||
'is_cableur': is_cableur,
|
'is_cableur': is_cableur,
|
||||||
|
@ -46,6 +48,7 @@ def context_user(request):
|
||||||
'is_bofh': is_bofh,
|
'is_bofh': is_bofh,
|
||||||
'is_trez': is_trez,
|
'is_trez': is_trez,
|
||||||
'is_infra': is_infra,
|
'is_infra': is_infra,
|
||||||
|
'is_admin' : is_admin,
|
||||||
'interfaces': interfaces,
|
'interfaces': interfaces,
|
||||||
'site_name': SITE_NAME,
|
'site_name': SITE_NAME,
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,20 +67,6 @@ SITE_NAME = "Re2o.rez"
|
||||||
MAIN_EXTENSION = ".rez"
|
MAIN_EXTENSION = ".rez"
|
||||||
|
|
||||||
LOGO_PATH = "static_files/logo.png"
|
LOGO_PATH = "static_files/logo.png"
|
||||||
ASSO_NAME = "Asso reseau"
|
|
||||||
ASSO_ADDRESS_LINE1 = "2, rue Edouard Belin"
|
|
||||||
ASSO_ADDRESS_LINE2 = "57070 Metz"
|
|
||||||
ASSO_SIRET = ""
|
|
||||||
ASSO_EMAIL = "tresorier@ecole.fr"
|
|
||||||
ASSO_PHONE = "01 02 03 04 05"
|
|
||||||
ASSO_PSEUDO = "rezo"
|
|
||||||
|
|
||||||
services_urls = {
|
|
||||||
#Fill IT : ex : 'gitlab': {
|
|
||||||
# 'url': 'https://gitlab.rezometz.org',
|
|
||||||
# 'logo': 'gitlab.png',
|
|
||||||
# 'description': 'Gitlab is cool 8-)'},
|
|
||||||
}
|
|
||||||
|
|
||||||
# Number of hours a token remains valid after having been created. Numeric and string
|
# Number of hours a token remains valid after having been created. Numeric and string
|
||||||
# versions should have the same meaning.
|
# versions should have the same meaning.
|
||||||
|
|
|
@ -32,20 +32,20 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<h1>Bienvenue sur {{ site_name }} !</h1>
|
<h1>Bienvenue sur {{ site_name }} !</h1>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
{% for col in services_urls %}
|
{% for service_list in services_urls %}
|
||||||
<div class="col-sm-6 col-md-4">
|
<div class="col-sm-6 col-md-4">
|
||||||
{% for key, s in col.items %}
|
{% for service in service_list %}
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<div class="thumbnail">
|
<div class="thumbnail">
|
||||||
<img src="{% static "logo/"|add:s.logo %}" alt="{{ key }}">
|
<img src="{% static service.image %}" alt="{{ service.name }}">
|
||||||
<div class="caption">
|
<div class="caption">
|
||||||
<h3>{{ key }}</h3>
|
<h3>{{ service.name }}</h3>
|
||||||
<p>{{ s.description }}</p>
|
<p>{{ service.description }}</p>
|
||||||
<p><a href="{{ s.url }}" class="btn btn-primary" role="button">Accéder</a></p>
|
<p><a href="{{ service.url }}" class="btn btn-primary" role="button">Accéder</a></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -24,7 +24,7 @@ from django.shortcuts import render
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
from django.template.context_processors import csrf
|
from django.template.context_processors import csrf
|
||||||
from django.template import Context, RequestContext, loader
|
from django.template import Context, RequestContext, loader
|
||||||
from re2o.settings import services_urls
|
from preferences.models import Service
|
||||||
|
|
||||||
def form(ctx, template, request):
|
def form(ctx, template, request):
|
||||||
c = ctx
|
c = ctx
|
||||||
|
@ -34,11 +34,8 @@ def form(ctx, template, request):
|
||||||
|
|
||||||
def index(request):
|
def index(request):
|
||||||
i = 0
|
i = 0
|
||||||
services = [{}]
|
services = [[], [], []]
|
||||||
for key, s in services_urls.items():
|
for indice, serv in enumerate(Service.objects.all()):
|
||||||
if len(services) <= i:
|
services[indice % 3].append(serv)
|
||||||
services += [{}]
|
|
||||||
services[i][key] = s
|
|
||||||
i = i + 1 if i < 2 else 0
|
|
||||||
|
|
||||||
return form({'services_urls': services}, 're2o/index.html', request)
|
return form({'services_urls': services}, 're2o/index.html', request)
|
||||||
|
|
|
@ -35,9 +35,8 @@ from users.views import form
|
||||||
from users.models import User
|
from users.models import User
|
||||||
|
|
||||||
from machines.forms import AliasForm, NewMachineForm, EditMachineForm, EditInterfaceForm, AddInterfaceForm
|
from machines.forms import AliasForm, NewMachineForm, EditMachineForm, EditInterfaceForm, AddInterfaceForm
|
||||||
from preferences.models import GeneralOption
|
from preferences.models import AssoOption, GeneralOption
|
||||||
|
|
||||||
from re2o.settings import ASSO_PSEUDO
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@permission_required('cableur')
|
@permission_required('cableur')
|
||||||
|
@ -150,10 +149,10 @@ def new_switch(request):
|
||||||
interface = AddInterfaceForm(request.POST or None, infra=request.user.has_perms(('infra',)))
|
interface = AddInterfaceForm(request.POST or None, infra=request.user.has_perms(('infra',)))
|
||||||
domain = AliasForm(request.POST or None, infra=request.user.has_perms(('infra',)))
|
domain = AliasForm(request.POST or None, infra=request.user.has_perms(('infra',)))
|
||||||
if switch.is_valid() and machine.is_valid() and interface.is_valid():
|
if switch.is_valid() and machine.is_valid() and interface.is_valid():
|
||||||
try:
|
options, created = AssoOption.objects.get_or_create()
|
||||||
user = User.objects.get(pseudo=ASSO_PSEUDO)
|
user = options.utilisateur_asso
|
||||||
except User.DoesNotExist:
|
if not user:
|
||||||
messages.error(request, "L'user %s n'existe pas encore, veuillez le créer" % ASSO_PSEUDO)
|
messages.error(request, "L'user association n'existe pas encore, veuillez le créer ou le linker dans preferences")
|
||||||
return redirect("/topologie/")
|
return redirect("/topologie/")
|
||||||
new_machine = machine.save(commit=False)
|
new_machine = machine.save(commit=False)
|
||||||
new_machine.user = user
|
new_machine.user = user
|
||||||
|
|
Loading…
Reference in a new issue