MVP of reworked tuple generation

This commit is contained in:
Hartmut Seichter 2024-05-18 22:26:50 +02:00
parent 833f0bdf4c
commit 1381c37500
4 changed files with 53 additions and 30 deletions
coursebuilder

View file

@ -92,7 +92,7 @@ class Schema:
return [k,', '.join(parts)]
def process(self,meta,fields = [],lang = 'de'):
def process(self,meta,fields,lang):
table_items = []
@ -113,28 +113,15 @@ class Schema:
# maybe return tableitems as np.Dataframe?
return table_items
def get_str(self,meta,field,lang='de'):
if self.is_translatable(field):
return meta[field][lang]
else:
if not 'value' in meta[field]:
raise AssertionError(field,'incomplete')
return meta[field]['value']
def get_enum(self,meta,field,lang):
enum_val = meta[field]['value']
return self.__schema[field]['values'][ enum_val ][lang]
def get_value(self,meta,field,lang):
"""treats receiving the value like a variant,
return values are language specific"""
match self.__schema[field]['type']:
case 'str': return self.get_str(meta,field,lang)
case 'enum': return self.get_enum(meta,field,lang)
case 'int' | 'num' : return meta[field]['value']
case 'multinum' : return meta[field]['value']
case 'str': return meta[field][lang] if self.is_translatable(field) else meta[field]['value']
case 'enum' | 'int' | 'num' | 'multikey' : return meta[field]['value']
case 'multinum': return meta[field]['value'] if hasattr(meta[field]['value'],'__iter__') else (meta[field]['value'],) # force list!
def to_dataframe(self,meta,fields,lang):
def to_list_of_dict(self,meta,fields,lang):
# list comprehension for rows
return [{'field' : field, # field name
'lang' : lang, # language shortcode
@ -143,6 +130,27 @@ class Schema:
'value' : self.get_value(meta,field,lang), # actual value
'template' : self.__schema[field]['template'][lang] if 'template' in self.__schema[field] else None,
# getting crazy with nested dict comprehension
'enum_values' : { k:v[lang] for (k,v) in self.__schema[field]['values'].items()} if 'enum' in self.__schema[field]['type'] else None
'enum_values' : { k:v[lang] for (k,v) in self.__schema[field]['values'].items()} if 'enum' in self.__schema[field]['type'] else None,
'key_values' : { k:v[lang] for (k,v) in self.__schema[field]['keys'].items()} if 'multikey' in self.__schema[field]['type'] else None,
'spec' : meta[field]['spec'][lang] if 'spec' in meta[field] else None
}
for field in fields]
def to_list_of_tuple(self,meta,fields,lang):
# generate a list of tuples with key and value (text)
list = []
for r in self.to_list_of_dict(meta,fields,lang):
match r['type']:
case 'str' :
list.append( (r['label'],r['value']) )
case 'int' | 'num' :
list.append( ( r['label'], r['template'].format(value=r['value'],spec=r['spec']) if r['template'] else r['value']) )
case 'enum' :
list.append( ( r['label'], r['template'].format(value=r['enum_values'][r['value']],spec=r['spec'])
if r['template'] else r['enum_values'][r['value']] ) )
case 'multikey' :
list.append( ( r['label'], ', '.join( [r['template'].format(key=r['key_values'][k],value=v) for k,v in r['value'].items()] ) ) )
case 'multinum' :
list.append( (r['label'], ', '.join( r['template'].format(value=v) for v in r['value'])) )
return list