views.py 7.59 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
# 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.

# App de gestion des machines pour re2o
# Gabriel Détraz, Augustin Lemesle
# Gplv2
26 27 28 29
"""
Vue d'affichage, et de modification des réglages (réglages machine,
topologie, users, service...)
"""
30

31
from __future__ import unicode_literals
32

33
from django.shortcuts import render, redirect
34 35 36
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.contrib import messages
from django.contrib.auth.decorators import login_required, permission_required
37
from django.db.models import ProtectedError
38 39 40 41 42
from django.db import transaction

from reversion.models import Version
from reversion import revisions as reversion

43
from re2o.views import form
44
from .forms import ServiceForm, DelServiceForm
45 46
from .models import Service, OptionalUser, OptionalMachine, AssoOption
from .models import MailMessageOption, GeneralOption, OptionalTopologie
47 48
from . import models
from . import forms
49 50 51 52 53


@login_required
@permission_required('cableur')
def display_options(request):
54 55 56 57 58 59 60 61
    """Vue pour affichage des options (en vrac) classé selon les models
    correspondants dans un tableau"""
    useroptions, _created = OptionalUser.objects.get_or_create()
    machineoptions, _created = OptionalMachine.objects.get_or_create()
    topologieoptions, _created = OptionalTopologie.objects.get_or_create()
    generaloptions, _created = GeneralOption.objects.get_or_create()
    assooptions, _created = AssoOption.objects.get_or_create()
    mailmessageoptions, _created = MailMessageOption.objects.get_or_create()
62
    service_list = Service.objects.all()
63 64 65 66 67 68 69 70 71 72
    return form({
        'useroptions': useroptions,
        'machineoptions': machineoptions,
        'topologieoptions': topologieoptions,
        'generaloptions': generaloptions,
        'assooptions': assooptions,
        'mailmessageoptions': mailmessageoptions,
        'service_list': service_list
        }, 'preferences/display_preferences.html', request)

73 74 75

@login_required
@permission_required('admin')
76 77 78 79 80
def edit_options(request, section):
    """ Edition des préférences générales"""
    model = getattr(models, section, None)
    form_instance = getattr(forms, 'Edit' + section + 'Form', None)
    if model and form:
81 82 83 84 85
        options_instance, _created = model.objects.get_or_create()
        options = form_instance(
            request.POST or None,
            instance=options_instance
        )
86
        if options.is_valid():
87
            with transaction.atomic(), reversion.create_revision():
88
                options.save()
89
                reversion.set_user(request.user)
90 91 92 93 94
                reversion.set_comment(
                    "Champs modifié(s) : %s" % ', '.join(
                        field for field in options.changed_data
                    )
                )
95 96
            messages.success(request, "Préférences modifiées")
            return redirect("/preferences/")
97 98 99 100 101
        return form(
            {'options': options},
            'preferences/edit_preferences.html',
            request
            )
102 103
    else:
        messages.error(request, "Objet  inconnu")
104
        return redirect("/preferences/")
105

106

107 108 109
@login_required
@permission_required('admin')
def add_services(request):
110
    """Ajout d'un service de la page d'accueil"""
111 112 113 114 115 116 117 118
    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/")
119 120 121 122 123 124
    return form(
        {'preferenceform': services},
        'preferences/preferences.html',
        request
        )

125 126 127 128

@login_required
@permission_required('admin')
def edit_services(request, servicesid):
129
    """Edition des services affichés sur la page d'accueil"""
130 131 132
    try:
        services_instance = Service.objects.get(pk=servicesid)
    except Service.DoesNotExist:
133
        messages.error(request, u"Entrée inexistante")
134 135 136 137 138 139
        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)
140 141 142 143 144
            reversion.set_comment(
                "Champs modifié(s) : %s" % ', '.join(
                    field for field in services.changed_data
                    )
            )
145 146
        messages.success(request, "Service modifié")
        return redirect("/preferences/")
147 148 149 150 151 152
    return form(
        {'preferenceform': services},
        'preferences/preferences.html',
        request
    )

153 154 155 156

@login_required
@permission_required('admin')
def del_services(request):
157
    """Suppression d'un service de la page d'accueil"""
158 159 160 161 162 163 164 165 166 167
    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:
168 169
                messages.error(request, "Erreur le service\
                suivant %s ne peut être supprimé" % services_del)
170
        return redirect("/preferences/")
171 172 173 174 175 176
    return form(
        {'preferenceform': services},
        'preferences/preferences.html',
        request
    )

177 178 179

@login_required
@permission_required('cableur')
180 181 182 183
def history(request, object_name, object_id):
    """Historique de creation et de modification d'un service affiché sur
    la page d'accueil"""
    if object_name == 'service':
184
        try:
185
            object_instance = Service.objects.get(pk=object_id)
186
        except Service.DoesNotExist:
187 188 189
            messages.error(request, "Service inexistant")
            return redirect("/preferences/")
    options, _created = GeneralOption.objects.get_or_create()
190 191 192 193 194 195 196 197 198 199 200 201
    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)
202 203 204 205
    return render(request, 're2o/history.html', {
        'reversions': reversions,
        'object': object_instance
        })