From 3af50b0bea1e6d42d5bbb0b26f66b6ce7871e136 Mon Sep 17 00:00:00 2001 From: Vassilii Khachaturov Date: Mon, 25 Nov 2013 12:37:19 +0200 Subject: [PATCH] 7212: convert invalid date to text on import Consolidate the new logic with the older code -- now malformatted dates, as well as well-formatted invalid ones, will also be converted to text. --- gramps/plugins/importer/importvcard.py | 28 +++++++++++-------- .../plugins/importer/test/importvcard_test.py | 12 ++++++++ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/gramps/plugins/importer/importvcard.py b/gramps/plugins/importer/importvcard.py index ac505810d..9c0104fdb 100644 --- a/gramps/plugins/importer/importvcard.py +++ b/gramps/plugins/importer/importvcard.py @@ -465,15 +465,13 @@ class VCardParser(object): """Read the BDAY property of a VCard.""" date_str = data.strip() date_match = VCardParser.DATE_RE.match(date_str) + date = Date() if date_match: if date_match.group(2): date_str = "%s-%s-%s" % (date_match.group(2), date_match.group(3), date_match.group(4)) else: date_str = date_match.group(1) - event = Event() - event.set_type(EventType(EventType.BIRTH)) - date = Date() y, m, d = [int(x, 10) for x in date_str.split('-')] try: date.set(value=(d, m, y, False)) @@ -482,18 +480,24 @@ class VCardParser(object): # in the format string, but you may re-order them if needed. LOG.warning(_( "Invalid date {date} in BDAY {vcard_snippet}, " - "preserving date as text" + "preserving date as text." ).format(date=e.date.to_struct(), vcard_snippet=data)) date.set(modifier=Date.MOD_TEXTONLY, text=data) - event.set_date_object(date) - self.database.add_event(event, self.trans) - - event_ref = EventRef() - event_ref.set_reference_handle(event.get_handle()) - self.person.set_birth_ref(event_ref) else: - LOG.warn("Date %s not in appropriate format yyyy-mm-dd, " - "line skipped." % date_str) + # TRANSLATORS: leave the {vcard_snippet} untranslated. + LOG.warning(_( + "Date {vcard_snippet} not in appropriate format yyyy-mm-dd, " + "preserving date as text." + ).format(vcard_snippet=date_str)) + date.set(modifier=Date.MOD_TEXTONLY, text=date_str) + event = Event() + event.set_type(EventType(EventType.BIRTH)) + event.set_date_object(date) + self.database.add_event(event, self.trans) + + event_ref = EventRef() + event_ref.set_reference_handle(event.get_handle()) + self.person.set_birth_ref(event_ref) def add_occupation(self, fields, data): """Read the ROLE property of a VCard.""" diff --git a/gramps/plugins/importer/test/importvcard_test.py b/gramps/plugins/importer/test/importvcard_test.py index 34b3762d8..6db458c63 100644 --- a/gramps/plugins/importer/test/importvcard_test.py +++ b/gramps/plugins/importer/test/importvcard_test.py @@ -462,6 +462,18 @@ class VCardCheck(unittest.TestCase): ET.SubElement(event, 'datestr', {'val': '20010229'}) self.do_test("\r\n".join(self.vcard), self.gramps) + def test_birthday_invalid_format_converted_to_datestr(self): + self.vcard.insert(4, 'BDAY:unforgettable') + attribs = {'hlink': 'E0000', 'role': 'Primary'} + eventref = ET.SubElement(self.person, 'eventref', attribs) + events = ET.Element('events') + self.gramps.insert(1, events) + attribs = {'handle': 'E0000', 'id': 'E0000'} + event = ET.SubElement(events, 'event', attribs) + ET.SubElement(event, 'type').text = 'Birth' + ET.SubElement(event, 'datestr', {'val': 'unforgettable'}) + self.do_test("\r\n".join(self.vcard), self.gramps) + def test_add_birthday_one_dash(self): self.vcard.insert(4, 'BDAY:2001-0928') attribs = {'hlink': 'E0000', 'role': 'Primary'}