From 007ad3310a977dce8a825c7960bf1b117e0df953 Mon Sep 17 00:00:00 2001 From: Gabriel Detraz Date: Wed, 28 Mar 2018 17:15:29 +0200 Subject: [PATCH 1/8] Factorise les get_instance dans le mixin acl --- cotisations/models.py | 53 +------------ machines/models.py | 169 +++--------------------------------------- re2o/mixins.py | 12 ++- topologie/models.py | 18 ----- users/models.py | 15 ---- 5 files changed, 24 insertions(+), 243 deletions(-) diff --git a/cotisations/models.py b/cotisations/models.py index 4678579d..cbf44b79 100644 --- a/cotisations/models.py +++ b/cotisations/models.py @@ -59,7 +59,7 @@ from machines.models import regen from re2o.field_permissions import FieldPermissionModelMixin from re2o.mixins import AclMixin -class Facture(FieldPermissionModelMixin, models.Model): +class Facture(AclMixin, FieldPermissionModelMixin, models.Model): """ Définition du modèle des factures. Une facture regroupe une ou plusieurs ventes, rattachée à un user, et reliée à un moyen de paiement et si il y a lieu un numero pour les chèques. Possède les valeurs @@ -114,13 +114,6 @@ class Facture(FieldPermissionModelMixin, models.Model): ).values_list('name', flat=True)) return name - def get_instance(factureid, *args, **kwargs): - return Facture.objects.get(pk=factureid) - - def can_create(user_request, *args, **kwargs): - return user_request.has_perm('cotisations.add_facture'), u"Vous n'avez pas le\ - droit de créer des factures" - def can_edit(self, user_request, *args, **kwargs): if not user_request.has_perm('cotisations.change_facture'): return False, u"Vous n'avez pas le droit d'éditer les factures" @@ -144,11 +137,6 @@ class Facture(FieldPermissionModelMixin, models.Model): else: return True, None - def can_view_all(user_request, *args, **kwargs): - if not user_request.has_perm('cotisations.view_facture'): - return False, u"Vous n'avez pas le droit de voir les factures" - return True, None - def can_view(self, user_request, *args, **kwargs): if not user_request.has_perm('cotisations.view_facture') and\ self.user != user_request: @@ -192,7 +180,7 @@ def facture_post_delete(sender, **kwargs): user.ldap_sync(base=False, access_refresh=True, mac_refresh=False) -class Vente(models.Model): +class Vente(AclMixin, models.Model): """Objet vente, contient une quantité, une facture parente, un nom, un prix. Peut-être relié à un objet cotisation, via le boolean iscotisation""" @@ -277,14 +265,6 @@ class Vente(models.Model): self.update_cotisation() super(Vente, self).save(*args, **kwargs) - def get_instance(venteid, *args, **kwargs): - return Vente.objects.get(pk=venteid) - - def can_create(user_request, *args, **kwargs): - return user_request.has_perm('cotisations.add_vente'), u"Vous n'avez pas le\ - droit de créer des ventes" - return True, None - def can_edit(self, user_request, *args, **kwargs): if not user_request.has_perm('cotisations.change_vente'): return False, u"Vous n'avez pas le droit d'éditer les ventes" @@ -308,11 +288,6 @@ class Vente(models.Model): else: return True, None - def can_view_all(user_request, *args, **kwargs): - if not user_request.has_perm('cotisations.view_vente'): - return False, u"Vous n'avez pas le droit de voir les ventes" - return True, None - def can_view(self, user_request, *args, **kwargs): if not user_request.has_perm('cotisations.view_vente') and\ self.facture.user != user_request: @@ -402,9 +377,6 @@ class Article(AclMixin, models.Model): "La durée est obligatoire si il s'agit d'une cotisation" ) - def get_instance(articleid, *args, **kwargs): - return Article.objects.get(pk=articleid) - def __str__(self): return self.name @@ -420,9 +392,6 @@ class Banque(AclMixin, models.Model): ("view_banque", "Peut voir un objet banque"), ) - def get_instance(banqueid, *args, **kwargs): - return Banque.objects.get(pk=banqueid) - def __str__(self): return self.name @@ -443,9 +412,6 @@ class Paiement(AclMixin, models.Model): ("view_paiement", "Peut voir un objet paiement"), ) - def get_instance(paiementid, *args, **kwargs): - return Paiement.objects.get(pk=paiementid) - def __str__(self): return self.moyen @@ -460,7 +426,7 @@ class Paiement(AclMixin, models.Model): super(Paiement, self).save(*args, **kwargs) -class Cotisation(models.Model): +class Cotisation(AclMixin, models.Model): """Objet cotisation, debut et fin, relié en onetoone à une vente""" PRETTY_NAME = "Cotisations" @@ -485,14 +451,6 @@ class Cotisation(models.Model): ("change_all_cotisation", "Superdroit, peut modifier toutes les cotisations"), ) - def get_instance(cotisationid, *args, **kwargs): - return Cotisations.objects.get(pk=cotisationid) - - def can_create(user_request, *args, **kwargs): - return user_request.has_perm('cotisations.add_cotisation'), u"Vous n'avez pas le\ - droit de créer des cotisations" - return True, None - def can_edit(self, user_request, *args, **kwargs): if not user_request.has_perm('cotisations.change_cotisation'): return False, u"Vous n'avez pas le droit d'éditer les cotisations" @@ -512,11 +470,6 @@ class Cotisation(models.Model): else: return True, None - def can_view_all(user_request, *args, **kwargs): - if not user_request.has_perm('cotisations.view_cotisation'): - return False, u"Vous n'avez pas le droit de voir les cotisations" - return True, None - def can_view(self, user_request, *args, **kwargs): if not user_request.has_perm('cotisations.view_cotisation') and\ self.vente.facture.user != user_request: diff --git a/machines/models.py b/machines/models.py index de4c7311..a07840a6 100644 --- a/machines/models.py +++ b/machines/models.py @@ -65,12 +65,6 @@ class Machine(FieldPermissionModelMixin, models.Model): ("change_machine_user", "Peut changer le propriétaire d'une machine"), ) - def get_instance(machineid, *args, **kwargs): - """Récupère une instance - :param machineid: Instance id à trouver - :return: Une instance machine évidemment""" - return Machine.objects.get(pk=machineid) - @staticmethod def can_change_user(user_request, *args, **kwargs): """Checks if an user is allowed to change the user who owns a @@ -85,6 +79,15 @@ class Machine(FieldPermissionModelMixin, models.Model): """ return user_request.has_perm('machines.change_machine_user'), "Vous ne pouvez pas modifier l'utilisateur de la machine." + def can_view_all(user_request, *args, **kwargs): + """Vérifie qu'on peut bien afficher l'ensemble des machines, + 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""" + if not user_request.has_perm('machines.view_machine'): + return False, u"Vous ne pouvez pas afficher l'ensemble des machines sans permission" + return True, None + def can_create(user_request, userid, *args, **kwargs): """Vérifie qu'un user qui fait la requète peut bien créer la machine et n'a pas atteint son quota, et crée bien une machine à lui @@ -132,15 +135,6 @@ class Machine(FieldPermissionModelMixin, models.Model): d'un autre user que vous sans droit" return True, None - def can_view_all(user_request, *args, **kwargs): - """Vérifie qu'on peut bien afficher l'ensemble des machines, - 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""" - if not user_request.has_perm('machines.view_machine'): - return False, u"Vous ne pouvez pas afficher l'ensemble des machines sans permission" - return True, None - def can_view(self, user_request, *args, **kwargs): """Vérifie qu'on peut bien voir cette instance particulière (soit machine de soi, soit droit particulier @@ -185,13 +179,6 @@ class MachineType(AclMixin, models.Model): machinetype""" return Interface.objects.filter(type=self) - def get_instance(machinetypeid, *args, **kwargs): - """Récupère une instance - :param machinetypeid: Instance id à trouver - :return: Une instance machinetype évidemment""" - return MachineType.objects.get(pk=machinetypeid) - - def can_use_all(user_request, *args, **kwargs): """Check if an user can use every MachineType. @@ -329,12 +316,6 @@ class IpType(AclMixin, models.Model): self.clean() super(IpType, self).save(*args, **kwargs) - def get_instance(iptypeid, *args, **kwargs): - """Récupère une instance - :param iptypeid: Instance id à trouver - :return: Une instance iptype évidemment""" - return IpType.objects.get(pk=iptypeid) - 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 @@ -359,12 +340,6 @@ class Vlan(AclMixin, models.Model): ("view_vlan", "Peut voir un objet vlan"), ) - def get_instance(vlanid, *args, **kwargs): - """Récupère une instance - :param vlanid: Instance id à trouver - :return: Une instance vlan évidemment""" - return Vlan.objects.get(pk=vlanid) - def __str__(self): return self.name @@ -404,12 +379,6 @@ class Nas(AclMixin, models.Model): ("view_nas", "Peut voir un objet Nas"), ) - def get_instance(nasid, *args, **kwargs): - """Récupère une instance - :param nasid: Instance id à trouver - :return: Une instance nas évidemment""" - return Nas.objects.get(pk=nasid) - def __str__(self): return self.name @@ -451,12 +420,6 @@ class SOA(AclMixin, models.Model): ("view_soa", "Peut voir un objet soa"), ) - def get_instance(soaid, *args, **kwargs): - """Récupère une instance - :param soaid: Instance id à trouver - :return: Une instance soa évidemment""" - return SOA.objects.get(pk=soaid) - def __str__(self): return str(self.name) @@ -545,12 +508,6 @@ class Extension(AclMixin, models.Model): entry += "@ IN AAAA " + str(self.origin_v6) return entry - def get_instance(extensionid, *args, **kwargs): - """Récupère une instance - :param extensionid: Instance id à trouver - :return: Une instance extension évidemment""" - return Extension.objects.get(pk=extensionid) - 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 @@ -587,12 +544,6 @@ class Mx(AclMixin, models.Model): fichiers de zones""" return "@ IN MX " + str(self.priority).ljust(3) + " " + str(self.name) - def get_instance(mxid, *args, **kwargs): - """Récupère une instance - :param mxid: Instance id à trouver - :return: Une instance mx évidemment""" - return Mx.objects.get(pk=mxid) - def __str__(self): return str(self.zone) + ' ' + str(self.priority) + ' ' + str(self.name) @@ -614,12 +565,6 @@ class Ns(AclMixin, models.Model): """Renvoie un enregistrement NS complet pour les filezones""" return "@ IN NS " + str(self.ns) - def get_instance(nsid, *args, **kwargs): - """Récupère une instance - :param nsid: Instance id à trouver - :return: Une instance ns évidemment""" - return Ns.objects.get(pk=nsid) - def __str__(self): return str(self.zone) + ' ' + str(self.ns) @@ -637,12 +582,6 @@ class Txt(AclMixin, models.Model): ("view_txt", "Peut voir un objet txt"), ) - def get_instance(txtid, *args, **kwargs): - """Récupère une instance - :param txtid: Instance id à trouver - :return: Une instance txt évidemment""" - return Txt.objects.get(pk=txtid) - def __str__(self): return str(self.zone) + " : " + str(self.field1) + " " +\ str(self.field2) @@ -701,12 +640,6 @@ class Srv(AclMixin, models.Model): ("view_soa", "Peut voir un objet soa"), ) - def get_instance(srvid, *args, **kwargs): - """Récupère une instance - :param srvid: Instance id à trouver - :return: Une instance srv évidemment""" - return Srv.objects.get(pk=srvid) - def __str__(self): return str(self.service) + ' ' + str(self.protocole) + ' ' +\ str(self.extension) + ' ' + str(self.priority) +\ @@ -721,7 +654,7 @@ class Srv(AclMixin, models.Model): str(self.port) + ' ' + str(self.target) + '.' -class Interface(FieldPermissionModelMixin,models.Model): +class Interface(AclMixin, FieldPermissionModelMixin,models.Model): """ Une interface. Objet clef de l'application machine : - une address mac unique. Possibilité de la rendre unique avec le typemachine @@ -879,12 +812,6 @@ class Interface(FieldPermissionModelMixin,models.Model): correspondent pas") super(Interface, self).save(*args, **kwargs) - def get_instance(interfaceid, *args, **kwargs): - """Récupère une instance - :param interfaceid: Instance id à trouver - :return: Une instance interface évidemment""" - return Interface.objects.get(pk=interfaceid) - def can_create(user_request, machineid, *args, **kwargs): """Verifie que l'user a les bons droits infra pour créer une interface, ou bien que la machine appartient bien à l'user @@ -936,16 +863,6 @@ class Interface(FieldPermissionModelMixin,models.Model): d'un autre user que vous sans droit" return True, None - def can_view_all(user_request, *args, **kwargs): - """Vérifie qu'on peut bien afficher l'ensemble des interfaces, - 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_interface'): - return False, u"Vous n'avez pas le droit de voir des machines autre\ - que les vôtres" - 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 ou qu'elle appartient à l'user @@ -984,7 +901,7 @@ class Interface(FieldPermissionModelMixin,models.Model): return self.ipv4 and not self.has_private_ip() -class Ipv6List(FieldPermissionModelMixin, models.Model): +class Ipv6List(AclMixin, FieldPermissionModelMixin, models.Model): PRETTY_NAME = 'Enregistrements Ipv6 des machines' ipv6 = models.GenericIPAddressField( @@ -1000,12 +917,6 @@ class Ipv6List(FieldPermissionModelMixin, models.Model): ("change_ipv6list_slaac_ip", "Peut changer la valeur slaac sur une ipv6"), ) - def get_instance(ipv6listid, *args, **kwargs): - """Récupère une instance - :param interfaceid: Instance id à trouver - :return: Une instance interface évidemment""" - return Ipv6List.objects.get(pk=ipv6listid) - def can_create(user_request, interfaceid, *args, **kwargs): """Verifie que l'user a les bons droits infra pour créer une ipv6, ou possède l'interface associée @@ -1050,16 +961,6 @@ class Ipv6List(FieldPermissionModelMixin, models.Model): d'un autre user que vous sans droit" return True, None - def can_view_all(user_request, *args, **kwargs): - """Vérifie qu'on peut bien afficher l'ensemble des interfaces, - 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_ipv6list'): - return False, u"Vous n'avez pas le droit de voir des machines autre\ - que les vôtres" - 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 ou qu'elle appartient à l'user @@ -1104,7 +1005,7 @@ class Ipv6List(FieldPermissionModelMixin, models.Model): return str(self.ipv6) -class Domain(models.Model): +class Domain(AclMixin, models.Model): """ Objet domain. Enregistrement A et CNAME en même temps : permet de stocker les alias et les nom de machines, suivant si interface_parent ou cname sont remplis""" @@ -1197,12 +1098,6 @@ class Domain(models.Model): else: return self.cname.get_parent_interface() - def get_instance(domainid, *args, **kwargs): - """Récupère une instance - :param domainid: Instance id à trouver - :return: Une instance domain évidemment""" - return Domain.objects.get(pk=domainid) - def can_create(user_request, interfaceid, *args, **kwargs): """Verifie que l'user a les bons droits infra pour créer un domain, ou possède l'interface associée @@ -1252,16 +1147,6 @@ class Domain(models.Model): d'un autre user que vous sans droit" return True, None - def can_view_all(user_request, *args, **kwargs): - """Vérifie qu'on peut bien afficher l'ensemble des domain, - 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_domain'): - return False, u"Vous ne pouvez pas supprimer un alias à une machine\ - d'un autre user que vous sans droit" - 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 ou qu'elle appartient à l'user @@ -1306,12 +1191,6 @@ class IpList(AclMixin, models.Model): self.clean() super(IpList, self).save(*args, **kwargs) - def get_instance(iplistid, *args, **kwargs): - """Récupère une instance - :param iplistid: Instance id à trouver - :return: Une instance iplist évidemment""" - return IpList.objects.get(pk=iplistid) - def __str__(self): return self.ipv4 @@ -1357,12 +1236,6 @@ class Service(AclMixin, models.Model): def save(self, *args, **kwargs): super(Service, self).save(*args, **kwargs) - def get_instance(serviceid, *args, **kwargs): - """Récupère une instance - :param serviceid: Instance id à trouver - :return: Une instance service évidemment""" - return Service.objects.get(pk=serviceid) - def __str__(self): return str(self.service_type) @@ -1403,12 +1276,6 @@ class Service_link(AclMixin, models.Model): ) < timezone.now() ) - def get_instance(servicelinkid, *args, **kwargs): - """Récupère une instance - :param servicelinkid: Instance id à trouver - :return: Une instance servicelink évidemment""" - return ServiceLink.objects.get(pk=servicelinkid) - def __str__(self): return str(self.server) + " " + str(self.service) @@ -1427,12 +1294,6 @@ class OuverturePortList(AclMixin, models.Model): ("view_ouvertureportlist", "Peut voir un objet ouvertureport"), ) - def get_instance(ouvertureportlistid, *args, **kwargs): - """Récupère une instance - :param ouvertureportlistid: Instance id à trouver - :return: Une instance ouvertureportlist évidemment""" - return OuverturePortList.objects.get(pk=ouvertureportlistid) - def can_delete(self, user_request, *args, **kwargs): """Verifie que l'user a les bons droits bureau pour delete cette instance ouvertureportlist @@ -1516,12 +1377,6 @@ class OuverturePort(AclMixin, models.Model): default=OUT, ) - def get_instance(ouvertureportid, *args, **kwargs): - """Récupère une instance - :param ouvertureportid: Instance id à trouver - :return: Une instance ouvertureport évidemment""" - return OuverturePort.objects.get(pk=ouvertureportid) - def __str__(self): if self.begin == self.end: return str(self.begin) diff --git a/re2o/mixins.py b/re2o/mixins.py index 09fee806..71128a58 100644 --- a/re2o/mixins.py +++ b/re2o/mixins.py @@ -3,9 +3,7 @@ # 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 +# Copyright © 2018 Gabriel Détraz # # 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 @@ -30,6 +28,14 @@ class AclMixin(object): def get_modulename(cls): return str(cls.__module__).split('.')[0].lower() + @classmethod + def get_instance(cls, *args, **kwargs): + """Récupère une instance + :param objectid: Instance id à trouver + :return: Une instance de la classe évidemment""" + object_id = kwargs.get(cls.get_classname() + 'id') + return cls.objects.get(pk=object_id) + @classmethod def can_create(cls, user_request, *args, **kwargs): """Verifie que l'user a les bons droits infra pour créer diff --git a/topologie/models.py b/topologie/models.py index bae4b054..93f65e0b 100644 --- a/topologie/models.py +++ b/topologie/models.py @@ -67,9 +67,6 @@ class Stack(AclMixin, models.Model): ("view_stack", "Peut voir un objet stack"), ) - def get_instance(stack_id, *args, **kwargs): - return Stack.objects.get(pk=stack_id) - def __str__(self): return " ".join([self.name, self.stack_id]) @@ -105,9 +102,6 @@ class AccessPoint(AclMixin, Machine): ("view_accesspoint", "Peut voir une borne"), ) - def get_instance(ap_id, *args, **kwargs): - return AccessPoint.objects.get(pk=ap_id) - class Switch(AclMixin, Machine): """ Definition d'un switch. Contient un nombre de ports (number), @@ -146,9 +140,6 @@ class Switch(AclMixin, Machine): ("view_switch", "Peut voir un objet switch"), ) - def get_instance(switch_id, *args, **kwargs): - return Switch.objects.get(pk=switch_id) - def clean(self): """ Verifie que l'id stack est dans le bon range Appelle également le clean de la classe parente""" @@ -210,9 +201,6 @@ class ModelSwitch(AclMixin, models.Model): ("view_modelswitch", "Peut voir un objet modelswitch"), ) - def get_instance(model_switch_id, *args, **kwargs): - return ModelSwitch.objects.get(pk=model_switch_id) - def __str__(self): return str(self.constructor) + ' ' + self.reference @@ -227,9 +215,6 @@ class ConstructorSwitch(AclMixin, models.Model): ("view_constructorswitch", "Peut voir un objet constructorswitch"), ) - def get_instance(constructor_switch_id, *args, **kwargs): - return ConstructorSwitch.objects.get(pk=constructor_switch_id) - def __str__(self): return self.name @@ -363,9 +348,6 @@ class Room(AclMixin, models.Model): ("view_room", "Peut voir un objet chambre"), ) - def get_instance(room_id, *args, **kwargs): - return Room.objects.get(pk=room_id) - def __str__(self): return self.name diff --git a/users/models.py b/users/models.py index db502fd1..adec20ed 100644 --- a/users/models.py +++ b/users/models.py @@ -990,9 +990,6 @@ class ServiceUser(AclMixin, AbstractBaseUser): )]).values_list('dn', flat=True)) group.save() - def get_instance(userid, *args, **kwargs): - return ServiceUser.objects.get(pk=userid) - def __str__(self): return self.pseudo @@ -1021,9 +1018,6 @@ class School(AclMixin, models.Model): ("view_school", "Peut voir un objet school"), ) - def get_instance(schoolid, *args, **kwargs): - return School.objects.get(pk=schoolid) - def __str__(self): return self.name @@ -1058,9 +1052,6 @@ class ListRight(AclMixin, Group): ("view_listright", "Peut voir un objet Group/ListRight"), ) - def get_instance(listrightid, *args, **kwargs): - return ListRight.objects.get(pk=listrightid) - def __str__(self): return self.name @@ -1110,9 +1101,6 @@ class ListShell(AclMixin, models.Model): ("view_listshell", "Peut voir un objet shell quelqu'il soit"), ) - def get_instance(shellid, *args, **kwargs): - return ListShell.objects.get(pk=shellid) - def get_pretty_name(self): """Return the canonical name of the shell""" return self.shell.split("/")[-1] @@ -1236,9 +1224,6 @@ class Whitelist(AclMixin, models.Model): def is_active(self): return self.date_end > timezone.now() - def get_instance(whitelistid, *args, **kwargs): - return Whitelist.objects.get(pk=whitelistid) - def can_view(self, user_request, *args, **kwargs): """Check if an user can view a Whitelist object. From 14991bf88ea37b1e43289bed23b9f7ea37e022c9 Mon Sep 17 00:00:00 2001 From: chirac Date: Wed, 28 Mar 2018 17:39:23 +0200 Subject: [PATCH 2/8] AclMixin sur preferences --- preferences/models.py | 385 +----------------------------------------- 1 file changed, 8 insertions(+), 377 deletions(-) diff --git a/preferences/models.py b/preferences/models.py index 5238e1a5..c0d761e6 100644 --- a/preferences/models.py +++ b/preferences/models.py @@ -34,7 +34,7 @@ from django.dispatch import receiver from django.core.cache import cache from .aes_field import AESEncryptedField - +from re2o.mixins import AclMixin class PreferencesModel(models.Model): @classmethod @@ -54,7 +54,7 @@ class PreferencesModel(models.Model): abstract = True -class OptionalUser(PreferencesModel): +class OptionalUser(AclMixin, PreferencesModel): """Options pour l'user : obligation ou nom du telephone, activation ou non du solde, autorisation du negatif, fingerprint etc""" PRETTY_NAME = "Options utilisateur" @@ -101,58 +101,6 @@ class OptionalUser(PreferencesModel): ("view_optionaluser", "Peut voir les options de l'user"), ) - def get_instance(*args, **kwargs): - return OptionalUser.objects.get_or_create() - - def can_create(user_request, *args, **kwargs): - """Check if an user can create a OptionalUser 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('preferences.add_optionaluser'), u"Vous n'avez pas le droit\ - de créer les préférences concernant les users" - - def can_edit(self, user_request, *args, **kwargs): - """Check if an user can edit a OptionalUser object. - - :param self: The OptionalUser 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('preferences.change_optionaluser'), u"Vous n'avez pas le droit\ - d'éditer les préférences concernant les users" - - def can_delete(self, user_request, *args, **kwargs): - """Check if an user can delete a OptionalUser object. - - :param self: The OptionalUser 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('preferences.delete_optionaluser'), u"Vous n'avez pas le droit\ - de supprimer les préférences concernant les users" - - def can_view_all(user_request, *args, **kwargs): - """Check if an user can access to the list of every OptionalUser 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('preferences.view_optionaluser'), u"Vous n'avez pas le droit\ - de voir les préférences concernant les utilisateurs" - - def can_view(self, user_request, *args, **kwargs): - """Check if an user can view a OptionalUser object. - - :param self: The targeted OptionalUser. - :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('preferences.view_optionaluser'), u"Vous n'avez pas le droit\ - de voir les préférences concernant les utilisateurs" - def clean(self): """Creation du mode de paiement par solde""" if self.user_solde: @@ -169,7 +117,7 @@ def optionaluser_post_save(sender, **kwargs): user_pref.set_in_cache() -class OptionalMachine(PreferencesModel): +class OptionalMachine(AclMixin, PreferencesModel): """Options pour les machines : maximum de machines ou d'alias par user sans droit, activation de l'ipv6""" PRETTY_NAME = "Options machines" @@ -205,59 +153,6 @@ class OptionalMachine(PreferencesModel): ("view_optionalmachine", "Peut voir les options de machine"), ) - def get_instance(*args, **kwargs): - return OptionalMachine.objects.get_or_create() - - def can_create(user_request, *args, **kwargs): - """Check if an user can create a OptionalMachine object. - - :param user_request: The user who wants to create an object. - :return: a message and a boolean which is True if the user can create. - """ - return user_request.has_perm('preferences.add_optionalmachine'), u"Vous n'avez pas le droit\ - de créer les préférences concernant les machines" - - def can_edit(self, user_request, *args, **kwargs): - """Check if an user can edit a OptionalMachine object. - - :param self: The OptionalMachine 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('preferences.change_optionalmachine'), u"Vous n'avez pas le droit\ - d'éditer les préférences concernant les machines" - - def can_delete(self, user_request, *args, **kwargs): - """Check if an user can delete a OptionalMachine object. - - :param self: The OptionalMachine 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('preferences.delete_optionalmachine'), u"Vous n'avez pas le droit\ - de supprimer les préférences concernant les machines" - - def can_view_all(user_request, *args, **kwargs): - """Check if an user can access to the list of every OptionalMachine 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('preferences.view_optionalmachine'), u"Vous n'avez pas le droit\ - de voir les préférences concernant les machines" - - def can_view(self, user_request, *args, **kwargs): - """Check if an user can view a OptionalMachine object. - - :param self: The targeted OptionalMachine. - :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('preferences.view_optionalmachine'), u"Vous n'avez pas le droit\ - de voir les préférences concernant les machines" - @receiver(post_save, sender=OptionalMachine) def optionalmachine_post_save(sender, **kwargs): @@ -269,7 +164,7 @@ def optionalmachine_post_save(sender, **kwargs): interface.sync_ipv6() -class OptionalTopologie(PreferencesModel): +class OptionalTopologie(AclMixin, PreferencesModel): """Reglages pour la topologie : mode d'accès radius, vlan où placer les machines en accept ou reject""" PRETTY_NAME = "Options topologie" @@ -306,58 +201,6 @@ class OptionalTopologie(PreferencesModel): ("view_optionaltopologie", "Peut voir les options de topologie"), ) - def get_instance(*args, **kwargs): - return OptionalTopologie.objects.get_or_create() - - def can_create(user_request, *args, **kwargs): - """Check if an user can create a OptionalTopologie object. - - :param user_request: The user who wants to create an object. - :return: a message and a boolean which is True if the user can create. - """ - return user_request.has_perm('preferences.add_optionaltopologie'), u"Vous n'avez pas le droit\ - de créer les préférences concernant la topologie" - - def can_edit(self, user_request, *args, **kwargs): - """Check if an user can edit a OptionalTopologie object. - - :param self: The OptionalTopologie 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('preferences.change_optionaltopologie'), u"Vous n'avez pas le droit\ - d'éditer les préférences concernant la topologie" - - def can_delete(self, user_request, *args, **kwargs): - """Check if an user can delete a OptionalTopologie object. - - :param self: The OptionalTopologie 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('preferences.delete_optionaltoplogie'), u"Vous n'avez pas le droit\ - d'éditer les préférences concernant la topologie" - - def can_view_all(user_request, *args, **kwargs): - """Check if an user can access to the list of every OptionalTopologie 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('preferences.view_optionaltopologie'), u"Vous n'avez pas le droit\ - de voir les préférences concernant la topologie" - - def can_view(self, user_request, *args, **kwargs): - """Check if an user can view a OptionalTopologie object. - - :param self: The targeted OptionalTopologie. - :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('preferences.view_optionaltopologie'), u"Vous n'avez pas le droit\ - de voir les préférences concernant la topologie" - @receiver(post_save, sender=OptionalTopologie) def optionaltopologie_post_save(sender, **kwargs): @@ -366,7 +209,7 @@ def optionaltopologie_post_save(sender, **kwargs): topologie_pref.set_in_cache() -class GeneralOption(PreferencesModel): +class GeneralOption(AclMixin, PreferencesModel): """Options générales : nombre de resultats par page, nom du site, temps où les liens sont valides""" PRETTY_NAME = "Options générales" @@ -398,59 +241,6 @@ class GeneralOption(PreferencesModel): ("view_generaloption", "Peut voir les options générales"), ) - def get_instance(*args, **kwargs): - return GeneralOption.objects.get_or_create() - - def can_create(user_request, *args, **kwargs): - """Check if an user can create a GeneralOption object. - - :param user_request: The user who wants to create an object. - :return: a message and a boolean which is True if the user can create. - """ - return user_request.has_perm('preferences.add_generaloption'), u"Vous n'avez pas le droit\ - de créer les préférences générales" - - def can_edit(self, user_request, *args, **kwargs): - """Check if an user can edit a GeneralOption object. - - :param self: The GeneralOption 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('preferences.change_generaloption'), u"Vous n'avez pas le droit\ - d'éditer les préférences générales" - - def can_delete(self, user_request, *args, **kwargs): - """Check if an user can delete a GeneralOption object. - - :param self: The GeneralOption 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('preferences.delete_generaloption'), u"Vous n'avez pas le droit\ - d'éditer les préférences générales" - - def can_view_all(user_request, *args, **kwargs): - """Check if an user can access to the list of every GeneralOption 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('preferences.view_generaloption'), u"Vous n'avez pas le droit\ - de voir les préférences générales" - - def can_view(self, user_request, *args, **kwargs): - """Check if an user can view a GeneralOption object. - - :param self: The targeted GeneralOption. - :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('preferences.view_generaloption'), u"Vous n'avez pas le droit\ - de voir les préférences générales" - @receiver(post_save, sender=GeneralOption) def generaloption_post_save(sender, **kwargs): @@ -459,7 +249,7 @@ def generaloption_post_save(sender, **kwargs): general_pref.set_in_cache() -class Service(models.Model): +class Service(AclMixin, models.Model): """Liste des services affichés sur la page d'accueil : url, description, image et nom""" name = models.CharField(max_length=32) @@ -472,65 +262,11 @@ class Service(models.Model): ("view_service", "Peut voir les options de service"), ) - def get_instance(serviceid, *args, **kwargs): - return Service.objects.get(pk=serviceid) - - def can_create(user_request, *args, **kwargs): - """Check if an user can create a Service object. - - :param user_request: The user who wants to create an object. - :return: a message and a boolean which is True if the user can create. - """ - - return user_request.has_perm('preferences.add_service'), u"Vous n'avez pas le droit\ - de créer un service pour la page d'accueil" - - def can_edit(self, user_request, *args, **kwargs): - """Check if an user can edit a Service object. - - :param self: The Service 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('preferences.change_service'), u"Vous n'avez pas le droit\ - d'éditer les services pour la page d'accueil" - - def can_delete(self, user_request, *args, **kwargs): - """Check if an user can delete a Service object. - - :param self: The Right 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('preferences.delete_service'), u"Vous n'avez pas le droit\ - de supprimer les services pour la page d'accueil" - - def can_view_all(user_request, *args, **kwargs): - """Check if an user can access to the list of every Service 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('preferences.view_service'), u"Vous n'avez pas le droit\ - de voir les services pour la page d'accueil" - - def can_view(self, user_request, *args, **kwargs): - """Check if an user can view a Service object. - - :param self: The targeted Service. - :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('preferences.view_service'), u"Vous n'avez pas le droit\ - de voir les services pour la page d'accueil" - def __str__(self): return str(self.name) -class AssoOption(PreferencesModel): +class AssoOption(AclMixin, PreferencesModel): """Options générales de l'asso : siret, addresse, nom, etc""" PRETTY_NAME = "Options de l'association" @@ -579,58 +315,6 @@ class AssoOption(PreferencesModel): ("view_assooption", "Peut voir les options de l'asso"), ) - def get_instance(*args, **kwargs): - return AssoOption.objects.get_or_create() - - def can_create(user_request, *args, **kwargs): - """Check if an user can create a AssoOption object. - - :param user_request: The user who wants to create an object. - :return: a message and a boolean which is True if the user can create. - """ - return user_request.has_perm('preferences.add_assooption'), u"Vous n'avez pas le droit\ - d'éditer les préférences concernant l'association" - - def can_edit(self, user_request, *args, **kwargs): - """Check if an user can edit a AssoOption object. - - :param self: The AssoOption 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('preferences.change_assooption'), u"Vous n'avez pas le droit\ - d'éditer les préférences concernant l'association" - - def can_delete(self, user_request, *args, **kwargs): - """Check if an user can delete a AssoOption object. - - :param self: The AssoOption 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('preferences.delete_assooption'), u"Vous n'avez pas le droit\ - d'éditer les préférences concernant l'association" - - def can_view_all(user_request, *args, **kwargs): - """Check if an user can access to the list of every AssoOption 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('preferences.view_assooption'), u"Vous n'avez pas le droit\ - de voir les préférences concernant l'association" - - def can_view(self, user_request, *args, **kwargs): - """Check if an user can view a AssoOption object. - - :param self: The targeted AssoOption. - :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('preferences.view_assooption'), u"Vous n'avez pas le droit\ - de voir les préférences concernant l'association" - @receiver(post_save, sender=AssoOption) def assooption_post_save(sender, **kwargs): @@ -639,7 +323,7 @@ def assooption_post_save(sender, **kwargs): asso_pref.set_in_cache() -class MailMessageOption(models.Model): +class MailMessageOption(AclMixin, models.Model): """Reglages, mail de bienvenue et autre""" PRETTY_NAME = "Options de corps de mail" @@ -650,56 +334,3 @@ class MailMessageOption(models.Model): permissions = ( ("view_mailmessageoption", "Peut voir les options de mail"), ) - - def get_instance(*args, **kwargs): - return MailMessageOption.objects.get_or_create() - - def can_create(user_request, *args, **kwargs): - """Check if an user can create a MailMessageOption object. - - :param user_request: The user who wants to create an object. - :return: a message and a boolean which is True if the user can create. - """ - return user_request.has_perm('preferences.add_mailmessageoption'), u"Vous n'avez pas le droit\ - d'éditer les préférences concernant les mails" - - def can_edit(self, user_request, *args, **kwargs): - """Check if an user can edit a MailMessageOption object. - - :param self: The MailMessageOption 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('preferences.change_mailmessageoption'), u"Vous n'avez pas le droit\ - d'éditer les préférences concernant les mails" - - def can_delete(self, user_request, *args, **kwargs): - """Check if an user can delete a AssoOption object. - - :param self: The AssoOption 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('preferences.delete_mailmessageoption'), u"Vous n'avez pas le droit\ - d'éditer les préférences concernant les mails" - - def can_view_all(user_request, *args, **kwargs): - """Check if an user can access to the list of every AssoOption 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('preferences.view_mailmessageoption'), u"Vous n'avez pas le droit\ - de voir les préférences concernant les mails" - - def can_view(self, user_request, *args, **kwargs): - """Check if an user can view a AssoOption object. - - :param self: The targeted AssoOption. - :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('preferences.view_mailmessageoption'), u"Vous n'avez pas le droit\ - de voir les préférences concernant les mails" From 3a253f3874988b253997907a3ad7ce606adffa52 Mon Sep 17 00:00:00 2001 From: Gabriel Detraz Date: Wed, 28 Mar 2018 18:04:25 +0200 Subject: [PATCH 3/8] Adapte history pour le acl_mixin --- re2o/views.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/re2o/views.py b/re2o/views.py index 9a987e5a..5e6e67d1 100644 --- a/re2o/views.py +++ b/re2o/views.py @@ -128,8 +128,10 @@ def history(request, application, object_name, object_id): model = HISTORY_BIND[application][object_name] except KeyError as e: raise Http404(u"Il n'existe pas d'historique pour ce modèle.") + object_name_id = object_name + 'id' + kwargs = {object_name_id: object_id} try: - instance = model.get_instance(object_id) + instance = model.get_instance(**kwargs) except model.DoesNotExist: messages.error(request, u"Entrée inexistante") return redirect(reverse('users:profil', From f91feff0fc409890c2788ef993a14668d6392ca8 Mon Sep 17 00:00:00 2001 From: Gabriel Detraz Date: Wed, 28 Mar 2018 19:58:38 +0200 Subject: [PATCH 4/8] Fix divers nas et ap --- machines/admin.py | 6 ++++++ re2o/views.py | 4 ++-- topologie/templates/topologie/aff_ap.html | 2 +- topologie/urls.py | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/machines/admin.py b/machines/admin.py index e6165672..9a2d5133 100644 --- a/machines/admin.py +++ b/machines/admin.py @@ -38,6 +38,7 @@ from .models import ( Nas, Service, OuverturePort, + Ipv6List, OuverturePortList ) @@ -46,6 +47,10 @@ class MachineAdmin(VersionAdmin): pass +class Ipv6ListAdmin(VersionAdmin): + pass + + class IpTypeAdmin(VersionAdmin): pass @@ -124,6 +129,7 @@ admin.site.register(Interface, InterfaceAdmin) admin.site.register(Domain, DomainAdmin) admin.site.register(Service, ServiceAdmin) admin.site.register(Vlan, VlanAdmin) +admin.site.register(Ipv6List, Ipv6ListAdmin) admin.site.register(Nas, NasAdmin) admin.site.register(OuverturePort, OuverturePortAdmin) admin.site.register(OuverturePortList, OuverturePortListAdmin) diff --git a/re2o/views.py b/re2o/views.py index 5e6e67d1..f6d6155a 100644 --- a/re2o/views.py +++ b/re2o/views.py @@ -83,7 +83,7 @@ HISTORY_BIND = { 'stack' : topologie.models.Stack, 'model_switch' : topologie.models.ModelSwitch, 'constructor_switch' : topologie.models.ConstructorSwitch, - 'ap' : topologie.models.AccessPoint, + 'accesspoint' : topologie.models.AccessPoint, }, 'machines' : { 'machine' : machines.models.Machine, @@ -99,7 +99,7 @@ HISTORY_BIND = { 'ns' : machines.models.Ns, 'service' : machines.models.Service, 'vlan' : machines.models.Vlan, - 'nas' : machines.models.Vlan, + 'nas' : machines.models.Nas, 'ipv6list' : machines.models.Ipv6List, }, } diff --git a/topologie/templates/topologie/aff_ap.html b/topologie/templates/topologie/aff_ap.html index 192e5026..fc38b4b1 100644 --- a/topologie/templates/topologie/aff_ap.html +++ b/topologie/templates/topologie/aff_ap.html @@ -49,7 +49,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {{ap.interface_set.first.details}} {{ap.location}} - + {% can_edit ap %} diff --git a/topologie/urls.py b/topologie/urls.py index 1f2968b7..90c872e6 100644 --- a/topologie/urls.py +++ b/topologie/urls.py @@ -37,7 +37,7 @@ urlpatterns = [ url(r'^$', views.index, name='index'), url(r'^index_ap/$', views.index_ap, name='index-ap'), url(r'^new_ap/$', views.new_ap, name='new-ap'), - url(r'^edit_ap/(?P[0-9]+)$', + url(r'^edit_ap/(?P[0-9]+)$', views.edit_ap, name='edit-ap'), url(r'^create_ports/(?P[0-9]+)$', From 746eef0f74563f23f45ea555b0d1ccc029aca37d Mon Sep 17 00:00:00 2001 From: Gabriel Detraz Date: Wed, 28 Mar 2018 20:32:03 +0200 Subject: [PATCH 5/8] Fix bugs sur topologie, id et plus _id --- topologie/models.py | 4 +- .../topologie/aff_constructor_switch.html | 2 +- .../templates/topologie/aff_model_switch.html | 2 +- topologie/templates/topologie/aff_port.html | 2 +- topologie/urls.py | 30 +++++------ topologie/views.py | 54 +++++++++---------- 6 files changed, 47 insertions(+), 47 deletions(-) diff --git a/topologie/models.py b/topologie/models.py index 93f65e0b..9cef5c44 100644 --- a/topologie/models.py +++ b/topologie/models.py @@ -282,14 +282,14 @@ class Port(AclMixin, models.Model): ("view_port", "Peut voir un objet port"), ) - def get_instance(port_id, *args, **kwargs): + def get_instance(portid, *args, **kwargs): return Port.objects\ .select_related('machine_interface__domain__extension')\ .select_related('machine_interface__machine__switch')\ .select_related('room')\ .select_related('related')\ .prefetch_related('switch__interface_set__domain__extension')\ - .get(pk=port_id) + .get(pk=portid) def make_port_related(self): """ Synchronise le port distant sur self""" diff --git a/topologie/templates/topologie/aff_constructor_switch.html b/topologie/templates/topologie/aff_constructor_switch.html index f9d8827c..76c74734 100644 --- a/topologie/templates/topologie/aff_constructor_switch.html +++ b/topologie/templates/topologie/aff_constructor_switch.html @@ -39,7 +39,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {{constructor_switch}} - + {% can_edit constructor_switch %} diff --git a/topologie/templates/topologie/aff_model_switch.html b/topologie/templates/topologie/aff_model_switch.html index a1aa88cf..6bb3e1f0 100644 --- a/topologie/templates/topologie/aff_model_switch.html +++ b/topologie/templates/topologie/aff_model_switch.html @@ -41,7 +41,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {{model_switch.reference}} {{model_switch.constructor}} - + {% can_edit model_switch %} diff --git a/topologie/templates/topologie/aff_port.html b/topologie/templates/topologie/aff_port.html index 4fe08862..1eef75b8 100644 --- a/topologie/templates/topologie/aff_port.html +++ b/topologie/templates/topologie/aff_port.html @@ -52,7 +52,7 @@ with this program; if not, write to the Free Software Foundation, Inc., {% if port.related %} - {{ port.related }} + {{ port.related }} {% endif %} {{ port.radius }} diff --git a/topologie/urls.py b/topologie/urls.py index 90c872e6..d4b31717 100644 --- a/topologie/urls.py +++ b/topologie/urls.py @@ -37,18 +37,18 @@ urlpatterns = [ url(r'^$', views.index, name='index'), url(r'^index_ap/$', views.index_ap, name='index-ap'), url(r'^new_ap/$', views.new_ap, name='new-ap'), - url(r'^edit_ap/(?P[0-9]+)$', + url(r'^edit_ap/(?P[0-9]+)$', views.edit_ap, name='edit-ap'), - url(r'^create_ports/(?P[0-9]+)$', + url(r'^create_ports/(?P[0-9]+)$', views.create_ports, name='create-ports'), url(r'^index_room/$', views.index_room, name='index-room'), url(r'^new_room/$', views.new_room, name='new-room'), - url(r'^edit_room/(?P[0-9]+)$', views.edit_room, name='edit-room'), - url(r'^del_room/(?P[0-9]+)$', views.del_room, name='del-room'), + url(r'^edit_room/(?P[0-9]+)$', views.edit_room, name='edit-room'), + url(r'^del_room/(?P[0-9]+)$', views.del_room, name='del-room'), url(r'^new_switch/$', views.new_switch, name='new-switch'), - url(r'^switch/(?P[0-9]+)$', + url(r'^switch/(?P[0-9]+)$', views.index_port, name='index-port'), url( @@ -57,18 +57,18 @@ urlpatterns = [ name='history', kwargs={'application':'topologie'}, ), - url(r'^edit_port/(?P[0-9]+)$', views.edit_port, name='edit-port'), - url(r'^new_port/(?P[0-9]+)$', views.new_port, name='new-port'), - url(r'^del_port/(?P[0-9]+)$', views.del_port, name='del-port'), - url(r'^edit_switch/(?P[0-9]+)$', + url(r'^edit_port/(?P[0-9]+)$', views.edit_port, name='edit-port'), + url(r'^new_port/(?P[0-9]+)$', views.new_port, name='new-port'), + url(r'^del_port/(?P[0-9]+)$', views.del_port, name='del-port'), + url(r'^edit_switch/(?P[0-9]+)$', views.edit_switch, name='edit-switch'), url(r'^new_stack/$', views.new_stack, name='new-stack'), url(r'^index_stack/$', views.index_stack, name='index-stack'), - url(r'^edit_stack/(?P[0-9]+)$', + url(r'^edit_stack/(?P[0-9]+)$', views.edit_stack, name='edit-stack'), - url(r'^del_stack/(?P[0-9]+)$', + url(r'^del_stack/(?P[0-9]+)$', views.del_stack, name='del-stack'), url(r'^index_model_switch/$', @@ -83,20 +83,20 @@ urlpatterns = [ views.new_model_switch, name='new-model-switch' ), - url(r'^edit_model_switch/(?P[0-9]+)$', + url(r'^edit_model_switch/(?P[0-9]+)$', views.edit_model_switch, name='edit-model-switch'), - url(r'^del_model_switch/(?P[0-9]+)$', + url(r'^del_model_switch/(?P[0-9]+)$', views.del_model_switch, name='del-model-switch'), url(r'^new_constructor_switch/$', views.new_constructor_switch, name='new-constructor-switch' ), - url(r'^edit_constructor_switch/(?P[0-9]+)$', + url(r'^edit_constructor_switch/(?P[0-9]+)$', views.edit_constructor_switch, name='edit-constructor-switch'), - url(r'^del_constructor_switch/(?P[0-9]+)$', + url(r'^del_constructor_switch/(?P[0-9]+)$', views.del_constructor_switch, name='del-constructor-switch'), ] diff --git a/topologie/views.py b/topologie/views.py index bc53c77b..97b01ebb 100644 --- a/topologie/views.py +++ b/topologie/views.py @@ -123,7 +123,7 @@ def index(request): @login_required @can_view_all(Port) @can_view(Switch) -def index_port(request, switch, switch_id): +def index_port(request, switch, switchid): """ Affichage de l'ensemble des ports reliés à un switch particulier""" port_list = Port.objects.filter(switch=switch)\ .select_related('room')\ @@ -143,7 +143,7 @@ def index_port(request, switch, switch_id): ) return render(request, 'topologie/index_p.html', { 'port_list': port_list, - 'id_switch': switch_id, + 'id_switch': switchid, 'nom_switch': switch }) @@ -250,10 +250,10 @@ def index_model_switch(request): @login_required @can_create(Port) -def new_port(request, switch_id): +def new_port(request, switchid): """ Nouveau port""" try: - switch = Switch.objects.get(pk=switch_id) + switch = Switch.objects.get(pk=switchid) except Switch.DoesNotExist: messages.error(request, u"Switch inexistant") return redirect(reverse('topologie:index')) @@ -271,14 +271,14 @@ def new_port(request, switch_id): messages.error(request, "Ce port existe déjà") return redirect(reverse( 'topologie:index-port', - kwargs={'switch_id':switch_id} + kwargs={'switchid':switchid} )) - return form({'id_switch': switch_id,'topoform': port, 'action_name' : 'Ajouter'}, 'topologie/topo.html', request) + return form({'id_switch': switchid,'topoform': port, 'action_name' : 'Ajouter'}, 'topologie/topo.html', request) @login_required @can_edit(Port) -def edit_port(request, port_object, port_id): +def edit_port(request, port_object, portid): """ Edition d'un port. Permet de changer le switch parent et l'affectation du port""" @@ -293,14 +293,14 @@ def edit_port(request, port_object, port_id): messages.success(request, "Le port a bien été modifié") return redirect(reverse( 'topologie:index-port', - kwargs={'switch_id': str(port_object.switch.id)} + kwargs={'switchid': str(port_object.switch.id)} )) return form({'id_switch': str(port_object.switch.id), 'topoform': port, 'action_name' : 'Editer'}, 'topologie/topo.html', request) @login_required @can_delete(Port) -def del_port(request, port, port_id): +def del_port(request, port, portid): """ Supprime le port""" if request.method == "POST": try: @@ -314,7 +314,7 @@ def del_port(request, port, port_id): impossible de le supprimer" % port) return redirect(reverse( 'topologie:index-port', - kwargs={'switch_id':str(port.switch.id)} + kwargs={'switchid':str(port.switch.id)} )) return form({'objet': port}, 'topologie/delete.html', request) @@ -322,7 +322,7 @@ def del_port(request, port, port_id): @login_required @can_create(Stack) def new_stack(request): - """Ajoute un nouveau stack : stack_id_min, max, et nombre de switches""" + """Ajoute un nouveau stack : stackid_min, max, et nombre de switches""" stack = StackForm(request.POST or None) if stack.is_valid(): with transaction.atomic(), reversion.create_revision(): @@ -335,7 +335,7 @@ def new_stack(request): @login_required @can_edit(Stack) -def edit_stack(request, stack, stack_id): +def edit_stack(request, stack, stackid): """Edition d'un stack (nombre de switches, nom...)""" stack = StackForm(request.POST or None, instance=stack) @@ -354,7 +354,7 @@ def edit_stack(request, stack, stack_id): @login_required @can_delete(Stack) -def del_stack(request, stack, stack_id): +def del_stack(request, stack, stackid): """Supprime un stack""" if request.method == "POST": try: @@ -372,7 +372,7 @@ def del_stack(request, stack, stack_id): @login_required @can_edit(Stack) -def edit_switchs_stack(request, stack, stack_id): +def edit_switchs_stack(request, stack, stackid): """Permet d'éditer la liste des switches dans une stack et l'ajouter""" if request.method == "POST": @@ -440,10 +440,10 @@ def new_switch(request): @login_required @can_create(Port) -def create_ports(request, switch_id): +def create_ports(request, switchid): """ Création d'une liste de ports pour un switch.""" try: - switch = Switch.objects.get(pk=switch_id) + switch = Switch.objects.get(pk=switchid) except Switch.DoesNotExist: messages.error(request, u"Switch inexistant") return redirect(reverse('topologie:index')) @@ -471,14 +471,14 @@ def create_ports(request, switch_id): return redirect(reverse( 'topologie:index-port', - kwargs={'switch_id':switch_id} + kwargs={'switchid':switchid} )) - return form({'id_switch': switch_id, 'topoform': port_form}, 'topologie/switch.html', request) + return form({'id_switch': switchid, 'topoform': port_form}, 'topologie/switch.html', request) @login_required @can_edit(Switch) -def edit_switch(request, switch, switch_id): +def edit_switch(request, switch, switchid): """ Edition d'un switch. Permet de chambre nombre de ports, place dans le stack, interface et machine associée""" @@ -524,7 +524,7 @@ def edit_switch(request, switch, switch_id): return redirect(reverse('topologie:index')) i_mbf_param = generate_ipv4_mbf_param(interface_form, False ) return form({ - 'id_switch': switch_id, + 'id_switch': switchid, 'topoform': interface_form, 'machineform': switch_form, 'domainform': domain_form, @@ -590,7 +590,7 @@ def new_ap(request): @login_required @can_edit(AccessPoint) -def edit_ap(request, ap, ap_id): +def edit_ap(request, ap, accesspointid): """ Edition d'un switch. Permet de chambre nombre de ports, place dans le stack, interface et machine associée""" interface_form = EditInterfaceForm( @@ -665,7 +665,7 @@ def new_room(request): @login_required @can_edit(Room) -def edit_room(request, room, room_id): +def edit_room(request, room, roomid): """ Edition numero et details de la chambre""" room = EditRoomForm(request.POST or None, instance=room) @@ -683,7 +683,7 @@ def edit_room(request, room, room_id): @login_required @can_delete(Room) -def del_room(request, room, room_id): +def del_room(request, room, roomid): """ Suppression d'un chambre""" if request.method == "POST": try: @@ -719,7 +719,7 @@ def new_model_switch(request): @login_required @can_edit(ModelSwitch) -def edit_model_switch(request, model_switch, model_switch_id): +def edit_model_switch(request, model_switch, modelswitchid): """ Edition d'un modèle de switch""" model_switch = EditModelSwitchForm(request.POST or None, instance=model_switch) @@ -737,7 +737,7 @@ def edit_model_switch(request, model_switch, model_switch_id): @login_required @can_delete(ModelSwitch) -def del_model_switch(request, model_switch_id): +def del_model_switch(request, model_switch, modelswitchid): """ Suppression d'un modèle de switch""" if request.method == "POST": try: @@ -773,7 +773,7 @@ def new_constructor_switch(request): @login_required @can_edit(ConstructorSwitch) -def edit_constructor_switch(request, constructor_switch, constructor_switch_id): +def edit_constructor_switch(request, constructor_switch, constructorswitchid): """ Edition d'un constructeur de switch""" constructor_switch = EditConstructorSwitchForm(request.POST or None, instance=constructor_switch) @@ -791,7 +791,7 @@ def edit_constructor_switch(request, constructor_switch, constructor_switch_id): @login_required @can_delete(ConstructorSwitch) -def del_constructor_switch(request, constructor_switch_id): +def del_constructor_switch(request, constructor_switch, constructorswitchid): """ Suppression d'un constructeur de switch""" if request.method == "POST": try: From 12cf400e2a78e1270c2a90382bd0e9c4a31e2f79 Mon Sep 17 00:00:00 2001 From: Gabriel Detraz Date: Wed, 28 Mar 2018 20:46:17 +0200 Subject: [PATCH 6/8] Shell -> ListShell --- re2o/views.py | 6 +++--- users/urls.py | 4 ++-- users/views.py | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/re2o/views.py b/re2o/views.py index f6d6155a..9965dcda 100644 --- a/re2o/views.py +++ b/re2o/views.py @@ -65,7 +65,7 @@ HISTORY_BIND = { 'school' : users.models.School, 'listright' : users.models.ListRight, 'serviceuser' : users.models.ServiceUser, - 'shell' : users.models.ListShell, + 'listshell' : users.models.ListShell, }, 'preferences' : { 'service' : preferences.models.Service, @@ -81,8 +81,8 @@ HISTORY_BIND = { 'port' : topologie.models.Port, 'room' : topologie.models.Room, 'stack' : topologie.models.Stack, - 'model_switch' : topologie.models.ModelSwitch, - 'constructor_switch' : topologie.models.ConstructorSwitch, + 'modelswitch' : topologie.models.ModelSwitch, + 'constructorswitch' : topologie.models.ConstructorSwitch, 'accesspoint' : topologie.models.AccessPoint, }, 'machines' : { diff --git a/users/urls.py b/users/urls.py index 756498aa..fac55e44 100644 --- a/users/urls.py +++ b/users/urls.py @@ -82,12 +82,12 @@ urlpatterns = [ url(r'^del_listright/$', views.del_listright, name='del-listright'), url(r'^add_shell/$', views.add_shell, name='add-shell'), url( - r'^edit_shell/(?P[0-9]+)$', + r'^edit_shell/(?P[0-9]+)$', views.edit_shell, name='edit-shell' ), url( - r'^del_shell/(?P[0-9]+)$', + r'^del_shell/(?P[0-9]+)$', views.del_shell, name='del-shell' ), diff --git a/users/views.py b/users/views.py index e1bf5985..73332e8b 100644 --- a/users/views.py +++ b/users/views.py @@ -515,8 +515,8 @@ def add_shell(request): @login_required @can_edit(ListShell) -def edit_shell(request, shell_instance, shellid): - """ Editer un shell à partir du shellid""" +def edit_shell(request, shell_instance, listshellid): + """ Editer un shell à partir du listshellid""" shell = ShellForm(request.POST or None, instance=shell_instance) if shell.is_valid(): with transaction.atomic(), reversion.create_revision(): @@ -532,7 +532,7 @@ def edit_shell(request, shell_instance, shellid): @login_required @can_delete(ListShell) -def del_shell(request, shell, shellid): +def del_shell(request, shell, listshellid): """Destruction d'un shell""" if request.method == "POST": with transaction.atomic(), reversion.create_revision(): From 34024bfc293534586fb537b3b037fe1def06dd29 Mon Sep 17 00:00:00 2001 From: Gabriel Detraz Date: Wed, 28 Mar 2018 20:46:48 +0200 Subject: [PATCH 7/8] init.py pour python2 dans api --- api/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 api/__init__.py diff --git a/api/__init__.py b/api/__init__.py new file mode 100644 index 00000000..e69de29b From c9fd4cd7b584dfef73f28cbb7ea5c23c61a7d7e7 Mon Sep 17 00:00:00 2001 From: Gabriel Detraz Date: Thu, 29 Mar 2018 04:35:23 +0200 Subject: [PATCH 8/8] Fix acl mixin sur users, docstring, fix topologie acl --- machines/models.py | 7 +++ re2o/mixins.py | 20 +++---- .../migrations/0055_auto_20180329_0431.py | 19 +++++++ topologie/templates/topologie/index_p.html | 4 +- users/models.py | 52 +++++++------------ 5 files changed, 56 insertions(+), 46 deletions(-) create mode 100644 topologie/migrations/0055_auto_20180329_0431.py diff --git a/machines/models.py b/machines/models.py index a07840a6..d4368b2e 100644 --- a/machines/models.py +++ b/machines/models.py @@ -65,6 +65,13 @@ class Machine(FieldPermissionModelMixin, models.Model): ("change_machine_user", "Peut changer le propriétaire d'une machine"), ) + def get_instance(machineid, *args, **kwargs): + """Get the Machine instance with machineid. + :param userid: The id + :return: The user + """ + return Machine.objects.get(pk=machineid) + @staticmethod def can_change_user(user_request, *args, **kwargs): """Checks if an user is allowed to change the user who owns a diff --git a/re2o/mixins.py b/re2o/mixins.py index 71128a58..c176939a 100644 --- a/re2o/mixins.py +++ b/re2o/mixins.py @@ -38,32 +38,32 @@ class AclMixin(object): @classmethod def can_create(cls, user_request, *args, **kwargs): - """Verifie que l'user a les bons droits infra pour créer - un servicelink + """Verifie que l'user a les bons droits pour créer + un object :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 + """Verifie que l'user a les bons droits pour editer + cette instance + :param self: Instance à 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 + """Verifie que l'user a les bons droits pour delete + cette instance + :param self: Instance à 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, + """Vérifie qu'on peut bien afficher l'ensemble des objets, 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""" @@ -72,7 +72,7 @@ class AclMixin(object): 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 self: instance à 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() diff --git a/topologie/migrations/0055_auto_20180329_0431.py b/topologie/migrations/0055_auto_20180329_0431.py new file mode 100644 index 00000000..f8633d84 --- /dev/null +++ b/topologie/migrations/0055_auto_20180329_0431.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2018-03-29 02:31 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('topologie', '0054_auto_20180326_1742'), + ] + + operations = [ + migrations.AlterModelOptions( + name='accesspoint', + options={'permissions': (('view_accesspoint', 'Peut voir une borne'),)}, + ), + ] diff --git a/topologie/templates/topologie/index_p.html b/topologie/templates/topologie/index_p.html index 1ba7c01a..4fc1a61d 100644 --- a/topologie/templates/topologie/index_p.html +++ b/topologie/templates/topologie/index_p.html @@ -33,9 +33,9 @@ with this program; if not, write to the Free Software Foundation, Inc., Editer {% can_create Port %} Ajouter un port -{% acl_end %} Ajouter des ports - {% include "topologie/aff_port.html" with port_list=port_list %} +{% acl_end %} + {% include "topologie/aff_port.html" with port_list=port_list %}


diff --git a/users/models.py b/users/models.py index adec20ed..512259ae 100644 --- a/users/models.py +++ b/users/models.py @@ -171,7 +171,7 @@ class UserManager(BaseUserManager): """ return self._create_user(pseudo, surname, email, password, True) -class User(FieldPermissionModelMixin, AbstractBaseUser, PermissionsMixin): +class User(FieldPermissionModelMixin, AbstractBaseUser, PermissionsMixin, AclMixin): """ Definition de l'utilisateur de base. Champs principaux : name, surnname, pseudo, email, room, password Herite du django BaseUser et du système d'auth django""" @@ -668,14 +668,6 @@ class User(FieldPermissionModelMixin, AbstractBaseUser, PermissionsMixin): num += 1 return composed_pseudo(num) - def get_instance(userid, *args, **kwargs): - """Get the User instance with userid. - - :param userid: The id - :return: The user - """ - return User.objects.get(pk=userid) - def can_edit(self, user_request, *args, **kwargs): """Check if an user can edit an user object. @@ -746,29 +738,6 @@ class User(FieldPermissionModelMixin, AbstractBaseUser, PermissionsMixin): def can_change_groups(user_request, *args, **kwargs): return user_request.has_perm('users.change_user_groups'), "Droit requis pour éditer les groupes de l'user" - def can_delete(self, user_request, *args, **kwargs): - """Check if an user can delete an user object. - - :param self: The user who is to be deleted. - :param user_request: The user who requests deletion. - :return: True if user_request has the right 'bureau', and a message. - """ - if user_request.has_perm('users.delete_user'): - return True, None - else: - return False, u"Vous ne pouvez pas supprimer cet utilisateur." - - def can_view_all(user_request, *args, **kwargs): - """Check if an user can access to the list of every user 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. - """ - if user_request.has_perm('users.view_user'): - return True, None - else: - return False, u"Vous n'avez pas accès à la liste des utilisateurs." - def can_view(self, user_request, *args, **kwargs): """Check if an user can view an user object. @@ -791,6 +760,23 @@ class User(FieldPermissionModelMixin, AbstractBaseUser, PermissionsMixin): else: return False, u"Vous ne pouvez voir un autre utilisateur que vous même" + def can_view_all(user_request, *args, **kwargs): + """Check if an user can access to the list of every user 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_user'), u"Vous n'avez pas accès à la liste des utilisateurs." + + def can_delete(self, user_request, *args, **kwargs): + """Check if an user can delete an user object. + + :param self: The user who is to be deleted. + :param user_request: The user who requests deletion. + :return: True if user_request has the right 'bureau', and a message. + """ + return user_request.has_perm('users.delete_user'), u"Vous ne pouvez pas supprimer cet utilisateur." + def __init__(self, *args, **kwargs): super(User, self).__init__(*args, **kwargs) self.field_permissions = { @@ -813,8 +799,6 @@ class Adherent(User): null=True ) - - def get_instance(adherentid, *args, **kwargs): """Try to find an instance of `Adherent` with the given id.