#!/usr/bin/env python3 from xml.etree import ElementTree import zipfile import lesana import guacamole XML_NS = '{http://periapsis.org/tellico/}' # https://docs.kde.org/trunk5/en/extragear-office/tellico/field-type-values.html F_TYPE_MAP = { '0': 'string', # not in the specs, but seen in the wild '1': 'string', '2': 'text', '3': 'string', '4': 'bool', '6': 'integer', '7': 'url', '8': 'list', # single column table '10': 'file', '12': 'timestamp', # date '14': 'integer', # rating } class T2L(guacamole.Command): """ Manage collections """ def register_arguments(self, parser): parser.add_argument( '-c', '--collection', help='Name of the new lesana collection', default=None, ) parser.add_argument( 'file', help='Tellico file to convert to lesana.', ) def invoked(self, ctx): with zipfile.ZipFile(ctx.args.file, 'r') as zp: tree = ElementTree.parse(zp.open('tellico.xml')) # open collection xml_collection = tree.getroot().find(XML_NS+'collection') # get collection settings title = xml_collection.attrib['title'] xml_fields = xml_collection.find(XML_NS+'fields') fields = [] for xf in xml_fields: print(xf.attrib) f_type = F_TYPE_MAP.get(xf.attrib['format']) # TODO: support fields with the multiple values flag # (they should probably become lists) fields.append({ 'name': xf.attrib['name'], 'type': f_type, 'help': xf.attrib['title'], }) # Create a collection with the settings we have loaded directory = ctx.args.collection or ctx.args.file.replace( '.tc', '.lesana' ) lesana.collection.Collection.init( directory=directory, git_enabled=False, settings={ 'name': title, 'fields': fields, } ) # import data for xe in xml_collection.findall(XML_NS+'entry'): data = { 'uid': xe.attrib['id'] } for xfield in xe.getchildren(): print(xfield, xfield.text) if __name__ == '__main__': T2L().main()