mirror of
https://gitlab2.federez.net/re2o/re2o
synced 2024-11-22 03:13:12 +00:00
Utilisation de django-field-permission, simplification du code
This commit is contained in:
parent
0ed60c64fd
commit
e66ff32fcc
5 changed files with 45 additions and 95 deletions
|
@ -56,8 +56,10 @@ from .models import (
|
|||
OuverturePortList,
|
||||
)
|
||||
|
||||
from field_permissions.forms import FieldPermissionFormMixin
|
||||
|
||||
class EditMachineForm(ModelForm):
|
||||
|
||||
class EditMachineForm(FieldPermissionFormMixin, ModelForm):
|
||||
"""Formulaire d'édition d'une machine"""
|
||||
class Meta:
|
||||
model = Machine
|
||||
|
@ -69,55 +71,16 @@ class EditMachineForm(ModelForm):
|
|||
self.fields['name'].label = 'Nom de la machine'
|
||||
|
||||
|
||||
class NewMachineForm(EditMachineForm):
|
||||
"""Creation d'une machine, ne renseigne que le nom"""
|
||||
class Meta(EditMachineForm.Meta):
|
||||
fields = ['name']
|
||||
|
||||
|
||||
class BaseEditMachineForm(EditMachineForm):
|
||||
"""Edition basique, ne permet que de changer le nom et le statut.
|
||||
Réservé aux users sans droits spécifiques"""
|
||||
class Meta(EditMachineForm.Meta):
|
||||
fields = ['name', 'active']
|
||||
|
||||
|
||||
class EditInterfaceForm(ModelForm):
|
||||
"""Edition d'une interface. Edition complète"""
|
||||
class EditInterfaceForm(FieldPermissionFormMixin, ModelForm):
|
||||
"""Ajout d'une interface à une machine. En fonction des droits,
|
||||
affiche ou non l'ensemble des ip disponibles"""
|
||||
class Meta:
|
||||
model = Interface
|
||||
fields = ['machine', 'type', 'ipv4', 'mac_address', 'details']
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
prefix = kwargs.pop('prefix', self.Meta.model.__name__)
|
||||
super(EditInterfaceForm, self).__init__(*args, prefix=prefix, **kwargs)
|
||||
self.fields['mac_address'].label = 'Adresse mac'
|
||||
self.fields['type'].label = 'Type de machine'
|
||||
self.fields['type'].empty_label = "Séléctionner un type de machine"
|
||||
if "ipv4" in self.fields:
|
||||
self.fields['ipv4'].empty_label = "Assignation automatique\
|
||||
de l'ipv4"
|
||||
self.fields['ipv4'].queryset = IpList.objects.filter(
|
||||
interface__isnull=True
|
||||
)
|
||||
# Add it's own address
|
||||
self.fields['ipv4'].queryset |= IpList.objects.filter(
|
||||
interface=self.instance
|
||||
)
|
||||
if "machine" in self.fields:
|
||||
self.fields['machine'].queryset = Machine.objects.all()\
|
||||
.select_related('user')
|
||||
|
||||
|
||||
class AddInterfaceForm(EditInterfaceForm):
|
||||
"""Ajout d'une interface à une machine. En fonction des droits,
|
||||
affiche ou non l'ensemble des ip disponibles"""
|
||||
class Meta(EditInterfaceForm.Meta):
|
||||
fields = ['type', 'ipv4', 'mac_address', 'details']
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
infra = kwargs.pop('infra')
|
||||
super(AddInterfaceForm, self).__init__(*args, **kwargs)
|
||||
super(EditInterfaceForm, self).__init__(*args, **kwargs)
|
||||
self.fields['ipv4'].empty_label = "Assignation automatique de l'ipv4"
|
||||
if not infra:
|
||||
self.fields['type'].queryset = MachineType.objects.filter(
|
||||
|
@ -126,36 +89,6 @@ class AddInterfaceForm(EditInterfaceForm):
|
|||
self.fields['ipv4'].queryset = IpList.objects.filter(
|
||||
interface__isnull=True
|
||||
).filter(ip_type__in=IpType.objects.filter(need_infra=False))
|
||||
else:
|
||||
self.fields['ipv4'].queryset = IpList.objects.filter(
|
||||
interface__isnull=True
|
||||
)
|
||||
|
||||
|
||||
class NewInterfaceForm(EditInterfaceForm):
|
||||
"""Formulaire light, sans choix de l'ipv4; d'ajout d'une interface"""
|
||||
class Meta(EditInterfaceForm.Meta):
|
||||
fields = ['type', 'mac_address', 'details']
|
||||
|
||||
|
||||
class BaseEditInterfaceForm(EditInterfaceForm):
|
||||
"""Edition basique d'une interface. En fonction des droits,
|
||||
ajoute ou non l'ensemble des ipv4 disponibles (infra)"""
|
||||
class Meta(EditInterfaceForm.Meta):
|
||||
fields = ['type', 'ipv4', 'mac_address', 'details']
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
infra = kwargs.pop('infra')
|
||||
super(BaseEditInterfaceForm, self).__init__(*args, **kwargs)
|
||||
self.fields['ipv4'].empty_label = "Assignation automatique de l'ipv4"
|
||||
if not infra:
|
||||
self.fields['type'].queryset = MachineType.objects.filter(
|
||||
ip_type__in=IpType.objects.filter(need_infra=False)
|
||||
)
|
||||
self.fields['ipv4'].queryset = IpList.objects.filter(
|
||||
interface__isnull=True
|
||||
).filter(ip_type__in=IpType.objects.filter(need_infra=False))
|
||||
# Add it's own address
|
||||
self.fields['ipv4'].queryset |= IpList.objects.filter(
|
||||
interface=self.instance
|
||||
)
|
||||
|
@ -168,6 +101,7 @@ class BaseEditInterfaceForm(EditInterfaceForm):
|
|||
)
|
||||
|
||||
|
||||
|
||||
class AliasForm(ModelForm):
|
||||
"""Ajout d'un alias (et edition), CNAME, contenant nom et extension"""
|
||||
class Meta:
|
||||
|
|
|
@ -35,10 +35,12 @@ from django.utils.functional import cached_property
|
|||
from django.utils import timezone
|
||||
from django.core.validators import MaxValueValidator
|
||||
|
||||
from field_permissions.models import FieldPermissionModelMixin
|
||||
|
||||
from macaddress.fields import MACAddressField
|
||||
|
||||
|
||||
class Machine(models.Model):
|
||||
class Machine(FieldPermissionModelMixin, models.Model):
|
||||
""" Class définissant une machine, object parent user, objets fils
|
||||
interfaces"""
|
||||
PRETTY_NAME = "Machine"
|
||||
|
@ -52,6 +54,16 @@ class Machine(models.Model):
|
|||
)
|
||||
active = models.BooleanField(default=True)
|
||||
|
||||
def can_change_user(self, user, **kwargs):
|
||||
return user.is_infra
|
||||
|
||||
field_permissions = {
|
||||
'user': can_change_user,
|
||||
}
|
||||
|
||||
class Meta:
|
||||
abstract = False
|
||||
|
||||
def __str__(self):
|
||||
return str(self.user) + ' - ' + str(self.id) + ' - ' + str(self.name)
|
||||
|
||||
|
@ -400,7 +412,7 @@ class Text(models.Model):
|
|||
return str(self.field1).ljust(15) + " IN TXT " + str(self.field2)
|
||||
|
||||
|
||||
class Interface(models.Model):
|
||||
class Interface(FieldPermissionModelMixin, models.Model):
|
||||
""" Une interface. Objet clef de l'application machine :
|
||||
- une address mac unique. Possibilité de la rendre unique avec le
|
||||
typemachine
|
||||
|
@ -422,6 +434,16 @@ class Interface(models.Model):
|
|||
details = models.CharField(max_length=255, blank=True)
|
||||
port_lists = models.ManyToManyField('OuverturePortList', blank=True)
|
||||
|
||||
def can_change_machine(self, user, **kwargs):
|
||||
return user.is_infra
|
||||
|
||||
field_permissions = {
|
||||
'machine': can_change_machine,
|
||||
}
|
||||
|
||||
class Meta:
|
||||
abstract = False
|
||||
|
||||
@cached_property
|
||||
def is_active(self):
|
||||
""" Renvoie si une interface doit avoir accès ou non """
|
||||
|
|
|
@ -59,16 +59,12 @@ from reversion.models import Version
|
|||
|
||||
import re
|
||||
from .forms import (
|
||||
NewMachineForm,
|
||||
EditMachineForm,
|
||||
EditInterfaceForm,
|
||||
AddInterfaceForm,
|
||||
MachineTypeForm,
|
||||
DelMachineTypeForm,
|
||||
ExtensionForm,
|
||||
DelExtensionForm,
|
||||
BaseEditInterfaceForm,
|
||||
BaseEditMachineForm
|
||||
)
|
||||
from .forms import (
|
||||
EditIpTypeForm,
|
||||
|
@ -225,8 +221,8 @@ def new_machine(request, userid):
|
|||
if user.user_interfaces().count() >= max_lambdauser_interfaces:
|
||||
messages.error(request, "Vous avez atteint le maximum d'interfaces autorisées que vous pouvez créer vous même (%s) " % max_lambdauser_interfaces)
|
||||
return redirect("/users/profil/" + str(request.user.id))
|
||||
machine = NewMachineForm(request.POST or None)
|
||||
interface = AddInterfaceForm(request.POST or None, infra=request.user.has_perms(('infra',)))
|
||||
machine = EditMachineForm(request.POST or None, user=request.user)
|
||||
interface = EditInterfaceForm(request.POST or None, infra=request.user.has_perms(('infra',)), user=request.user)
|
||||
domain = DomainForm(request.POST or None, user=user)
|
||||
if machine.is_valid() and interface.is_valid():
|
||||
new_machine = machine.save(commit=False)
|
||||
|
@ -267,11 +263,8 @@ def edit_interface(request, interfaceid):
|
|||
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))
|
||||
machine_form = BaseEditMachineForm(request.POST or None, instance=interface.machine)
|
||||
interface_form = BaseEditInterfaceForm(request.POST or None, instance=interface, infra=False)
|
||||
else:
|
||||
machine_form = EditMachineForm(request.POST or None, instance=interface.machine)
|
||||
interface_form = EditInterfaceForm(request.POST or None, instance=interface)
|
||||
interface_form = EditInterfaceForm(request.POST or None, instance=interface, infra=request.user.has_perms(('infra',)), user=request.user)
|
||||
machine_form = EditMachineForm(request.POST or None, instance=interface.machine, user=request.user)
|
||||
domain_form = DomainForm(request.POST or None, instance=interface.domain)
|
||||
if machine_form.is_valid() and interface_form.is_valid() and domain_form.is_valid():
|
||||
new_machine = machine_form.save(commit=False)
|
||||
|
@ -331,7 +324,7 @@ def new_interface(request, machineid):
|
|||
if machine.user.user_interfaces().count() >= max_lambdauser_interfaces:
|
||||
messages.error(request, "Vous avez atteint le maximum d'interfaces autorisées que vous pouvez créer vous même (%s) " % max_lambdauser_interfaces)
|
||||
return redirect("/users/profil/" + str(request.user.id))
|
||||
interface_form = AddInterfaceForm(request.POST or None, infra=request.user.has_perms(('infra',)))
|
||||
interface_form = EditInterfaceForm(request.POST or None, infra=request.user.has_perms(('infra',)), user=request.user)
|
||||
domain_form = DomainForm(request.POST or None)
|
||||
if interface_form.is_valid():
|
||||
new_interface = interface_form.save(commit=False)
|
||||
|
|
|
@ -76,7 +76,8 @@ INSTALLED_APPS = (
|
|||
'preferences',
|
||||
'logs',
|
||||
'rest_framework',
|
||||
'reversion'
|
||||
'reversion',
|
||||
'field_permissions'
|
||||
) + OPTIONNAL_APPS
|
||||
|
||||
MIDDLEWARE_CLASSES = (
|
||||
|
|
|
@ -68,10 +68,8 @@ from users.views import form
|
|||
from re2o.utils import SortTable
|
||||
from machines.forms import (
|
||||
DomainForm,
|
||||
NewMachineForm,
|
||||
EditMachineForm,
|
||||
EditInterfaceForm,
|
||||
AddInterfaceForm
|
||||
)
|
||||
from machines.views import generate_ipv4_mbf_param
|
||||
from preferences.models import AssoOption, GeneralOption
|
||||
|
@ -431,10 +429,11 @@ def new_switch(request):
|
|||
associée. Vue complexe. Appelle successivement les 4 models forms
|
||||
adaptés : machine, interface, domain et switch"""
|
||||
switch = NewSwitchForm(request.POST or None)
|
||||
machine = NewMachineForm(request.POST or None)
|
||||
interface = AddInterfaceForm(
|
||||
machine = EditMachineForm(request.POST or None, user=request.user)
|
||||
interface = EditInterfaceForm(
|
||||
request.POST or None,
|
||||
infra=request.user.has_perms(('infra',))
|
||||
infra=request.user.has_perms(('infra',)),
|
||||
user=request.user,
|
||||
)
|
||||
domain = DomainForm(
|
||||
request.POST or None,
|
||||
|
@ -549,7 +548,8 @@ def edit_switch(request, switch_id):
|
|||
)
|
||||
interface_form = EditInterfaceForm(
|
||||
request.POST or None,
|
||||
instance=switch.switch_interface
|
||||
instance=switch.switch_interface,
|
||||
user=request.user,
|
||||
)
|
||||
domain_form = DomainForm(
|
||||
request.POST or None,
|
||||
|
|
Loading…
Reference in a new issue