mirror of
https://gitlab2.federez.net/re2o/re2o
synced 2024-11-26 22:52:26 +00:00
Gestion de l'historique dans topologie
This commit is contained in:
parent
b48a0569e3
commit
f42ed988cb
9 changed files with 99 additions and 13 deletions
16
re2o/templates/re2o/aff_history.html
Normal file
16
re2o/templates/re2o/aff_history.html
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
<table class="table table-striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Date</th>
|
||||||
|
<th>Cableur</th>
|
||||||
|
<th>Commentaire</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
{% for rev in reversions %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ rev.revision.date_created }}</td>
|
||||||
|
<td>{{ rev.revision.user }}</td>
|
||||||
|
<td>{{ rev.revision.comment }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
12
re2o/templates/re2o/history.html
Normal file
12
re2o/templates/re2o/history.html
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{% extends "re2o/sidebar.html" %}
|
||||||
|
{% load bootstrap3 %}
|
||||||
|
|
||||||
|
{% block title %}Historique{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h2>Historique de {{ object }}</h2>
|
||||||
|
{% include "re2o/aff_history.html" with reversions=reversions %}
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
{% endblock %}
|
|
@ -1,15 +1,16 @@
|
||||||
|
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
from reversion.admin import VersionAdmin
|
||||||
|
|
||||||
from .models import Port, Room, Switch
|
from .models import Port, Room, Switch
|
||||||
|
|
||||||
class SwitchAdmin(admin.ModelAdmin):
|
class SwitchAdmin(VersionAdmin):
|
||||||
list_display = ('building','number','details')
|
list_display = ('building','number','details')
|
||||||
|
|
||||||
class PortAdmin(admin.ModelAdmin):
|
class PortAdmin(VersionAdmin):
|
||||||
list_display = ('switch', 'port','room','machine_interface','details')
|
list_display = ('switch', 'port','room','machine_interface','details')
|
||||||
|
|
||||||
class RoomAdmin(admin.ModelAdmin):
|
class RoomAdmin(VersionAdmin):
|
||||||
list_display = ('name','details')
|
list_display = ('name','details')
|
||||||
|
|
||||||
admin.site.register(Port, PortAdmin)
|
admin.site.register(Port, PortAdmin)
|
||||||
|
|
|
@ -3,6 +3,7 @@ from django.forms import ModelForm, Form
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.contrib.contenttypes.fields import GenericForeignKey
|
from django.contrib.contenttypes.fields import GenericForeignKey
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
|
import reversion
|
||||||
|
|
||||||
def make_port_related(port):
|
def make_port_related(port):
|
||||||
related_port = port.related
|
related_port = port.related
|
||||||
|
|
|
@ -11,7 +11,8 @@
|
||||||
<td>{{room.name}}</td>
|
<td>{{room.name}}</td>
|
||||||
<td>{{room.details}}</td>
|
<td>{{room.details}}</td>
|
||||||
<td>{% if is_infra %}<a class="btn btn-primary btn-sm" role="button" href="{% url 'topologie:edit-room' room.id %}"><i class="glyphicon glyphicon-random"></i> Editer</a>
|
<td>{% if is_infra %}<a class="btn btn-primary btn-sm" role="button" href="{% url 'topologie:edit-room' room.id %}"><i class="glyphicon glyphicon-random"></i> Editer</a>
|
||||||
<a class="btn btn-danger btn-sm" role="button" href="{% url 'topologie:del-room' room.id %}"><i class="glyphicon glyphicon-trash"></i> Supprimer</a>{% endif %}</td>
|
<a class="btn btn-danger btn-sm" role="button" href="{% url 'topologie:del-room' room.id %}"><i class="glyphicon glyphicon-trash"></i> Supprimer</a>{% endif %}
|
||||||
|
<a class="btn btn-info btn-sm" role="button" href="{% url 'topologie:history' 'room' room.pk %}"><i class="glyphicon glyphicon-repeat"></i> Historique</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
|
|
|
@ -16,7 +16,8 @@
|
||||||
<td>{{ port.machine_interface }}</td>
|
<td>{{ port.machine_interface }}</td>
|
||||||
<td>{{ port.related }}</td>
|
<td>{{ port.related }}</td>
|
||||||
<td>{{ port.details }}</td>
|
<td>{{ port.details }}</td>
|
||||||
<td>{% if is_infra %}<a class="btn btn-primary btn-sm" role="button" href="{% url 'topologie:edit-port' port.id %}"><i class="glyphicon glyphicon-random"></i> Editer</a>{% endif %}</td>
|
<td>{% if is_infra %}<a class="btn btn-primary btn-sm" role="button" href="{% url 'topologie:edit-port' port.id %}"><i class="glyphicon glyphicon-random"></i> Editer</a>{% endif %}
|
||||||
|
<a class="btn btn-info btn-sm" role="button" href="{% url 'topologie:history' 'port' port.pk %}"><i class="glyphicon glyphicon-repeat"></i> Historique</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
|
|
|
@ -12,7 +12,8 @@
|
||||||
<td>{{switch.building}}</td>
|
<td>{{switch.building}}</td>
|
||||||
<td>{{switch.number}}</td>
|
<td>{{switch.number}}</td>
|
||||||
<td>{{switch.details}}</td>
|
<td>{{switch.details}}</td>
|
||||||
<td><a class="btn btn-primary btn-sm" role="button" href="{% url 'topologie:index-port' switch.pk %}"><i class="glyphicon glyphicon-cog"></i> Configurer</a></td>
|
<td><a class="btn btn-primary btn-sm" role="button" href="{% url 'topologie:index-port' switch.pk %}"><i class="glyphicon glyphicon-cog"></i> Configurer</a>
|
||||||
|
<a class="btn btn-info btn-sm" role="button" href="{% url 'topologie:history' 'switch' switch.pk %}"><i class="glyphicon glyphicon-repeat"></i> Historique</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
|
|
|
@ -10,6 +10,9 @@ urlpatterns = [
|
||||||
url(r'^edit_room/(?P<room_id>[0-9]+)$', views.edit_room, name='edit-room'),
|
url(r'^edit_room/(?P<room_id>[0-9]+)$', views.edit_room, name='edit-room'),
|
||||||
url(r'^del_room/(?P<room_id>[0-9]+)$', views.del_room, name='del-room'),
|
url(r'^del_room/(?P<room_id>[0-9]+)$', views.del_room, name='del-room'),
|
||||||
url(r'^switch/(?P<switch_id>[0-9]+)$', views.index_port, name='index-port'),
|
url(r'^switch/(?P<switch_id>[0-9]+)$', views.index_port, name='index-port'),
|
||||||
|
url(r'^history/(?P<object>switch)/(?P<id>[0-9]+)$', views.history, name='history'),
|
||||||
|
url(r'^history/(?P<object>port)/(?P<id>[0-9]+)$', views.history, name='history'),
|
||||||
|
url(r'^history/(?P<object>room)/(?P<id>[0-9]+)$', views.history, name='history'),
|
||||||
url(r'^edit_port/(?P<port_id>[0-9]+)$', views.edit_port, name='edit-port'),
|
url(r'^edit_port/(?P<port_id>[0-9]+)$', views.edit_port, name='edit-port'),
|
||||||
url(r'^new_port/(?P<switch_id>[0-9]+)$', views.new_port, name='new-port'),
|
url(r'^new_port/(?P<switch_id>[0-9]+)$', views.new_port, name='new-port'),
|
||||||
url(r'^edit_switch/(?P<switch_id>[0-9]+)$', views.edit_switch, name='edit-switch'),
|
url(r'^edit_switch/(?P<switch_id>[0-9]+)$', views.edit_switch, name='edit-switch'),
|
||||||
|
|
|
@ -2,6 +2,8 @@ from django.shortcuts import render, redirect
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.contrib.auth.decorators import login_required, permission_required
|
from django.contrib.auth.decorators import login_required, permission_required
|
||||||
from django.db import IntegrityError
|
from django.db import IntegrityError
|
||||||
|
from django.db import transaction
|
||||||
|
from reversion import revisions as reversion
|
||||||
|
|
||||||
from topologie.models import Switch, Port, Room
|
from topologie.models import Switch, Port, Room
|
||||||
from topologie.forms import EditPortForm, EditSwitchForm, AddPortForm, EditRoomForm
|
from topologie.forms import EditPortForm, EditSwitchForm, AddPortForm, EditRoomForm
|
||||||
|
@ -13,6 +15,33 @@ def index(request):
|
||||||
switch_list = Switch.objects.order_by('building', 'number')
|
switch_list = Switch.objects.order_by('building', 'number')
|
||||||
return render(request, 'topologie/index.html', {'switch_list': switch_list})
|
return render(request, 'topologie/index.html', {'switch_list': switch_list})
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
@permission_required('cableur')
|
||||||
|
def history(request, object, id):
|
||||||
|
if object == 'switch':
|
||||||
|
try:
|
||||||
|
object_instance = Switch.objects.get(pk=id)
|
||||||
|
except Switch.DoesNotExist:
|
||||||
|
messages.error(request, "Switch inexistant")
|
||||||
|
return redirect("/topologie/")
|
||||||
|
elif object == 'port':
|
||||||
|
try:
|
||||||
|
object_instance = Port.objects.get(pk=id)
|
||||||
|
except Port.DoesNotExist:
|
||||||
|
messages.error(request, "Port inexistant")
|
||||||
|
return redirect("/topologie/")
|
||||||
|
elif object == 'room':
|
||||||
|
try:
|
||||||
|
object_instance = Room.objects.get(pk=id)
|
||||||
|
except Room.DoesNotExist:
|
||||||
|
messages.error(request, "Chambre inexistante")
|
||||||
|
return redirect("/topologie/")
|
||||||
|
else:
|
||||||
|
messages.error(request, "Objet inconnu")
|
||||||
|
return redirect("/topologie/")
|
||||||
|
reversions = reversion.get_for_object(object_instance)
|
||||||
|
return render(request, 're2o/history.html', {'reversions': reversions, 'object': object_instance})
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@permission_required('cableur')
|
@permission_required('cableur')
|
||||||
def index_port(request, switch_id):
|
def index_port(request, switch_id):
|
||||||
|
@ -43,7 +72,10 @@ def new_port(request, switch_id):
|
||||||
port = port.save(commit=False)
|
port = port.save(commit=False)
|
||||||
port.switch = switch
|
port.switch = switch
|
||||||
try:
|
try:
|
||||||
|
with transaction.atomic(), reversion.create_revision():
|
||||||
port.save()
|
port.save()
|
||||||
|
reversion.set_user(request.user)
|
||||||
|
reversion.set_comment("Création")
|
||||||
messages.success(request, "Port ajouté")
|
messages.success(request, "Port ajouté")
|
||||||
except IntegrityError:
|
except IntegrityError:
|
||||||
messages.error(request,"Ce port existe déjà" )
|
messages.error(request,"Ce port existe déjà" )
|
||||||
|
@ -60,7 +92,10 @@ def edit_port(request, port_id):
|
||||||
return redirect("/topologie/")
|
return redirect("/topologie/")
|
||||||
port = EditPortForm(request.POST or None, instance=port)
|
port = EditPortForm(request.POST or None, instance=port)
|
||||||
if port.is_valid():
|
if port.is_valid():
|
||||||
|
with transaction.atomic(), reversion.create_revision():
|
||||||
port.save()
|
port.save()
|
||||||
|
reversion.set_user(request.user)
|
||||||
|
reversion.set_comment("Champs modifié(s) : %s" % ', '.join(field for field in port.changed_data))
|
||||||
messages.success(request, "Le port a bien été modifié")
|
messages.success(request, "Le port a bien été modifié")
|
||||||
return redirect("/topologie/")
|
return redirect("/topologie/")
|
||||||
return form({'topoform':port}, 'topologie/topo.html', request)
|
return form({'topoform':port}, 'topologie/topo.html', request)
|
||||||
|
@ -70,7 +105,10 @@ def edit_port(request, port_id):
|
||||||
def new_switch(request):
|
def new_switch(request):
|
||||||
switch = EditSwitchForm(request.POST or None)
|
switch = EditSwitchForm(request.POST or None)
|
||||||
if switch.is_valid():
|
if switch.is_valid():
|
||||||
|
with transaction.atomic(), reversion.create_revision():
|
||||||
switch.save()
|
switch.save()
|
||||||
|
reversion.set_user(request.user)
|
||||||
|
reversion.set_comment("Création")
|
||||||
messages.success(request, "Le switch a été créé")
|
messages.success(request, "Le switch a été créé")
|
||||||
return redirect("/topologie/")
|
return redirect("/topologie/")
|
||||||
return form({'topoform':switch}, 'topologie/topo.html', request)
|
return form({'topoform':switch}, 'topologie/topo.html', request)
|
||||||
|
@ -85,7 +123,10 @@ def edit_switch(request, switch_id):
|
||||||
return redirect("/topologie/")
|
return redirect("/topologie/")
|
||||||
switch = EditSwitchForm(request.POST or None, instance=switch)
|
switch = EditSwitchForm(request.POST or None, instance=switch)
|
||||||
if switch.is_valid():
|
if switch.is_valid():
|
||||||
|
with transaction.atomic(), reversion.create_revision():
|
||||||
switch.save()
|
switch.save()
|
||||||
|
reversion.set_user(request.user)
|
||||||
|
reversion.set_comment("Champs modifié(s) : %s" % ', '.join(field for field in switch.changed_data))
|
||||||
messages.success(request, "Le switch a bien été modifié")
|
messages.success(request, "Le switch a bien été modifié")
|
||||||
return redirect("/topologie/")
|
return redirect("/topologie/")
|
||||||
return form({'topoform':switch}, 'topologie/topo.html', request)
|
return form({'topoform':switch}, 'topologie/topo.html', request)
|
||||||
|
@ -95,7 +136,10 @@ def edit_switch(request, switch_id):
|
||||||
def new_room(request):
|
def new_room(request):
|
||||||
room = EditRoomForm(request.POST or None)
|
room = EditRoomForm(request.POST or None)
|
||||||
if room.is_valid():
|
if room.is_valid():
|
||||||
|
with transaction.atomic(), reversion.create_revision():
|
||||||
room.save()
|
room.save()
|
||||||
|
reversion.set_user(request.user)
|
||||||
|
reversion.set_comment("Création")
|
||||||
messages.success(request, "La chambre a été créé")
|
messages.success(request, "La chambre a été créé")
|
||||||
return redirect("/topologie/index_room/")
|
return redirect("/topologie/index_room/")
|
||||||
return form({'topoform':room}, 'topologie/topo.html', request)
|
return form({'topoform':room}, 'topologie/topo.html', request)
|
||||||
|
@ -110,7 +154,10 @@ def edit_room(request, room_id):
|
||||||
return redirect("/topologie/index_room/")
|
return redirect("/topologie/index_room/")
|
||||||
room = EditRoomForm(request.POST or None, instance=room)
|
room = EditRoomForm(request.POST or None, instance=room)
|
||||||
if room.is_valid():
|
if room.is_valid():
|
||||||
|
with transaction.atomic(), reversion.create_revision():
|
||||||
room.save()
|
room.save()
|
||||||
|
reversion.set_user(request.user)
|
||||||
|
reversion.set_comment("Champs modifié(s) : %s" % ', '.join(field for field in room.changed_data))
|
||||||
messages.success(request, "La chambre a bien été modifiée")
|
messages.success(request, "La chambre a bien été modifiée")
|
||||||
return redirect("/topologie/index_room/")
|
return redirect("/topologie/index_room/")
|
||||||
return form({'topoform':room}, 'topologie/topo.html', request)
|
return form({'topoform':room}, 'topologie/topo.html', request)
|
||||||
|
@ -124,7 +171,10 @@ def del_room(request, room_id):
|
||||||
messages.error(request, u"Chambre inexistante" )
|
messages.error(request, u"Chambre inexistante" )
|
||||||
return redirect("/topologie/index_room/")
|
return redirect("/topologie/index_room/")
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
|
with transaction.atomic(), reversion.create_revision():
|
||||||
room.delete()
|
room.delete()
|
||||||
|
reversion.set_user(request.user)
|
||||||
|
reversion.set_comment("Destruction")
|
||||||
messages.success(request, "La chambre/prise a été détruite")
|
messages.success(request, "La chambre/prise a été détruite")
|
||||||
return redirect("/topologie/index_room/")
|
return redirect("/topologie/index_room/")
|
||||||
return form({'objet': room, 'objet_name': 'Chambre'}, 'topologie/delete.html', request)
|
return form({'objet': room, 'objet_name': 'Chambre'}, 'topologie/delete.html', request)
|
||||||
|
|
Loading…
Reference in a new issue