def get_timezone_str(default='Africa/Abidjan'): try: timezone = get_timezone() except TechnicalError: return default else: return timezone.zone if timezone else default
def timestamp_to_datetime(timestamp): dt = datetime.utcfromtimestamp(timestamp) timezone = get_timezone() if timezone: dt = pytz.utc.localize(dt) return dt.astimezone(timezone) return None
def local_str_date_to_utc(str, tz=None): timezone = tz or get_timezone() dt = str_to_dt(str) if timezone: local = pytz.timezone(timezone) local_dt = local.localize(dt, is_dst=None) utc_date = local_dt.astimezone(pytz.UTC) return utc_date return None
def output(self, key, obj): tz = get_timezone() value = fields.get_value( key if self.attribute is None else self.attribute, obj) if value is None: return self.default return self.format(value, tz)
def output(self, key, obj): date = fields.get_value(self.date, obj) if self.date else None time = fields.get_value(self.time, obj) if time == __date_time_null_value__: return "" if not date: return self.format_time(time) date_time = date + time tz = get_timezone() return self.format(date_time, timezone=tz)
def timestamp_to_datetime(timestamp, tz=None): """ Convert a timestamp to datetime if timestamp > MAX_INT we return None """ maxint = 9223372036854775807 # when a date is > 2038-01-19 03:14:07 # we receive a timestamp = 18446744071562142720 (64 bits) > 9223372036854775807 (MAX_INT 32 bits) # And ValueError: timestamp out of range for platform time_t is raised if timestamp >= maxint: return None dt = datetime.utcfromtimestamp(timestamp) timezone = tz or get_timezone() if timezone: dt = pytz.utc.localize(dt) return dt.astimezone(timezone) return None
def get(self, uri=None, region=None, lon=None, lat=None): args = self.parsers["get"].parse_args() # for retrocompatibility purpose for forbid_id in args['__temporary_forbidden_id[]']: args['forbidden_uris[]'].append(forbid_id) args["nb_stoptimes"] = args["count"] if args['disable_geojson']: g.disable_geojson = True # retrocompatibility if args['max_date_times'] is not None: args['items_per_schedule'] = args['max_date_times'] if uri is None: if not args['filter']: raise InvalidArguments('filter') first_filter = args["filter"].lower().split("and")[0].strip() parts = first_filter.lower().split("=") if len(parts) != 2: error = "Unable to parse filter {filter}" return {"error": error.format(filter=args["filter"])}, 503 else: self.region = i_manager.get_region(object_id=parts[1].strip()) else: self.collection = 'schedules' args["filter"] = self.get_filter(uri.split("/"), args) self.region = i_manager.get_region(region, lon, lat) timezone.set_request_timezone(self.region) if not args["from_datetime"] and not args["until_datetime"]: # no datetime given, default is the current time, and we activate the realtime args['from_datetime'] = args['_current_datetime'] if args["calendar"]: # if we have a calendar, the dt is only used for sorting, so 00:00 is fine args['from_datetime'] = args['from_datetime'].replace(hour=0, minute=0) if not args['data_freshness']: args['data_freshness'] = 'realtime' elif not args.get('calendar'): #if a calendar is given all times will be given in local (because the calendar might span over dst) if args['from_datetime']: args['from_datetime'] = self.convert_to_utc(args['from_datetime']) if args['until_datetime']: args['until_datetime'] = self.convert_to_utc(args['until_datetime']) # we save the original datetime for debuging purpose args['original_datetime'] = args['from_datetime'] if args['from_datetime']: args['from_datetime'] = utils.date_to_timestamp(args['from_datetime']) if args['until_datetime']: args['until_datetime'] = utils.date_to_timestamp(args['until_datetime']) if not args['data_freshness']: # The data freshness depends on the API # for route_schedule, by default we want the base schedule if self.endpoint == 'route_schedules': args['data_freshness'] = 'base_schedule' # for stop_schedule and previous/next departure/arrival, we want the freshest data by default else: args['data_freshness'] = 'realtime' if not args["from_datetime"] and args["until_datetime"]\ and self.endpoint[:4] == "next": self.endpoint = "previous" + self.endpoint[4:] # Add timezone in request for availability in greenlet args['timezone'] = timezone.get_timezone() self._register_interpreted_parameters(args) return i_manager.dispatch(args, self.endpoint, instance_name=self.region)