Merge branch 'release/v22.6.5'
This commit is contained in:
@@ -1156,7 +1156,8 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
|
|||||||
consistencychecks=False,
|
consistencychecks=False,
|
||||||
startdatetime='',
|
startdatetime='',
|
||||||
workoutid='',
|
workoutid='',
|
||||||
impeller=False):
|
impeller=False,
|
||||||
|
timezone=''):
|
||||||
|
|
||||||
message = None
|
message = None
|
||||||
|
|
||||||
@@ -1173,7 +1174,7 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
|
|||||||
row = rdata(f2, rower=rr)
|
row = rdata(f2, rower=rr)
|
||||||
|
|
||||||
startdatetime, startdate, starttime, timezone_str, partofday = get_startdate_time_zone(
|
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 == '':
|
if title is None or title == '':
|
||||||
title = 'Workout'
|
title = 'Workout'
|
||||||
@@ -1463,6 +1464,7 @@ def new_workout_from_file(r, f2,
|
|||||||
rpe=-1,
|
rpe=-1,
|
||||||
makeprivate=False,
|
makeprivate=False,
|
||||||
startdatetime='',
|
startdatetime='',
|
||||||
|
timezone='',
|
||||||
notes='',
|
notes='',
|
||||||
workoutid='',
|
workoutid='',
|
||||||
oarlockfirmware='',
|
oarlockfirmware='',
|
||||||
@@ -1641,6 +1643,7 @@ def new_workout_from_file(r, f2,
|
|||||||
workoutsource=workoutsource,
|
workoutsource=workoutsource,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
startdatetime=startdatetime,
|
startdatetime=startdatetime,
|
||||||
|
timezone=timezone,
|
||||||
rpe=rpe,
|
rpe=rpe,
|
||||||
inboard=inboard, oarlength=oarlength,
|
inboard=inboard, oarlength=oarlength,
|
||||||
seatnumber=seatnumber, boatname=boatname,
|
seatnumber=seatnumber, boatname=boatname,
|
||||||
|
|||||||
@@ -905,7 +905,7 @@ def clean_df_stats_pl(datadf, workstrokesonly=True, ignorehr=True,
|
|||||||
return datadf
|
return datadf
|
||||||
|
|
||||||
|
|
||||||
def getpartofday(row, r):
|
def getpartofday(row, r, startdatetime=None, timezone=''):
|
||||||
workoutstartdatetime = row.rowdatetime
|
workoutstartdatetime = row.rowdatetime
|
||||||
try: # pragma: no cover
|
try: # pragma: no cover
|
||||||
latavg = row.df[' latitude'].mean()
|
latavg = row.df[' latitude'].mean()
|
||||||
@@ -932,6 +932,8 @@ def getpartofday(row, r):
|
|||||||
workoutstartdatetime = row.rowdatetime
|
workoutstartdatetime = row.rowdatetime
|
||||||
|
|
||||||
h = workoutstartdatetime.astimezone(pytz.timezone(timezone_str)).hour
|
h = workoutstartdatetime.astimezone(pytz.timezone(timezone_str)).hour
|
||||||
|
if startdatetime is not None:
|
||||||
|
h = startdatetime.hour
|
||||||
|
|
||||||
if h < 12: # pragma: no cover
|
if h < 12: # pragma: no cover
|
||||||
return "Morning"
|
return "Morning"
|
||||||
@@ -1170,7 +1172,10 @@ parsers = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def get_startdate_time_zone(r, row, startdatetime=None):
|
def get_startdate_time_zone(r, row, startdatetime=None, timezone=''):
|
||||||
|
preserve_timezone = False
|
||||||
|
if timezone != '':
|
||||||
|
preserve_timezone = True
|
||||||
if isinstance(startdatetime, str):
|
if isinstance(startdatetime, str):
|
||||||
try:
|
try:
|
||||||
startdatetime = pendulum.parse(startdatetime)
|
startdatetime = pendulum.parse(startdatetime)
|
||||||
@@ -1184,15 +1189,15 @@ def get_startdate_time_zone(r, row, startdatetime=None):
|
|||||||
timezone_str = 'Ect/GMT'
|
timezone_str = 'Ect/GMT'
|
||||||
elif startdatetime == '':
|
elif startdatetime == '':
|
||||||
startdatetime = row.rowdatetime
|
startdatetime = row.rowdatetime
|
||||||
else:
|
#else:
|
||||||
startdatetime = row.rowdatetime
|
# startdatetime = row.rowdatetime
|
||||||
|
|
||||||
try:
|
try:
|
||||||
_ = startdatetime.tzinfo
|
_ = startdatetime.tzinfo
|
||||||
except AttributeError: # pragma: no cover
|
except AttributeError: # pragma: no cover
|
||||||
startdatetime = row.rowdatetime
|
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']:
|
if startdatetime.tzinfo is None or str(startdatetime.tzinfo) in ['tzutc()', 'Ect/GMT']:
|
||||||
timezone_str = 'UTC'
|
timezone_str = 'UTC'
|
||||||
@@ -1200,6 +1205,8 @@ def get_startdate_time_zone(r, row, startdatetime=None):
|
|||||||
startdatetime = timezone.make_aware(startdatetime)
|
startdatetime = timezone.make_aware(startdatetime)
|
||||||
except ValueError: # pragma: no cover
|
except ValueError: # pragma: no cover
|
||||||
pass
|
pass
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
|
|
||||||
try:
|
try:
|
||||||
latavg = row.df[' latitude'].mean()
|
latavg = row.df[' latitude'].mean()
|
||||||
@@ -1232,8 +1239,23 @@ def get_startdate_time_zone(r, row, startdatetime=None):
|
|||||||
timezone_str = str(startdatetime.tzinfo)
|
timezone_str = str(startdatetime.tzinfo)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
startdatetime = startdatetime.astimezone(pytz.timezone(timezone_str))
|
if not preserve_timezone:
|
||||||
|
startdatetime = startdatetime.astimezone(pytz.timezone(timezone_str))
|
||||||
except UnknownTimeZoneError:
|
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)
|
startdatetime = startdatetime.astimezone(pytz.utc)
|
||||||
|
|
||||||
startdate = startdatetime.strftime('%Y-%m-%d')
|
startdate = startdatetime.strftime('%Y-%m-%d')
|
||||||
|
|||||||
@@ -543,7 +543,7 @@ class DataPrepTests(TestCase):
|
|||||||
) = dataprep.get_startdate_time_zone(self.r,row,startdatetime=aware)
|
) = dataprep.get_startdate_time_zone(self.r,row,startdatetime=aware)
|
||||||
|
|
||||||
self.assertEqual(timezone_str,'America/Los_Angeles')
|
self.assertEqual(timezone_str,'America/Los_Angeles')
|
||||||
self.assertEqual(partofday,'Morning')
|
self.assertEqual(partofday,'Evening')
|
||||||
want = arrow.get('2021-06-15 19:55:13.400000-07:00').isoformat()
|
want = arrow.get('2021-06-15 19:55:13.400000-07:00').isoformat()
|
||||||
got = arrow.get(startdatetime).isoformat()
|
got = arrow.get(startdatetime).isoformat()
|
||||||
|
|
||||||
@@ -569,7 +569,7 @@ class DataPrepTests(TestCase):
|
|||||||
) = dataprep.get_startdate_time_zone(self.r,row)
|
) = dataprep.get_startdate_time_zone(self.r,row)
|
||||||
|
|
||||||
self.assertEqual(timezone_str,'America/Los_Angeles')
|
self.assertEqual(timezone_str,'America/Los_Angeles')
|
||||||
self.assertEqual(partofday,'Morning')
|
self.assertEqual(partofday,'Evening')
|
||||||
want = arrow.get('2021-06-15 19:55:13.400000-07:00').isoformat()
|
want = arrow.get('2021-06-15 19:55:13.400000-07:00').isoformat()
|
||||||
got = arrow.get(startdatetime).isoformat()
|
got = arrow.get(startdatetime).isoformat()
|
||||||
|
|
||||||
|
|||||||
BIN
rowers/tests/testdata/testdata.tcx.gz
vendored
BIN
rowers/tests/testdata/testdata.tcx.gz
vendored
Binary file not shown.
@@ -4981,6 +4981,7 @@ def workout_upload_api(request):
|
|||||||
garminid = post_data.get('garminid','')
|
garminid = post_data.get('garminid','')
|
||||||
workoutid = post_data.get('id','')
|
workoutid = post_data.get('id','')
|
||||||
startdatetime = post_data.get('startdatetime', '')
|
startdatetime = post_data.get('startdatetime', '')
|
||||||
|
timezone = post_data.get('timezone','')
|
||||||
oarlockfirmware = post_data.get('oarlockfirmware', None)
|
oarlockfirmware = post_data.get('oarlockfirmware', None)
|
||||||
inboard = post_data.get('inboard', None)
|
inboard = post_data.get('inboard', None)
|
||||||
oarlength = post_data.get('oarlength', None)
|
oarlength = post_data.get('oarlength', None)
|
||||||
@@ -5079,6 +5080,7 @@ def workout_upload_api(request):
|
|||||||
notes=notes,
|
notes=notes,
|
||||||
uploadoptions=post_data,
|
uploadoptions=post_data,
|
||||||
startdatetime=startdatetime,
|
startdatetime=startdatetime,
|
||||||
|
timezone=timezone,
|
||||||
oarlockfirmware=oarlockfirmware,
|
oarlockfirmware=oarlockfirmware,
|
||||||
inboard=inboard,
|
inboard=inboard,
|
||||||
oarlength=oarlength,
|
oarlength=oarlength,
|
||||||
|
|||||||
Reference in New Issue
Block a user