From 7c0558deea39efa851a1fc92b0323ed04a04935a Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 20 Jul 2023 08:45:51 +0200 Subject: [PATCH] more use of syncrecord --- .coveragerc | 16 ++-------------- rowers/integrations/rp3.py | 8 ++++---- rowers/integrations/sporttracks.py | 12 +++++------- rowers/integrations/strava.py | 8 ++++---- rowers/models.py | 1 + rowers/tests/testdata/testdata.tcx.gz | Bin 4000 -> 3999 bytes rowers/uploads.py | 3 +++ 7 files changed, 19 insertions(+), 29 deletions(-) diff --git a/.coveragerc b/.coveragerc index 29245f10..744c334d 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,15 +1,3 @@ -[run] -include = - ./* -omit = - *tests* - *migrations* - *cvkbrno* - */py2/* - */venv/* - *__init__* [report] -exclude_lines = - pragma: no cover - if __name__ == .__main__.: - +show_missing = True +omit = py39/* \ No newline at end of file diff --git a/rowers/integrations/rp3.py b/rowers/integrations/rp3.py index fba8b4e2..6e5b3467 100644 --- a/rowers/integrations/rp3.py +++ b/rowers/integrations/rp3.py @@ -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.tasks import handle_rp3_async_workout @@ -100,6 +100,8 @@ class RP3Integration(SyncIntegration): startdatetime = kwargs.get('startdatetime', None) if not startdatetime: startdatetime = str(timezone.now()) + + record = create_or_update_syncrecord(self.rower, None, rp3id=id) auth_token = self.open() _ = myqueue( @@ -172,9 +174,7 @@ class RP3Integration(SyncIntegration): workouts_list = pd.json_normalize(workouts_json['data']['workouts']) - knownrp3ids = uniqify([ - w.uploadedtorp3 for w in Workout.objects.filter(user=r) - ]) + knownrp3ids = get_known_ids(r, 'rp3id') workouts = [] diff --git a/rowers/integrations/sporttracks.py b/rowers/integrations/sporttracks.py index 9b4de159..d004b4f4 100644 --- a/rowers/integrations/sporttracks.py +++ b/rowers/integrations/sporttracks.py @@ -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 rowingdata import rowingdata @@ -238,9 +238,7 @@ class SportTracksIntegration(SyncIntegration): stids = [int(getidfromuri(item['uri'])) for item in workouts_json['items']] - knownstids = uniqify([ - w.uploadedtosporttracks for w in Workout.objects.filter(user=r) - ]) + knownstids = get_known_ids(r, 'sporttracksid') newids = [stid for stid in stids if stid not in knownstids] for sporttracksid in newids: id = self.get_workout(sporttracksid) @@ -254,6 +252,7 @@ class SportTracksIntegration(SyncIntegration): r = self.rower + record = create_or_update_syncrecord(r, None, sporttracksid=id) job = myqueue( queue, @@ -289,9 +288,8 @@ class SportTracksIntegration(SyncIntegration): workouts = [] - knownstids = uniqify([ - w.uploadedtosporttracks for w in Workout.objects.filter(user=r) - ]) + knownstids = get_known_ids(r, 'sporttracksid') + for item in workouts_json['items']: d = int(float(item['total_distance'])) i = int(getidfromuri(item['uri'])) diff --git a/rowers/integrations/strava.py b/rowers/integrations/strava.py index 6f99af05..068ff07d 100644 --- a/rowers/integrations/strava.py +++ b/rowers/integrations/strava.py @@ -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 rowingdata import rowingdata @@ -212,6 +212,8 @@ class StravaIntegration(SyncIntegration): except NoTokenError("Strava error"): return 0 + record = create_or_update_syncrecord(self.rower, None, stravaid=id) + csvfilename = 'media/{code}_{id}.csv'.format( code=uuid4().hex[:16], id=id) job = myqueue(queue, @@ -279,9 +281,7 @@ class StravaIntegration(SyncIntegration): w.uploadedtostrava = int(stravaid) w.save() - knownstravaids = uniqify([ - w.uploadedtostrava for w in Workout.objects.filter(user=self.rower) - ]) + knownstravaids = get_known_ids(self.rower,'stravaid') for item in res.json(): d = int(float(item['distance'])) diff --git a/rowers/models.py b/rowers/models.py index 661f33b4..4d66ab55 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -3625,6 +3625,7 @@ class SyncRecord(models.Model): nkid = 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) + rp3id = models.BigIntegerField(unique=True,null=True,default=None) def save(self, *args, **kwargs): if self.workout: diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 568f08b79a7be70b713e35b58d5ec92df3924004..f2afd5909d71079a71282b86b2f08f7ad8294236 100644 GIT binary patch delta 3903 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 O{s#-fT~P$YfB^ug!`f*8 diff --git a/rowers/uploads.py b/rowers/uploads.py index 960a4e0d..15210848 100644 --- a/rowers/uploads.py +++ b/rowers/uploads.py @@ -142,6 +142,7 @@ def do_sync(w, options, quick=False): # upload_to_strava = False do_strava_export = False w.save() + record = create_or_update_syncrecord(w.user, w, {stravaid:options['stravaid']}) except KeyError: pass @@ -192,6 +193,7 @@ def do_sync(w, options, quick=False): if options['rp3id'] != 0 and options['rp3id'] != '': # pragma: no cover w.uploadedtorp3 = options['rp3id'] w.save() + record = create_or_update_syncrecord(w.user, w, {rp3id:options['rp3id']}) except KeyError: pass @@ -242,6 +244,7 @@ def do_sync(w, options, quick=False): w.uploadedtosporttracks = sporttracksid w.save() do_st_export = False + record = create_or_update_syncrecord(w.user, w, {'sporttracksid':sporttracksid}) try: # pragma: no cover upload_to_st = options['upload_to_SportTracks'] or do_st_export do_st_export = upload_to_st