Last active
December 25, 2016 16:06
-
-
Save jaseg/97fd37f12aa0232e429bdcb391006d97 to your computer and use it in GitHub Desktop.
Convert mailbox.org/openXchange contact exports to Fritzbox Phonebook backup files
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
# coding: utf-8 | |
import csv | |
import argparse | |
avm_xml_template = '''<?xml version="1.0" encoding="utf-8"?> | |
<phonebooks> | |
<phonebook> | |
{entries} | |
</phonebook> | |
</phonebooks>''' | |
contact_xml_template = '''<contact> | |
<category /> | |
<person> | |
<realName>{name}</realName> | |
</person> | |
<telephony nid="1"> | |
<number prio="1" type="home" id="0">{number}</number> | |
</telephony> | |
<services /> | |
<setup /> | |
<uniqueid>{uid}</uniqueid> | |
</contact>''' | |
defaultget = lambda entry, fields: next(entry[field] for field in fields if entry.get(field)) | |
make_name = lambda entry: entry.get('Display name') or ' '.join([val for val in map(entry.get, ['Given name', 'Middle name', 'Sur name']) if val]) or entry.get('Company') or entry.get('Unnamed, blame converter script') | |
def convert_file(infile): | |
return avm_xml_template.format(entries='\n'.join(convert_entries(infile))) | |
def convert_entries(infile): | |
reader = csv.DictReader(infile) | |
telephone_fields = [n for n in reader.fieldnames if 'elephone' in n] | |
for uid, entry in enumerate(list(reader), 11): | |
try: | |
yield contact_xml_template.format(name=make_name(entry), number=defaultget(entry, telephone_fields), uid=uid) | |
except StopIteration: | |
# Contact has no phone number | |
print('No phone number found for', make_name(entry)) | |
if __name__ == '__main__': | |
parser = argparse.ArgumentParser() | |
parser.add_argument('infile', type=str) | |
parser.add_argument('outfile', type=str) | |
args = parser.parse_args() | |
with open(args.infile, 'r') as infile: | |
with open(args.outfile, 'w') as outfile: | |
outfile.write(convert_file(infile)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment