From 007ad3310a977dce8a825c7960bf1b117e0df953 Mon Sep 17 00:00:00 2001 From: Gabriel Detraz Date: Wed, 28 Mar 2018 17:15:29 +0200 Subject: [PATCH] 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.