aboutsummaryrefslogtreecommitdiff
path: root/scripts/tellico2lesana
blob: 1c579c910412a06fa4654eba051e32dff6f78023 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/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()