Private
Public Access
1
0

Merge branch 'release/v20.1.10'

This commit is contained in:
2023-07-20 09:03:08 +02:00
11 changed files with 81 additions and 64 deletions
+2 -14
View File
@@ -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__.:
+5 -13
View File
@@ -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 -1
View File
@@ -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
+4 -13
View File
@@ -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 = []
+4 -4
View File
@@ -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
@@ -100,6 +100,8 @@ class RP3Integration(SyncIntegration):
startdatetime = kwargs.get('startdatetime', None) startdatetime = kwargs.get('startdatetime', None)
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(
@@ -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 = []
+5 -7
View File
@@ -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']))
+4 -4
View File
@@ -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
View File
@@ -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 __str__(self):
str = 'SyncRecord {i} {r} {w} '.format(
i = self.id,
r = self.rower,
w = self.workout,
)
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): def create_or_update_syncrecord(rower, workout, **kwargs):
records = SyncRecord.objects.filter(workout=workout,rower=rower)
if records.count():
record = records[0]
else:
record = SyncRecord(workout=workout, rower=rower)
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
View File
@@ -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')
Binary file not shown.
+3
View File
@@ -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