diff --git a/rowers/integrations/c2.py b/rowers/integrations/c2.py index fd8e0d50..b7fee546 100644 --- a/rowers/integrations/c2.py +++ b/rowers/integrations/c2.py @@ -1,5 +1,5 @@ -from .integrations import SyncIntegration, NoTokenError -from rowers.models import User, Rower, Workout, TombStone, SyncRecord +from .integrations import SyncIntegration, NoTokenError, create_or_update_syncrecord, get_known_ids +from rowers.models import User, Rower, Workout, TombStone from django.db.utils import IntegrityError from rowingdata import rowingdata @@ -360,15 +360,9 @@ class C2Integration(SyncIntegration): def get_workout(self, id, *args, **kwargs): _ = self.open() + r = self.rower - record = SyncRecord( - rower = self.rower, - c2id = id, - ) - try: - record.save() - except IntegrityError: - return 0 + record = create_or_update_syncrecord(r, None, c2id=id) _ = myqueue(queuehigh, handle_c2_getworkout, @@ -428,9 +422,7 @@ class C2Integration(SyncIntegration): workouts = [] c2ids = [item['id'] for item in res.json()['data']] - knownc2ids = uniqify([ - record.c2id for record in SyncRecord.objects.filter(rower=r) - ]) + knownc2ids = get_known_ids(r, 'c2id') for item in res.json()['data']: d = item['distance'] diff --git a/rowers/integrations/integrations.py b/rowers/integrations/integrations.py index 98de0b2e..0cfaf0ad 100644 --- a/rowers/integrations/integrations.py +++ b/rowers/integrations/integrations.py @@ -1,6 +1,6 @@ from abc import ABCMeta, ABC, abstractmethod from importlib import import_module -from rowers.models import Rower, User, create_or_update_syncrecord +from rowers.models import Rower, User, create_or_update_syncrecord, get_known_ids from rowers.utils import NoTokenError,dologging import requests diff --git a/rowers/integrations/nk.py b/rowers/integrations/nk.py index 1e3908df..d109b415 100644 --- a/rowers/integrations/nk.py +++ b/rowers/integrations/nk.py @@ -1,5 +1,5 @@ -from .integrations import SyncIntegration, NoTokenError, create_or_update_syncrecord -from rowers.models import User, Rower, Workout, TombStone, SyncRecord +from .integrations import SyncIntegration, NoTokenError, create_or_update_syncrecord, get_known_ids +from rowers.models import User, Rower, Workout, TombStone from django.db.utils import IntegrityError from rowers import mytypes @@ -185,9 +185,7 @@ class NKIntegration(SyncIntegration): # get NK IDs nkids = [item['id'] for item in jsondata] - knownnkids = uniqify([ - record.nkid for record in SyncRecord.objects.filter(rower=r) - ]) + knownnkids = get_known_ids(r, 'nkid') workouts = [] diff --git a/rowers/models.py b/rowers/models.py index 3480a3ba..661f33b4 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -5,7 +5,7 @@ from rowers.courseutils import coordinate_in_path from rowers.utils import ( # workflowleftpanel, workflowmiddlepanel, 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.utils import geo_distance @@ -3630,6 +3630,28 @@ class SyncRecord(models.Model): if self.workout: self.rower = self.workout.user 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): try: @@ -3674,7 +3696,12 @@ def create_or_update_syncrecord(rower, workout, **kwargs): 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 diff --git a/rowers/tasks.py b/rowers/tasks.py index b7394de6..e34d100e 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -405,6 +405,7 @@ def check_tp_workout_id(workout, location, attempts=5, debug=False, **kwargs): if status == 'Success': tpid = response.json()['WorkoutIds'][0] workout.uploadedtotp = tpid + record = create_or_update_syncrecord(workout.user, workout, tpid=tpid) workout.save() return 1 @@ -432,6 +433,7 @@ def handle_workout_tp_upload(w, thetoken, tcxfilename, debug=False, **kwargs): return 0 w.uploadedtotp = res + record = create_or_update_syncrecord(w.user, w, tpid=tpid) tpid = res w.save() 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.uploadedtosporttracks = id workout.save() - + record = create_or_update_syncrecord(workout.user, workout, sporttracksid=id) return 1 @@ -798,6 +800,7 @@ def handle_strava_sync(stravatoken, workout.uploadedtostrava = res.id workout.save() + record = create_or_update_syncrecord(workout.user, workout, stravaid=res.id) try: act = client.update_activity(res.id, activity_type=activity_type, description=description, device_name='Rowsandall.com') diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index e3b7263c..b2537667 100644 Binary files a/rowers/tests/testdata/testdata.tcx.gz and b/rowers/tests/testdata/testdata.tcx.gz differ