# -*- mode: python; coding: utf-8 -*- # Re2o est un logiciel d'administration développé initiallement au rezometz. Il # se veut agnostique au réseau considéré, de manière à être installable en # quelques clics. # # Copyright © 2018 Gabriel Détraz # Copyright © 2017 Charlie Jacomme # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from reversion import revisions as reversion class RevMixin(object): def save(self, *args, **kwargs): if self.pk is None: reversion.set_comment("Création") return super(RevMixin, self).save(*args, **kwargs) def delete(self, *args, **kwargs): reversion.set_comment("Suppresion") return super(RevMixin, self).delete(*args, **kwargs) class FormRevMixin(object): def save(self, *args, **kwargs): if reversion.get_comment() != "" and self.changed_data != []: reversion.set_comment( reversion.get_comment() + ",%s" % ', '.join(field for field in self.changed_data) ) elif self.changed_data: reversion.set_comment( "Champs modifié(s) : %s" % ', '.join(field for field in self.changed_data) ) return super(FormRevMixin, self).save(*args, **kwargs) class AclMixin(object): """This mixin is used in nearly every class/models defined in re2o apps. It is used by acl, in models (decorators can_...) and in templates tags :get_instance: Applied on a class, take an id argument, return an instance :can_create: Applied on a class, take the requested user, return if the user can do the creation :can_edit: Applied on an instance, return if the user can edit the instance :can_delete: Applied on an instance, return if the user can delete the instance :can_view: Applied on an instance, return if the user can view the instance :can_view_all: Applied on a class, return if the user can view all instances""" @classmethod def get_classname(cls): return str(cls.__name__).lower() @classmethod 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 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 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 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 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""" return ( user_request.has_perm( cls.get_modulename() + '.view_' + cls.get_classname() ), u"Vous n'avez pas le droit de voir des " + cls.get_classname() ) def can_view(self, user_request, *args, **kwargs): """Vérifie qu'on peut bien voir cette instance particulière avec droit view objet :param self: instance à 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() )