86 lines
3.5 KiB
Python
86 lines
3.5 KiB
Python
from configparser import ConfigParser
|
|
import json
|
|
import logging
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class Persistence:
|
|
_options: dict = {
|
|
# config (section, option): (varname, type conversion function)
|
|
('main', 'settings'): ('templates', json.loads),
|
|
('main', 'output_dest_dir'): ('output_path', None),
|
|
('main', 'enabled_templates'): ('enabled_templates', lambda s: [x for x in s.split(',') if x]),
|
|
('main', 'disabled_templates'): ('disabled_templates', lambda s: [x for x in s.split(',') if x]),
|
|
('main', 'create_svg'): ('create_svg', lambda x: x == "True"),
|
|
('main', 'del_temp_files'): ('del_temp_files', lambda x: x == "True"),
|
|
('main', 'delete_single_page_files'): ('del_single_page_files', lambda x: x == "True"),
|
|
('main', 'assembly_file_extension'): ('assembly_file_extension', None),
|
|
('main', 'page_info'): ('page_info', None),
|
|
('main', 'info_variable'): ('info_variable', None),
|
|
}
|
|
_typeconv: dict = {
|
|
bool: lambda x: "True" if x else "False",
|
|
(list, tuple): lambda x: ",".join(x),
|
|
dict: lambda x: json.dumps(x, indent=4),
|
|
(int, float): lambda x: str(x),
|
|
str: lambda x: x,
|
|
}
|
|
|
|
def __init__(self, configfile: str):
|
|
self._config: ConfigParser = ConfigParser()
|
|
self._configfile: str = configfile
|
|
|
|
self.templates: dict = {}
|
|
self.output_path: str = 'plot'
|
|
self.enabled_templates: list = []
|
|
self.disabled_templates: list = []
|
|
self.create_svg: bool = False
|
|
self.del_temp_files: bool = True
|
|
self.del_single_page_files: bool = True
|
|
self.assembly_file_extension: str = "__Assembly"
|
|
self.page_info: str = 'Board2Pdf: ${template_name} - Page ${page_nr}/${total_pages}'
|
|
self.info_variable: str = '4'
|
|
|
|
self.default_settings_file_path: str = ''
|
|
self.global_settings_file_path: str = ''
|
|
self.local_settings_file_path: str = ''
|
|
|
|
def save(self, file_path: str):
|
|
_logger.debug(f"save config")
|
|
self._config.read(self._configfile)
|
|
|
|
# `value` type conversion to string
|
|
for (section, option), (varname, str2type) in self._options.items():
|
|
value = getattr(self, varname)
|
|
for _types, convert in self._typeconv.items():
|
|
_logger.info(f"{section},{option}: {varname}")
|
|
if isinstance(value, _types):
|
|
value = convert(value)
|
|
break
|
|
else:
|
|
raise Exception(f"unknown value type {type(value)}")
|
|
|
|
if not self._config.has_section(section):
|
|
self._config.add_section(section)
|
|
self._config.set(section, option, value)
|
|
|
|
with open(file_path, 'w') as f:
|
|
try:
|
|
self._config.write(f)
|
|
except:
|
|
raise Exception(f"Unable to save")
|
|
|
|
def load(self) -> dict:
|
|
self._config.read(self._configfile)
|
|
|
|
values = {} # alternative output
|
|
for (section, option), (varname, post_action) in self._options.items():
|
|
if self._config.has_option(section, option):
|
|
val = self._config.get(section, option)
|
|
values[varname] = post_action(val) if post_action else val
|
|
setattr(self, varname, values[varname])
|
|
_logger.info(f"{varname}={values[varname]}")
|
|
|
|
return values
|