From b926bf975f283e18a94abbcf74bba6be1c47fa03 Mon Sep 17 00:00:00 2001 From: Christian Geier Date: Thu, 30 Jan 2014 00:07:27 +0100 Subject: [PATCH] better support for broken vcards (no FN prop) We are now trying to fix vcards that have no FN (reconstruct it from the N property). For reference: github issue #90 --- pycarddav/model.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/pycarddav/model.py b/pycarddav/model.py index 235e478..6c1389d 100644 --- a/pycarddav/model.py +++ b/pycarddav/model.py @@ -122,6 +122,14 @@ def vcard_from_string(vcard_string): vcard = vobject.readOne(vcard_string) except vobject.base.ParseError as error: raise Exception(error) # TODO proper exception + + if 'fn' not in vcard.contents: # broken vcard (no FN) + logging.debug('vcard has no formatted name, reconstructing...') + name = vcard.contents['n'][0].split(';') + fname = name[2] + ' ' + name[1] + ' ' + name[0] + ' ' + name[3] + fname = fname.strip() + vcard.add('fn') + vcard.fn.value = fname return vcard_from_vobject(vcard) @@ -288,7 +296,10 @@ def generate_random_uid(): collector.append('BEGIN:VCARD') collector.append('VERSION:3.0') for key in ['FN', 'N']: - collector.append(key + ':' + self[key][0][0]) + try: + collector.append(key + ':' + self[key][0][0]) + except IndexError: # broken vcard without FN or N + collector.append(key + ':') for prop in self.alt_keys(): for line in self[prop]: