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

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

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

[docs]@register(System) class RelationShip(System.Field): name = String(primary_key=True) model = String(primary_key=True) local_columns = String() remote_columns = String() remote_name = String() remote_model = String(nullable=False) remote = Boolean(default=False) nullable = Boolean() def _description(self): res = super(RelationShip, self)._description() remote_name = self.remote_name or '' local_columns = [] if self.local_columns: local_columns = [x.strip() for x in self.local_columns.split(',')] remote_columns = [] if self.remote_columns: remote_columns = [ x.strip() for x in self.remote_columns.split(',')] res.update( nullable=self.nullable, model=self.remote_model, remote_name=remote_name, local_columns=local_columns, remote_columns=remote_columns, ) return res
[docs] @classmethod def add_field(cls, rname, relation, model, table, ftype): """ Insert a relationship definition :param rname: name of the relationship :param relation: instance of the relationship :param model: namespace of the model :param table: name of the table of the model :param ftype: type of the AnyBlok Field """ local_columns = ','.join('local_columns', [])) remote_columns = ','.join('remote_columns', [])) remote_model ='remote_model') remote_name ='remote_name') label ='label') nullable ='nullable', True) vals = dict(code=table + '.' + rname, model=model, name=rname, local_columns=local_columns, remote_model=remote_model, remote_name=remote_name, remote_columns=remote_columns, label=label, nullable=nullable, ftype=ftype) cls.insert(**vals) if remote_name: remote_type = "Many2One" if ftype == "Many2One": remote_type = "One2Many" elif ftype == 'Many2Many': remote_type = "Many2Many" elif ftype == "One2One": remote_type = "One2One" m = cls.anyblok.get(remote_model) vals = dict(code=m.__tablename__ + '.' + remote_name, model=remote_model, name=remote_name, local_columns=remote_columns, remote_model=model, remote_name=rname, remote_columns=local_columns, label=remote_name.capitalize().replace('_', ' '), nullable=True, ftype=remote_type, remote=True) cls.insert(**vals)
@classmethod def alter_field(cls, field, field_, ftype): field.label =['label']