diff --git a/rowers/dataprep.py b/rowers/dataprep.py index a824f571..acce7fa3 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -1156,7 +1156,8 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', consistencychecks=False, startdatetime='', workoutid='', - impeller=False): + impeller=False, + timezone=''): message = None @@ -1173,7 +1174,7 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', row = rdata(f2, rower=rr) startdatetime, startdate, starttime, timezone_str, partofday = get_startdate_time_zone( - r, row, startdatetime=startdatetime) + r, row, startdatetime=startdatetime, timezone=timezone) if title is None or title == '': title = 'Workout' @@ -1463,6 +1464,7 @@ def new_workout_from_file(r, f2, rpe=-1, makeprivate=False, startdatetime='', + timezone='', notes='', workoutid='', oarlockfirmware='', @@ -1641,6 +1643,7 @@ def new_workout_from_file(r, f2, workoutsource=workoutsource, summary=summary, startdatetime=startdatetime, + timezone=timezone, rpe=rpe, inboard=inboard, oarlength=oarlength, seatnumber=seatnumber, boatname=boatname, diff --git a/rowers/dataroutines.py b/rowers/dataroutines.py index 001f6fcb..d020faf6 100644 --- a/rowers/dataroutines.py +++ b/rowers/dataroutines.py @@ -905,7 +905,7 @@ def clean_df_stats_pl(datadf, workstrokesonly=True, ignorehr=True, return datadf -def getpartofday(row, r): +def getpartofday(row, r, startdatetime=None, timezone=''): workoutstartdatetime = row.rowdatetime try: # pragma: no cover latavg = row.df[' latitude'].mean() @@ -932,6 +932,8 @@ def getpartofday(row, r): workoutstartdatetime = row.rowdatetime h = workoutstartdatetime.astimezone(pytz.timezone(timezone_str)).hour + if startdatetime is not None: + h = startdatetime.hour if h < 12: # pragma: no cover return "Morning" @@ -1170,7 +1172,9 @@ parsers = { } -def get_startdate_time_zone(r, row, startdatetime=None): +def get_startdate_time_zone(r, row, startdatetime=None, timezone=''): + if timezone != '': + preserve_timezone = True if isinstance(startdatetime, str): try: startdatetime = pendulum.parse(startdatetime) @@ -1184,15 +1188,15 @@ def get_startdate_time_zone(r, row, startdatetime=None): timezone_str = 'Ect/GMT' elif startdatetime == '': startdatetime = row.rowdatetime - else: - startdatetime = row.rowdatetime + #else: + # startdatetime = row.rowdatetime try: _ = startdatetime.tzinfo except AttributeError: # pragma: no cover startdatetime = row.rowdatetime - partofday = getpartofday(row, r) + partofday = getpartofday(row, r, startdatetime=startdatetime, timezone=timezone) if startdatetime.tzinfo is None or str(startdatetime.tzinfo) in ['tzutc()', 'Ect/GMT']: timezone_str = 'UTC' @@ -1200,6 +1204,8 @@ def get_startdate_time_zone(r, row, startdatetime=None): startdatetime = timezone.make_aware(startdatetime) except ValueError: # pragma: no cover pass + except AttributeError: + pass try: latavg = row.df[' latitude'].mean() @@ -1232,8 +1238,23 @@ def get_startdate_time_zone(r, row, startdatetime=None): timezone_str = str(startdatetime.tzinfo) try: - startdatetime = startdatetime.astimezone(pytz.timezone(timezone_str)) + if not preserve_timezone: + startdatetime = startdatetime.astimezone(pytz.timezone(timezone_str)) except UnknownTimeZoneError: + try: + offset = timezone_str.strip("(TimeZone('')").split(":") + hours = int(offset[0]) + minutes = int(offset[1]) + tz_offset = datetime.timedelta(hours=hours, minutes=minutes) + tz = datetime.timezone(tz_offset) + utc_offset = tz.utcoffset(datetime.utcnow()).total_seconds() + for zone in pytz.all_timezones: + if pytz.timezone(zone).utcoffset(datetime.utcnow()).total_seconds() == utc_offset: + timezone_str = zone + break + except Exception as e: + pass + startdatetime = startdatetime.astimezone(pytz.utc) startdate = startdatetime.strftime('%Y-%m-%d') diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index b4e8bb72..b3805e75 100644 Binary files a/rowers/tests/testdata/testdata.tcx.gz and b/rowers/tests/testdata/testdata.tcx.gz differ diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index 26ec16f8..07ce9525 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -4981,6 +4981,7 @@ def workout_upload_api(request): garminid = post_data.get('garminid','') workoutid = post_data.get('id','') startdatetime = post_data.get('startdatetime', '') + timezone = post_data.get('timezone','') oarlockfirmware = post_data.get('oarlockfirmware', None) inboard = post_data.get('inboard', None) oarlength = post_data.get('oarlength', None) @@ -5079,6 +5080,7 @@ def workout_upload_api(request): notes=notes, uploadoptions=post_data, startdatetime=startdatetime, + timezone=timezone, oarlockfirmware=oarlockfirmware, inboard=inboard, oarlength=oarlength,