kalenislims/lims_interface/table.py

173 lines
5.9 KiB
Python

# -*- coding: utf-8 -*-
# This file is part of lims_interface module for Tryton.
# The COPYRIGHT file at the top level of this repository contains
# the full copyright notices and license terms.
import formulas
from trytond import backend
from trytond.model import ModelSQL, ModelView, fields
from trytond.transaction import Transaction
from .interface import FIELD_TYPE_SQL, FIELD_TYPE_SELECTION
class ModelEmulation:
__doc__ = None
_table = None
__name__ = None
class Table(ModelSQL, ModelView):
'Interface Table'
__name__ = 'lims.interface.table'
name = fields.Char('Name', required=True)
fields_ = fields.One2Many('lims.interface.table.field', 'table',
'Fields')
grouped_fields_ = fields.One2Many('lims.interface.table.grouped_field',
'table', 'Grouped Fields')
views = fields.One2Many('lims.interface.table.view', 'table',
'Views')
grouped_views = fields.One2Many('lims.interface.table.grouped_view',
'table', 'Grouped Views')
def create_table(self):
TableHandler = backend.TableHandler
model = ModelEmulation()
model.__doc__ = self.name
model._table = self.name
if TableHandler.table_exist(self.name):
TableHandler.drop_table('', self.name)
table = TableHandler(model)
for name, field in [
('create_uid', fields.Integer),
('write_uid', fields.Integer),
('create_date', fields.Timestamp),
('write_date', fields.Timestamp),
('compilation', fields.Integer),
('annulled', fields.Boolean),
('notebook_line', fields.Integer),
]:
sql_type = field._sql_type
table.add_column(name, sql_type)
for field in self.fields_:
sql_type = FIELD_TYPE_SQL[field.type]
table.add_column(field.name, sql_type)
return table
def drop_table(self):
transaction = Transaction()
backend.TableHandler.drop_table('', self.name, cascade=True)
transaction.database.sequence_delete(transaction.connection,
self.name + '_id_seq')
@classmethod
def delete(cls, tables):
for table in tables:
table.drop_table()
super().delete(tables)
class TableField(ModelSQL, ModelView):
'Interface Table Field'
__name__ = 'lims.interface.table.field'
table = fields.Many2One('lims.interface.table', 'Table',
required=True, ondelete='CASCADE', select=True)
name = fields.Char('Name', required=True)
string = fields.Char('String', required=True)
type = fields.Selection(
[(None, ''), ('one2many', 'One2Many')] + FIELD_TYPE_SELECTION,
'Field Type', required=False)
help = fields.Text('Help')
transfer_field = fields.Boolean('Is a transfer field', select=True)
related_line_field = fields.Many2One('ir.model.field', 'Related Field',
select=True)
related_model = fields.Many2One('ir.model', 'Related Model')
selection = fields.Text('Selection')
domain = fields.Char('Domain Value')
formula = fields.Char('On Change With Formula')
inputs = fields.Char('On Change With Inputs')
readonly = fields.Boolean('Read only')
required = fields.Boolean('Required')
invisible = fields.Boolean('Invisible')
digits = fields.Integer('Digits')
group = fields.Integer('Group')
related_group = fields.Integer('Related Group')
default_width = fields.Integer('Default Width')
colspan = fields.Integer('Colspan')
group_name = fields.Char('Group Name')
group_colspan = fields.Integer('Group Colspan')
group_col = fields.Integer('Group Col')
def get_ast(self):
parser = formulas.Parser()
ast = parser.ast(self.formula)[1].compile()
return ast
class TableGroupedField(ModelSQL, ModelView):
'Interface Table Grouped Field'
__name__ = 'lims.interface.table.grouped_field'
table = fields.Many2One('lims.interface.table', 'Table',
required=True, ondelete='CASCADE')
name = fields.Char('Name', required=True)
string = fields.Char('String', required=True)
type = fields.Selection([(None, '')] + FIELD_TYPE_SELECTION,
'Field Type', required=False)
help = fields.Text('Help')
related_model = fields.Many2One('ir.model', 'Related Model')
selection = fields.Text('Selection')
domain = fields.Char('Domain Value')
formula = fields.Char('On Change With Formula')
inputs = fields.Function(fields.Char('On Change With Inputs'),
'get_inputs')
required = fields.Boolean('Required')
readonly = fields.Boolean('Read only')
invisible = fields.Boolean('Invisible')
digits = fields.Integer('Digits')
group = fields.Integer('Group')
default_width = fields.Integer('Default Width')
def get_inputs(self, name=None):
if not self.formula:
return
parser = formulas.Parser()
ast = parser.ast(self.formula)[1].compile()
return (' '.join([x for x in ast.inputs])).lower()
def get_ast(self):
parser = formulas.Parser()
ast = parser.ast(self.formula)[1].compile()
return ast
class TableView(ModelSQL, ModelView):
'Interface Table View'
__name__ = 'lims.interface.table.view'
table = fields.Many2One('lims.interface.table', 'Table',
required=True, ondelete='CASCADE')
type = fields.Char('Type')
arch = fields.Text('Arch')
field_names = fields.Char('Fields')
field_childs = fields.Char('Field Childs')
class TableGroupedView(ModelSQL, ModelView):
'Interface Table Grouped View'
__name__ = 'lims.interface.table.grouped_view'
table = fields.Many2One('lims.interface.table', 'Table',
required=True, ondelete='CASCADE')
type = fields.Char('Type')
arch = fields.Text('Arch')
field_names = fields.Char('Fields')
field_childs = fields.Char('Field Childs')
group = fields.Integer('Group')