1.1 --- a/imiptools/data.py Mon Sep 11 23:57:30 2017 +0200
1.2 +++ b/imiptools/data.py Tue Sep 12 18:33:53 2017 +0200
1.3 @@ -946,6 +946,12 @@
1.4 return address
1.5
1.6 def is_mailto_uri(value):
1.7 +
1.8 + """
1.9 + Return whether 'value' is a mailto: URI, with the protocol potentially being
1.10 + in upper case.
1.11 + """
1.12 +
1.13 return value.lower().startswith("mailto:")
1.14
1.15 def get_uri(value):
1.16 @@ -953,6 +959,9 @@
1.17 "Return a URI for the given 'value'."
1.18
1.19 if not value: return None
1.20 +
1.21 + # Normalise to "mailto:" or return other URI form.
1.22 +
1.23 return is_mailto_uri(value) and ("mailto:%s" % value[7:]) or \
1.24 ":" in value and value or \
1.25 "mailto:%s" % get_address(value)
2.1 --- a/imiptools/period.py Mon Sep 11 23:57:30 2017 +0200
2.2 +++ b/imiptools/period.py Tue Sep 12 18:33:53 2017 +0200
2.3 @@ -33,6 +33,12 @@
2.4 if x is None: return y
2.5 else: return x
2.6
2.7 +def start_point(obj):
2.8 + return Comparable(ifnone(obj.get_start_point(), StartOfTime()))
2.9 +
2.10 +def end_point(obj):
2.11 + return Comparable(ifnone(obj.get_end_point(), EndOfTime()))
2.12 +
2.13 class Comparable:
2.14
2.15 "A date/datetime wrapper that allows comparisons with other types."
2.16 @@ -158,23 +164,23 @@
2.17
2.18 if isinstance(other, PeriodBase):
2.19 return cmp(
2.20 - (Comparable(ifnone(self.get_start_point(), StartOfTime())), Comparable(ifnone(self.get_end_point(), EndOfTime()))),
2.21 - (Comparable(ifnone(other.get_start_point(), StartOfTime())), Comparable(ifnone(other.get_end_point(), EndOfTime())))
2.22 + (start_point(self), end_point(self)),
2.23 + (start_point(other), end_point(other))
2.24 )
2.25 else:
2.26 return 1
2.27
2.28 def overlaps(self, other):
2.29 - return Comparable(ifnone(self.get_end_point(), EndOfTime())) > Comparable(ifnone(other.get_start_point(), StartOfTime())) and \
2.30 - Comparable(ifnone(self.get_start_point(), StartOfTime())) < Comparable(ifnone(other.get_end_point(), EndOfTime()))
2.31 + return end_point(self) > start_point(other) and \
2.32 + start_point(self) < end_point(other)
2.33
2.34 def within(self, other):
2.35 - return Comparable(ifnone(self.get_start_point(), StartOfTime())) >= Comparable(ifnone(other.get_start_point(), StartOfTime())) and \
2.36 - Comparable(ifnone(self.get_end_point(), EndOfTime())) <= Comparable(ifnone(other.get_end_point(), EndOfTime()))
2.37 + return start_point(self) >= start_point(other) and \
2.38 + end_point(self) <= end_point(other)
2.39
2.40 def common(self, other):
2.41 - start = max(Comparable(ifnone(self.get_start_point(), StartOfTime())), Comparable(ifnone(other.get_start_point(), StartOfTime())))
2.42 - end = min(Comparable(ifnone(self.get_end_point(), EndOfTime())), Comparable(ifnone(other.get_end_point(), EndOfTime())))
2.43 + start = max(start_point(self), start_point(other))
2.44 + end = min(end_point(self), end_point(other))
2.45 if start <= end:
2.46 return self.make_corrected(start.dt, end.dt)
2.47 else:
3.1 --- a/imipweb/data.py Mon Sep 11 23:57:30 2017 +0200
3.2 +++ b/imipweb/data.py Tue Sep 12 18:33:53 2017 +0200
3.3 @@ -129,17 +129,23 @@
3.4
3.5 dtstart, dtstart_attr = self.get_start_item()
3.6 if not dtstart:
3.7 - raise PeriodError(*[index is not None and ("dtstart", index) or "dtstart"])
3.8 + if index is not None:
3.9 + raise PeriodError(("dtstart", index))
3.10 + else:
3.11 + raise PeriodError("dtstart")
3.12
3.13 dtend, dtend_attr = self.get_end_item()
3.14 if not dtend:
3.15 - raise PeriodError(*[index is not None and ("dtend", index) or "dtend"])
3.16 + if index is not None:
3.17 + raise PeriodError(("dtend", index))
3.18 + else:
3.19 + raise PeriodError("dtend")
3.20
3.21 if dtstart > dtend:
3.22 - raise PeriodError(*[
3.23 - index is not None and ("dtstart", index) or "dtstart",
3.24 - index is not None and ("dtend", index) or "dtend"
3.25 - ])
3.26 + if index is not None:
3.27 + raise PeriodError(("dtstart", index), ("dtend", index))
3.28 + else:
3.29 + raise PeriodError("dtstart", "dtend")
3.30
3.31 return EventPeriod(dtstart, end_date_to_calendar(dtend), self.tzid,
3.32 self.origin, dtstart_attr, dtend_attr,