From ef1dbc882bb496cbac3ef98e290fb20b540efcee Mon Sep 17 00:00:00 2001 From: Gabriel Detraz Date: Wed, 28 Mar 2018 03:52:07 +0200 Subject: [PATCH 1/3] Poc de acl mixin, factorisation du code --- machines/models.py | 692 ++------------------------------------------- re2o/mixins.py | 72 +++++ 2 files changed, 88 insertions(+), 676 deletions(-) create mode 100644 re2o/mixins.py diff --git a/machines/models.py b/machines/models.py index 43906bab..de4c7311 100644 --- a/machines/models.py +++ b/machines/models.py @@ -39,6 +39,7 @@ from django.core.validators import MaxValueValidator from macaddress.fields import MACAddressField from re2o.field_permissions import FieldPermissionModelMixin +from re2o.mixins import AclMixin import users.models import preferences.models @@ -161,7 +162,7 @@ class Machine(FieldPermissionModelMixin, models.Model): return str(self.user) + ' - ' + str(self.id) + ' - ' + str(self.name) -class MachineType(models.Model): +class MachineType(AclMixin, models.Model): """ Type de machine, relié à un type d'ip, affecté aux interfaces""" PRETTY_NAME = "Type de machine" @@ -190,33 +191,6 @@ class MachineType(models.Model): :return: Une instance machinetype évidemment""" return MachineType.objects.get(pk=machinetypeid) - def can_create(user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour créer - un type de machine - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.add_machinetype'), u"Vous n'avez pas le droit\ - de créer un type de machine" - - def can_edit(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour editer - cette instance type de machine - :param self: Instance machinetype à editer - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - if not user_request.has_perm('machines.change_machinetype'): - return False, u"Vous n'avez pas le droit d'éditer des types de machine" - return True, None - - def can_delete(self, user_request, *args, **kwargs): - """Vérifie qu'on peut bien supprimer cette instance particulière (soit - machinetype de soi, soit droit particulier - :param self: instance machinetype à supprimer - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - if not user_request.has_perm('machines.delete_machinetype'): - return False, u"Vous n'avez pas le droit de supprimer des types de machines" - return True, None def can_use_all(user_request, *args, **kwargs): """Check if an user can use every MachineType. @@ -231,28 +205,11 @@ class MachineType(models.Model): return False, u"Vous n'avez pas le droit d'utiliser tout types de machines" return True, None - def can_view_all(user_request, *args, **kwargs): - """Vérifie qu'on peut bien afficher l'ensemble des machinetype, - droit particulier correspondant - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_machinetype'), u"Vous n'avez pas le droit\ - de voir les types de machines" - - def can_view(self, user_request, *args, **kwargs): - """Vérifie qu'on peut bien voir cette instance particulière avec - droit view objet - :param self: instance machinetype à voir - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_machinetype'), u"Vous n'avez pas le droit\ - de voir les types de machines" - def __str__(self): return self.type -class IpType(models.Model): +class IpType(AclMixin, models.Model): """ Type d'ip, définissant un range d'ip, affecté aux machine types""" PRETTY_NAME = "Type d'ip" @@ -384,56 +341,11 @@ class IpType(models.Model): :return: True ou False avec la raison de l'échec le cas échéant""" return user_request.has_perm('machines.use_all_iptype'), None - - def can_create(user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour créer - un type d'ip - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.add_iptype'), u"Vous n'avez pas le droit\ - de créer un type d'ip" - - def can_edit(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour editer - cette instance iptype - :param self: Instance iptype à editer - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - if not user_request.has_perm('machines.change_iptype'): - return False, u"Vous n'avez pas le droit d'éditer des types d'ip" - return True, None - - def can_delete(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour supprimer - cette instance iptype - :param self: Instance iptype à delete - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.delete_iptype'), u"Vous n'avez pas le droit\ - de supprimer un type d'ip" - - def can_view_all(user_request, *args, **kwargs): - """Vérifie qu'on peut bien afficher l'ensemble des iptype, - droit particulier view objet correspondant - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_iptype'), u"Vous n'avez pas le droit\ - de voir les types d'ip" - - def can_view(self, user_request, *args, **kwargs): - """Vérifie qu'on peut bien voir cette instance particulière avec - droit view objet - :param self: instance iptype à voir - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_iptype'), u"Vous n'avez pas le droit\ - de voir les types d'ip" - def __str__(self): return self.type -class Vlan(models.Model): +class Vlan(AclMixin, models.Model): """ Un vlan : vlan_id et nom On limite le vlan id entre 0 et 4096, comme défini par la norme""" PRETTY_NAME = "Vlans" @@ -453,55 +365,11 @@ class Vlan(models.Model): :return: Une instance vlan évidemment""" return Vlan.objects.get(pk=vlanid) - def can_create(user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour créer - un vlan - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.add_vlan'), u"Vous n'avez pas le droit\ - de créer un vlan" - - def can_edit(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour editer - cette instance vlan - :param self: Instance vlan à editer - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - if not user_request.has_perm('machines.change_vlan'): - return False, u"Vous n'avez pas le droit d'éditer des vlans" - return True, None - - def can_delete(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour supprimer - cette instance vlan - :param self: Instance vlan à delete - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.delete_vlan'), u"Vous n'avez pas le droit\ - de suprimer un vlan" - - def can_view_all(user_request, *args, **kwargs): - """Vérifie qu'on peut bien afficher l'ensemble des vlan, - droit particulier view objet correspondant - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_vlan'), u"Vous n'avez pas le droit\ - de voir les vlans" - - def can_view(self, user_request, *args, **kwargs): - """Vérifie qu'on peut bien voir cette instance particulière avec - droit view objet - :param self: instance vlan à voir - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_vlan'), u"Vous n'avez pas le droit\ - de voir les vlans" - def __str__(self): return self.name -class Nas(models.Model): +class Nas(AclMixin, models.Model): """ Les nas. Associé à un machine_type. Permet aussi de régler le port_access_mode (802.1X ou mac-address) pour le radius. Champ autocapture de la mac à true ou false""" @@ -542,56 +410,11 @@ class Nas(models.Model): :return: Une instance nas évidemment""" return Nas.objects.get(pk=nasid) - def can_create(user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour créer - un nas - :param user_request: instance utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.add_nas'), u"Vous n'avez pas le droit\ - de créer un nas" - - def can_edit(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour editer - cette instance nas - :param self: Instance nas à editer - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - if not user_request.has_perm('machines.change_nas'): - return False, u"Vous n'avez pas le droit d'éditer des nas" - return True, None - - def can_delete(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour supprimer - cette instance nas - :param self: Instance nas à delete - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.delete_nas'), u"Vous n'avez pas le droit\ - de supprimer un nas" - - def can_view_all(user_request, *args, **kwargs): - """Vérifie qu'on peut bien afficher l'ensemble des nas, - droit particulier view objet correspondant - - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_nas'), u"Vous n'avez pas le droit\ - de voir les nas" - - def can_view(self, user_request, *args, **kwargs): - """Vérifie qu'on peut bien voir cette instance particulière avec - droit view objet - :param self: instance nas à voir - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_nas'), u"Vous n'avez pas le droit\ - de voir les nas" - def __str__(self): return self.name -class SOA(models.Model): +class SOA(AclMixin, models.Model): """ Un enregistrement SOA associé à une extension Les valeurs par défault viennent des recommandations RIPE : @@ -634,50 +457,6 @@ class SOA(models.Model): :return: Une instance soa évidemment""" return SOA.objects.get(pk=soaid) - def can_create(user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour créer - un soa - :param user_request: instance utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.add_soa'), u"Vous n'avez pas le droit\ - de créer un enregistrement SOA" - - def can_edit(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour editer - cette instance soa - :param self: Instance soa à editer - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - if not user_request.has_perm('machines.change_soa'): - return False, u"Vous n'avez pas le droit d'éditer des enregistrements SOA" - return True, None - - def can_delete(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour supprimer - cette instance soa - :param self: Instance soa à delete - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.delete_soa'), u"Vous n'avez pas le droit\ - de supprimer des enregistrements SOA" - - def can_view_all(user_request, *args, **kwargs): - """Vérifie qu'on peut bien afficher l'ensemble des soa, - droit particulier view objet correspondant - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_soa'), u"Vous n'avez pas le droit\ - de voir les enreistrement SOA" - - def can_view(self, user_request, *args, **kwargs): - """Vérifie qu'on peut bien voir cette instance particulière avec - droit view objet - :param self: instance soa à voir - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_soa'), u"Vous n'avez pas le droit\ - de voir les enreistrement SOA" - def __str__(self): return str(self.name) @@ -718,7 +497,7 @@ class SOA(models.Model): -class Extension(models.Model): +class Extension(AclMixin, models.Model): """ Extension dns type example.org. Précise si tout le monde peut l'utiliser, associé à un origin (ip d'origine)""" PRETTY_NAME = "Extensions dns" @@ -772,56 +551,12 @@ class Extension(models.Model): :return: Une instance extension évidemment""" return Extension.objects.get(pk=extensionid) - def can_create(user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour créer - une extension - :param user_request: instance utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.add_extension'), u"Vous n'avez pas le droit\ - de créer une extension" - - def can_edit(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour editer - cette instance extension - :param self: Instance extension à editer - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - if not user_request.has_perm('machines.change_extension'): - return False, u"Vous n'avez pas le droit d'éditer des extensions" - return True, None - - def can_delete(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour supprimer - cette instance extension - :param self: Instance extension à delete - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.delete_extension'), u"Vous n'avez pas le droit\ - de supprimer des extension" - - def can_view_all(user_request, *args, **kwargs): - """Vérifie qu'on peut bien afficher l'ensemble des extension, - droit particulier view objet correspondant - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_extension'), u"Vous n'avez pas le droit\ - de voir les extensions" - def can_use_all(user_request, *args, **kwargs): """Superdroit qui permet d'utiliser toutes les extensions sans restrictions :param user_request: instance user qui fait l'edition :return: True ou False avec la raison de l'échec le cas échéant""" return user_request.has_perm('machines.use_all_extension'), None - def can_view(self, user_request, *args, **kwargs): - """Vérifie qu'on peut bien voir cette instance particulière avec - droit view objet - :param self: instance extension à voir - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_extension'), u"Vous n'avez pas le droit\ - de voir les extensions" - def __str__(self): return self.name @@ -831,7 +566,7 @@ class Extension(models.Model): super(Extension, self).clean(*args, **kwargs) -class Mx(models.Model): +class Mx(AclMixin, models.Model): """ Entrées des MX. Enregistre la zone (extension) associée et la priorité Todo : pouvoir associer un MX à une interface """ @@ -858,55 +593,11 @@ class Mx(models.Model): :return: Une instance mx évidemment""" return Mx.objects.get(pk=mxid) - def can_create(user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour créer - un mx - :param user_request: instance utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.add_mx'), u"Vous n'avez pas le droit\ - de créer un enregistrement MX" - - def can_edit(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour editer - cette instance mx - :param self: Instance mx à editer - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - if not user_request.has_perm('machines.change_mx'): - return False, u"Vous n'avez pas le droit d'éditer des enregstrements MX" - return True, None - - def can_delete(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour del - cette instance mx - :param self: Instance mx à delete - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.delete_mx'), u"Vous n'avez pas le droit\ - de supprimer un enregistrement MX" - - def can_view_all(user_request, *args, **kwargs): - """Vérifie qu'on peut bien afficher l'ensemble des mx, - droit particulier view objet correspondant - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_mx'), u"Vous n'avez pas le droit\ - de voir les enregistrements MX" - - def can_view(self, user_request, *args, **kwargs): - """Vérifie qu'on peut bien voir cette instance particulière avec - droit view objet - :param self: instance mx à voir - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_mx'), u"Vous n'avez pas le droit\ - de voir les enregistrements MX" - def __str__(self): return str(self.zone) + ' ' + str(self.priority) + ' ' + str(self.name) -class Ns(models.Model): +class Ns(AclMixin, models.Model): """Liste des enregistrements name servers par zone considéérée""" PRETTY_NAME = "Enregistrements NS" @@ -929,55 +620,11 @@ class Ns(models.Model): :return: Une instance ns évidemment""" return Ns.objects.get(pk=nsid) - def can_create(user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour créer - un ns - :param user_request: instance utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.add_ns'), u"Vous n'avez pas le droit\ - de créer un enregistrement NS" - - def can_edit(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour editer - cette instance ns - :param self: Instance ns à editer - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - if not user_request.has_perm('machines.change_ns'): - return False, u"Vous n'avez pas le droit d'éditer des enregistrements NS" - return True, None - - def can_delete(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour del - cette instance ns - :param self: Instance ns à delete - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.del_ns'), u"Vous n'avez pas le droit\ - de supprimer un enregistrement NS" - - def can_view_all(user_request, *args, **kwargs): - """Vérifie qu'on peut bien afficher l'ensemble des ns, - droit particulier view objet correspondant - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_ns'), u"Vous n'avez pas le droit\ - de voir les enregistrements NS" - - def can_view(self, user_request, *args, **kwargs): - """Vérifie qu'on peut bien voir cette instance particulière avec - droit view objet - :param self: instance ns à voir - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_ns'), u"Vous n'avez pas le droit\ - de voir les enregistrements NS" - def __str__(self): return str(self.zone) + ' ' + str(self.ns) -class Txt(models.Model): +class Txt(AclMixin, models.Model): """ Un enregistrement TXT associé à une extension""" PRETTY_NAME = "Enregistrement TXT" @@ -996,50 +643,6 @@ class Txt(models.Model): :return: Une instance txt évidemment""" return Txt.objects.get(pk=txtid) - def can_create(user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour créer - un txt - :param user_request: instance utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.add_txt'), u"Vous n'avez pas le droit\ - de créer un enregistrement TXT" - - def can_edit(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour editer - cette instance txt - :param self: Instance txt à editer - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - if not user_request.has_perm('machines.change_txt'): - return False, u"Vous n'avez pas le droit d'éditer des enregistrement TXT" - return True, None - - def can_delete(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour del - cette instance txt - :param self: Instance txt à delete - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.delete_txt'), u"Vous n'avez pas le droit\ - de supprimer des enregistrements TXT" - - def can_view_all(user_request, *args, **kwargs): - """Vérifie qu'on peut bien afficher l'ensemble des txt, - droit particulier view objet correspondant - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_txt'), u"Vous n'avez pas le droit\ - de voir les enregistrements TXT" - - def can_view(self, user_request, *args, **kwargs): - """Vérifie qu'on peut bien voir cette instance particulière avec - droit view objet - :param self: instance txt à voir - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_txt'), u"Vous n'avez pas le droit\ - de voir les enregistrements TXT" - def __str__(self): return str(self.zone) + " : " + str(self.field1) + " " +\ str(self.field2) @@ -1050,7 +653,7 @@ class Txt(models.Model): return str(self.field1).ljust(15) + " IN TXT " + str(self.field2) -class Srv(models.Model): +class Srv(AclMixin, models.Model): PRETTY_NAME = "Enregistrement Srv" TCP = 'TCP' @@ -1104,50 +707,6 @@ class Srv(models.Model): :return: Une instance srv évidemment""" return Srv.objects.get(pk=srvid) - def can_create(user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour créer - un srv - :param user_request: instance utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.add_soa'), u"Vous n'avez pas le droit\ - de créer un enregistrement SRV" - - def can_edit(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour editer - cette instance srv - :param self: Instance srv à editer - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - if not user_request.has_perm('machines.change_soa'): - return False, u"Vous n'avez pas le droit d'éditer des enregistrements SRV" - return True, None - - def can_delete(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour del - cette instance srv - :param self: Instance srv à delete - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.delete_soa'), u"Vous n'avez pas le droit\ - de supprimer un enregistrement SRV" - - def can_view_all(user_request, *args, **kwargs): - """Vérifie qu'on peut bien afficher l'ensemble des srv, - droit particulier view objet correspondant - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_soa'), u"Vous n'avez pas le droit\ - de voir les enregistrements SRV" - - def can_view(self, user_request, *args, **kwargs): - """Vérifie qu'on peut bien voir cette instance particulière avec - droit view objet - :param self: instance srv à voir - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_soa'), u"Vous n'avez pas le droit\ - de voir les enregistrements SRV" - def __str__(self): return str(self.service) + ' ' + str(self.protocole) + ' ' +\ str(self.extension) + ' ' + str(self.priority) +\ @@ -1719,7 +1278,7 @@ class Domain(models.Model): return str(self.name) + str(self.extension) -class IpList(models.Model): +class IpList(AclMixin, models.Model): PRETTY_NAME = "Addresses ipv4" ipv4 = models.GenericIPAddressField(protocol='IPv4', unique=True) @@ -1753,58 +1312,11 @@ class IpList(models.Model): :return: Une instance iplist évidemment""" return IpList.objects.get(pk=iplistid) - def can_create(user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour créer - une ip - :param user_request: instance utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.add_iplist'), u"Vous n'avez pas le droit\ - de créer une ip" - - def can_edit(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour editer - cette instance ip - :param self: Instance ip à editer - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - if not user_request.has_perm('machines.change_iplist'): - return False, u"Vous n'avez pas le droit d'éditer des enregistrements ip" - return True, None - - def can_delete(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour delete - cette instance ip - :param self: Instance ip à delete - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - if not user_request.has_perm('machines.delete_iplist'): - return False, u"Vous n'avez pas le droit d'éditer des enregistrements ip" - return True, None - - def can_view_all(user_request, *args, **kwargs): - """Vérifie qu'on peut bien afficher l'ensemble des ip, - droit particulier view objet correspondant - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - if not user_request.has_perm('machines.view_iplist'): - return False, u"Vous n'avez pas le droit de voir des enregistrements ip" - return True, None - - def can_view(self, user_request, *args, **kwargs): - """Vérifie qu'on peut bien voir cette instance particulière avec - droit infra - :param self: instance iplist à voir - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - if not user_request.has_perm('machines.view_iplist'): - return False, u"Vous n'avez pas le droit de voir des enregistrements ip" - return True, None - def __str__(self): return self.ipv4 -class Service(models.Model): +class Service(AclMixin, models.Model): """ Definition d'un service (dhcp, dns, etc)""" PRETTY_NAME = "Services à générer (dhcp, dns, etc)" @@ -1851,50 +1363,6 @@ class Service(models.Model): :return: Une instance service évidemment""" return Service.objects.get(pk=serviceid) - def can_create(user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour créer - un service - :param user_request: instance utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.add_service'), u"Vous n'avez pas le droit\ - de créer un service" - - def can_edit(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour editer - cette instance service - :param self: Instance service à editer - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - if not user_request.has_perm('machines.change_service'): - return False, u"Vous n'avez pas le droit d'éditer des services" - return True, None - - def can_delete(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour delete - cette instance service - :param self: Instance service à delete - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.delete_service'), u"Vous n'avez pas le droit\ - de supprimer un service" - - def can_view_all(user_request, *args, **kwargs): - """Vérifie qu'on peut bien afficher l'ensemble des services, - droit particulier view objet correspondant - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_service'), u"Vous n'avez pas le droit\ - de voir des services" - - def can_view(self, user_request, *args, **kwargs): - """Vérifie qu'on peut bien voir cette instance particulière avec - droit view objet - :param self: instance service à voir - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_service'), u"Vous n'avez pas le droit\ - de voir des services" - def __str__(self): return str(self.service_type) @@ -1908,7 +1376,7 @@ def regen(service): return -class Service_link(models.Model): +class Service_link(AclMixin, models.Model): """ Definition du lien entre serveurs et services""" PRETTY_NAME = "Relation entre service et serveur" @@ -1941,56 +1409,11 @@ class Service_link(models.Model): :return: Une instance servicelink évidemment""" return ServiceLink.objects.get(pk=servicelinkid) - def can_create(user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour créer - un servicelink - :param user_request: instance utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.add_service'), u"Vous n'avez pas le droit\ - de créer un service" - - def can_edit(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour editer - cette instance servicelink - :param self: Instance servicelink à editer - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - if not user_request.has_perm('machines.change_service'): - return False, u"Vous n'avez pas le droit d'éditer des services" - return True, None - - def can_delete(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour delete - cette instance servicelink - :param self: Instance servicelink à delete - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - if not user_request.has_perm('machines.delete_service'): - return False, u"Vous n'avez pas le droit d'éditer des services" - return True, None - - def can_view_all(user_request, *args, **kwargs): - """Vérifie qu'on peut bien afficher l'ensemble des services, - droit particulier view objet correspondant - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_service'), u"Vous n'avez pas le droit\ - de voir des liens de services" - - def can_view(self, user_request, *args, **kwargs): - """Vérifie qu'on peut bien voir cette instance particulière avec - droit view objet - :param self: instance service à voir - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_service'), u"Vous n'avez pas le droit\ - de voir des liens de services" - def __str__(self): return str(self.server) + " " + str(self.service) -class OuverturePortList(models.Model): +class OuverturePortList(AclMixin, models.Model): """Liste des ports ouverts sur une interface.""" PRETTY_NAME = "Profil d'ouverture de ports" @@ -2010,24 +1433,6 @@ class OuverturePortList(models.Model): :return: Une instance ouvertureportlist évidemment""" return OuverturePortList.objects.get(pk=ouvertureportlistid) - def can_create(user_request, *args, **kwargs): - """Verifie que l'user a les bons droits bureau pour créer - une ouverture de port - :param user_request: instance utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.add_ouvertureportlist') , u"Vous n'avez pas le droit\ - d'ouvrir un port" - - def can_edit(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits bureau pour editer - cette instance ouvertureportlist - :param self: Instance ouvertureportlist à editer - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - if not user_request.has_perm('machines.change_ouvertureportlist'): - return False, u"Vous n'avez pas le droit d'éditer des ouvertures de port" - return True, None - def can_delete(self, user_request, *args, **kwargs): """Verifie que l'user a les bons droits bureau pour delete cette instance ouvertureportlist @@ -2041,23 +1446,6 @@ class OuverturePortList(models.Model): return False, u"Cette liste de ports est utilisée" return True, None - def can_view_all(user_request, *args, **kwargs): - """Vérifie qu'on peut bien afficher l'ensemble des ouvertureport, - droit particulier view objet correspondant - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_ouvertureportlist'), u"Vous n'avez pas le droit\ - de voir des ouverture de ports" - - def can_view(self, user_request, *args, **kwargs): - """Vérifie qu'on peut bien voir cette instance particulière avec - droit view objet - :param self: instance ouvertureport à voir - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - return user_request.has_perm('machines.view_ouvertureportlist'), u"Vous n'avez pas le droit\ - de voir des ouverture de ports" - def __str__(self): return self.name @@ -2090,7 +1478,7 @@ class OuverturePortList(models.Model): ) -class OuverturePort(models.Model): +class OuverturePort(AclMixin, models.Model): """ Représente un simple port ou une plage de ports. @@ -2134,54 +1522,6 @@ class OuverturePort(models.Model): :return: Une instance ouvertureport évidemment""" return OuverturePort.objects.get(pk=ouvertureportid) - def can_create(user_request, *args, **kwargs): - """Verifie que l'user a les bons droits bureau pour créer - une ouverture de port - :param user_request: instance utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - return user_request.has_perm('machines.add_ouvertureportlist') , u"Vous n'avez pas le droit\ - d'ouvrir un port" - - def can_edit(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits bureau pour editer - cette instance ouvertureport - :param self: Instance ouvertureport à editer - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - if not user_request.has_perm('machines.change_ouvertureportlist'): - return False, u"Vous n'avez pas le droit d'éditer des ouvertures de port" - return True, None - - def can_delete(self, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits bureau pour delete - cette instance ouvertureport - :param self: Instance ouvertureport à delete - :param user_request: Utilisateur qui fait la requête - :return: soit True, soit False avec la raison de l'échec""" - if not user_request.has_perm('machines.delete_ouvertureportlist'): - return False, u"Vous n'avez pas le droit d'éditer des ouvertures de port" - return True, None - - def can_view_all(user_request, *args, **kwargs): - """Vérifie qu'on peut bien afficher l'ensemble des ouvertureport, - droit particulier view objet correspondant - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - if not user_request.has_perm('machines.view_ouvertureportlist'): - return False, u"Vous n'avez pas le droit d'éditer des ouvertures de port" - return True, None - - def can_view(self, user_request, *args, **kwargs): - """Vérifie qu'on peut bien voir cette instance particulière avec - droit view objet - :param self: instance ouvertureport à voir - :param user_request: instance user qui fait l'edition - :return: True ou False avec la raison de l'échec le cas échéant""" - if not user_request.has_perm('machines.view_ouvertureportlist'): - return False, u"Vous n'avez pas le droit d'éditer des ouvertures de port" - return True, None - - def __str__(self): if self.begin == self.end: return str(self.begin) diff --git a/re2o/mixins.py b/re2o/mixins.py new file mode 100644 index 00000000..09fee806 --- /dev/null +++ b/re2o/mixins.py @@ -0,0 +1,72 @@ +# -*- mode: python; coding: utf-8 -*- +# 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. + +class AclMixin(object): + @classmethod + def get_classname(cls): + return str(cls.__name__).lower() + + @classmethod + def get_modulename(cls): + return str(cls.__module__).split('.')[0].lower() + + @classmethod + def can_create(cls, user_request, *args, **kwargs): + """Verifie que l'user a les bons droits infra pour créer + un servicelink + :param user_request: instance utilisateur qui fait la requête + :return: soit True, soit False avec la raison de l'échec""" + return user_request.has_perm(cls.get_modulename() + '.add_' + cls.get_classname()), u"Vous n'avez pas le droit\ + de créer un " + cls.get_classname() + + def can_edit(self, user_request, *args, **kwargs): + """Verifie que l'user a les bons droits infra pour editer + cette instance servicelink + :param self: Instance servicelink à editer + :param user_request: Utilisateur qui fait la requête + :return: soit True, soit False avec la raison de l'échec""" + return user_request.has_perm(self.get_modulename() + '.change_' + self.get_classname()), u"Vous n'avez pas le droit d'éditer des " + self.get_classname() + + def can_delete(self, user_request, *args, **kwargs): + """Verifie que l'user a les bons droits infra pour delete + cette instance servicelink + :param self: Instance servicelink à delete + :param user_request: Utilisateur qui fait la requête + :return: soit True, soit False avec la raison de l'échec""" + return user_request.has_perm(self.get_modulename() + '.delete_' + self.get_classname()), u"Vous n'avez pas le droit d'éditer des " + self.get_classname() + + @classmethod + def can_view_all(cls, user_request, *args, **kwargs): + """Vérifie qu'on peut bien afficher l'ensemble des services, + droit particulier view objet correspondant + :param user_request: instance user qui fait l'edition + :return: True ou False avec la raison de l'échec le cas échéant""" + return user_request.has_perm(cls.get_modulename() + '.view_' + cls.get_classname()), u"Vous n'avez pas le droit de voir des " + cls.get_classname() + + def can_view(self, user_request, *args, **kwargs): + """Vérifie qu'on peut bien voir cette instance particulière avec + droit view objet + :param self: instance service à voir + :param user_request: instance user qui fait l'edition + :return: True ou False avec la raison de l'échec le cas échéant""" + return user_request.has_perm(self.get_modulename() + '.view_' + self.get_classname()), u"Vous n'avez pas le droit de voir des " + self.get_classname() From 262431113f0478c86c68b0307b67f5aa8dd716b3 Mon Sep 17 00:00:00 2001 From: Gabriel Detraz Date: Wed, 28 Mar 2018 04:07:10 +0200 Subject: [PATCH 2/3] Passage de cotisations, topologie et users avec le nouveau mixin --- cotisations/models.py | 68 +--------- topologie/models.py | 186 ++------------------------- users/models.py | 288 +----------------------------------------- 3 files changed, 20 insertions(+), 522 deletions(-) diff --git a/cotisations/models.py b/cotisations/models.py index 11df1712..4678579d 100644 --- a/cotisations/models.py +++ b/cotisations/models.py @@ -57,7 +57,7 @@ from django.utils import timezone from machines.models import regen from re2o.field_permissions import FieldPermissionModelMixin - +from re2o.mixins import AclMixin class Facture(FieldPermissionModelMixin, models.Model): """ Définition du modèle des factures. Une facture regroupe une ou @@ -350,7 +350,7 @@ def vente_post_delete(sender, **kwargs): user.ldap_sync(base=False, access_refresh=True, mac_refresh=False) -class Article(models.Model): +class Article(AclMixin, models.Model): """Liste des articles en vente : prix, nom, et attribut iscotisation et duree si c'est une cotisation""" PRETTY_NAME = "Articles en vente" @@ -405,31 +405,11 @@ class Article(models.Model): def get_instance(articleid, *args, **kwargs): return Article.objects.get(pk=articleid) - def can_create(user_request, *args, **kwargs): - return user_request.has_perm('cotisations.add_article'), u"Vous n'avez pas le\ - droit d'ajouter des articles" - - def can_edit(self, user_request, *args, **kwargs): - return user_request.has_perm('cotisations.change_article'), u"Vous n'avez pas le\ - droit d'éditer des articles" - - def can_delete(self, user_request, *args, **kwargs): - return user_request.has_perm('cotisations.delete_article'), u"Vous n'avez pas le\ - droit de supprimer des articles" - - def can_view_all(user_request, *args, **kwargs): - return user_request.has_perm('cotisations.view_article'), u"Vous n'avez pas le\ - droit de voir des articles" - - def can_view(self, user_request, *args, **kwargs): - return user_request.has_perm('cotisations.view_article'), u"Vous n'avez pas le\ - droit de voir des articles" - def __str__(self): return self.name -class Banque(models.Model): +class Banque(AclMixin, models.Model): """Liste des banques""" PRETTY_NAME = "Banques enregistrées" @@ -443,31 +423,11 @@ class Banque(models.Model): def get_instance(banqueid, *args, **kwargs): return Banque.objects.get(pk=banqueid) - def can_create(user_request, *args, **kwargs): - return user_request.has_perm('cotisations.add_banque'), u"Vous n'avez pas le\ - droit d'ajouter des banques" - - def can_edit(self, user_request, *args, **kwargs): - return user_request.has_perm('cotisations.change_banque'), u"Vous n'avez pas le\ - droit d'éditer des banques" - - def can_delete(self, user_request, *args, **kwargs): - return user_request.has_perm('cotisations.delete_banque'), u"Vous n'avez pas le\ - droit de supprimer des banques" - - def can_view_all(user_request, *args, **kwargs): - return user_request.has_perm('cotisations.view_banque'), u"Vous n'avez pas le\ - droit de voir des banques" - - def can_view(self, user_request, *args, **kwargs): - return user_request.has_perm('cotisations.view_banque'), u"Vous n'avez pas le\ - droit de voir des banques" - def __str__(self): return self.name -class Paiement(models.Model): +class Paiement(AclMixin, models.Model): """Moyens de paiement""" PRETTY_NAME = "Moyens de paiement" PAYMENT_TYPES = ( @@ -486,26 +446,6 @@ class Paiement(models.Model): def get_instance(paiementid, *args, **kwargs): return Paiement.objects.get(pk=paiementid) - def can_create(user_request, *args, **kwargs): - return user_request.has_perm('cotisations.add_paiement'), u"Vous n'avez pas le\ - droit d'ajouter des paiements" - - def can_edit(self, user_request, *args, **kwargs): - return user_request.has_perm('cotisations.change_paiement'), u"Vous n'avez pas le\ - droit d'éditer des paiements" - - def can_delete(self, user_request, *args, **kwargs): - return user_request.has_perm('cotisations.delete_paiement'), u"Vous n'avez pas le\ - droit de supprimer des paiements" - - def can_view_all(user_request, *args, **kwargs): - return user_request.has_perm('cotisations.view_paiement'), u"Vous n'avez pas le\ - droit de voir des paiements" - - def can_view(self, user_request, *args, **kwargs): - return user_request.has_perm('cotisations.view_paiement'), u"Vous n'avez pas le\ - droit de voir des paiements" - def __str__(self): return self.moyen diff --git a/topologie/models.py b/topologie/models.py index ba40626f..bae4b054 100644 --- a/topologie/models.py +++ b/topologie/models.py @@ -48,8 +48,9 @@ from django.db import transaction from reversion import revisions as reversion from machines.models import Machine, Interface, regen +from re2o.mixins import AclMixin -class Stack(models.Model): +class Stack(AclMixin, models.Model): """Un objet stack. Regrouppe des switchs en foreign key ,contient une id de stack, un switch id min et max dans le stack""" @@ -69,30 +70,6 @@ class Stack(models.Model): def get_instance(stack_id, *args, **kwargs): return Stack.objects.get(pk=stack_id) - def can_create(user_request, *args, **kwargs): - return user_request.has_perm('topologie.add_stack') , u"Vous n'avez pas le droit\ - de créer un stack" - - def can_edit(self, user_request, *args, **kwargs): - if not user_request.has_perm('topologie.change_stack'): - return False, u"Vous n'avez pas le droit d'éditer des stack" - return True, None - - def can_delete(self, user_request, *args, **kwargs): - if not user_request.has_perm('topologie.delete_stack'): - return False, u"Vous n'avez pas le droit de supprimer une stack" - return True, None - - def can_view_all(user_request, *args, **kwargs): - if not user_request.has_perm('topologie.view_stack'): - return False, u"Vous n'avez pas le droit de voir une stack" - return True, None - - def can_view(self, user_request, *args, **kwargs): - if not user_request.has_perm('topologie.view_stack'): - return False, u"Vous n'avez pas le droit de voir une stack" - return True, None - def __str__(self): return " ".join([self.name, self.stack_id]) @@ -109,7 +86,7 @@ class Stack(models.Model): inférieure à l'id minimale"}) -class AccessPoint(Machine): +class AccessPoint(AclMixin, Machine): """Define a wireless AP. Inherit from machines.interfaces Definition pour une borne wifi , hérite de machines.interfaces @@ -125,38 +102,14 @@ class AccessPoint(Machine): class Meta: permissions = ( - ("view_ap", "Peut voir une borne"), + ("view_accesspoint", "Peut voir une borne"), ) def get_instance(ap_id, *args, **kwargs): return AccessPoint.objects.get(pk=ap_id) - def can_create(user_request, *args, **kwargs): - return user_request.has_perm('topologie.add_ap') , u"Vous n'avez pas le droit\ - de créer une borne" - def can_edit(self, user_request, *args, **kwargs): - if not user_request.has_perm('topologie.change_ap'): - return False, u"Vous n'avez pas le droit d'éditer des bornes" - return True, None - - def can_delete(self, user_request, *args, **kwargs): - if not user_request.has_perm('topologie.delete_ap'): - return False, u"Vous n'avez pas le droit de supprimer une borne" - return True, None - - def can_view_all(user_request, *args, **kwargs): - if not user_request.has_perm('topologie.view_ap'): - return False, u"Vous n'avez pas le droit de voir les bornes" - return True, None - - def can_view(self, user_request, *args, **kwargs): - if not user_request.has_perm('topologie.view_ap'): - return False, u"Vous n'avez pas le droit de voir les bornes" - return True, None - - -class Switch(Machine): +class Switch(AclMixin, Machine): """ Definition d'un switch. Contient un nombre de ports (number), un emplacement (location), un stack parent (optionnel, stack) et un id de membre dans le stack (stack_member_id) @@ -196,30 +149,6 @@ class Switch(Machine): def get_instance(switch_id, *args, **kwargs): return Switch.objects.get(pk=switch_id) - def can_create(user_request, *args, **kwargs): - return user_request.has_perm('topologie.add_switch') , u"Vous n'avez pas le droit\ - de créer un switch" - - def can_edit(self, user_request, *args, **kwargs): - if not user_request.has_perm('topologie.change_switch'): - return False, u"Vous n'avez pas le droit d'éditer des switch" - return True, None - - def can_delete(self, user_request, *args, **kwargs): - if not user_request.has_perm('topologie.delete_switch'): - return False, u"Vous n'avez pas le droit de supprimer un switch" - return True, None - - def can_view_all(user_request, *args, **kwargs): - if not user_request.has_perm('topologie.view_switch'): - return False, u"Vous n'avez pas le droit de voir les switch" - return True, None - - def can_view(self, user_request, *args, **kwargs): - if not user_request.has_perm('topologie.view_switch'): - return False, u"Vous n'avez pas le droit de voir les switch" - return True, None - def clean(self): """ Verifie que l'id stack est dans le bon range Appelle également le clean de la classe parente""" @@ -267,7 +196,7 @@ class Switch(Machine): return str(self.interface_set.first()) -class ModelSwitch(models.Model): +class ModelSwitch(AclMixin, models.Model): """Un modèle (au sens constructeur) de switch""" PRETTY_NAME = "Modèle de switch" reference = models.CharField(max_length=255) @@ -284,35 +213,11 @@ class ModelSwitch(models.Model): def get_instance(model_switch_id, *args, **kwargs): return ModelSwitch.objects.get(pk=model_switch_id) - def can_create(user_request, *args, **kwargs): - return user_request.has_perm('topologie.add_modelswitch') , u"Vous n'avez pas le droit\ - de créer un modèle de switch" - - def can_edit(self, user_request, *args, **kwargs): - if not user_request.has_perm('topologie.change_modelswitch'): - return False, u"Vous n'avez pas le droit d'éditer des modèle de switchs" - return True, None - - def can_delete(self, user_request, *args, **kwargs): - if not user_request.has_perm('topologie.delete_modelswitch'): - return False, u"Vous n'avez pas le droit de supprimer un modèle switch" - return True, None - - def can_view(self, user_request, *args, **kwargs): - if not user_request.has_perm('topologie.view_modelswitch'): - return False, u"Vous n'avez pas le droit de voir un modèle switch" - return True, None - - def can_view_all(user_request, *args, **kwargs): - if not user_request.has_perm('topologie.view_modelswitch'): - return False, u"Vous n'avez pas le droit de voir un modèle switch" - return True, None - def __str__(self): return str(self.constructor) + ' ' + self.reference -class ConstructorSwitch(models.Model): +class ConstructorSwitch(AclMixin, models.Model): """Un constructeur de switch""" PRETTY_NAME = "Constructeur de switch" name = models.CharField(max_length=255) @@ -325,36 +230,11 @@ class ConstructorSwitch(models.Model): def get_instance(constructor_switch_id, *args, **kwargs): return ConstructorSwitch.objects.get(pk=constructor_switch_id) - def can_create(user_request, *args, **kwargs): - return user_request.has_perm('topologie.add_constructorswitch') , u"Vous n'avez pas le droit\ - de créer un constructeur de switch" - - def can_edit(self, user_request, *args, **kwargs): - if not user_request.has_perm('topologie.change_constructorswitch'): - return False, u"Vous n'avez pas le droit d'éditer des\ - constructeurs de switchs" - return True, None - - def can_delete(self, user_request, *args, **kwargs): - if not user_request.has_perm('topologie.delete_constructorswitch'): - return False, u"Vous n'avez pas le droit de supprimer un constructeur" - return True, None - - def can_view_all(user_request, *args, **kwargs): - if not user_request.has_perm('topologie.view_constructorswitch'): - return False, u"Vous n'avez pas le droit de voir un constructeur" - return True, None - - def can_view(self, user_request, *args, **kwargs): - if not user_request.has_perm('topologie.view_constructorswitch'): - return False, u"Vous n'avez pas le droit de voir un constructeur" - return True, None - def __str__(self): return self.name -class Port(models.Model): +class Port(AclMixin, models.Model): """ Definition d'un port. Relié à un switch(foreign_key), un port peut etre relié de manière exclusive à : - une chambre (room) @@ -426,30 +306,6 @@ class Port(models.Model): .prefetch_related('switch__interface_set__domain__extension')\ .get(pk=port_id) - def can_create(user_request, *args, **kwargs): - return user_request.has_perm('topologie.add_port') , u"Vous n'avez pas le droit\ - de créer un port" - - def can_edit(self, user_request, *args, **kwargs): - if not user_request.has_perm('topologie.change_port'): - return False, u"Vous n'avez pas le droit d'éditer des ports" - return True, None - - def can_delete(self, user_request, *args, **kwargs): - if not user_request.has_perm('topologie.delete_port'): - return False, u"Vous n'avez pas le droit de supprimer un port" - return True, None - - def can_view_all(user_request, *args, **kwargs): - if not user_request.has_perm('topologie.view_port'): - return False, u"Vous n'avez pas le droit de voir les ports" - return True, None - - def can_view(self, user_request, *args, **kwargs): - if not user_request.has_perm('topologie.view_port'): - return False, u"Vous n'avez pas le droit de voir les ports" - return True, None - def make_port_related(self): """ Synchronise le port distant sur self""" related_port = self.related @@ -494,7 +350,7 @@ class Port(models.Model): return str(self.switch) + " - " + str(self.port) -class Room(models.Model): +class Room(AclMixin, models.Model): """Une chambre/local contenant une prise murale""" PRETTY_NAME = "Chambre/ Prise murale" @@ -510,30 +366,6 @@ class Room(models.Model): def get_instance(room_id, *args, **kwargs): return Room.objects.get(pk=room_id) - def can_create(user_request, *args, **kwargs): - return user_request.has_perm('topologie.add_room') , u"Vous n'avez pas le droit\ - de créer une chambre" - - def can_edit(self, user_request, *args, **kwargs): - if not user_request.has_perm('topologie.change_room'): - return False, u"Vous n'avez pas le droit d'éditer une chambre" - return True, None - - def can_delete(self, user_request, *args, **kwargs): - if not user_request.has_perm('topologie.delete_room'): - return False, u"Vous n'avez pas le droit de supprimer une chambre" - return True, None - - def can_view_all(user_request, *args, **kwargs): - if not user_request.has_perm('topologie.view_room'): - return False, u"Vous n'avez pas le droit de voir les chambres" - return True, None - - def can_view(self, user_request, *args, **kwargs): - if not user_request.has_perm('topologie.view_room'): - return False, u"Vous n'avez pas le droit de voir les chambres" - return True, None - def __str__(self): return self.name diff --git a/users/models.py b/users/models.py index 61f2bef5..db502fd1 100644 --- a/users/models.py +++ b/users/models.py @@ -76,6 +76,7 @@ import ldapdb.models.fields from re2o.settings import RIGHTS_LINK, LDAP, GID_RANGES, UID_RANGES from re2o.login import hashNT from re2o.field_permissions import FieldPermissionModelMixin +from re2o.mixins import AclMixin from cotisations.models import Cotisation, Facture, Paiement, Vente from machines.models import Domain, Interface, Machine, regen @@ -922,7 +923,7 @@ def user_post_delete(sender, **kwargs): user.ldap_del() regen('mailing') -class ServiceUser(AbstractBaseUser): +class ServiceUser(AclMixin, AbstractBaseUser): """ Classe des users daemons, règle leurs accès au ldap""" readonly = 'readonly' ACCESS = ( @@ -992,58 +993,6 @@ class ServiceUser(AbstractBaseUser): def get_instance(userid, *args, **kwargs): return ServiceUser.objects.get(pk=userid) - def can_create(user_request, *args, **kwargs): - """Check if an user can create a ServiceUser object. - - :param user_request: The user who wants to create a user object. - :return: a message and a boolean which is True if the user can create - or if the `options.all_can_create` is set. - """ - return user_request.has_perm('users.add_serviceuser'), ( - u"Vous n'avez pas le droit de créer un service user" - ) - - def can_edit(self, user_request, *args, **kwargs): - """Check if an user can edit a ServiceUser object. - - :param self: The ServiceUser which is to be edited. - :param user_request: The user who requests to edit self. - :return: a message and a boolean which is True if edition is granted. - """ - return user_request.has_perm('users.change_serviceuser'), ( - u"Vous n'avez pas le droit d'éditer les services users" - ) - - def can_delete(self, user_request, *args, **kwargs): - """Check if an user can delete a ServiceUser object. - - :param self: The ServiceUser who is to be deleted. - :param user_request: The user who requests deletion. - :return: True if user_request has the right 'infra', and a message. - """ - return user_request.has_perm('users.delete_serviceuser'), u"Vous n'avez pas le droit de\ - supprimer un service user" - - def can_view_all(user_request, *args, **kwargs): - """Check if an user can access to the list of every ServiceUser objects - - :param user_request: The user who wants to view the list. - :return: True if the user can view the list and an explanation message. - """ - return user_request.has_perm('users.view_serviceuser'), u"Vous n'avez pas le droit de\ - voir un service user" - - def can_view(self, user_request, *args, **kwargs): - """Check if an user can view a ServiceUser object. - - :param self: The targeted ServiceUser. - :param user_request: The user who ask for viewing the target. - :return: A boolean telling if the acces is granted and an explanation - text - """ - return user_request.has_perm('users.view_serviceuser'), u"Vous n'avez pas le droit de\ - voir un service user" - def __str__(self): return self.pseudo @@ -1061,7 +1010,7 @@ def service_user_post_delete(sender, **kwargs): service_user.ldap_del() -class School(models.Model): +class School(AclMixin, models.Model): """ Etablissement d'enseignement""" PRETTY_NAME = "Établissements enregistrés" @@ -1075,60 +1024,11 @@ class School(models.Model): def get_instance(schoolid, *args, **kwargs): return School.objects.get(pk=schoolid) - def can_create(user_request, *args, **kwargs): - """Check if an user can create a School object. - - :param user_request: The user who wants to create a user object. - :return: a message and a boolean which is True if the user can create. - """ - return user_request.has_perm('users.add_school'), u"Vous n'avez pas le\ - droit de créer des écoles" - - def can_edit(self, user_request, *args, **kwargs): - """Check if an user can edit a School object. - - :param self: The School which is to be edited. - :param user_request: The user who requests to edit self. - :return: a message and a boolean which is True if edition is granted. - """ - return user_request.has_perm('users.change_school'), u"Vous n'avez pas le\ - droit d'éditer des écoles" - - def can_delete(self, user_request, *args, **kwargs): - """Check if an user can delete a School object. - - :param self: The School which is to be deleted. - :param user_request: The user who requests deletion. - :return: True if deletion is granted, and a message. - """ - return user_request.has_perm('users.delete_school'), u"Vous n'avez pas le\ - droit de supprimer des écoles" - - def can_view_all(user_request, *args, **kwargs): - """Check if an user can access to the list of every School objects - - :param user_request: The user who wants to view the list. - :return: True if the user can view the list and an explanation message. - """ - return user_request.has_perm('users.view_school'), u"Vous n'avez pas le\ - droit de voir les écoles" - - def can_view(self, user_request, *args, **kwargs): - """Check if an user can view a School object. - - :param self: The targeted School. - :param user_request: The user who ask for viewing the target. - :return: A boolean telling if the acces is granted and an explanation - text - """ - return user_request.has_perm('users.view_school'), u"Vous n'avez pas le\ - droit de voir les écoles" - def __str__(self): return self.name -class ListRight(Group): +class ListRight(AclMixin, Group): """ Ensemble des droits existants. Chaque droit crée un groupe ldap synchronisé, avec gid. Permet de gérer facilement les accès serveurs et autres @@ -1161,55 +1061,6 @@ class ListRight(Group): def get_instance(listrightid, *args, **kwargs): return ListRight.objects.get(pk=listrightid) - def can_create(user_request, *args, **kwargs): - """Check if an user can create a ListRight object. - - :param user_request: The user who wants to create a ListRight object. - :return: a message and a boolean which is True if the user can create. - """ - return user_request.has_perm('users.add_listright'), u"Vous n'avez pas le droit\ - de créer des groupes de droits" - - def can_edit(self, user_request, *args, **kwargs): - """Check if an user can edit a ListRight object. - - :param self: The object which is to be edited. - :param user_request: The user who requests to edit self. - :return: a message and a boolean which is True if edition is granted. - """ - return user_request.has_perm('users.change_listright'), u"Vous n'avez pas le droit\ - d'éditer des groupes de droits" - - def can_delete(self, user_request, *args, **kwargs): - """Check if an user can delete a ListRight object. - - :param self: The object which is to be deleted. - :param user_request: The user who requests deletion. - :return: True if deletion is granted, and a message. - """ - return user_request.has_perm('users.delete_listright'), u"Vous n'avez pas le droit\ - de supprimer des groupes de droits" - - def can_view_all(user_request, *args, **kwargs): - """Check if an user can access to the list of every ListRight objects - - :param user_request: The user who wants to view the list. - :return: True if the user can view the list and an explanation message. - """ - return user_request.has_perm('users.view_listright'), u"Vous n'avez pas le droit\ - de voir les groupes de droits" - - def can_view(self, user_request, *args, **kwargs): - """Check if an user can view a ListRight object. - - :param self: The targeted object. - :param user_request: The user who ask for viewing the target. - :return: A boolean telling if the acces is granted and an explanation - text - """ - return user_request.has_perm('users.view_listright'), u"Vous n'avez pas le droit\ - de voir les groupes de droits" - def __str__(self): return self.name @@ -1247,7 +1098,7 @@ def listright_post_delete(sender, **kwargs): right.ldap_del() -class ListShell(models.Model): +class ListShell(AclMixin, models.Model): """Un shell possible. Pas de check si ce shell existe, les admin sont des grands""" PRETTY_NAME = "Liste des shells disponibles" @@ -1266,60 +1117,11 @@ class ListShell(models.Model): """Return the canonical name of the shell""" return self.shell.split("/")[-1] - def can_create(user_request, *args, **kwargs): - """Check if an user can create a ListShell object. - - :param user_request: The user who wants to create a user object. - :return: a message and a boolean which is True if the user can create. - """ - return user_request.has_perm('users.add_listshell'), u"Vous n'avez pas le\ - droit de créer des shells" - - def can_edit(self, user_request, *args, **kwargs): - """Check if an user can edit a ListShell object. - - :param self: The Shell which is to be edited. - :param user_request: The user who requests to edit self. - :return: a message and a boolean which is True if edition is granted. - """ - return user_request.has_perm('users.change_listshell'), u"Vous n'avez pas le\ - droit d'éditer des shells" - - def can_delete(self, user_request, *args, **kwargs): - """Check if an user can delete a ListShell object. - - :param self: The Shell which is to be deleted. - :param user_request: The user who requests deletion. - :return: True if deletion is granted, and a message. - """ - return user_request.has_perm('users.delete_listshell'), u"Vous n'avez pas le\ - droit de supprimer des shells" - - def can_view_all(user_request, *args, **kwargs): - """Check if an user can access to the list of every ListShell objects - - :param user_request: The user who wants to view the list. - :return: True if the user can view the list and an explanation message. - """ - return user_request.has_perm('users.view_listshell'), u"Vous n'avez pas le\ - droit de voir les shells" - - def can_view(self, user_request, *args, **kwargs): - """Check if an user can view a ListShell object. - - :param self: The targeted ListShell instance. - :param user_request: The user who ask for viewing the target. - :return: A boolean telling if the acces is granted and an explanation - text - """ - return user_request.has_perm('users.view_listshell'), u"Vous n'avez pas le\ - droit de voir les shells" - def __str__(self): return self.shell -class Ban(models.Model): +class Ban(AclMixin, models.Model): """ Bannissement. Actuellement a un effet tout ou rien. Gagnerait à être granulaire""" PRETTY_NAME = "Liste des bannissements" @@ -1369,44 +1171,6 @@ class Ban(models.Model): def get_instance(banid, *args, **kwargs): return Ban.objects.get(pk=banid) - def can_create(user_request, *args, **kwargs): - """Check if an user can create a Ban object. - - :param user_request: The user who wants to create a Ban object. - :return: a message and a boolean which is True if the user can create. - """ - return user_request.has_perm('users.add_ban'), u"Vous n'avez pas le droit de\ - créer des bannissements" - - def can_edit(self, user_request, *args, **kwargs): - """Check if an user can edit a Ban object. - - :param self: The object which is to be edited. - :param user_request: The user who requests to edit self. - :return: a message and a boolean which is True if edition is granted. - """ - return user_request.has_perm('users.change_ban'), u"Vous n'avez pas le droit\ - d'éditer des bannissements" - - def can_delete(self, user_request, *args, **kwargs): - """Check if an user can delete a Ban object. - - :param self: The object which is to be deleted. - :param user_request: The user who requests deletion. - :return: True if deletion is granted, and a message. - """ - return user_request.has_perm('users.delete_ban'), u"Vous n'avez pas le droit\ - de supprimer des bannissements" - - def can_view_all(user_request, *args, **kwargs): - """Check if an user can access to the list of every Ban objects - - :param user_request: The user who wants to view the list. - :return: True if the user can view the list and an explanation message. - """ - return user_request.has_perm('users.view_ban'), u"Vous n'avez pas le droit\ - de voir tous les bannissements" - def can_view(self, user_request, *args, **kwargs): """Check if an user can view a Ban object. @@ -1453,7 +1217,7 @@ def ban_post_delete(sender, **kwargs): regen('mac_ip_list') -class Whitelist(models.Model): +class Whitelist(AclMixin, models.Model): """Accès à titre gracieux. L'utilisateur ne paye pas; se voit accorder un accès internet pour une durée défini. Moins fort qu'un ban quel qu'il soit""" @@ -1475,44 +1239,6 @@ class Whitelist(models.Model): def get_instance(whitelistid, *args, **kwargs): return Whitelist.objects.get(pk=whitelistid) - def can_create(user_request, *args, **kwargs): - """Check if an user can create a Whitelist object. - - :param user_request: The user who wants to create a Whitelist object. - :return: a message and a boolean which is True if the user can create. - """ - return user_request.has_perm('users.add_whitelist'), u"Vous n'avez pas le\ - droit de créer des accès gracieux" - - def can_edit(self, user_request, *args, **kwargs): - """Check if an user can edit a Whitelist object. - - :param self: The object which is to be edited. - :param user_request: The user who requests to edit self. - :return: a message and a boolean which is True if edition is granted. - """ - return user_request.has_perm('users.change_whitelist'), u"Vous n'avez pas le\ - droit d'éditer des accès gracieux" - - def can_delete(self, user_request, *args, **kwargs): - """Check if an user can delete a Whitelist object. - - :param self: The object which is to be deleted. - :param user_request: The user who requests deletion. - :return: True if deletion is granted, and a message. - """ - return user_request.has_perm('users.delete_whitelist'), u"Vous n'avez pas le\ - droit de supprimer des accès gracieux" - - def can_view_all(user_request, *args, **kwargs): - """Check if an user can access to the list of every Whitelist objects - - :param user_request: The user who wants to view the list. - :return: True if the user can view the list and an explanation message. - """ - return user_request.has_perm('users.view_whitelist'), u"Vous n'avez pas le\ - droit de voir les accès gracieux" - def can_view(self, user_request, *args, **kwargs): """Check if an user can view a Whitelist object. From 46ba34ec0b2d8e30f7aa9833f02153ebefa558ab Mon Sep 17 00:00:00 2001 From: Gabriel Detraz Date: Wed, 28 Mar 2018 04:14:16 +0200 Subject: [PATCH 3/3] Fix can_edit/can_create --- machines/templates/machines/aff_extension.html | 2 +- machines/templates/machines/aff_vlan.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/machines/templates/machines/aff_extension.html b/machines/templates/machines/aff_extension.html index 1feec748..44061b1b 100644 --- a/machines/templates/machines/aff_extension.html +++ b/machines/templates/machines/aff_extension.html @@ -48,7 +48,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {{ extension.origin_v6 }} {% endif %} - {% can_create Extension %} + {% can_edit extension %} {% include 'buttons/edit.html' with href='machines:edit-extension' id=extension.id %} {% acl_end %} {% include 'buttons/history.html' with href='machines:history' name='extension' id=extension.id %} diff --git a/machines/templates/machines/aff_vlan.html b/machines/templates/machines/aff_vlan.html index 2e3d99b4..de49c7a6 100644 --- a/machines/templates/machines/aff_vlan.html +++ b/machines/templates/machines/aff_vlan.html @@ -42,7 +42,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {{ vlan.comment }} {% for range in vlan.iptype_set.all %}{{ range }}, {% endfor%} - {% can_create Vlan %} + {% can_edit vlan %} {% include 'buttons/edit.html' with href='machines:edit-vlan' id=vlan.id %} {% acl_end %} {% include 'buttons/history.html' with href='machines:history' name='vlan' id=vlan.id %}