views.py 9.9 KB
Newer Older
1 2 3 4 5 6 7 8
# App de gestion des machines pour re2o
# Gabriel Détraz
# Gplv2
from django.shortcuts import render, redirect
from django.shortcuts import render_to_response, get_object_or_404
from django.core.context_processors import csrf
from django.template import Context, RequestContext, loader
from django.contrib import messages
9
from django.contrib.auth.decorators import login_required, permission_required
chirac's avatar
chirac committed
10
from django.db.models import ProtectedError
Dalahro's avatar
Dalahro committed
11

12
from .forms import NewMachineForm, EditMachineForm, EditInterfaceForm, AddInterfaceForm, NewInterfaceForm, MachineTypeForm, DelMachineTypeForm, ExtensionForm, DelExtensionForm, BaseEditInterfaceForm, BaseEditMachineForm
13
from .models import Machine, Interface, IpList, MachineType, Extension
14 15
from users.models import User

16 17 18
def unassign_ips(user):
    machines = Interface.objects.filter(machine=Machine.objects.filter(user=user))
    for machine in machines:
chirac's avatar
chirac committed
19 20 21 22 23 24 25 26 27 28
        unassign_ipv4(machine)
    return

def assign_ips(user):
    """ Assign une ipv4 aux machines d'un user """
    machines = Interface.objects.filter(machine=Machine.objects.filter(user=user))
    for machine in machines:
        if not machine.ipv4:
            interface = assign_ipv4(machine)
            interface.save()
29 30 31 32 33 34 35 36 37 38 39 40 41
    return

def free_ip():
    """ Renvoie la liste des ip disponibles """
    return IpList.objects.filter(interface__isnull=True)

def assign_ipv4(interface):
    """ Assigne une ip à l'interface """
    free_ips = free_ip()
    if free_ips:
        interface.ipv4 = free_ips[0]
    return interface

chirac's avatar
chirac committed
42 43 44 45
def unassign_ipv4(interface):
    interface.ipv4 = None
    interface.save()

46 47 48 49 50
def form(ctx, template, request):
    c = ctx
    c.update(csrf(request))
    return render_to_response(template, c, context_instance=RequestContext(request))

chirac's avatar
chirac committed
51
@login_required
52 53 54 55 56 57
def new_machine(request, userid):
    try:
        user = User.objects.get(pk=userid)
    except User.DoesNotExist:
        messages.error(request, u"Utilisateur inexistant" )
        return redirect("/machines/")
58 59 60
    if not request.user.has_perms(('cableur',)) and str(userid)!=str(request.user.id):
        messages.error(request, "Vous ne pouvez pas ajouter une machine à un autre user que vous sans droit")
        return redirect("/users/profil/" + str(request.user.id))
61
    machine = NewMachineForm(request.POST or None)
62
    interface = AddInterfaceForm(request.POST or None) 
63 64 65 66 67 68
    if machine.is_valid() and interface.is_valid():
        new_machine = machine.save(commit=False)
        new_machine.user = user
        new_machine.save()
        new_interface = interface.save(commit=False)
        new_interface.machine = new_machine
69
        if free_ip() and not new_interface.ipv4:
70
            new_interface = assign_ipv4(new_interface)
71
        elif not new_interface.ipv4:
72
            messages.error(request, u"Il n'y a plus d'ip disponibles")
73 74
        new_interface.save()
        messages.success(request, "La machine a été crée")
75
        return redirect("/users/profil/" + userid)
76 77
    return form({'machineform': machine, 'interfaceform': interface}, 'machines/machine.html', request)

chirac's avatar
chirac committed
78
@login_required
79 80 81 82 83 84
def edit_machine(request, interfaceid):
    try:
        interface = Interface.objects.get(pk=interfaceid)
    except Interface.DoesNotExist:
        messages.error(request, u"Interface inexistante" )
        return redirect("/machines")
85 86 87 88 89 90 91 92 93
    if not request.user.has_perms(('cableur',)):
        if str(interface.machine.user.id)!=str(request.user.id):
            messages.error(request, "Vous ne pouvez pas éditer une machine d'un autre user que vous sans droit")
            return redirect("/users/profil/" + str(request.user.id))
        machine_form = BaseEditMachineForm(request.POST or None, instance=interface.machine)
        interface_form = BaseEditInterfaceForm(request.POST or None, instance=interface)
    else:
        machine_form = EditMachineForm(request.POST or None, instance=interface.machine)
        interface_form = EditInterfaceForm(request.POST or None, instance=interface)
94 95 96 97
    if machine_form.is_valid() and interface_form.is_valid():
        machine_form.save()
        interface_form.save()
        messages.success(request, "La machine a été modifiée")
98
        return redirect("/users/profil/" + str(interface.machine.user.id))
99 100
    return form({'machineform': machine_form, 'interfaceform': interface_form}, 'machines/machine.html', request)

chirac's avatar
chirac committed
101
@login_required
102 103 104 105 106 107
def new_interface(request, machineid):
    try:
        machine = Machine.objects.get(pk=machineid)
    except Machine.DoesNotExist:
        messages.error(request, u"Machine inexistante" )
        return redirect("/machines")
108 109 110 111 112 113 114
    if not request.user.has_perms(('cableur',)):
        if str(machine.user.id)!=str(request.user.id):
            messages.error(request, "Vous ne pouvez pas ajouter une interface à une machine d'un autre user que vous sans droit")
            return redirect("/users/profil/" + str(request.user.id))
        machine_form = BaseEditMachineForm(request.POST or None, instance=machine)
    else:
        machine_form = EditMachineForm(request.POST or None, instance=machine)
115 116 117 118 119
    interface_form = AddInterfaceForm(request.POST or None)
    if interface_form.is_valid() and machine_form.is_valid():
        machine_form.save()
        new_interface = interface_form.save(commit=False)
        new_interface.machine = machine
120 121 122 123
        if free_ip() and not new_interface.ipv4:
            new_interface = assign_ipv4(new_interface)
        elif not new_interface.ipv4:
            messages.error(request, u"Il n'y a plus d'ip disponibles")
124 125
        new_interface.save()
        messages.success(request, "L'interface a été ajoutée")
chirac's avatar
chirac committed
126
        return redirect("/machines/")
127 128
    return form({'machineform': machine_form, 'interfaceform': interface_form}, 'machines/machine.html', request)

chirac's avatar
chirac committed
129
@login_required
130
@permission_required('infra')
chirac's avatar
chirac committed
131 132 133 134 135
def add_machinetype(request):
    machinetype = MachineTypeForm(request.POST or None)
    if machinetype.is_valid():
        machinetype.save()
        messages.success(request, "Ce type de machine a été ajouté")
136
        return redirect("/machines/index_machinetype")
chirac's avatar
chirac committed
137 138
    return form({'machineform': machinetype, 'interfaceform': None}, 'machines/machine.html', request)

chirac's avatar
chirac committed
139
@login_required
140
@permission_required('infra')
141 142 143 144 145 146 147 148 149 150 151 152 153
def edit_machinetype(request, machinetypeid):
    try:
        machinetype_instance = MachineType.objects.get(pk=machinetypeid)
    except MachineType.DoesNotExist:
        messages.error(request, u"Entrée inexistante" )
        return redirect("/machines/index_machinetype/")
    machinetype = MachineTypeForm(request.POST or None, instance=machinetype_instance)
    if machinetype.is_valid():
        machinetype.save()
        messages.success(request, "Type de machine modifié")
        return redirect("/machines/index_machinetype/")
    return form({'machineform': machinetype}, 'machines/machine.html', request)

chirac's avatar
chirac committed
154
@login_required
155
@permission_required('infra')
chirac's avatar
chirac committed
156 157 158 159 160 161 162 163 164 165
def del_machinetype(request):
    machinetype = DelMachineTypeForm(request.POST or None)
    if machinetype.is_valid():
        machinetype_dels = machinetype.cleaned_data['machinetypes']
        for machinetype_del in machinetype_dels:
            try:
                machinetype_del.delete()
                messages.success(request, "Le type de machine a été supprimé")
            except ProtectedError:
                messages.error(request, "Le type de machine %s est affectée à au moins une machine, vous ne pouvez pas le supprimer" % machinetype_del)
166
        return redirect("/machines/index_machinetype")
chirac's avatar
chirac committed
167 168
    return form({'machineform': machinetype, 'interfaceform': None}, 'machines/machine.html', request)

169
@login_required
170
@permission_required('infra')
171 172 173 174 175 176 177 178 179
def add_extension(request):
    extension = ExtensionForm(request.POST or None)
    if extension.is_valid():
        extension.save()
        messages.success(request, "Cette extension a été ajoutée")
        return redirect("/machines/index_extension")
    return form({'machineform': extension, 'interfaceform': None}, 'machines/machine.html', request)

@login_required
180
@permission_required('infra')
181 182 183 184 185 186 187 188 189 190 191 192 193 194
def edit_extension(request, extensionid):
    try:
        extension_instance = Extension.objects.get(pk=extensionid)
    except Extension.DoesNotExist:
        messages.error(request, u"Entrée inexistante" )
        return redirect("/machines/index_extension/")
    extension = ExtensionForm(request.POST or None, instance=extension_instance)
    if extension.is_valid():
        extension.save()
        messages.success(request, "Extension modifiée")
        return redirect("/machines/index_extension/")
    return form({'machineform': extension}, 'machines/machine.html', request)

@login_required
195
@permission_required('infra')
196 197 198 199 200 201 202 203 204 205 206 207 208
def del_extension(request):
    extension = DelExtensionForm(request.POST or None)
    if extension.is_valid():
        extension_dels = extension.cleaned_data['extensions']
        for extension_del in extension_dels:
            try:
                extension_del.delete()
                messages.success(request, "L'extension a été supprimée")
            except ProtectedError:
                messages.error(request, "L'extension %s est affectée à au moins un type de machine, vous ne pouvez pas la supprimer" % extension_del)
        return redirect("/machines/index_extension")
    return form({'machineform': extension, 'interfaceform': None}, 'machines/machine.html', request)

chirac's avatar
chirac committed
209
@login_required
chirac's avatar
chirac committed
210
@permission_required('cableur')
211
def index(request):
212 213
    interfaces_list = Interface.objects.order_by('pk')
    return render(request, 'machines/index.html', {'interfaces_list': interfaces_list})
214

chirac's avatar
chirac committed
215
@login_required
chirac's avatar
chirac committed
216
@permission_required('cableur')
217 218
def index_machinetype(request):
    machinetype_list = MachineType.objects.order_by('type')
219
    return render(request, 'machines/index_machinetype.html', {'machinetype_list':machinetype_list})
220 221

@login_required
chirac's avatar
chirac committed
222
@permission_required('cableur')
223 224
def index_extension(request):
    extension_list = Extension.objects.order_by('name')
225
    return render(request, 'machines/index_extension.html', {'extension_list':extension_list})