mixins.py 5.31 KB
Newer Older
1 2 3 4 5
# -*- 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.
#
6
# Copyright © 2018  Gabriel Détraz
7
# Copyright © 2017  Charlie Jacomme
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#
# 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.

23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
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 != None:
            reversion.set_comment("Champs modifié(s) : %s" % ', '.join(field for field in self.changed_data))
        return super(FormRevMixin, self).save(*args, **kwargs)


46
class AclMixin(object):
Gabriel Detraz's avatar
Gabriel Detraz committed
47 48 49 50 51 52 53 54 55 56
    """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"""

57 58 59 60 61 62 63 64
    @classmethod
    def get_classname(cls):
        return str(cls.__name__).lower()

    @classmethod
    def get_modulename(cls):
        return str(cls.__module__).split('.')[0].lower()

65 66 67 68 69 70 71 72
    @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)

73 74
    @classmethod
    def can_create(cls, user_request, *args, **kwargs):
75 76
        """Verifie que l'user a les bons droits pour créer
        un object
77 78 79 80 81 82
        :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):
83 84 85
        """Verifie que l'user a les bons droits pour editer
        cette instance
        :param self: Instance à editer
86 87 88 89 90
        :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):
91 92 93
        """Verifie que l'user a les bons droits pour delete
        cette instance
        :param self: Instance à delete
94 95 96 97 98 99
        :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):
100
        """Vérifie qu'on peut bien afficher l'ensemble des objets,
101 102 103 104 105 106 107 108
        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
109
        :param self: instance à voir
110 111 112
        :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()