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 sqlalchemy.orm.session import object_state
from .exceptions import (
    ForbidUpdateException, ForbidDeleteException)
from anyblok import Declarations
from anyblok.common import anyblok_column_prefix

Mixin = Declarations.Mixin


[docs]@Declarations.register(Mixin) class ForbidUpdate: def get_modified_fields(self): state = object_state(self) modified_fields = [] for attr in state.manager.attributes: if not hasattr(attr.impl, 'get_history'): continue added, unmodified, deleted = attr.impl.get_history( state, state.dict) if added or deleted: field = attr.key if field.startswith(anyblok_column_prefix): field = field[len(anyblok_column_prefix):] modified_fields.append(field) return modified_fields @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))
[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