mirror of
https://gitlab2.federez.net/re2o/re2o
synced 2024-11-22 11:23:10 +00:00
Add machines.models.Role
This commit is contained in:
parent
d2a128326a
commit
5dab70ccee
10 changed files with 249 additions and 1 deletions
|
@ -42,6 +42,7 @@ from .models import (
|
|||
SshFp,
|
||||
Nas,
|
||||
Service,
|
||||
Role,
|
||||
OuverturePort,
|
||||
Ipv6List,
|
||||
OuverturePortList,
|
||||
|
@ -146,6 +147,11 @@ class ServiceAdmin(VersionAdmin):
|
|||
""" Admin view of a ServiceAdmin object """
|
||||
list_display = ('service_type', 'min_time_regen', 'regular_time_regen')
|
||||
|
||||
class RoleAdmin(VersionAdmin):
|
||||
""" Admin view of a RoleAdmin object """
|
||||
list_display = ('role_type')
|
||||
|
||||
|
||||
|
||||
admin.site.register(Machine, MachineAdmin)
|
||||
admin.site.register(MachineType, MachineTypeAdmin)
|
||||
|
@ -162,6 +168,7 @@ admin.site.register(IpList, IpListAdmin)
|
|||
admin.site.register(Interface, InterfaceAdmin)
|
||||
admin.site.register(Domain, DomainAdmin)
|
||||
admin.site.register(Service, ServiceAdmin)
|
||||
admin.site.register(Role, RoleAdmin)
|
||||
admin.site.register(Vlan, VlanAdmin)
|
||||
admin.site.register(Ipv6List, Ipv6ListAdmin)
|
||||
admin.site.register(Nas, NasAdmin)
|
||||
|
|
|
@ -53,6 +53,7 @@ from .models import (
|
|||
Txt,
|
||||
DName,
|
||||
Ns,
|
||||
Role,
|
||||
Service,
|
||||
Vlan,
|
||||
Srv,
|
||||
|
@ -497,6 +498,40 @@ class DelNasForm(FormRevMixin, Form):
|
|||
self.fields['nas'].queryset = Nas.objects.all()
|
||||
|
||||
|
||||
class RoleForm(FormRevMixin, ModelForm):
|
||||
"""Ajout et edition d'un role"""
|
||||
class Meta:
|
||||
model = Role
|
||||
fields = '__all__'
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
prefix = kwargs.pop('prefix', self.Meta.model.__name__)
|
||||
super(RoleForm, self).__init__(*args, prefix=prefix, **kwargs)
|
||||
self.fields['servers'].queryset = (Interface.objects.all()
|
||||
.select_related(
|
||||
'domain__extension'
|
||||
))
|
||||
|
||||
|
||||
class DelRoleForm(FormRevMixin, Form):
|
||||
"""Suppression d'un ou plusieurs service"""
|
||||
role = forms.ModelMultipleChoiceField(
|
||||
queryset=Role.objects.none(),
|
||||
label="Roles actuels",
|
||||
widget=forms.CheckboxSelectMultiple
|
||||
)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
instances = kwargs.pop('instances', None)
|
||||
super(DelRoleForm, self).__init__(*args, **kwargs)
|
||||
if instances:
|
||||
self.fields['role'].queryset = instances
|
||||
else:
|
||||
self.fields['role'].queryset = role.objects.all()
|
||||
|
||||
|
||||
|
||||
|
||||
class ServiceForm(FormRevMixin, ModelForm):
|
||||
"""Ajout et edition d'une classe de service : dns, dhcp, etc"""
|
||||
class Meta:
|
||||
|
|
|
@ -1441,6 +1441,26 @@ class IpList(RevMixin, AclMixin, models.Model):
|
|||
return self.ipv4
|
||||
|
||||
|
||||
|
||||
class Role(RevMixin, AclMixin, models.Model):
|
||||
""" Definition d'un role (routeur principal, routeur de backkup)"""
|
||||
""" Sert à la génération automatique de la conf des serveurs"""
|
||||
PRETTY_NAME = "Roles des serveurs"
|
||||
|
||||
role_type = models.CharField(max_length=255, unique=True)
|
||||
servers = models.ManyToManyField('Interface')
|
||||
|
||||
class Meta:
|
||||
permissions = (
|
||||
("view_role", "Peut voir un objet service"),
|
||||
)
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
super(Role, self).save(*args, **kwargs)
|
||||
|
||||
def __str__(self):
|
||||
return str(self.role_type)
|
||||
|
||||
class Service(RevMixin, AclMixin, models.Model):
|
||||
""" Definition d'un service (dhcp, dns, etc)"""
|
||||
PRETTY_NAME = "Services à générer (dhcp, dns, etc)"
|
||||
|
|
49
machines/templates/machines/aff_role.html
Normal file
49
machines/templates/machines/aff_role.html
Normal file
|
@ -0,0 +1,49 @@
|
|||
{% 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 acl %}
|
||||
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Nom du role</th>
|
||||
<th>Serveurs inclus</th>
|
||||
<th></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
{% for role in role_list %}
|
||||
<tr>
|
||||
<td>{{ role.role_type }}</td>
|
||||
<td>{% for serv in role.servers.all %}{{ serv }}, {% endfor %}</td>
|
||||
<td class="text-right">
|
||||
{% can_edit role %}
|
||||
{% include 'buttons/edit.html' with href='machines:edit-role' id=role.id %}
|
||||
{% acl_end %}
|
||||
{% include 'buttons/history.html' with href='machines:history' name='role' id=role.id %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
41
machines/templates/machines/index_role.html
Normal file
41
machines/templates/machines/index_role.html
Normal file
|
@ -0,0 +1,41 @@
|
|||
{% extends "machines/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 %}
|
||||
{% load acl %}
|
||||
|
||||
{% block title %}Machines{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<h2>Liste des roles</h2>
|
||||
{% can_create Role %}
|
||||
<a class="btn btn-primary btn-sm" role="button" href="{% url 'machines:add-role' %}"><i class="fa fa-plus"></i> Ajouter un role</a>
|
||||
{% acl_end %}
|
||||
<a class="btn btn-danger btn-sm" role="button" href="{% url 'machines:del-role' %}"><i class="fa fa-trash"></i> Supprimer un ou plusieurs role</a>
|
||||
{% include "machines/aff_role.html" with role_list=role_list %}
|
||||
<br />
|
||||
<br />
|
||||
{% endblock %}
|
||||
|
|
@ -71,6 +71,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
{% endif %}
|
||||
{% if sshfpform %}
|
||||
{% bootstrap_form_errors sshfpform %}
|
||||
{% if roleform %}
|
||||
{% bootstrap_form_errors roleform %}
|
||||
{% endif %}
|
||||
{% if vlanform %}
|
||||
{% bootstrap_form_errors vlanform %}
|
||||
|
@ -148,6 +150,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
<h3>Service</h3>
|
||||
{% massive_bootstrap_form serviceform 'servers' %}
|
||||
{% endif %}
|
||||
{% if roleform %}
|
||||
<h3>Role</h3>
|
||||
{% massive_bootstrap_form roleform 'servers' %}
|
||||
{% endif %}
|
||||
{% if vlanform %}
|
||||
<h3>Vlan</h3>
|
||||
{% bootstrap_form vlanform %}
|
||||
|
|
|
@ -68,6 +68,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
Services (dhcp, dns...)
|
||||
</a>
|
||||
{% acl_end %}
|
||||
{% can_view_all Role %}
|
||||
<a class="list-group-item list-group-item-info" href="{% url "machines:index-role" %}">
|
||||
<i class="fa fa-list-ul"></i>
|
||||
Roles des serveurs
|
||||
</a>
|
||||
{% acl_end %}
|
||||
{% can_view_all OuverturePortList %}
|
||||
<a class="list-group-item list-group-item-info" href="{% url "machines:index-portlist" %}">
|
||||
<i class="fa fa-list-ul"></i>
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
"""machines.urls
|
||||
The defined URLs for the Cotisations app
|
||||
The defined URLs for the Machines app
|
||||
"""
|
||||
|
||||
from __future__ import unicode_literals
|
||||
|
@ -125,6 +125,12 @@ urlpatterns = [
|
|||
name='edit-service'),
|
||||
url(r'^del_service/$', views.del_service, name='del-service'),
|
||||
url(r'^index_service/$', views.index_service, name='index-service'),
|
||||
url(r'^add_role/$', views.add_role, name='add-role'),
|
||||
url(r'^edit_role/(?P<roleid>[0-9]+)$',
|
||||
views.edit_role,
|
||||
name='edit-role'),
|
||||
url(r'^del_role/$', views.del_role, name='del-role'),
|
||||
url(r'^index_role/$', views.index_role, name='index-role'),
|
||||
url(r'^add_vlan/$', views.add_vlan, name='add-vlan'),
|
||||
url(r'^edit_vlan/(?P<vlanid>[0-9]+)$', views.edit_vlan, name='edit-vlan'),
|
||||
url(r'^del_vlan/$', views.del_vlan, name='del-vlan'),
|
||||
|
|
|
@ -101,6 +101,8 @@ from .forms import (
|
|||
DelMxForm,
|
||||
VlanForm,
|
||||
DelVlanForm,
|
||||
RoleForm,
|
||||
DelRoleForm,
|
||||
ServiceForm,
|
||||
DelServiceForm,
|
||||
SshFpForm,
|
||||
|
@ -122,6 +124,7 @@ from .models import (
|
|||
Mx,
|
||||
Ns,
|
||||
Domain,
|
||||
Role,
|
||||
Service,
|
||||
Service_link,
|
||||
Vlan,
|
||||
|
@ -1141,6 +1144,65 @@ def del_alias(request, interface, interfaceid):
|
|||
)
|
||||
|
||||
|
||||
@login_required
|
||||
@can_create(Role)
|
||||
def add_role(request):
|
||||
""" View used to add a Role object """
|
||||
role = RoleForm(request.POST or None)
|
||||
if role.is_valid():
|
||||
role.save()
|
||||
messages.success(request, "Cet enregistrement role a été ajouté")
|
||||
return redirect(reverse('machines:index-role'))
|
||||
return form(
|
||||
{'roleform': role, 'action_name': 'Créer'},
|
||||
'machines/machine.html',
|
||||
request
|
||||
)
|
||||
|
||||
|
||||
@login_required
|
||||
@can_edit(Role)
|
||||
def edit_role(request, role_instance, **_kwargs):
|
||||
""" View used to edit a Role object """
|
||||
role = RoleForm(request.POST or None, instance=role_instance)
|
||||
if role.is_valid():
|
||||
if role.changed_data:
|
||||
role.save()
|
||||
messages.success(request, "Role modifié")
|
||||
return redirect(reverse('machines:index-role'))
|
||||
return form(
|
||||
{'roleform': role, 'action_name': 'Editer'},
|
||||
'machines/machine.html',
|
||||
request
|
||||
)
|
||||
|
||||
|
||||
@login_required
|
||||
@can_delete_set(Role)
|
||||
def del_role(request, instances):
|
||||
""" View used to delete a Service object """
|
||||
role = DelRoleForm(request.POST or None, instances=instances)
|
||||
if role.is_valid():
|
||||
role_dels = role.cleaned_data['role']
|
||||
for role_del in role_dels:
|
||||
try:
|
||||
role_del.delete()
|
||||
messages.success(request, "Le role a été supprimée")
|
||||
except ProtectedError:
|
||||
messages.error(
|
||||
request,
|
||||
("Erreur le role suivant %s ne peut être supprimé"
|
||||
% role_del)
|
||||
)
|
||||
return redirect(reverse('machines:index-role'))
|
||||
return form(
|
||||
{'roleform': role, 'action_name': 'Supprimer'},
|
||||
'machines/machine.html',
|
||||
request
|
||||
)
|
||||
|
||||
|
||||
|
||||
@login_required
|
||||
@can_create(Service)
|
||||
def add_service(request):
|
||||
|
@ -1481,6 +1543,21 @@ def index_ipv6(request, interface, interfaceid):
|
|||
)
|
||||
|
||||
|
||||
@login_required
|
||||
@can_view_all(Role)
|
||||
def index_role(request):
|
||||
""" View used to display the list of existing roles """
|
||||
role_list = (Role.objects
|
||||
.prefetch_related(
|
||||
'servers__domain__extension'
|
||||
).all())
|
||||
return render(
|
||||
request,
|
||||
'machines/index_role.html',
|
||||
{'role_list': role_list}
|
||||
)
|
||||
|
||||
|
||||
@login_required
|
||||
@can_view_all(Service)
|
||||
def index_service(request):
|
||||
|
|
|
@ -79,6 +79,7 @@ from django.contrib.contenttypes.models import ContentType
|
|||
|
||||
register = template.Library()
|
||||
|
||||
|
||||
def get_model(model_name):
|
||||
"""Retrieve the model object from its name"""
|
||||
splitted = model_name.split('.')
|
||||
|
|
Loading…
Reference in a new issue