Source code for anyblok.bloks.anyblok_core.system.field

# This file is a part of the AnyBlok project
#
#    Copyright (C) 2014 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 anyblok import Declarations
from anyblok.column import String
from anyblok.schema import ForeignKeyConstraint

register = Declarations.register
System = Declarations.Model.System
Mixin = Declarations.Mixin


[docs]@register(System) # noqa class Field: name = String(primary_key=True) code = String(nullable=True) model = String(primary_key=True) # FIXME, foreign_key=System.Model.use('name')) label = String() ftype = String(label="Type", nullable=True) entity_type = String(nullable=True) @classmethod def define_table_args(cls): table_args = super(Field, cls).define_table_args() if cls.__registry_name__ != System.Field.__registry_name__: F = cls.anyblok.System.Field return table_args + ( ForeignKeyConstraint( [cls.name, cls.model], [F.name, F.model], ondelete="CASCADE" ), ) return table_args @classmethod def define_mapper_args(cls): mapper_args = super(Field, cls).define_mapper_args() if cls.__registry_name__ == System.Field.__registry_name__: mapper_args.update( { "polymorphic_identity": cls.__registry_name__, "polymorphic_on": cls.entity_type, } ) else: mapper_args.update( { "polymorphic_identity": cls.__registry_name__, } ) return mapper_args @classmethod def get_cname(self, field, cname): return cname def _description(self): res = { "id": self.name, "label": self.label, "type": self.ftype, "nullable": True, "primary_key": False, "model": None, } c = self.anyblok.loaded_namespaces_first_step[self.model][self.name] c.update_description(self.anyblok, self.model, res) return res
[docs] @classmethod def add_field(cls, rname, label, model, table, ftype): """Insert a field definition :param rname: name of the field :param label: label of the field :param model: namespace of the model :param table: name of the table of the model :param ftype: type of the AnyBlok Field """ cls.insert( code=table + "." + rname, model=model, name=rname, label=label, ftype=ftype, )
[docs] @classmethod def alter_field(cls, field, label, ftype): """Update an existing field :param field: instance of the Field model to update :param label: label of the field :param ftype: type of the AnyBlok Field """ field.update(label=label, ftype=ftype)