Merge branch 'release/v20.1.10'
This commit is contained in:
+2
-14
@@ -1,15 +1,3 @@
|
|||||||
[run]
|
|
||||||
include =
|
|
||||||
./*
|
|
||||||
omit =
|
|
||||||
*tests*
|
|
||||||
*migrations*
|
|
||||||
*cvkbrno*
|
|
||||||
*/py2/*
|
|
||||||
*/venv/*
|
|
||||||
*__init__*
|
|
||||||
[report]
|
[report]
|
||||||
exclude_lines =
|
show_missing = True
|
||||||
pragma: no cover
|
omit = py39/*
|
||||||
if __name__ == .__main__.:
|
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
from .integrations import SyncIntegration, NoTokenError
|
from .integrations import SyncIntegration, NoTokenError, create_or_update_syncrecord, get_known_ids
|
||||||
from rowers.models import User, Rower, Workout, TombStone, SyncRecord
|
from rowers.models import User, Rower, Workout, TombStone
|
||||||
from django.db.utils import IntegrityError
|
from django.db.utils import IntegrityError
|
||||||
|
|
||||||
from rowingdata import rowingdata
|
from rowingdata import rowingdata
|
||||||
@@ -360,15 +360,9 @@ class C2Integration(SyncIntegration):
|
|||||||
|
|
||||||
def get_workout(self, id, *args, **kwargs):
|
def get_workout(self, id, *args, **kwargs):
|
||||||
_ = self.open()
|
_ = self.open()
|
||||||
|
r = self.rower
|
||||||
|
|
||||||
record = SyncRecord(
|
record = create_or_update_syncrecord(r, None, c2id=id)
|
||||||
rower = self.rower,
|
|
||||||
c2id = id,
|
|
||||||
)
|
|
||||||
try:
|
|
||||||
record.save()
|
|
||||||
except IntegrityError:
|
|
||||||
return 0
|
|
||||||
|
|
||||||
_ = myqueue(queuehigh,
|
_ = myqueue(queuehigh,
|
||||||
handle_c2_getworkout,
|
handle_c2_getworkout,
|
||||||
@@ -428,9 +422,7 @@ class C2Integration(SyncIntegration):
|
|||||||
workouts = []
|
workouts = []
|
||||||
c2ids = [item['id'] for item in res.json()['data']]
|
c2ids = [item['id'] for item in res.json()['data']]
|
||||||
|
|
||||||
knownc2ids = uniqify([
|
knownc2ids = get_known_ids(r, 'c2id')
|
||||||
record.c2id for record in SyncRecord.objects.filter(rower=r)
|
|
||||||
])
|
|
||||||
|
|
||||||
for item in res.json()['data']:
|
for item in res.json()['data']:
|
||||||
d = item['distance']
|
d = item['distance']
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from abc import ABCMeta, ABC, abstractmethod
|
from abc import ABCMeta, ABC, abstractmethod
|
||||||
from importlib import import_module
|
from importlib import import_module
|
||||||
from rowers.models import Rower, User
|
from rowers.models import Rower, User, create_or_update_syncrecord, get_known_ids
|
||||||
from rowers.utils import NoTokenError,dologging
|
from rowers.utils import NoTokenError,dologging
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
from .integrations import SyncIntegration, NoTokenError
|
from .integrations import SyncIntegration, NoTokenError, create_or_update_syncrecord, get_known_ids
|
||||||
from rowers.models import User, Rower, Workout, TombStone, SyncRecord
|
from rowers.models import User, Rower, Workout, TombStone
|
||||||
from django.db.utils import IntegrityError
|
from django.db.utils import IntegrityError
|
||||||
|
|
||||||
from rowers import mytypes
|
from rowers import mytypes
|
||||||
@@ -91,14 +91,7 @@ class NKIntegration(SyncIntegration):
|
|||||||
_ = self.open()
|
_ = self.open()
|
||||||
r = self.rower
|
r = self.rower
|
||||||
|
|
||||||
record = SyncRecord(
|
record = create_or_update_syncrecord(r, None, nkid=id)
|
||||||
rower = r,
|
|
||||||
nkid = id,
|
|
||||||
)
|
|
||||||
try:
|
|
||||||
record.save()
|
|
||||||
except IntegrityError:
|
|
||||||
return 0
|
|
||||||
|
|
||||||
before = kwargs.get('before',0)
|
before = kwargs.get('before',0)
|
||||||
after = kwargs.get('after',0)
|
after = kwargs.get('after',0)
|
||||||
@@ -192,9 +185,7 @@ class NKIntegration(SyncIntegration):
|
|||||||
|
|
||||||
# get NK IDs
|
# get NK IDs
|
||||||
nkids = [item['id'] for item in jsondata]
|
nkids = [item['id'] for item in jsondata]
|
||||||
knownnkids = uniqify([
|
knownnkids = get_known_ids(r, 'nkid')
|
||||||
record.nkid for record in SyncRecord.objects.filter(rower=r)
|
|
||||||
])
|
|
||||||
workouts = []
|
workouts = []
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from .integrations import SyncIntegration, NoTokenError
|
from .integrations import SyncIntegration, NoTokenError, create_or_update_syncrecord, get_known_ids
|
||||||
from rowers.models import User, Rower, Workout, TombStone
|
from rowers.models import User, Rower, Workout, TombStone
|
||||||
|
|
||||||
from rowers.tasks import handle_rp3_async_workout
|
from rowers.tasks import handle_rp3_async_workout
|
||||||
@@ -101,6 +101,8 @@ class RP3Integration(SyncIntegration):
|
|||||||
if not startdatetime:
|
if not startdatetime:
|
||||||
startdatetime = str(timezone.now())
|
startdatetime = str(timezone.now())
|
||||||
|
|
||||||
|
record = create_or_update_syncrecord(self.rower, None, rp3id=id)
|
||||||
|
|
||||||
auth_token = self.open()
|
auth_token = self.open()
|
||||||
_ = myqueue(
|
_ = myqueue(
|
||||||
queuehigh,
|
queuehigh,
|
||||||
@@ -172,9 +174,7 @@ class RP3Integration(SyncIntegration):
|
|||||||
|
|
||||||
workouts_list = pd.json_normalize(workouts_json['data']['workouts'])
|
workouts_list = pd.json_normalize(workouts_json['data']['workouts'])
|
||||||
|
|
||||||
knownrp3ids = uniqify([
|
knownrp3ids = get_known_ids(r, 'rp3id')
|
||||||
w.uploadedtorp3 for w in Workout.objects.filter(user=r)
|
|
||||||
])
|
|
||||||
|
|
||||||
workouts = []
|
workouts = []
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from .integrations import SyncIntegration, NoTokenError
|
from .integrations import SyncIntegration, NoTokenError, create_or_update_syncrecord, get_known_ids
|
||||||
from rowers.models import User, Rower, Workout, TombStone
|
from rowers.models import User, Rower, Workout, TombStone
|
||||||
|
|
||||||
from rowingdata import rowingdata
|
from rowingdata import rowingdata
|
||||||
@@ -238,9 +238,7 @@ class SportTracksIntegration(SyncIntegration):
|
|||||||
stids = [int(getidfromuri(item['uri']))
|
stids = [int(getidfromuri(item['uri']))
|
||||||
for item in workouts_json['items']]
|
for item in workouts_json['items']]
|
||||||
|
|
||||||
knownstids = uniqify([
|
knownstids = get_known_ids(r, 'sporttracksid')
|
||||||
w.uploadedtosporttracks for w in Workout.objects.filter(user=r)
|
|
||||||
])
|
|
||||||
newids = [stid for stid in stids if stid not in knownstids]
|
newids = [stid for stid in stids if stid not in knownstids]
|
||||||
for sporttracksid in newids:
|
for sporttracksid in newids:
|
||||||
id = self.get_workout(sporttracksid)
|
id = self.get_workout(sporttracksid)
|
||||||
@@ -254,6 +252,7 @@ class SportTracksIntegration(SyncIntegration):
|
|||||||
|
|
||||||
r = self.rower
|
r = self.rower
|
||||||
|
|
||||||
|
record = create_or_update_syncrecord(r, None, sporttracksid=id)
|
||||||
|
|
||||||
job = myqueue(
|
job = myqueue(
|
||||||
queue,
|
queue,
|
||||||
@@ -289,9 +288,8 @@ class SportTracksIntegration(SyncIntegration):
|
|||||||
|
|
||||||
workouts = []
|
workouts = []
|
||||||
|
|
||||||
knownstids = uniqify([
|
knownstids = get_known_ids(r, 'sporttracksid')
|
||||||
w.uploadedtosporttracks for w in Workout.objects.filter(user=r)
|
|
||||||
])
|
|
||||||
for item in workouts_json['items']:
|
for item in workouts_json['items']:
|
||||||
d = int(float(item['total_distance']))
|
d = int(float(item['total_distance']))
|
||||||
i = int(getidfromuri(item['uri']))
|
i = int(getidfromuri(item['uri']))
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from .integrations import SyncIntegration, NoTokenError
|
from .integrations import SyncIntegration, NoTokenError, create_or_update_syncrecord, get_known_ids
|
||||||
from rowers.models import User, Rower, Workout, TombStone
|
from rowers.models import User, Rower, Workout, TombStone
|
||||||
from rowingdata import rowingdata
|
from rowingdata import rowingdata
|
||||||
|
|
||||||
@@ -212,6 +212,8 @@ class StravaIntegration(SyncIntegration):
|
|||||||
except NoTokenError("Strava error"):
|
except NoTokenError("Strava error"):
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
record = create_or_update_syncrecord(self.rower, None, stravaid=id)
|
||||||
|
|
||||||
csvfilename = 'media/{code}_{id}.csv'.format(
|
csvfilename = 'media/{code}_{id}.csv'.format(
|
||||||
code=uuid4().hex[:16], id=id)
|
code=uuid4().hex[:16], id=id)
|
||||||
job = myqueue(queue,
|
job = myqueue(queue,
|
||||||
@@ -279,9 +281,7 @@ class StravaIntegration(SyncIntegration):
|
|||||||
w.uploadedtostrava = int(stravaid)
|
w.uploadedtostrava = int(stravaid)
|
||||||
w.save()
|
w.save()
|
||||||
|
|
||||||
knownstravaids = uniqify([
|
knownstravaids = get_known_ids(self.rower,'stravaid')
|
||||||
w.uploadedtostrava for w in Workout.objects.filter(user=self.rower)
|
|
||||||
])
|
|
||||||
|
|
||||||
for item in res.json():
|
for item in res.json():
|
||||||
d = int(float(item['distance']))
|
d = int(float(item['distance']))
|
||||||
|
|||||||
+49
-7
@@ -5,7 +5,7 @@ from rowers.courseutils import coordinate_in_path
|
|||||||
from rowers.utils import (
|
from rowers.utils import (
|
||||||
# workflowleftpanel, workflowmiddlepanel,
|
# workflowleftpanel, workflowmiddlepanel,
|
||||||
defaultleft, defaultmiddle, landingpages, landingpages2,
|
defaultleft, defaultmiddle, landingpages, landingpages2,
|
||||||
steps_read_fit, steps_write_fit, ps_dict_order
|
steps_read_fit, steps_write_fit, ps_dict_order, uniqify
|
||||||
)
|
)
|
||||||
from rowers.metrics import axlabels
|
from rowers.metrics import axlabels
|
||||||
from rowers.utils import geo_distance
|
from rowers.utils import geo_distance
|
||||||
@@ -3625,19 +3625,36 @@ class SyncRecord(models.Model):
|
|||||||
nkid = models.BigIntegerField(unique=True,null=True,default=None)
|
nkid = models.BigIntegerField(unique=True,null=True,default=None)
|
||||||
c2id = models.BigIntegerField(unique=True,null=True,default=None)
|
c2id = models.BigIntegerField(unique=True,null=True,default=None)
|
||||||
tpid = models.BigIntegerField(unique=True,null=True,default=None)
|
tpid = models.BigIntegerField(unique=True,null=True,default=None)
|
||||||
|
rp3id = models.BigIntegerField(unique=True,null=True,default=None)
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
if self.workout:
|
if self.workout:
|
||||||
self.rower = self.workout.user
|
self.rower = self.workout.user
|
||||||
return super(SyncRecord, self).save(*args, **kwargs)
|
return super(SyncRecord, self).save(*args, **kwargs)
|
||||||
|
|
||||||
def create_or_update_syncrecord(rower, workout, **kwargs):
|
def __str__(self):
|
||||||
records = SyncRecord.objects.filter(workout=workout,rower=rower)
|
str = 'SyncRecord {i} {r} {w} '.format(
|
||||||
if records.count():
|
i = self.id,
|
||||||
record = records[0]
|
r = self.rower,
|
||||||
else:
|
w = self.workout,
|
||||||
record = SyncRecord(workout=workout, rower=rower)
|
)
|
||||||
|
|
||||||
|
str2 = ''
|
||||||
|
|
||||||
|
for field in ['stravaid', 'sporttracksid', 'nkid', 'c2id', 'tpid']:
|
||||||
|
value = getattr(self, field, None)
|
||||||
|
if value is not None:
|
||||||
|
str2 += '{w}: {v},'.format(
|
||||||
|
w = field,
|
||||||
|
v = value
|
||||||
|
)
|
||||||
|
|
||||||
|
if str2:
|
||||||
|
str = str+'('+str2+')'
|
||||||
|
|
||||||
|
return str
|
||||||
|
|
||||||
|
def create_or_update_syncrecord(rower, workout, **kwargs):
|
||||||
try:
|
try:
|
||||||
kwargs.pop('rower')
|
kwargs.pop('rower')
|
||||||
except KeyError:
|
except KeyError:
|
||||||
@@ -3648,6 +3665,26 @@ def create_or_update_syncrecord(rower, workout, **kwargs):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
if workout:
|
||||||
|
records = SyncRecord.objects.filter(workout=workout,rower=rower)
|
||||||
|
if records.count():
|
||||||
|
record = records[0]
|
||||||
|
else:
|
||||||
|
records = SyncRecord.objects.filter(**kwargs,rower=rower)
|
||||||
|
if records.count():
|
||||||
|
record = records[0]
|
||||||
|
record.workout = workout
|
||||||
|
else:
|
||||||
|
record = SyncRecord(rower=rower, workout=workout)
|
||||||
|
|
||||||
|
else: # not workout
|
||||||
|
records = SyncRecord.objects.filter(**kwargs, rower=rower)
|
||||||
|
if records.count():
|
||||||
|
record = records[0]
|
||||||
|
else:
|
||||||
|
record = SyncRecord(rower=rower)
|
||||||
|
|
||||||
|
|
||||||
for field in record._meta.fields:
|
for field in record._meta.fields:
|
||||||
value = kwargs.get(field.name, None)
|
value = kwargs.get(field.name, None)
|
||||||
if value:
|
if value:
|
||||||
@@ -3660,7 +3697,12 @@ def create_or_update_syncrecord(rower, workout, **kwargs):
|
|||||||
|
|
||||||
return record
|
return record
|
||||||
|
|
||||||
|
def get_known_ids(rower, field_name):
|
||||||
|
knownids = uniqify(
|
||||||
|
getattr(record, field_name, None) for record in SyncRecord.objects.filter(rower=rower)
|
||||||
|
)
|
||||||
|
|
||||||
|
return knownids
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+4
-1
@@ -405,6 +405,7 @@ def check_tp_workout_id(workout, location, attempts=5, debug=False, **kwargs):
|
|||||||
if status == 'Success':
|
if status == 'Success':
|
||||||
tpid = response.json()['WorkoutIds'][0]
|
tpid = response.json()['WorkoutIds'][0]
|
||||||
workout.uploadedtotp = tpid
|
workout.uploadedtotp = tpid
|
||||||
|
record = create_or_update_syncrecord(workout.user, workout, tpid=tpid)
|
||||||
workout.save()
|
workout.save()
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
@@ -432,6 +433,7 @@ def handle_workout_tp_upload(w, thetoken, tcxfilename, debug=False, **kwargs):
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
w.uploadedtotp = res
|
w.uploadedtotp = res
|
||||||
|
record = create_or_update_syncrecord(w.user, w, tpid=tpid)
|
||||||
tpid = res
|
tpid = res
|
||||||
w.save()
|
w.save()
|
||||||
os.remove(tcxfilename)
|
os.remove(tcxfilename)
|
||||||
@@ -729,7 +731,7 @@ def handle_sporttracks_sync(workoutid, url, headers, data, debug=False, **kwargs
|
|||||||
workout = Workout.objects.get(id=workoutid)
|
workout = Workout.objects.get(id=workoutid)
|
||||||
workout.uploadedtosporttracks = id
|
workout.uploadedtosporttracks = id
|
||||||
workout.save()
|
workout.save()
|
||||||
|
record = create_or_update_syncrecord(workout.user, workout, sporttracksid=id)
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
@@ -798,6 +800,7 @@ def handle_strava_sync(stravatoken,
|
|||||||
|
|
||||||
workout.uploadedtostrava = res.id
|
workout.uploadedtostrava = res.id
|
||||||
workout.save()
|
workout.save()
|
||||||
|
record = create_or_update_syncrecord(workout.user, workout, stravaid=res.id)
|
||||||
try:
|
try:
|
||||||
act = client.update_activity(res.id, activity_type=activity_type,
|
act = client.update_activity(res.id, activity_type=activity_type,
|
||||||
description=description, device_name='Rowsandall.com')
|
description=description, device_name='Rowsandall.com')
|
||||||
|
|||||||
BIN
Binary file not shown.
@@ -142,6 +142,7 @@ def do_sync(w, options, quick=False):
|
|||||||
# upload_to_strava = False
|
# upload_to_strava = False
|
||||||
do_strava_export = False
|
do_strava_export = False
|
||||||
w.save()
|
w.save()
|
||||||
|
record = create_or_update_syncrecord(w.user, w, {stravaid:options['stravaid']})
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -192,6 +193,7 @@ def do_sync(w, options, quick=False):
|
|||||||
if options['rp3id'] != 0 and options['rp3id'] != '': # pragma: no cover
|
if options['rp3id'] != 0 and options['rp3id'] != '': # pragma: no cover
|
||||||
w.uploadedtorp3 = options['rp3id']
|
w.uploadedtorp3 = options['rp3id']
|
||||||
w.save()
|
w.save()
|
||||||
|
record = create_or_update_syncrecord(w.user, w, {rp3id:options['rp3id']})
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -242,6 +244,7 @@ def do_sync(w, options, quick=False):
|
|||||||
w.uploadedtosporttracks = sporttracksid
|
w.uploadedtosporttracks = sporttracksid
|
||||||
w.save()
|
w.save()
|
||||||
do_st_export = False
|
do_st_export = False
|
||||||
|
record = create_or_update_syncrecord(w.user, w, {'sporttracksid':sporttracksid})
|
||||||
try: # pragma: no cover
|
try: # pragma: no cover
|
||||||
upload_to_st = options['upload_to_SportTracks'] or do_st_export
|
upload_to_st = options['upload_to_SportTracks'] or do_st_export
|
||||||
do_st_export = upload_to_st
|
do_st_export = upload_to_st
|
||||||
|
|||||||
Reference in New Issue
Block a user