Source code for anyblok.bloks.anyblok_core.mixins
# This file is a part of the AnyBlok project
#
# Copyright (C) 2017 Jean-Sebastien SUZANNE <jssuzanne@anybox.fr>
#
# This Source Code Form is subject to the terms of the Mozilla Public License,
# v. 2.0. If a copy of the MPL was not distributed with this file,You can
# obtain one at http://mozilla.org/MPL/2.0/.
from .exceptions import (
ForbidUpdateException, ForbidDeleteException)
from anyblok import Declarations
from anyblok.column import Boolean, Selection
Mixin = Declarations.Mixin
[docs]@Declarations.register(Mixin)
class ForbidUpdate:
@classmethod
def before_update_orm_event(cls, mapper, connection, target):
modified_fields = target.get_modified_fields()
raise ForbidUpdateException(
"The modification of %r on %s with field(s) %r is forbidden" % (
target, cls.__registry_name__, modified_fields.keys()))
[docs]@Declarations.register(Mixin)
class ForbidDelete:
@classmethod
def before_delete_orm_event(cls, mapper, connection, target):
raise ForbidDeleteException(
"The deletion of %r on %r is forbidden" % (
target, cls.__registry_name__))
[docs]@Declarations.register(Declarations.Mixin)
class ReadOnly(Mixin.ForbidUpdate, Mixin.ForbidDelete):
pass
[docs]@Declarations.register(Mixin)
class ConditionalForbidUpdate:
def check_if_forbid_update_condition_is_true(self, **previous_values):
raise ForbidUpdateException(
"No 'check_if_forbid_update_condition_is_true' method found "
" on %s to check the allow or forbid choice " % (
self.__registry_name__))
@classmethod
def before_update_orm_event(cls, mapper, connection, target):
modified_fields = target.get_modified_fields()
if target.check_if_forbid_update_condition_is_true(**modified_fields):
raise ForbidUpdateException(
"The modification of %r on %s with field(s) %r is forbidden" % (
target, cls.__registry_name__, modified_fields.keys()))
[docs]@Declarations.register(Mixin)
class ConditionalForbidDelete:
def check_if_forbid_delete_condition_is_true(self):
raise ForbidDeleteException(
"No 'check_if_forbid_delete_condition_is_true' method found "
" on %s to check the allow or forbid choice " % (
self.__registry_name__))
@classmethod
def before_delete_orm_event(cls, mapper, connection, target):
if target.check_if_forbid_delete_condition_is_true():
raise ForbidDeleteException(
"The deletion of %r on %r is forbidden" % (
target, cls.__registry_name__))
[docs]@Declarations.register(Declarations.Mixin)
class ConditionalReadOnly(Mixin.ConditionalForbidUpdate,
Mixin.ConditionalForbidDelete):
pass
[docs]@Declarations.register(Declarations.Mixin)
class BooleanForbidUpdate(Mixin.ConditionalForbidUpdate):
forbid_update = Boolean(default=False)
def check_if_forbid_update_condition_is_true(self, **previous_values):
return previous_values.get('forbid_update', self.forbid_update)
[docs]@Declarations.register(Declarations.Mixin)
class BooleanForbidDelete(Mixin.ConditionalForbidDelete):
forbid_delete = Boolean(default=False)
def check_if_forbid_delete_condition_is_true(self):
return self.forbid_delete
[docs]@Declarations.register(Declarations.Mixin)
class BooleanReadOnly(Mixin.ConditionalForbidUpdate,
Mixin.ConditionalForbidDelete):
readonly = Boolean(default=False)
def check_if_forbid_update_condition_is_true(self, **previous_values):
return previous_values.get('readonly', self.readonly)
def check_if_forbid_delete_condition_is_true(self):
return self.readonly
[docs]@Declarations.register(Declarations.Mixin)
class StateReadOnly(Mixin.ConditionalForbidUpdate,
Mixin.ConditionalForbidDelete):
DEFAULT_STATE = None
state = Selection(selections='get_states',
default='get_default_state',
nullable=False)
@classmethod
def get_default_state(cls):
return cls.DEFAULT_STATE
@classmethod
def get_states(cls):
return {}