91 lines
2.9 KiB
Python
91 lines
2.9 KiB
Python
fields = {
|
|
'book':
|
|
[('isbn', 's'), ('title', 's'), ('category', 's'),
|
|
('subtitle', 's'), ('persons', 'd'), ('publisher', 's'),
|
|
('published_year', 's'), ('edition', 's'), ('num_pages', 's'),
|
|
('series', 's'), ('description', 's'), # TODO picture, thumbnail
|
|
('references', 'd')],
|
|
'person':
|
|
[('id', 's'), ('first_name', 's'), ('last_name', 's')],
|
|
'category':
|
|
[('id', 's'), ('name', 's'), ('placement', 'l')] }
|
|
action_fields = {
|
|
'new-book':
|
|
{ 'type': 'book',
|
|
'required': ['isbn', 'title', 'category'] },
|
|
'edit-book':
|
|
{ 'type': 'book',
|
|
'required': ['isbn'] },
|
|
'delete-book':
|
|
{ 'type': 'book',
|
|
'required': ['isbn'] },
|
|
'new-person':
|
|
{ 'type': 'person',
|
|
'required': ['id', 'first_name', 'last_name'] },
|
|
'edit-person':
|
|
{ 'type': 'person',
|
|
'required': ['id'] },
|
|
'delete-person':
|
|
{ 'type': 'person',
|
|
'required': ['id'] },
|
|
'new-category':
|
|
{ 'type': 'category',
|
|
'required': ['id', 'name'] },
|
|
'edit-category':
|
|
{ 'type': 'category',
|
|
'required': ['id'] },
|
|
'delete-category':
|
|
{ 'type': 'category',
|
|
'required': ['id'] } }
|
|
|
|
def read_action(lines):
|
|
d = {}
|
|
lastfield = None
|
|
for line in lines:
|
|
if len(line) == 0:
|
|
raise 'Empty line in action'
|
|
if line[0] in [' ', '\t']: # continuation line
|
|
if not lastfield:
|
|
raise 'First line is continuation line'
|
|
d[lastfield] = d[lastfield] + '\n' + line.strip()
|
|
else:
|
|
field, value = line.split(':', 1)
|
|
# TODO skriv ferdig
|
|
|
|
def write_field_value_str(val):
|
|
lines = ''
|
|
value_lines = val.split('\n')
|
|
for l in value_lines:
|
|
lines += ' ' + l + '\n'
|
|
return lines
|
|
|
|
def write_field_value_dict(val):
|
|
lines = '\n'
|
|
for (key,values) in val.items():
|
|
for single_value in values:
|
|
lines += ' ' + key + ' ' + single_value + '\n'
|
|
return lines
|
|
|
|
def write_field_value_list(val):
|
|
lines = ''
|
|
for single_value in val:
|
|
lines += ' ' + single_value
|
|
return lines
|
|
|
|
def write_action(d):
|
|
action = d['action']
|
|
lines = 'action: ' + action + '\n'
|
|
data_type = action_fields[action]['type']
|
|
for field, ftype in fields[data_type]:
|
|
if field in d:
|
|
value_writer = {'s': write_field_value_str,
|
|
'd': write_field_value_dict,
|
|
'l': write_field_value_list}[ftype]
|
|
lines += field + ':' + value_writer(d[field])
|
|
return lines
|
|
|
|
def write_actionlist(actions):
|
|
return '\n'.join(map(write_action, actions))
|
|
|
|
# test: print write_actionlist([{'action':'new-book','isbn':'434545'},{'action':'edit-book','isbn':'654654745','persons':{'author':['ab','foo'],'illustrator':['moo']}},{'action':'edit-category','id':'matematikk','name':'Matematikk','placement':['T10','T11']}])
|