Private
Public Access
1
0

Merge branch 'release/v16.4.13'

This commit is contained in:
Sander Roosendaal
2021-06-16 20:25:21 +02:00
5 changed files with 1910 additions and 68 deletions

View File

@@ -13,7 +13,7 @@ from rowers.models import (
import pytz import pytz
import collections import collections
import pendulum
from rowingdata import rowingdata as rrdata from rowingdata import rowingdata as rrdata
from rowingdata import rower as rrower from rowingdata import rower as rrower
@@ -1600,18 +1600,12 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
hrtr=r.tr, hran=r.an, ftp=r.ftp, hrtr=r.tr, hran=r.an, ftp=r.ftp,
powerperc=powerperc, powerzones=r.powerzones) powerperc=powerperc, powerzones=r.powerzones)
row = rdata(f2, rower=rr) row = rdata(f2, rower=rr)
if startdatetime != '': # pragma: no cover
row.rowdatetime = arrow.get(startdatetime).datetime
dologging('debuglog.log','Row Date Time (line 1606) = {rowdatetime}'.format( startdatetime,startdate,starttime,timezone_str,partofday = get_startdate_time_zone(r,row,startdatetime=startdatetime)
rowdatetime=row.rowdatetime,
))
if title is None or title == '': if title is None or title == '':
title = 'Workout' title = 'Workout'
partofday = getpartofday(row,r)
if partofday is not None: if partofday is not None:
title = '{partofday} {workouttype}'.format( title = '{partofday} {workouttype}'.format(
@@ -1721,66 +1715,23 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
summary = row.allstats() summary = row.allstats()
if startdatetime != '': # pragma: no cover workoutstartdatetime = startdatetime
workoutstartdatetime = arrow.get(startdatetime).datetime
else:
workoutstartdatetime = row.rowdatetime
timezone_str = 'UTC' dologging('debuglog.log','Dataprep line 1721, Workout Startdatetime {workoutstartdatetime}'.format(
try:
workoutstartdatetime = timezone.make_aware(workoutstartdatetime)
except ValueError:
pass
dologging('debuglog.log','Dataprep line 1737, Workout Startdatetime {workoutstartdatetime}'.format(
workoutstartdatetime=workoutstartdatetime, workoutstartdatetime=workoutstartdatetime,
)) ))
try:
latavg = row.df[' latitude'].mean()
lonavg = row.df[' longitude'].mean()
tf = TimezoneFinder()
try:
timezone_str = tf.timezone_at(lng=lonavg, lat=latavg)
except (ValueError,OverflowError): # pragma: no cover
timezone_str = 'UTC'
if timezone_str == None: # pragma: no cover
timezone_str = tf.closest_timezone_at(lng=lonavg,
lat=latavg)
if timezone_str == None: # pragma: no cover
timezone_str = r.defaulttimezone
try:
workoutstartdatetime = pytz.timezone(timezone_str).localize(
row.rowdatetime
)
except ValueError:
workoutstartdatetime = workoutstartdatetime.astimezone(
pytz.timezone(timezone_str)
)
except KeyError:
timezone_str = r.defaulttimezone
duration = totaltime_sec_to_string(totaltime) duration = totaltime_sec_to_string(totaltime)
workoutdate = workoutstartdatetime.astimezone( workoutdate = startdate
pytz.timezone(timezone_str) workoutstarttime = starttime
).strftime('%Y-%m-%d')
workoutstarttime = workoutstartdatetime.astimezone(
pytz.timezone(timezone_str)
).strftime('%H:%M:%S')
s = 'Dataprep line 1780 workoutdate and time set to {workoutdate} and {workoutstarttime}'.format( s = 'Dataprep line 1730 workoutdate and time set to {workoutdate} and {workoutstarttime}'.format(
workoutdate=workoutdate, workoutdate=workoutdate,
workoutstarttime=workoutstarttime, workoutstarttime=workoutstarttime,
) )
dologging('debuglog.log',s)
if makeprivate: # pragma: no cover if makeprivate: # pragma: no cover
@@ -1812,6 +1763,8 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower',
if title is not None and len(title)>140: # pragma: no cover if title is not None and len(title)>140: # pragma: no cover
title = title[0:140] title = title[0:140]
timezone_str = str(workoutstartdatetime.tzinfo)
w = Workout(user=r, name=title, date=workoutdate, w = Workout(user=r, name=title, date=workoutdate,
workouttype=workouttype, workouttype=workouttype,
boattype=boattype, boattype=boattype,
@@ -1887,6 +1840,59 @@ parsers = {
'hero': HeroParser, 'hero': HeroParser,
} }
def get_startdate_time_zone(r,row,startdatetime=None):
if startdatetime is not None and startdatetime != '':
timezone_str = pendulum.instance(startdatetime).timezone.name
else:
startdatetime = row.rowdatetime
partofday = getpartofday(row,r)
if startdatetime.tzinfo is None or str(startdatetime.tzinfo) in ['tzutc()','Ect/GMT']:
timezone_str = 'UTC'
try:
startdatetime = timezone.make_aware(startdatetime)
except ValueError: # pragma: no cover
pass
try:
latavg = row.df[' latitude'].mean()
lonavg = row.df[' longitude'].mean()
tf = TimezoneFinder()
if row.df[' latitude'].std() != 0:
try:
timezone_str = tf.timezone_at(lng=lonavg, lat=latavg)
except (ValueError,OverflowError): # pragma: no cover
timezone_str = 'UTC'
if timezone_str is None: # pragma: no cover
timezone_str = tf.closest_timezone_at(lng=lonavg,
lat=latavg)
if timezone_str is None: # pragma: no cover
timezone_str = r.defaulttimezone
else:
timezone_str = r.defaulttimezone
try:
startdatetime = pytz.timezone(timezone_str).localize(
row.rowdatetime
)
except ValueError: # pragma: no cover
startdatetime = startdatetime.astimezone(
pytz.timezone(timezone_str)
)
except KeyError: # pragma: no cover
timezone_str = r.defaulttimezone
else:
timezone_str = str(startdatetime.tzinfo)
startdate = startdatetime.strftime('%Y-%m-%d')
starttime = startdatetime.strftime('%H:%M:%S')
return startdatetime,startdate,starttime,timezone_str,partofday
def parsenonpainsled(fileformat,f2,summary,startdatetime='',empowerfirmware=None,inboard=None,oarlength=None): def parsenonpainsled(fileformat,f2,summary,startdatetime='',empowerfirmware=None,inboard=None,oarlength=None):
try: try:
if fileformat == 'nklinklogbook' and empowerfirmware is not None: # pragma: no cover if fileformat == 'nklinklogbook' and empowerfirmware is not None: # pragma: no cover
@@ -2342,7 +2348,7 @@ def new_workout_from_df(r, df,
summary = '' summary = ''
makeprivate = False makeprivate = False
rpe = 0 rpe = 0
if startdatetime == '': if startdatetime == '': # pragma: no cover
startdatetime = timezone.now() startdatetime = timezone.now()
if setprivate: # pragma: no cover if setprivate: # pragma: no cover

View File

@@ -11,6 +11,8 @@ from rowers.models import update_records
from django.db import transaction from django.db import transaction
nu = datetime.datetime.now() nu = datetime.datetime.now()
import datetime
import pytz
# interactive plots # interactive plots
from rowers import interactiveplots from rowers import interactiveplots
@@ -20,6 +22,7 @@ from rowers import plannedsessions
from rowers.views.workoutviews import get_video_id from rowers.views.workoutviews import get_video_id
from rowers import stravastuff from rowers import stravastuff
import rowingdata
class OtherUnitTests(TestCase): class OtherUnitTests(TestCase):
def setUp(self): def setUp(self):
@@ -240,7 +243,7 @@ class PlannedSessionTests(TestCase):
monday = sundays[i]-datetime.timedelta(days=6) monday = sundays[i]-datetime.timedelta(days=6)
if monday < cycle.startdate: if monday < cycle.startdate:
monday = cycle.startdate monday = cycle.startdate
nextsunday = sundays[i] nextsunday = sundays[i]
@@ -362,6 +365,7 @@ class DataPrepTests(TestCase):
rowerplan='coach') rowerplan='coach')
self.r.birthdate = timezone.now()-datetime.timedelta(days=25*365) self.r.birthdate = timezone.now()-datetime.timedelta(days=25*365)
self.r.defaulttimezone = 'Europe/Amsterdam'
self.r.save() self.r.save()
self.c = Client() self.c = Client()
@@ -404,6 +408,108 @@ class DataPrepTests(TestCase):
def tearDown(self): def tearDown(self):
pass pass
def test_timezones(self):
#row = rowingdata.rowingdata(csvfile='rowers.tests/testdata/testdata_210616_075409.csv')
row = rowingdata.rowingdata(csvfile='rowers/tests/testdata/testdata_210616_075409.csv')
aware = datetime.datetime(2021,6,16,7,54,9,999000,tzinfo=pytz.timezone('Europe/Amsterdam'))
row.rowdatetime = aware
startdatetime, startdate, starttime, timezone_str,partofday = dataprep.get_startdate_time_zone(self.r,row)
self.assertEqual(partofday,'Morning')
want = arrow.get('2021-06-16T07:54:09.999000+02:00').isoformat()
got = arrow.get(startdatetime).isoformat()
self.assertEqual(got, want)
self.assertEqual(timezone_str,'Europe/Amsterdam')
self.assertEqual(starttime,'07:54:09')
self.assertEqual(startdate,'2021-06-16')
def test_timezones2(self):
#row = rowingdata.rowingdata(csvfile='rowers.tests/testdata/testdata_210616_075409.csv')
row = rowingdata.rowingdata(csvfile='rowers/tests/testdata/testdata_210616_075409.csv')
naive = datetime.datetime(2021,6,16,7,54,9,999000)
timezone = pytz.timezone('Europe/Prague')
aware = timezone.localize(naive)
row.rowdatetime = aware
startdatetime, startdate, starttime, timezone_str,partofday = dataprep.get_startdate_time_zone(self.r,row,
startdatetime=aware)
self.assertEqual(partofday,'Morning')
want = arrow.get('2021-06-16T07:54:09.999000+02:00').isoformat()
got = arrow.get(startdatetime).isoformat()
self.assertEqual(got, want)
self.assertEqual(timezone_str,'Europe/Prague')
self.assertEqual(starttime,'07:54:09')
self.assertEqual(startdate,'2021-06-16')
def test_timezones3(self):
#row = rowingdata.rowingdata(csvfile='rowers.tests/testdata/testdata_210616_075409.csv')
row = rowingdata.rowingdata(csvfile='rowers/tests/testdata/testdata_210616_075409.csv')
naive = datetime.datetime(2021,6,16,7,54,9,999000)
row.rowdatetime = naive
startdatetime, startdate, starttime, timezone_str,partofday = dataprep.get_startdate_time_zone(self.r,row)
self.assertEqual(timezone_str,'Europe/Amsterdam')
def test_timezones4(self):
#row = rowingdata.rowingdata(csvfile='rowers.tests/testdata/testdata_210616_075409.csv')
row = rowingdata.rowingdata(csvfile='rowers/tests/testdata/testdata_210616_075409.csv')
naive = datetime.datetime(2021,6,15,19,55,13,400000)
timezone = pytz.timezone('America/Los_Angeles')
aware = timezone.localize(naive)
row.rowdatetime = aware
(
startdatetime,
startdate,
starttime,
timezone_str,
partofday
) = dataprep.get_startdate_time_zone(self.r,row,startdatetime=aware)
self.assertEqual(timezone_str,'America/Los_Angeles')
self.assertEqual(partofday,'Morning')
want = arrow.get('2021-06-15 19:55:13.400000-07:00').isoformat()
got = arrow.get(startdatetime).isoformat()
self.assertEqual(got, want)
self.assertEqual(starttime,'19:55:13')
self.assertEqual(startdate,'2021-06-15')
def test_timezones5(self):
#row = rowingdata.rowingdata(csvfile='rowers.tests/testdata/testdata_210616_075409.csv')
row = rowingdata.rowingdata(csvfile='rowers/tests/testdata/testdata_210616_075409.csv')
naive = datetime.datetime(2021,6,15,19,55,13,400000)
timezone = pytz.timezone('America/Los_Angeles')
aware = timezone.localize(naive)
row.rowdatetime = aware
(
startdatetime,
startdate,
starttime,
timezone_str,
partofday
) = dataprep.get_startdate_time_zone(self.r,row)
self.assertEqual(timezone_str,'America/Los_Angeles')
self.assertEqual(partofday,'Morning')
want = arrow.get('2021-06-15 19:55:13.400000-07:00').isoformat()
got = arrow.get(startdatetime).isoformat()
self.assertEqual(got, want)
self.assertEqual(starttime,'19:55:13')
self.assertEqual(startdate,'2021-06-15')
@patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_uh) @patch('rowers.dataprep.getsmallrowdata_db',side_effect=mocked_getsmallrowdata_uh)
def test_goldmedalstandard(self,mocked_getsmallrowdata_uh): def test_goldmedalstandard(self,mocked_getsmallrowdata_uh):
maxvalue, delta = dataprep.calculate_goldmedalstandard(self.r,self.wuh_otw) maxvalue, delta = dataprep.calculate_goldmedalstandard(self.r,self.wuh_otw)

View File

@@ -0,0 +1 @@
,sander,sander-pc,16.06.2021 17:04,file:///home/sander/.config/libreoffice/4;

File diff suppressed because it is too large Load Diff

View File

@@ -539,15 +539,18 @@ def get_strava_stream(r,metric,stravaid,series_type='time',fetchresolution='high
with open('data.txt', 'w') as outfile: with open('data.txt', 'w') as outfile:
json.dump(s.json(), outfile) json.dump(s.json(), outfile)
for data in s.json(): try:
y = None for data in s.json():
try: y = None
if data['type'] == metric: try:
return np.array(data['data']) if data['type'] == metric:
except TypeError: # pragma: no cover return np.array(data['data'])
return None except TypeError: # pragma: no cover
return None
except JSONDecodeError:
return None
return None return None # pragma: no cover
def allmonths(startdate,enddate): def allmonths(startdate,enddate):
d = startdate d = startdate