3 HCE project, Python bindings, Distributed Tasks Manager application. 4 PDateTimezonesHandler Class content main functional calculate offset use timezones. 7 @file PDateTimezonesHandler.py 8 @author Alexander Vybornyh <alexander.hce.cluster@gmail.com> 9 @link: http://hierarchical-cluster-engine.com/ 10 @copyright: Copyright © 2013-2016 IOIX Ukraine 11 @license: http://hierarchical-cluster-engine.com/license/ 26 def __init__(self, pattern, zoneTo, zoneFrom, condition):
37 PROPERTY_OPTION_PATTERN =
'pattern' 38 PROPERTY_OPTION_ZONE_TO =
'zone_to' 39 PROPERTY_OPTION_ZONE_FROM =
'zone_from' 40 PROPERTY_OPTION_CONDITION =
'condition' 42 VALUE_ZONE_FROM_LOCAL =
'LOCAL' 44 ERROR_BAD_PARAMETER =
'Bad parameter' 45 ERROR_LOAD_PROPERTIES =
'Load properties fail' 46 ERROR_MANDATORY_FIELDS =
'Missed some mandatory fields' 47 ERROR_WRONG_CONDITION =
"Wrong '" + PROPERTY_OPTION_CONDITION +
"' value" 49 USE_PATTERN =
'Use pattern' 51 patternListTimezoneOffset = [
r'(?P<op>[+−-])(?P<hour>[0-9][0-9]):(?P<min>[0-9][0-9])',
52 r'(?P<op>[+−-])(?P<hour>[0-9][0-9])(?P<min>[0-9][0-9])',
53 r'(?P<op>[+-])(?P<hour>\d{1,2})',
54 r'(?P<hour>[−][0-9][0-9])']
56 TRANSFORMATION_ALWAYS = 0
57 TRANSFORMATION_TIMEZONE_DEFINED = 1
58 TRANSFORMATION_NO_TIMEZONE_DEFINED = 2
59 TRANSFORMATION_TIMEZONE_EQUAL = 3
60 TRANSFORMATION_TIMEZONE_NOT_EQUAL = 4
75 obj = json.loads(propertyString)
77 if PDateTimezonesHandler.PROPERTY_OPTION_PATTERN
in elem
and \
78 PDateTimezonesHandler.PROPERTY_OPTION_ZONE_TO
in elem
and \
79 PDateTimezonesHandler.PROPERTY_OPTION_ZONE_FROM
in elem
and \
80 PDateTimezonesHandler.PROPERTY_OPTION_CONDITION
in elem:
82 elem[PDateTimezonesHandler.PROPERTY_OPTION_ZONE_TO],
83 elem[PDateTimezonesHandler.PROPERTY_OPTION_ZONE_FROM],
84 elem[PDateTimezonesHandler.PROPERTY_OPTION_CONDITION]))
85 elif PDateTimezonesHandler.PROPERTY_OPTION_PATTERN
in elem
and \
86 PDateTimezonesHandler.PROPERTY_OPTION_ZONE_TO
in elem
and \
87 PDateTimezonesHandler.PROPERTY_OPTION_CONDITION
in elem:
89 elem[PDateTimezonesHandler.PROPERTY_OPTION_ZONE_TO],
91 elem[PDateTimezonesHandler.PROPERTY_OPTION_CONDITION]))
93 if logger
is not None:
94 errorMessage = PDateTimezonesHandler.ERROR_MANDATORY_FIELDS +
': ' 95 if PDateTimezonesHandler.PROPERTY_OPTION_PATTERN
not in elem:
96 errorMessage +=
"'" + PDateTimezonesHandler.PROPERTY_OPTION_PATTERN +
"'," 98 if PDateTimezonesHandler.PROPERTY_OPTION_ZONE_TO
not in elem:
99 errorMessage +=
"'" + PDateTimezonesHandler.PROPERTY_OPTION_ZONE_TO +
"'," 101 if PDateTimezonesHandler.PROPERTY_OPTION_CONDITION
not in elem:
102 errorMessage +=
"'" + PDateTimezonesHandler.PROPERTY_OPTION_CONDITION +
"'," 104 logger.debug(errorMessage)
106 except Exception, err:
107 if logger
is not None:
108 logger.error(PDateTimezonesHandler.ERROR_LOAD_PROPERTIES +
': ' + str(err))
122 def transform(dt, utcOffset, propertyString, urlString, logger=None):
126 if not isinstance(dt, datetime.datetime):
127 raise Exception(PDateTimezonesHandler.ERROR_BAD_PARAMETER +
" 'Datatime'")
129 if (
not isinstance(propertyString, str)
and not isinstance(propertyString, unicode))
or not propertyString:
130 raise Exception(PDateTimezonesHandler.ERROR_BAD_PARAMETER +
" 'propertyString'")
132 if (
not isinstance(urlString, str)
and not isinstance(urlString, unicode))
or not urlString:
133 raise Exception(PDateTimezonesHandler.ERROR_BAD_PARAMETER +
" 'urlString'")
136 properties = PDateTimezonesHandler.loadProperties(propertyString, logger)
138 for elem
in properties:
139 match = re.search(elem.pattern, urlString)
141 if logger
is not None:
142 logger.debug(PDateTimezonesHandler.USE_PATTERN +
": '" + str(elem.pattern) +
"'")
144 transformHandlers = {\
145 PDateTimezonesHandler.TRANSFORMATION_ALWAYS:\
146 PDateTimezonesHandler.transformationHandlerAlways, \
147 PDateTimezonesHandler.TRANSFORMATION_TIMEZONE_DEFINED:\
148 PDateTimezonesHandler.transformationHandlerTimezoneDefined, \
149 PDateTimezonesHandler.TRANSFORMATION_NO_TIMEZONE_DEFINED:\
150 PDateTimezonesHandler.transformationHandlerNoTimezoneDefined, \
151 PDateTimezonesHandler.TRANSFORMATION_TIMEZONE_EQUAL:\
152 PDateTimezonesHandler.transformationHandlerTimezoneEqual, \
153 PDateTimezonesHandler.TRANSFORMATION_TIMEZONE_NOT_EQUAL:\
154 PDateTimezonesHandler.transformationHandlerTimezoneNotEqual}
156 if int(elem.condition) < len(transformHandlers)
and int(elem.condition) >= 0:
158 if elem.zoneFrom
is None:
159 elem.zoneFrom = DateTimeType.getTimezone(dt)
160 elif elem.zoneFrom == PDateTimezonesHandler.VALUE_ZONE_FROM_LOCAL:
161 elem.zoneFrom = PDateTimezonesHandler.getLocalOffset()
163 logger.debug(
'>>>>> d.isoformat: ' + str(dt.isoformat(
' ')))
164 logger.debug(
'>>>>> elem.zoneFrom: ' + str(elem.zoneFrom))
165 logger.debug(
'>>>>> elem.zoneTo: ' + str(elem.zoneTo))
166 logger.debug(
'>>>>> elem.condition = ' + str(elem.condition))
169 ret = transformHandlers[int(elem.condition)](dt, utcOffset, elem.zoneTo, elem.zoneFrom, logger)
171 if logger
is not None:
172 logger.debug(PDateTimezonesHandler.ERROR_WRONG_CONDITION +
': ' + str(elem.condition))
174 except Exception, err:
175 if logger
is not None:
176 logger.error(str(err))
178 logger.debug(
"!!! ret: %s", str(ret))
194 utcOffset = utcOffset.replace(
'−',
'-')
197 for pattern
in PDateTimezonesHandler.patternListTimezoneOffset:
198 match = re.search(pattern, utcOffset)
200 if 'op' in match.groupdict():
201 if match.groupdict()[
'op'] ==
'-':
206 if 'hour' in match.groupdict():
207 hour = int(match.groupdict()[
'hour'])
209 if operation
is None:
212 if 'min' in match.groupdict():
213 minute = int(match.groupdict()[
'min'])
216 if logger
is not None:
217 logger.debug(
'operation: ' + str(operation) +
' hour: ' + str(hour) +
' minute: ' + str(minute))
219 except Exception, err:
221 logger.debug(str(err))
223 return operation, int(hour), int(minute)
232 gmTime = time.gmtime()
233 locTime = time.localtime()
235 tmMinute = (gmTime.tm_hour * 60 + gmTime.tm_min) - (locTime.tm_hour * 60 + locTime.tm_min)
236 hour = tmMinute // 60 * (-1)
237 minute = tmMinute - tmMinute // 60 * 60
241 return str(hour) +
':' + str(minute)
255 lUtcOffset = DateTimeType.extractUtcOffset(lhs, logger)
256 if lUtcOffset
is not None:
258 rUtcOffset = DateTimeType.extractUtcOffset(rhs, logger)
260 if rUtcOffset
is not None:
261 lOperation, lHour, lMinute = PDateTimezonesHandler.utcOffsetToNumeric(lUtcOffset, logger)
262 rOperation, rHour, rMinute = PDateTimezonesHandler.utcOffsetToNumeric(rUtcOffset, logger)
264 if lOperation
and rOperation
and lOperation == rOperation
and lHour == rHour
and lMinute == rMinute:
283 tZoneTo = datetime.timedelta(hours=0)
284 tZoneFrom = datetime.timedelta(hours=0)
287 zoneToOffset = DateTimeType.extractUtcOffset(zoneTo, logger)
288 if zoneToOffset
is not None:
289 zoneTo = str(zoneToOffset)
291 zoneFromOffset = DateTimeType.extractUtcOffset(zoneFrom, logger)
292 if zoneFromOffset
is not None:
293 zoneFrom = str(zoneFromOffset)
295 opZoneTo, hour, minute = PDateTimezonesHandler.utcOffsetToNumeric(zoneTo, logger)
299 if opZoneTo
is not None:
300 tZoneTo = datetime.timedelta(hours=hour, minutes=minute)
303 tZoneFrom = datetime.timedelta(hours=0, minutes=0)
306 opZoneFrom, hour, minute = PDateTimezonesHandler.utcOffsetToNumeric(zoneFrom, logger)
307 if opZoneFrom
is None:
309 tZoneFrom = datetime.timedelta(hours=hour, minutes=minute)
311 if logger
is not None:
312 logger.debug(
"!!! opZoneTo = %s, opZoneFrom = %s", str(opZoneTo), str(opZoneFrom))
313 logger.debug(
"!!! tZoneTo = %s, tZoneFrom = %s", str(tZoneTo), str(tZoneFrom))
315 if opZoneTo
is not None and opZoneFrom
is not None:
316 if int(opZoneTo) >= 0
and int(opZoneFrom) >= 0:
318 ret = dt + tZoneFrom * (-1) + tZoneTo
319 if logger
is not None:
320 logger.debug(
"!!! GOOD !!! ret = %s", str(ret))
322 elif int(opZoneTo) < 0
and int(opZoneFrom) < 0:
324 ret = dt + tZoneFrom * (-1) + tZoneTo
327 ret = dt + (abs(tZoneTo) + abs(tZoneFrom)) * opZoneTo
345 sourceTimeZone = DateTimeType.extractUtcOffset(utcOffset, logger,
True)
346 if sourceTimeZone
is not None:
347 ret = PDateTimezonesHandler.transformationHandlerAlways(dt, utcOffset, zoneTo, zoneFrom, logger)
364 sourceTimeZone = DateTimeType.extractUtcOffset(utcOffset, logger)
365 if sourceTimeZone
is None:
366 ret = PDateTimezonesHandler.transformationHandlerAlways(dt, utcOffset, zoneTo, zoneFrom, logger)
383 if PDateTimezonesHandler.isEqualOffset(utcOffset, zoneFrom):
384 ret = PDateTimezonesHandler.transformationHandlerAlways(dt, utcOffset, zoneTo, zoneFrom, logger)
401 if not PDateTimezonesHandler.isEqualOffset(utcOffset, zoneFrom):
402 ret = PDateTimezonesHandler.transformationHandlerAlways(dt, utcOffset, zoneTo, zoneFrom, logger)
415 utcOffset = DateTimeType.extractUtcOffset(timezone, logger,
True)
416 if logger
is not None:
417 logger.debug(
"timezone: '%s', utcOffset: %s", str(timezone), str(utcOffset))
419 res = PDateTimezonesHandler.transformationHandlerAlways(dt, utcOffset, timezone,
None, logger)
420 if logger
is not None:
421 logger.debug(
"result: %s", str(res))
def transformationHandlerTimezoneNotEqual(dt, utcOffset, zoneTo, zoneFrom, logger=None)
def applyTimezone(dt, timezone, logger=None)
def transform(dt, utcOffset, propertyString, urlString, logger=None)
def __init__(self, pattern, zoneTo, zoneFrom, condition)
def transformationHandlerAlways(dt, utcOffset, zoneTo, zoneFrom, logger=None)
def utcOffsetToNumeric(utcOffset, logger=None)
def transformationHandlerTimezoneDefined(dt, utcOffset, zoneTo, zoneFrom, logger=None)
def transformationHandlerTimezoneEqual(dt, utcOffset, zoneTo, zoneFrom, logger=None)
def isEqualOffset(lhs, rhs, logger=None)
def transformationHandlerNoTimezoneDefined(dt, utcOffset, zoneTo, zoneFrom, logger=None)
def loadProperties(propertyString, logger=None)