7197: back-port the fix 68c0615b from gramps40

The failing test now passes.

Back-porting work done:
1) use numbers in format strings for str.format, for py2.6 compat
2) downgrade to_struct to dateval as there's no to_struct in gramps34

Original commit:
	commit 68c0615bc4
	Author: Vassilii Khachaturov <vassilii@tarunz.org>
	Date:   Fri Nov 15 15:43:27 2013 +0200

		7197: merge the fix from master
This commit is contained in:
Vassilii Khachaturov 2013-11-15 18:30:53 +02:00
parent 5e78d54c9c
commit 62cd754ef4

View File

@ -3,6 +3,7 @@
#
# Copyright (C) 2000-2007 Donald N. Allingham
# Copyright (C) 2009 Douglas S. Blank
# Copyright (C) 2013 Vassilii Khachaturov
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -1497,6 +1498,31 @@ class Date(object):
day = max(d, 1)
return (year, month, day)
def _adjust_newyear(self):
"""
Returns year adjustment performed (0 or -1).
"""
ny = self.get_new_year()
year_delta = 0
if ny: # new year offset?
if ny == Date.NEWYEAR_MAR1:
split = (3, 1)
elif ny == Date.NEWYEAR_MAR25:
split = (3, 25)
elif ny == Date.NEWYEAR_SEP1:
split = (9, 1)
elif isinstance(ny, (list, tuple)):
split = ny
else:
split = (0, 0)
if (self.get_month(), self.get_day()) >= split and split != (0, 0):
year_delta = -1
d1 = Date(self.get_year() + year_delta, self.get_month(), self.get_day())
d1.set_calendar(self.calendar)
d1.recalc_sort_value()
self.sortval = d1.sortval
return year_delta
def set(self, quality=None, modifier=None, calendar=None,
value=None,
text=None, newyear=0):
@ -1577,24 +1603,7 @@ class Date(object):
self.set_calendar(Date.CAL_JULIAN)
self.recalc_sort_value()
ny = self.get_new_year()
year_delta = 0
if ny: # new year offset?
if ny == Date.NEWYEAR_MAR1:
split = (3, 1)
elif ny == Date.NEWYEAR_MAR25:
split = (3, 25)
elif ny == Date.NEWYEAR_SEP1:
split = (9, 1)
elif isinstance(ny, (list, tuple)):
split = ny
else:
split = (0, 0)
if (self.get_month(), self.get_day()) >= split and split != (0, 0):
year_delta = -1
d1 = Date(self.get_year() + year_delta, self.get_month(), self.get_day())
d1.set_calendar(self.calendar)
self.sortval = d1.sortval
year_delta = self._adjust_newyear()
if text:
self.text = text
@ -1602,35 +1611,46 @@ class Date(object):
if modifier != Date.MOD_TEXTONLY:
sanity = Date(self)
sanity.convert_calendar(self.calendar, known_valid = False)
# convert_calendar resets slash and new year, restore these as needed
if sanity.get_slash() != self.get_slash():
sanity.set_slash(self.get_slash())
if self.is_compound() and sanity.get_slash2() != self.get_slash2():
sanity.set_slash2(self.get_slash2())
if sanity.get_new_year() != self.get_new_year():
sanity.set_new_year(self.get_new_year())
sanity._adjust_newyear()
# We don't do the roundtrip conversion on self, becaue
# it would remove uncertainty on day/month expressed with zeros
# Did the roundtrip change the date value?!
if sanity.dateval != value:
# Maybe it is OK because of undetermined value adjustment?
zl = zip(sanity.dateval, value)
# Loop over all values present, whether compound or not
for d,m,y,sl in zip(*[iter(zl)]*4):
# each of d,m,y,sl is a pair from dateval and value, to compare
try:
# Maybe it is OK because of undetermined value adjustment?
zl = zip(sanity.dateval, value)
# Loop over all values present, whether compound or not
for d,m,y,sl in zip(*[iter(zl)]*4):
# each of d,m,y,sl is a pair from dateval and value, to compare
adjusted,original = sl
if adjusted != original:
raise DateError("Invalid date value {0}".
format(value))
for adjusted,original in d,m:
for adjusted,original in d,m:
if adjusted != original and not(original == 0 and adjusted == 1):
raise DateError("Invalid day/month {0} passed in value {1}".
format(original, value))
adjusted,original = y
adjusted -= year_delta
if adjusted != original and not(original == 0 and adjusted == 1):
log.debug("Sanity check failed - self: {0}, sanity: {1}".format(
self.dateval, sanity.dateval))
raise DateError("Invalid day/month {} passed in value {}".
raise DateError("Invalid year {0} passed in value {1}".
format(original, value))
adjusted,original = y
adjusted -= year_delta
if adjusted != original and not(original == 0 and adjusted == 1):
log.debug("Sanity check failed - self: {0}, sanity: {1}".format(
self.dateval, sanity.dateval))
raise DateError("Invalid year {} passed in value {}".
format(original, value))
# ignore slash difference
except DateError:
log.debug("Sanity check failed - self: {0}, sanity: {1}".format(
self.dateval, sanity.dateval))
raise
def recalc_sort_value(self):
"""