Compare commits

..

No commits in common. "1381c37500af3e429f0f1e658f88b227e77cd616" and "0efcea4879f066d9f291f5194833b9a13539599a" have entirely different histories.

5 changed files with 60 additions and 68 deletions

View file

@ -58,24 +58,12 @@ class CourseBuilder:
meta = yaml.load(fm,Loader=yaml.Loader)
table_items = schema.process(meta=meta,fields=actual_fields,lang=args.lang) if query == None else schema.to_list_of_dict(meta=meta,fields=actual_fields,lang=args.lang)
table_items = schema.process(meta=meta,fields=actual_fields,lang=args.lang) if query == None else schema.process_raw(meta=meta,fields=actual_fields,lang=args.lang)
if args.legacy:
MarkdownGenerator.generate_table_legacy(table_items=table_items,add_pagebreak=args.pagebreak,title_template=args.title,first_colwidth=args.leftcol)
elif query:
query.run(table_items)
# for i in table_items:
# print(i)
q = schema.to_list_of_tuple(meta=meta,fields=actual_fields,lang=args.lang)
for i in q:
print(i)
# MarkdownGenerator.generate_table(table_items=q,add_pagebreak=args.pagebreak,title_template=args.title,first_colwidth=args.leftcol)
else:
MarkdownGenerator.generate_table(table_items=table_items,add_pagebreak=args.pagebreak,title_template=args.title,first_colwidth=args.leftcol)

View file

@ -1,6 +1,4 @@
import pandas as pd
class Query:
def __init__(self,query) -> None:
@ -8,9 +6,8 @@ class Query:
def run(self,table_items):
# print(table_items)
# for item in table_items:
# pass
# print(item)
# print(eval(self.__query,locals()))
for row in table_items:
print(row)
# print(eval(self.__query,{row:row}))
pass

View file

@ -92,7 +92,7 @@ class Schema:
return [k,', '.join(parts)]
def process(self,meta,fields,lang):
def process(self,meta,fields = [],lang = 'de'):
table_items = []
@ -113,44 +113,52 @@ class Schema:
# maybe return tableitems as np.Dataframe?
return table_items
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 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 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):
vv = meta[field]['value']
return self.__schema[field]['values'][vv][lang]
def to_list_of_dict(self,meta,fields,lang):
# list comprehension for rows
return [{'field' : field, # field name
'lang' : lang, # language shortcode
'type' : self.__schema[field]['type'], # datatype
'label' : self.process_label(field,lang), # label
'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,
'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
def get_num(self,meta,field,lang):
return meta[field]['value']
# if self.needs_spec(field):
# t = string.Template(self.get_template(field=field,lang=lang))
# spec = meta[field]['spec'][lang]
# return [self.process_label(field,lang),t.substitute({'value': enum_val,'spec': spec})]
# else:
# return [self.process_label(field,lang),enum_val]
def get_value(self,meta,field,lang):
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 self.get_num(meta,field,lang)
case 'multinum' : return meta[field]['value']
def process_raw(self,meta,fields,lang):
items = [{'field' : field,
'lang' : lang,
'type' : self.__schema[field]['type'],
'label' : self.process_label(field,lang),
'value' : self.get_value(meta,field,lang)
}
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
# maybe return tableitems as np.Dataframe?
return items

View file

@ -33,6 +33,6 @@ debug:
# | pandoc ${target_flags} -V lang:de -o ${target_de}
debug-query:
python ${coursebuilder} -s schema.yaml -m mod.cg.yaml mod.interactsys.yaml -q "item['field'] == 'kind' and item['value'] == 'elective'"
python ${coursebuilder} -s schema.yaml -m mod.cg.yaml mod.interactsys.yaml -q "kind == compulsory"
.PHONY: clean

View file

@ -114,8 +114,8 @@ form-of-instruction:
}
}
template:
de: "{key} ({value}SWS)"
en: "{key} ({value}SWS)"
de: "${key} (${value}SWS)"
en: "${key} (${value}SWS)"
#
# Voraussetzungen für die Teilnahme
@ -181,15 +181,14 @@ workload:
# credits/ECTS
#
credits:
type: num
unit: ECTS
type: num
label: {
en: "credits and weight of mark",
de: "Kreditpunkte und Gewichtung der Note in der Gesamtnote"
}
template:
de: "{value}CP, Gewichtung: {value}CP von 120CP "
en: "{value}CP, weight: {value} / 120 "
de: "${value}CP, Gewichtung: ${value}CP von 120CP "
en: "${value}CP, weight: ${value} / 120 "
#
@ -217,8 +216,8 @@ form-of-exam:
}
spec: true
template:
de: "{value} ({spec})"
en: "{value} ({spec})"
de: "${value} (${spec})"
en: "${value} (${spec})"
#
@ -263,8 +262,8 @@ duration:
de: Dauer
en: duration
template:
de: "{value} Semester"
en: "{value} term(s)"
de: "$value Semester"
en: "$value term(s)"
#
# Art der Veranstaltung