Source code for anyblok.bloks.anyblok_core.system.column
# 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 Boolean, String
from anyblok.common import anyblok_column_prefix
register = Declarations.register
System = Declarations.Model.System
Mixin = Declarations.Mixin
[docs]@register(System)
class Column(System.Field):
name = String(primary_key=True)
model = String(primary_key=True)
autoincrement = Boolean(label="Auto increment")
foreign_key = String()
primary_key = Boolean()
unique = Boolean()
nullable = Boolean()
remote_model = String()
def _description(self):
res = super(Column, self)._description()
res.update(
nullable=self.nullable,
primary_key=self.primary_key,
model=self.remote_model,
)
return res
[docs] @classmethod
def get_cname(self, field, cname):
"""Return the real name of the column
:param field: the instance of the column
:param cname: Not use here
:rtype: string of the real column name
"""
return cname
[docs] @classmethod
def add_field(cls, cname, column, model, table, ftype):
"""Insert a column definition
:param cname: name of the column
:param column: instance of the column
:param model: namespace of the model
:param table: name of the table of the model
:param ftype: type of the AnyBlok Field
"""
Model = cls.anyblok.get(model)
if hasattr(Model, anyblok_column_prefix + cname):
c = getattr(Model, anyblok_column_prefix + cname)
else:
c = column.property.columns[0] # pragma: no cover
autoincrement = c.autoincrement
if autoincrement == "auto":
autoincrement = (
True if c.primary_key and ftype == "Integer" else False
)
vals = dict(
autoincrement=autoincrement,
code=table + "." + cname,
model=model,
name=cname,
foreign_key=c.info.get("foreign_key"),
label=c.info.get("label"),
nullable=c.nullable,
primary_key=c.primary_key,
ftype=ftype,
remote_model=c.info.get("remote_model"),
unique=c.unique,
)
cls.insert(**vals)
[docs] @classmethod
def alter_field(cls, column, meta_column, ftype):
"""Update an existing column
:param column: instance of the Column model to update
:param meta_column: instance of the SqlAlchemy column
:param ftype: type of the AnyBlok Field
"""
Model = cls.anyblok.get(column.model)
if hasattr(Model, anyblok_column_prefix + column.name):
c = getattr(Model, anyblok_column_prefix + column.name)
else:
c = meta_column.property.columns[0] # pragma: no cover
autoincrement = c.autoincrement
if autoincrement == "auto":
autoincrement = (
True if c.primary_key and ftype == "Integer" else False
)
if column.autoincrement != autoincrement:
column.autoincrement = autoincrement # pragma: no cover
for col in ("nullable", "primary_key", "unique"):
if getattr(column, col) != getattr(c, col):
setattr(column, col, getattr(c, col)) # pragma: no cover
for col in ("foreign_key", "label", "remote_model"):
if getattr(column, col) != c.info.get(col):
setattr(column, col, c.info.get(col)) # pragma: no cover
if column.ftype != ftype:
column.ftype = ftype # pragma: no cover