From b3259d0a002a48efd78462e106843901db825252 Mon Sep 17 00:00:00 2001 From: Vassilii Khachaturov Date: Mon, 25 Nov 2013 12:24:00 +0200 Subject: [PATCH] 7212: convert invalid date to text on import Switch vcard birthday import code to use the validating Date.set and catch the exception, convert to text mode if caught. --- gramps/plugins/importer/importvcard.py | 15 ++++++++++-- .../plugins/importer/test/importvcard_test.py | 23 ++++++++++++------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/gramps/plugins/importer/importvcard.py b/gramps/plugins/importer/importvcard.py index eb4bef452..ac505810d 100644 --- a/gramps/plugins/importer/importvcard.py +++ b/gramps/plugins/importer/importvcard.py @@ -49,7 +49,8 @@ LOG = logging.getLogger(".ImportVCard") # #------------------------------------------------------------------------- from gramps.gen.errors import GrampsImportError -from gramps.gen.lib import Address, Date, Event, EventRef, EventType, Name, NameType, Person, Surname, Url, UrlType +from gramps.gen.lib import (Address, Date, DateError, Event, EventRef, + EventType, Name, NameType, Person, Surname, Url, UrlType) from gramps.gen.db import DbTxn from gramps.gen.plug.utils import OpenFileOrStdin @@ -473,7 +474,17 @@ class VCardParser(object): event = Event() event.set_type(EventType(EventType.BIRTH)) date = Date() - date.set_yr_mon_day(*[int(x, 10) for x in date_str.split('-')]) + y, m, d = [int(x, 10) for x in date_str.split('-')] + try: + date.set(value=(d, m, y, False)) + except DateError as e: + # TRANSLATORS: leave the {date} and {vcard_snippet} untranslated + # 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" + ).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) diff --git a/gramps/plugins/importer/test/importvcard_test.py b/gramps/plugins/importer/test/importvcard_test.py index 10ac28732..34b3762d8 100644 --- a/gramps/plugins/importer/test/importvcard_test.py +++ b/gramps/plugins/importer/test/importvcard_test.py @@ -79,7 +79,7 @@ class VCardCheck(unittest.TestCase): if debug: print(input_str) - process = subprocess.Popen('python Gramps.py ' + process = subprocess.Popen('python Gramps.py -d .Date -d .ImportVCard ' '--config=preferences.eprefix:DEFAULT ' '-i - -f vcf -e - -f gramps', stdin=subprocess.PIPE, @@ -87,10 +87,11 @@ class VCardCheck(unittest.TestCase): stderr=subprocess.PIPE, shell=True) result_str, err_str = process.communicate(input_str.encode('utf-8')) + if debug: + print(err_str) result_doc = ET.XML(result_str) if debug: - print(err_str) print(self.canonicalize(result_doc)) print(self.canonicalize(expect_doc)) self.assertEqual(self.canonicalize(result_doc), @@ -449,6 +450,18 @@ class VCardCheck(unittest.TestCase): ET.SubElement(event, 'dateval', {'val': '2001-09-28'}) self.do_test("\r\n".join(self.vcard), self.gramps) + def test_birthday_long_Feb_converted_to_datestr(self): + self.vcard.insert(4, 'BDAY:20010229') + 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': '20010229'}) + 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'} @@ -465,12 +478,6 @@ class VCardCheck(unittest.TestCase): self.vcard.insert(4, "BDAY:28-09-2001") self.do_test("\r\n".join(self.vcard), self.gramps) - #def test_add_birthday_non_existant(self): - # # This test fails, I think gen.lib.date.set_yr_mon_day should raise - # # an error if a wrong date is entered. - # self.vcard.insert(4, 'BDAY:2001-13-28') - # self.do_test("\r\n".join(self.vcard), self.gramps) - def test_add_birthday_empty(self): self.vcard.insert(4, "BDAY: ") self.do_test("\r\n".join(self.vcard), self.gramps)