in src/zonal/zone.py [0:0]
def vtimezone(self, calendar, rules, minYear, maxYear):
"""
Generate a VTIMEZONE for this Zone.
@param calendar: the L{Calendar} object for the VCALENDAR in which the VTIMEZONE
will be created.
@param rules: the C{dict} containing the set of Rules currently defined.
@param startYear: a C{int} containing the first year that should be present
in the VTIMEZONE.
@return: C{vtimezone} component.
"""
# Get a VTIMEZONE component
vtz = VTimezone(parent=calendar)
# Add TZID property
vtz.addProperty(Property(definitions.cICalProperty_TZID, self.name))
vtz.addProperty(Property("X-LIC-LOCATION", self.name))
transitions = self.expand(rules, minYear, maxYear)
# Group rules
lastZoneRule = None
ruleorder = []
rulemap = {}
def _generateRuleData():
# Generate VTIMEZONE component for last set of rules
for tzrule in ruleorder:
if tzrule:
# Accumulate tzrule portions with the same offset pairs
lastOffsetPair = (rulemap[tzrule][0][1], rulemap[tzrule][0][2],)
startIndex = 0
for index in xrange(len(rulemap[tzrule])):
offsetPair = (rulemap[tzrule][index][1], rulemap[tzrule][index][2],)
if offsetPair != lastOffsetPair:
tzrule.vtimezone(
vtz,
lastZoneRule,
rulemap[tzrule][startIndex][0],
rulemap[tzrule][index - 1][0],
rulemap[tzrule][startIndex][1],
rulemap[tzrule][startIndex][2],
index - startIndex,
)
lastOffsetPair = (rulemap[tzrule][index][1], rulemap[tzrule][index][2],)
startIndex = index
tzrule.vtimezone(
vtz,
lastZoneRule,
rulemap[tzrule][startIndex][0],
rulemap[tzrule][index][0],
rulemap[tzrule][startIndex][1],
rulemap[tzrule][startIndex][2],
len(rulemap[tzrule]),
)
else:
lastZoneRule.vtimezone(
vtz,
lastZoneRule,
rulemap[tzrule][0][0],
rulemap[tzrule][-1][0],
rulemap[tzrule][0][1],
rulemap[tzrule][0][2],
)
del ruleorder[:]
rulemap.clear()
for dt, offsetfrom, offsetto, zonerule, tzrule in transitions:
# Check for change of rule - we ignore LMT's
if zonerule.format != "LMT":
if lastZoneRule and lastZoneRule != zonerule:
_generateRuleData()
if tzrule not in ruleorder:
ruleorder.append(tzrule)
rulemap.setdefault(tzrule, []).append((dt, offsetfrom, offsetto,))
lastZoneRule = zonerule
# Do left overs
_generateRuleData()
self._compressRDateComponents(vtz)
vtz.finalise()
return vtz