views.py 35.1 KB
Newer Older
1
# App de gestion des machines pour re2o
Dalahro's avatar
Dalahro committed
2
# Gabriel Détraz, Augustin Lemesle
3
# Gplv2
Dalahro's avatar
Dalahro committed
4
from django.http import HttpResponse
5
from django.shortcuts import render, redirect
6
7
from django.shortcuts import get_object_or_404
from django.template.context_processors import csrf
8
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
9
10
from django.template import Context, RequestContext, loader
from django.contrib import messages
11
from django.contrib.auth.decorators import login_required, permission_required
chirac's avatar
chirac committed
12
from django.db.models import ProtectedError
chirac's avatar
chirac committed
13
from django.forms import ValidationError
14
from django.db import transaction
Dalahro's avatar
Dalahro committed
15
16
from django.contrib.auth import authenticate, login
from django.views.decorators.csrf import csrf_exempt
Dalahro's avatar
Dalahro committed
17

Dalahro's avatar
Dalahro committed
18
from rest_framework.renderers import JSONRenderer
chirac's avatar
chirac committed
19
from machines.serializers import InterfaceSerializer, TypeSerializer, DomainSerializer, MxSerializer, ExtensionSerializer, NsSerializer
20
from reversion import revisions as reversion
root's avatar
root committed
21
from reversion.models import Version
Dalahro's avatar
Dalahro committed
22

chirac's avatar
chirac committed
23
import re
24
from .forms import NewMachineForm, EditMachineForm, EditInterfaceForm, AddInterfaceForm, MachineTypeForm, DelMachineTypeForm, ExtensionForm, DelExtensionForm, BaseEditInterfaceForm, BaseEditMachineForm
25
from .forms import IpTypeForm, DelIpTypeForm, AliasForm, DelAliasForm, NsForm, DelNsForm, MxForm, DelMxForm
chirac's avatar
chirac committed
26
from .models import IpType, Machine, Interface, IpList, MachineType, Extension, Mx, Ns, Domain
27
from users.models import User
28
from re2o.settings import PAGINATION_NUMBER, PAGINATION_LARGE_NUMBER, MAX_INTERFACES, MAX_ALIAS
29

chirac's avatar
chirac committed
30
def full_domain_validator(request, domain):
chirac's avatar
chirac committed
31
32
    """ Validation du nom de domaine, extensions dans type de machine, prefixe pas plus long que 63 caractères """
    HOSTNAME_LABEL_PATTERN = re.compile("(?!-)[A-Z\d-]+(?<!-)$", re.IGNORECASE)
chirac's avatar
chirac committed
33
    dns = domain.name.lower()
chirac's avatar
chirac committed
34
    if len(dns) > 63:
chirac's avatar
chirac committed
35
36
37
        messages.error(request,
                "Le nom de domaine %s est trop long (maximum de 63 caractères)." % dns)
        return False
chirac's avatar
chirac committed
38
    if not HOSTNAME_LABEL_PATTERN.match(dns):
chirac's avatar
chirac committed
39
40
41
42
43
        messages.error(request,
                "Ce nom de domaine %s contient des carractères interdits." % dns)
        return False
    return True

44
def unassign_ips(user):
45
    machines = user.user_interfaces()
46
    for machine in machines:
chirac's avatar
chirac committed
47
48
49
50
51
        unassign_ipv4(machine)
    return

def assign_ips(user):
    """ Assign une ipv4 aux machines d'un user """
52
    machines = user.user_interfaces()
chirac's avatar
chirac committed
53
54
55
    for machine in machines:
        if not machine.ipv4:
            interface = assign_ipv4(machine)
56
57
58
            with transaction.atomic(), reversion.create_revision():
                reversion.set_comment("Assignation ipv4")
                interface.save()
59
60
    return

61
def free_ip(type):
62
    """ Renvoie la liste des ip disponibles """
63
64
65
66
    if not type.need_infra:
        return IpList.objects.filter(interface__isnull=True).filter(ip_type=type).filter(need_infra=False)
    else:
        return IpList.objects.filter(interface__isnull=True).filter(ip_type=type)
67
68
69

def assign_ipv4(interface):
    """ Assigne une ip à l'interface """
chirac's avatar
chirac committed
70
    free_ips = free_ip(interface.type.ip_type)
71
72
73
74
    if free_ips:
        interface.ipv4 = free_ips[0]
    return interface

chirac's avatar
chirac committed
75
76
def unassign_ipv4(interface):
    interface.ipv4 = None
77
78
79
    with transaction.atomic(), reversion.create_revision():
        reversion.set_comment("Désassignation ipv4")
        interface.save()
chirac's avatar
chirac committed
80

81
82
83
def form(ctx, template, request):
    c = ctx
    c.update(csrf(request))
84
    return render(request, template, c)
85

chirac's avatar
chirac committed
86
@login_required
87
88
89
90
91
92
def new_machine(request, userid):
    try:
        user = User.objects.get(pk=userid)
    except User.DoesNotExist:
        messages.error(request, u"Utilisateur inexistant" )
        return redirect("/machines/")
93
94
95
96
97
98
99
    if not request.user.has_perms(('cableur',)):
        if user != request.user:
            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))
        if user.user_interfaces().count() >= MAX_INTERFACES:
            messages.error(request, "Vous avez atteint le maximum d'interfaces autorisées que vous pouvez créer vous même (%s) " % MAX_INTERFACES)
            return redirect("/users/profil/" + str(request.user.id))
100
    machine = NewMachineForm(request.POST or None)
101
    interface = AddInterfaceForm(request.POST or None, infra=request.user.has_perms(('infra',))) 
chirac's avatar
chirac committed
102
    domain = AliasForm(request.POST or None, infra=request.user.has_perms(('infra',)))
103
104
105
106
    if machine.is_valid() and interface.is_valid():
        new_machine = machine.save(commit=False)
        new_machine.user = user
        new_interface = interface.save(commit=False)
chirac's avatar
chirac committed
107
108
        new_domain = domain.save(commit=False)
        if full_domain_validator(request, new_domain):
109
110
111
112
            with transaction.atomic(), reversion.create_revision():
                new_machine.save()
                reversion.set_user(request.user)
                reversion.set_comment("Création")
chirac's avatar
chirac committed
113
            new_interface.machine = new_machine
chirac's avatar
chirac committed
114
            if free_ip(new_interface.type.ip_type) and not new_interface.ipv4:
chirac's avatar
chirac committed
115
116
117
                new_interface = assign_ipv4(new_interface)
            elif not new_interface.ipv4:
                messages.error(request, u"Il n'y a plus d'ip disponibles")
118
119
120
121
            with transaction.atomic(), reversion.create_revision():
                new_interface.save()
                reversion.set_user(request.user)
                reversion.set_comment("Création")
chirac's avatar
chirac committed
122
123
124
125
126
            new_domain.interface_parent = new_interface
            with transaction.atomic(), reversion.create_revision():
                new_domain.save()
                reversion.set_user(request.user)
                reversion.set_comment("Création")
chirac's avatar
chirac committed
127
128
            messages.success(request, "La machine a été crée")
            return redirect("/users/profil/" + userid)
chirac's avatar
chirac committed
129
    return form({'machineform': machine, 'interfaceform': interface, 'domainform': domain}, 'machines/machine.html', request)
130

chirac's avatar
chirac committed
131
@login_required
132
def edit_interface(request, interfaceid):
133
134
135
136
137
    try:
        interface = Interface.objects.get(pk=interfaceid)
    except Interface.DoesNotExist:
        messages.error(request, u"Interface inexistante" )
        return redirect("/machines")
138
    if not request.user.has_perms(('infra',)):
139
        if not request.user.has_perms(('cableur',)) and interface.machine.user != request.user:
140
141
142
            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)
143
        interface_form = BaseEditInterfaceForm(request.POST or None, instance=interface, infra=False)
144
145
    else:
        machine_form = EditMachineForm(request.POST or None, instance=interface.machine)
chirac's avatar
chirac committed
146
        interface_form = EditInterfaceForm(request.POST or None, instance=interface)
chirac's avatar
chirac committed
147
148
    domain_form = AliasForm(request.POST or None, infra=request.user.has_perms(('infra',)), instance=interface.domain)
    if machine_form.is_valid() and interface_form.is_valid() and domain_form.is_valid():
chirac's avatar
chirac committed
149
150
        new_interface = interface_form.save(commit=False)
        new_machine = machine_form.save(commit=False)
chirac's avatar
chirac committed
151
152
        new_domain = domain_form.save(commit=False)
        if full_domain_validator(request, new_domain):
153
154
155
156
            with transaction.atomic(), reversion.create_revision():
                new_machine.save()
                reversion.set_user(request.user)
                reversion.set_comment("Champs modifié(s) : %s" % ', '.join(field for field in machine_form.changed_data))
157
158
            if free_ip(new_interface.type.ip_type) and not new_interface.ipv4:
                new_interface = assign_ipv4(new_interface)
159
160
161
162
            with transaction.atomic(), reversion.create_revision():
                new_interface.save()
                reversion.set_user(request.user)
                reversion.set_comment("Champs modifié(s) : %s" % ', '.join(field for field in interface_form.changed_data))
chirac's avatar
chirac committed
163
164
165
166
            with transaction.atomic(), reversion.create_revision():
                new_domain.save()
                reversion.set_user(request.user)
                reversion.set_comment("Champs modifié(s) : %s" % ', '.join(field for field in domain_form.changed_data))
chirac's avatar
chirac committed
167
168
            messages.success(request, "La machine a été modifiée")
            return redirect("/users/profil/" + str(interface.machine.user.id))
chirac's avatar
chirac committed
169
    return form({'machineform': machine_form, 'interfaceform': interface_form, 'domainform': domain_form}, 'machines/machine.html', request)
170

171
172
173
174
175
176
177
178
179
180
181
@login_required
def del_machine(request, machineid):
    try:
        machine = Machine.objects.get(pk=machineid)
    except Machine.DoesNotExist:
        messages.error(request, u"Machine inexistante" )
        return redirect("/machines")
    if not request.user.has_perms(('cableur',)):
        if machine.user != request.user:
            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))
182
    if request.method == "POST":
183
184
185
        with transaction.atomic(), reversion.create_revision():
            machine.delete()
            reversion.set_user(request.user)
186
187
188
        messages.success(request, "La machine a été détruite")
        return redirect("/users/profil/" + str(request.user.id))
    return form({'objet': machine, 'objet_name': 'machine'}, 'machines/delete.html', request)
189

chirac's avatar
chirac committed
190
@login_required
191
192
193
194
195
196
def new_interface(request, machineid):
    try:
        machine = Machine.objects.get(pk=machineid)
    except Machine.DoesNotExist:
        messages.error(request, u"Machine inexistante" )
        return redirect("/machines")
197
    if not request.user.has_perms(('cableur',)):
198
        if machine.user != request.user:
199
200
            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))
201
202
203
        if machine.user.user_interfaces().count() >= MAX_INTERFACES:
            messages.error(request, "Vous avez atteint le maximum d'interfaces autorisées que vous pouvez créer vous même (%s) " % MAX_INTERFACES)
            return redirect("/users/profil/" + str(request.user.id))
204
    interface_form = AddInterfaceForm(request.POST or None, infra=request.user.has_perms(('infra',)))
chirac's avatar
chirac committed
205
    domain_form = AliasForm(request.POST or None, infra=request.user.has_perms(('infra',)))
chirac's avatar
chirac committed
206
    if interface_form.is_valid():
207
208
        new_interface = interface_form.save(commit=False)
        new_interface.machine = machine
chirac's avatar
chirac committed
209
210
        new_domain = domain_form.save(commit=False)
        if full_domain_validator(request, new_domain):
chirac's avatar
chirac committed
211
            if free_ip(new_interface.type.ip_type) and not new_interface.ipv4:
chirac's avatar
chirac committed
212
213
214
                new_interface = assign_ipv4(new_interface)
            elif not new_interface.ipv4:
                messages.error(request, u"Il n'y a plus d'ip disponibles")
215
216
217
218
            with transaction.atomic(), reversion.create_revision():
                new_interface.save()
                reversion.set_user(request.user)
                reversion.set_comment("Création")
chirac's avatar
chirac committed
219
220
221
222
223
            new_domain.interface_parent = new_interface
            with transaction.atomic(), reversion.create_revision():
                new_domain.save()
                reversion.set_user(request.user)
                reversion.set_comment("Création")
chirac's avatar
chirac committed
224
            messages.success(request, "L'interface a été ajoutée")
225
            return redirect("/users/profil/" + str(machine.user.id))
chirac's avatar
chirac committed
226
    return form({'interfaceform': interface_form, 'domainform': domain_form}, 'machines/machine.html', request)
227

228
229
230
231
232
233
234
235
236
237
238
@login_required
def del_interface(request, interfaceid):
    try:
        interface = Interface.objects.get(pk=interfaceid)
    except Interface.DoesNotExist:
        messages.error(request, u"Interface inexistante" )
        return redirect("/machines")
    if not request.user.has_perms(('cableur',)):
        if interface.machine.user != request.user:
            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))
239
    if request.method == "POST":
240
        machine = interface.machine
241
242
        with transaction.atomic(), reversion.create_revision():
            interface.delete()
243
244
            if not machine.interface_set.all():
               machine.delete()
245
            reversion.set_user(request.user)
246
247
248
        messages.success(request, "L'interface a été détruite")
        return redirect("/users/profil/" + str(request.user.id))
    return form({'objet': interface, 'objet_name': 'interface'}, 'machines/delete.html', request)
249

chirac's avatar
chirac committed
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
@login_required
@permission_required('infra')
def add_iptype(request):
    iptype = IpTypeForm(request.POST or None)
    if iptype.is_valid():
        with transaction.atomic(), reversion.create_revision():
            iptype.save()
            reversion.set_user(request.user)
            reversion.set_comment("Création")
        messages.success(request, "Ce type d'ip a été ajouté")
        return redirect("/machines/index_iptype")
    return form({'machineform': iptype, 'interfaceform': None}, 'machines/machine.html', request)

@login_required
@permission_required('infra')
def edit_iptype(request, iptypeid):
    try:
        iptype_instance = IpType.objects.get(pk=iptypeid)
    except IpType.DoesNotExist:
        messages.error(request, u"Entrée inexistante" )
        return redirect("/machines/index_iptype/")
    iptype = IpTypeForm(request.POST or None, instance=iptype_instance)
    if iptype.is_valid():
        with transaction.atomic(), reversion.create_revision():
            iptype.save()
            reversion.set_user(request.user)
            reversion.set_comment("Champs modifié(s) : %s" % ', '.join(field for field in iptype.changed_data))
        messages.success(request, "Type d'ip modifié")
        return redirect("/machines/index_iptype/")
    return form({'machineform': iptype}, 'machines/machine.html', request)

@login_required
@permission_required('infra')
def del_iptype(request):
    iptype = DelIpTypeForm(request.POST or None)
    if iptype.is_valid():
        iptype_dels = iptype.cleaned_data['iptypes']
        for iptype_del in iptype_dels:
            try:
                with transaction.atomic(), reversion.create_revision():
                    iptype_del.delete()
                    reversion.set_user(request.user)
                messages.success(request, "Le type d'ip a été supprimé")
            except ProtectedError:
                messages.error(request, "Le type d'ip %s est affectée à au moins une machine, vous ne pouvez pas le supprimer" % iptype_del)
        return redirect("/machines/index_iptype")
    return form({'machineform': iptype, 'interfaceform': None}, 'machines/machine.html', request)

chirac's avatar
chirac committed
298
@login_required
299
@permission_required('infra')
chirac's avatar
chirac committed
300
301
302
def add_machinetype(request):
    machinetype = MachineTypeForm(request.POST or None)
    if machinetype.is_valid():
303
304
305
306
        with transaction.atomic(), reversion.create_revision():
            machinetype.save()
            reversion.set_user(request.user)
            reversion.set_comment("Création")
chirac's avatar
chirac committed
307
        messages.success(request, "Ce type de machine a été ajouté")
308
        return redirect("/machines/index_machinetype")
chirac's avatar
chirac committed
309
310
    return form({'machineform': machinetype, 'interfaceform': None}, 'machines/machine.html', request)

chirac's avatar
chirac committed
311
@login_required
312
@permission_required('infra')
313
314
315
316
317
318
319
320
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():
321
322
323
324
        with transaction.atomic(), reversion.create_revision():
            machinetype.save()
            reversion.set_user(request.user)
            reversion.set_comment("Champs modifié(s) : %s" % ', '.join(field for field in machinetype.changed_data))
325
326
327
328
        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
329
@login_required
330
@permission_required('infra')
chirac's avatar
chirac committed
331
332
333
334
335
336
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:
337
338
339
                with transaction.atomic(), reversion.create_revision():
                    machinetype_del.delete()
                    reversion.set_user(request.user)
chirac's avatar
chirac committed
340
341
342
                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)
343
        return redirect("/machines/index_machinetype")
chirac's avatar
chirac committed
344
345
    return form({'machineform': machinetype, 'interfaceform': None}, 'machines/machine.html', request)

346
@login_required
347
@permission_required('infra')
348
349
350
def add_extension(request):
    extension = ExtensionForm(request.POST or None)
    if extension.is_valid():
351
352
353
354
        with transaction.atomic(), reversion.create_revision():
            extension.save()
            reversion.set_user(request.user)
            reversion.set_comment("Création")
355
356
357
358
359
        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
360
@permission_required('infra')
361
362
363
364
365
366
367
368
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():
369
370
371
372
        with transaction.atomic(), reversion.create_revision():
            extension.save()
            reversion.set_user(request.user)
            reversion.set_comment("Champs modifié(s) : %s" % ', '.join(field for field in extension.changed_data))
373
374
375
376
377
        messages.success(request, "Extension modifiée")
        return redirect("/machines/index_extension/")
    return form({'machineform': extension}, 'machines/machine.html', request)

@login_required
378
@permission_required('infra')
379
380
381
382
383
384
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:
385
386
387
                with transaction.atomic(), reversion.create_revision():
                    extension_del.delete()
                    reversion.set_user(request.user)
388
389
390
391
392
393
                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)

394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
@login_required
@permission_required('infra')
def add_mx(request):
    mx = MxForm(request.POST or None)
    if mx.is_valid():
        with transaction.atomic(), reversion.create_revision():
            mx.save()
            reversion.set_user(request.user)
            reversion.set_comment("Création")
        messages.success(request, "Cet enregistrement mx a été ajouté")
        return redirect("/machines/index_extension")
    return form({'machineform': mx, 'interfaceform': None}, 'machines/machine.html', request)

@login_required
@permission_required('infra')
def edit_mx(request, mxid):
    try:
        mx_instance = Mx.objects.get(pk=mxid)
    except Mx.DoesNotExist:
        messages.error(request, u"Entrée inexistante" )
        return redirect("/machines/index_extension/")
    mx = MxForm(request.POST or None, instance=mx_instance)
    if mx.is_valid():
        with transaction.atomic(), reversion.create_revision():
            mx.save()
            reversion.set_user(request.user)
            reversion.set_comment("Champs modifié(s) : %s" % ', '.join(field for field in mx.changed_data))
        messages.success(request, "Mx modifié")
        return redirect("/machines/index_extension/")
    return form({'machineform': mx}, 'machines/machine.html', request)

@login_required
@permission_required('infra')
def del_mx(request):
    mx = DelMxForm(request.POST or None)
    if mx.is_valid():
        mx_dels = mx.cleaned_data['mx']
        for mx_del in mx_dels:
            try:
                with transaction.atomic(), reversion.create_revision():
                    mx_del.delete()
                    reversion.set_user(request.user)
                messages.success(request, "L'mx a été supprimée")
            except ProtectedError:
                messages.error(request, "Erreur le Mx suivant %s ne peut être supprimé" % mx_del)
        return redirect("/machines/index_extension")
    return form({'machineform': mx, 'interfaceform': None}, 'machines/machine.html', request)

442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
@login_required
@permission_required('infra')
def add_ns(request):
    ns = NsForm(request.POST or None)
    if ns.is_valid():
        with transaction.atomic(), reversion.create_revision():
            ns.save()
            reversion.set_user(request.user)
            reversion.set_comment("Création")
        messages.success(request, "Cet enregistrement ns a été ajouté")
        return redirect("/machines/index_extension")
    return form({'machineform': ns, 'interfaceform': None}, 'machines/machine.html', request)

@login_required
@permission_required('infra')
def edit_ns(request, nsid):
    try:
        ns_instance = Ns.objects.get(pk=nsid)
    except Ns.DoesNotExist:
        messages.error(request, u"Entrée inexistante" )
        return redirect("/machines/index_extension/")
    ns = NsForm(request.POST or None, instance=ns_instance)
    if ns.is_valid():
        with transaction.atomic(), reversion.create_revision():
            ns.save()
            reversion.set_user(request.user)
            reversion.set_comment("Champs modifié(s) : %s" % ', '.join(field for field in ns.changed_data))
        messages.success(request, "Ns modifié")
        return redirect("/machines/index_extension/")
    return form({'machineform': ns}, 'machines/machine.html', request)

@login_required
@permission_required('infra')
def del_ns(request):
    ns = DelNsForm(request.POST or None)
    if ns.is_valid():
        ns_dels = ns.cleaned_data['ns']
        for ns_del in ns_dels:
            try:
                with transaction.atomic(), reversion.create_revision():
                    ns_del.delete()
                    reversion.set_user(request.user)
                messages.success(request, "Le ns a été supprimée")
            except ProtectedError:
                messages.error(request, "Erreur le Ns suivant %s ne peut être supprimé" % ns_del)
        return redirect("/machines/index_extension")
    return form({'machineform': ns, 'interfaceform': None}, 'machines/machine.html', request)

490
491
492
493
494
495
496
@login_required
def add_alias(request, interfaceid):
    try:
        interface = Interface.objects.get(pk=interfaceid)
    except Interface.DoesNotExist:
        messages.error(request, u"Interface inexistante" )
        return redirect("/machines")
497
498
499
500
    if not request.user.has_perms(('cableur',)):
        if interface.machine.user != request.user:
            messages.error(request, "Vous ne pouvez pas ajouter un alias à une machine d'un autre user que vous sans droit")
            return redirect("/users/profil/" + str(request.user.id))
chirac's avatar
chirac committed
501
        if Domain.objects.filter(cname__in=Domain.objects.filter(interface_parent__in=interface.machine.user.user_interfaces())).count() >= MAX_ALIAS:
502
503
            messages.error(request, "Vous avez atteint le maximum d'alias autorisées que vous pouvez créer vous même (%s) " % MAX_ALIAS)
            return redirect("/users/profil/" + str(request.user.id))
504
    alias = AliasForm(request.POST or None, infra=request.user.has_perms(('infra',)))
505
506
    if alias.is_valid():
        alias = alias.save(commit=False)
chirac's avatar
chirac committed
507
        alias.cname = interface.domain
508
509
510
511
512
513
514
515
516
517
518
        with transaction.atomic(), reversion.create_revision():
            alias.save()
            reversion.set_user(request.user)
            reversion.set_comment("Création")
        messages.success(request, "Cet alias a été ajouté")
        return redirect("/machines/index_alias/" + str(interfaceid))
    return form({'machineform': alias, 'interfaceform': None}, 'machines/machine.html', request)

@login_required
def edit_alias(request, aliasid):
    try:
chirac's avatar
chirac committed
519
520
        alias_instance = Domain.objects.get(pk=aliasid)
    except Domain.DoesNotExist:
521
522
        messages.error(request, u"Entrée inexistante" )
        return redirect("/machines/index_extension/")
chirac's avatar
chirac committed
523
    if not request.user.has_perms(('cableur',)) and alias_instance.cname.interface_parent.machine.user != request.user:
524
525
        messages.error(request, "Vous ne pouvez pas ajouter un alias à une machine d'un autre user que vous sans droit")
        return redirect("/users/profil/" + str(request.user.id))
526
    alias = AliasForm(request.POST or None, instance=alias_instance, infra=request.user.has_perms(('infra',)))
527
528
529
530
531
532
    if alias.is_valid():
        with transaction.atomic(), reversion.create_revision():
            alias_instance = alias.save()
            reversion.set_user(request.user)
            reversion.set_comment("Champs modifié(s) : %s" % ', '.join(field for field in alias.changed_data))
        messages.success(request, "Alias modifié")
chirac's avatar
chirac committed
533
        return redirect("/machines/index_alias/" + str(alias_instance.cname.interface_parent.id))
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
    return form({'machineform': alias}, 'machines/machine.html', request)

@login_required
def del_alias(request, interfaceid):
    try:
        interface = Interface.objects.get(pk=interfaceid)
    except Interface.DoesNotExist:
        messages.error(request, u"Interface inexistante" )
        return redirect("/machines")
    if not request.user.has_perms(('cableur',)) and interface.machine.user != request.user:
        messages.error(request, "Vous ne pouvez pas ajouter un alias à une machine d'un autre user que vous sans droit")
        return redirect("/users/profil/" + str(request.user.id))
    alias = DelAliasForm(request.POST or None, interface=interface)
    if alias.is_valid():
        alias_dels = alias.cleaned_data['alias']
        for alias_del in alias_dels:
            try:
                with transaction.atomic(), reversion.create_revision():
                    alias_del.delete()
                    reversion.set_user(request.user)
                messages.success(request, "L'alias %s a été supprimé" % alias_del)
            except ProtectedError:
                messages.error(request, "Erreur l'alias suivant %s ne peut être supprimé" % alias_del)
        return redirect("/machines/index_alias/" + str(interfaceid))
    return form({'machineform': alias, 'interfaceform': None}, 'machines/machine.html', request)

chirac's avatar
chirac committed
560
@login_required
chirac's avatar
chirac committed
561
@permission_required('cableur')
562
def index(request):
563
    machines_list = Machine.objects.order_by('pk')
chirac's avatar
chirac committed
564
    paginator = Paginator(machines_list, PAGINATION_LARGE_NUMBER)
565
566
567
568
569
570
571
572
573
    page = request.GET.get('page')
    try:
        machines_list = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        machines_list = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        machines_list = paginator.page(paginator.num_pages)
574
    return render(request, 'machines/index.html', {'machines_list': machines_list})
575

chirac's avatar
chirac committed
576
577
578
579
580
581
@login_required
@permission_required('cableur')
def index_iptype(request):
    iptype_list = IpType.objects.order_by('type')
    return render(request, 'machines/index_iptype.html', {'iptype_list':iptype_list})

chirac's avatar
chirac committed
582
@login_required
chirac's avatar
chirac committed
583
@permission_required('cableur')
584
585
def index_machinetype(request):
    machinetype_list = MachineType.objects.order_by('type')
586
    return render(request, 'machines/index_machinetype.html', {'machinetype_list':machinetype_list})
587
588

@login_required
chirac's avatar
chirac committed
589
@permission_required('cableur')
590
591
def index_extension(request):
    extension_list = Extension.objects.order_by('name')
592
593
594
    mx_list = Mx.objects.order_by('zone')
    ns_list = Ns.objects.order_by('zone')
    return render(request, 'machines/index_extension.html', {'extension_list':extension_list, 'mx_list': mx_list, 'ns_list': ns_list})
Dalahro's avatar
Dalahro committed
595

596
597
598
599
600
601
602
603
604
605
@login_required
def index_alias(request, interfaceid):
    try:
        interface = Interface.objects.get(pk=interfaceid)
    except Interface.DoesNotExist:
        messages.error(request, u"Interface inexistante" )
        return redirect("/machines")
    if not request.user.has_perms(('cableur',)) and interface.machine.user != request.user:
        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))
chirac's avatar
chirac committed
606
    alias_list = Domain.objects.filter(cname=Domain.objects.filter(interface_parent=interface)).order_by('name')
607
608
    return render(request, 'machines/index_alias.html', {'alias_list':alias_list, 'interface_id': interfaceid})

609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
@login_required
def history(request, object, id):
    if object == 'machine':
        try:
             object_instance = Machine.objects.get(pk=id)
        except Machine.DoesNotExist:
             messages.error(request, "Machine inexistante")
             return redirect("/machines/")
        if not request.user.has_perms(('cableur',)) and object_instance.user != request.user:
             messages.error(request, "Vous ne pouvez pas afficher l'historique d'une machine d'un autre user que vous sans droit cableur")
             return redirect("/users/profil/" + str(request.user.id))
    elif object == 'interface':
        try:
             object_instance = Interface.objects.get(pk=id)
        except Interface.DoesNotExist:
             messages.error(request, "Interface inexistante")
             return redirect("/machines/")
        if not request.user.has_perms(('cableur',)) and object_instance.machine.user != request.user:
             messages.error(request, "Vous ne pouvez pas afficher l'historique d'une interface d'un autre user que vous sans droit cableur")
             return redirect("/users/profil/" + str(request.user.id))
629
630
    elif object == 'alias':
        try:
chirac's avatar
chirac committed
631
632
             object_instance = Domain.objects.get(pk=id)
        except Domain.DoesNotExist:
633
634
             messages.error(request, "Alias inexistant")
             return redirect("/machines/")
chirac's avatar
chirac committed
635
        if not request.user.has_perms(('cableur',)) and object_instance.cname.interface_parent.machine.user != request.user:
636
637
             messages.error(request, "Vous ne pouvez pas afficher l'historique d'un alias d'un autre user que vous sans droit cableur")
             return redirect("/users/profil/" + str(request.user.id))
638
639
640
641
642
643
    elif object == 'machinetype' and request.user.has_perms(('cableur',)):
        try:
             object_instance = MachineType.objects.get(pk=id)
        except MachineType.DoesNotExist:
             messages.error(request, "Type de machine inexistant")
             return redirect("/machines/")
chirac's avatar
chirac committed
644
645
646
647
648
649
    elif object == 'iptype' and request.user.has_perms(('cableur',)):
        try:
             object_instance = IpType.objects.get(pk=id)
        except IpType.DoesNotExist:
             messages.error(request, "Type d'ip inexistant")
             return redirect("/machines/")
650
651
652
653
654
655
    elif object == 'extension' and request.user.has_perms(('cableur',)):
        try:
             object_instance = Extension.objects.get(pk=id)
        except Extension.DoesNotExist:
             messages.error(request, "Extension inexistante")
             return redirect("/machines/")
656
657
658
659
660
661
    elif object == 'mx' and request.user.has_perms(('cableur',)):
        try:
             object_instance = Mx.objects.get(pk=id)
        except Mx.DoesNotExist:
             messages.error(request, "Mx inexistant")
             return redirect("/machines/")
662
663
664
665
666
667
    elif object == 'ns' and request.user.has_perms(('cableur',)):
        try:
             object_instance = Ns.objects.get(pk=id)
        except Ns.DoesNotExist:
             messages.error(request, "Ns inexistant")
             return redirect("/machines/")
668
669
670
    else:
        messages.error(request, "Objet  inconnu")
        return redirect("/machines/")
root's avatar
root committed
671
    reversions = Version.objects.get_for_object(object_instance)
chirac's avatar
chirac committed
672
673
674
675
676
677
678
679
680
681
    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)
682
683
684
    return render(request, 're2o/history.html', {'reversions': reversions, 'object': object_instance})


Dalahro's avatar
Dalahro committed
685
686
687
688
""" Framework Rest """

class JSONResponse(HttpResponse):
    def __init__(self, data, **kwargs):
Dalahro's avatar
Dalahro committed
689
        content = JSONRenderer().render(data)
Dalahro's avatar
Dalahro committed
690
691
692
        kwargs['content_type'] = 'application/json'
        super(JSONResponse, self).__init__(content, **kwargs)

Dalahro's avatar
Dalahro committed
693
694
695
@csrf_exempt
@login_required
@permission_required('serveur')
Dalahro's avatar
Dalahro committed
696
697
def interface_list(request):
    interfaces = Interface.objects.all()
Dalahro's avatar
Dalahro committed
698
699
700
701
702
703
    interface = []
    for i in interfaces :
        if i.ipv4 and i.is_active():
            interface.append(i)
    seria = InterfaceSerializer(interface, many=True) 
    return seria.data
Dalahro's avatar
Dalahro committed
704

Dalahro's avatar
Dalahro committed
705
706
707
@csrf_exempt
@login_required
@permission_required('serveur')
708
def alias(request):
chirac's avatar
chirac committed
709
710
    alias = Domain.objects.filter(interface_parent=None).filter(cname=Domain.objects.filter(interface_parent__in=Interface.objects.exclude(ipv4=None)))
    seria = DomainSerializer(alias, many=True)
711
712
713
714
715
716
    return JSONResponse(seria.data)

@csrf_exempt
@login_required
@permission_required('serveur')
def corresp(request):
Dalahro's avatar
Dalahro committed
717
718
    type = IpType.objects.all()
    seria = TypeSerializer(type, many=True)
719
    return JSONResponse(seria.data)
Dalahro's avatar
Dalahro committed
720

721
722
723
724
725
726
727
728
729
730
731
732
@csrf_exempt
@login_required
@permission_required('serveur')
def mx(request):
    mx = Mx.objects.all()
    seria = MxSerializer(mx, many=True)
    return JSONResponse(seria.data)

@csrf_exempt
@login_required
@permission_required('serveur')
def ns(request):
733
    ns = Ns.objects.filter(interface__in=Interface.objects.exclude(ipv4=None))
734
735
736
    seria = NsSerializer(ns, many=True)
    return JSONResponse(seria.data)

737
738
739
740
741
742
743
744
@csrf_exempt
@login_required
@permission_required('serveur')
def zones(request):
    zones = Extension.objects.all()
    seria = ExtensionSerializer(zones, many=True)
    return JSONResponse(seria.data)

Dalahro's avatar
Dalahro committed
745
746
747
@csrf_exempt
@login_required
@permission_required('serveur')
Dalahro's avatar
Dalahro committed
748
749
750
def mac_ip(request):
    seria = interface_list(request)
    return JSONResponse(seria)
Dalahro's avatar
Dalahro committed
751

Dalahro's avatar
Dalahro committed
752
753
754
@csrf_exempt
@login_required
@permission_required('serveur')
Dalahro's avatar
Dalahro committed
755
def mac_ip_dns(request):
Dalahro's avatar
Dalahro committed
756
757
    seria = interface_list(request)
    return JSONResponse(seria)
Dalahro's avatar
Dalahro committed
758

Dalahro's avatar
Dalahro committed
759
760
761
762
763
@csrf_exempt
def login_user(request):
    user = authenticate(username=request.POST['username'], password=request.POST['password'])
    login(request, user)
    return HttpResponse("Logged In")