"""Fill annotator Created by: EOLE (http://eole.orion.education.fr) Copyright (C) 2005-2018 Forked by: Cadoles (http://www.cadoles.com) Copyright (C) 2019-2021 distribued with GPL-2 or later license This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA """ from rougail.utils import load_modules from rougail.i18n import _ from rougail.error import DictConsistencyError from rougail.annotator.target import TargetAnnotator from rougail.annotator.param import ParamAnnotator CALC_MULTI = ('calc_value', 'calc_list', 'get_range', 'calc_val_first_value', 'unbound_filename', 'zone_information') class Annotator(TargetAnnotator, ParamAnnotator): """Fill annotator """ level = 60 def __init__(self, objectspace, eosfunc_file, *args, ): if not hasattr(objectspace.space, 'constraints') or \ not hasattr(objectspace.space.constraints, 'fill'): return self.objectspace = objectspace self.functions = dir(load_modules(eosfunc_file)) self.functions.extend(self.objectspace.rougailconfig['internal_functions']) self.target_is_uniq = True self.only_variable = True self.allow_function = False self.convert_target(self.objectspace.space.constraints.fill) self.convert_param(self.objectspace.space.constraints.fill) self.fill_to_value() del self.objectspace.space.constraints.fill def calc_is_multi(self, variable: 'self.objectspace.variable') -> bool: multi = variable.multi if multi is False: return multi if multi == 'submulti': return True return not self.objectspace.paths.is_follower(variable.path) def fill_to_value(self) -> None: """valid and manage """ for fill in self.objectspace.space.constraints.fill: # test if the function exists if fill.name not in self.functions: msg = _(f'cannot find fill function "{fill.name}"') raise DictConsistencyError(msg, 25, fill.xmlfiles) for target in fill.target: # create an object value value = self.objectspace.value(fill.xmlfiles) value.type = 'calculation' value.name = fill.name if fill.name not in CALC_MULTI: is_calc_multi = self.calc_is_multi(target.name) else: is_calc_multi = False value.calc_multi = is_calc_multi if target.name.namespace == 'services': target.name.default = value else: target.name.value = [value] # manage params if hasattr(fill, 'param') and fill.param: value.param = fill.param