From 8bc552c48886a7cb806e846963a87080c2b740e2 Mon Sep 17 00:00:00 2001 From: oysteini Date: Sat, 5 Mar 2011 17:53:13 +0000 Subject: [PATCH] =?UTF-8?q?Kode=20for=20=C3=A5=20skrive=20ut=20commit-form?= =?UTF-8?q?atet.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python/fileformat.py | 90 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 python/fileformat.py diff --git a/python/fileformat.py b/python/fileformat.py new file mode 100644 index 0000000..df588a4 --- /dev/null +++ b/python/fileformat.py @@ -0,0 +1,90 @@ +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']}])