lims_analysis_sheet: allow REFERENCE_VALUE function as default value

This commit is contained in:
Adrián Bernardi 2022-05-26 20:59:03 -03:00
parent 6234f020e8
commit e0f56a7056
1 changed files with 58 additions and 19 deletions

View File

@ -1,7 +1,10 @@
# This file is part of lims_analysis_sheet module for Tryton.
# The COPYRIGHT file at the top level of this repository contains
# the full copyright notices and license terms.
import formulas
import schedula
import functools
from itertools import chain
from io import StringIO
from decimal import Decimal
from datetime import datetime, date
@ -21,6 +24,7 @@ from trytond.exceptions import UserError
from trytond.i18n import gettext
from trytond.modules.lims_interface.interface import str2date, \
get_model_resource
from trytond.modules.lims_interface.data import ALLOWED_RESULT_TYPES
class TemplateAnalysisSheet(DeactivableMixin, ModelSQL, ModelView):
@ -949,25 +953,8 @@ class AnalysisSheet(Workflow, ModelSQL, ModelView):
Data = Pool().get('lims.interface.data')
interface = self.template.interface
defaults = {}
schema, _ = self.compilation._get_schema()
for k in list(schema.keys()):
if schema[k]['default_value'] is None:
continue
value = schema[k]['default_value']
if value.startswith('='):
continue
if schema[k]['type'] == 'boolean':
defaults[k] = bool(value)
elif schema[k]['type'] == 'date':
defaults[k] = str2date(value, interface.language)
elif schema[k]['type'] == 'many2one':
resource = get_model_resource(schema[k]['model_name'],
value, schema[k]['field_name'])
defaults[k] = resource and resource[0].id
else:
defaults[k] = value
defaults = self.get_data_defaults()
with Transaction().set_context(
lims_interface_table=self.compilation.table.id):
@ -981,7 +968,9 @@ class AnalysisSheet(Workflow, ModelSQL, ModelView):
for k in list(schema.keys()):
if (schema[k]['default_value'] is not None and
schema[k]['default_value'].startswith('=')):
schema[k]['default_value'].startswith('=') and
not schema[k]['default_value'].startswith(
'=REFERENCE_VALUE')):
path = schema[k]['default_value'][1:].split('.')
field = path.pop(0)
try:
@ -1018,6 +1007,56 @@ class AnalysisSheet(Workflow, ModelSQL, ModelView):
if data:
Data.create(data)
def get_data_defaults(self):
defaults = {}
schema, _ = self.compilation._get_schema()
for k in list(schema.keys()):
value = schema[k]['default_value']
if value in (None, ''):
continue
if value.startswith('=REFERENCE_VALUE'):
parser = formulas.Parser()
ast = parser.ast(value)[1].compile()
try:
value = ast()
except schedula.utils.exc.DispatcherError as e:
raise UserError(e.args[0] % e.args[1:])
if isinstance(value, list):
value = str(value)
elif not isinstance(value, ALLOWED_RESULT_TYPES):
value = value.tolist()
if isinstance(value, formulas.tokens.operand.XlError):
value = None
elif isinstance(value, list):
for x in chain(*value):
if isinstance(x, formulas.tokens.operand.XlError):
value = None
defaults[k] = value
continue
if value.startswith('='):
continue
if schema[k]['type'] == 'integer':
defaults[k] = int(value)
elif schema[k]['type'] == 'float':
defaults[k] = float(value)
elif schema[k]['type'] == 'numeric':
defaults[k] = Decimal(str(value))
elif schema[k]['type'] == 'boolean':
defaults[k] = bool(value)
elif schema[k]['type'] == 'date':
defaults[k] = str2date(value,
self.compilation.interface.language)
elif schema[k]['type'] == 'many2one':
resource = get_model_resource(
schema[k]['model_name'], value,
schema[k]['field_name'])
defaults[k] = resource and resource[0].id
else:
defaults[k] = str(value)
return defaults
class OpenAnalysisSheetData(Wizard):
'Open Analysis Sheet Data'