From 8f060ed5bb4dd51e1c4c260cd456d50a63394b16 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 18 Jul 2023 22:24:10 +0200 Subject: [PATCH 1/7] more refactorgoodies --- rowers/integrations/integrations.py | 2 +- rowers/integrations/nk.py | 13 +++--------- rowers/models.py | 28 ++++++++++++++++++++------ rowers/tests/testdata/testdata.tcx.gz | Bin 4001 -> 4001 bytes 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/rowers/integrations/integrations.py b/rowers/integrations/integrations.py index 87aa1661..98de0b2e 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 +from rowers.models import Rower, User, create_or_update_syncrecord from rowers.utils import NoTokenError,dologging import requests diff --git a/rowers/integrations/nk.py b/rowers/integrations/nk.py index 3c95729c..fc22d965 100644 --- a/rowers/integrations/nk.py +++ b/rowers/integrations/nk.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 +from rowers.models import User, Rower, Workout, TombStone from django.db.utils import IntegrityError from rowers import mytypes @@ -91,14 +91,7 @@ class NKIntegration(SyncIntegration): _ = self.open() r = self.rower - record = SyncRecord( - rower = r, - nkid = id, - ) - try: - record.save() - except IntegrityError: - return 0 + record = create_or_update_syncrecord(rower, None, nkid=id) before = kwargs.get('before',0) after = kwargs.get('after',0) diff --git a/rowers/models.py b/rowers/models.py index bacd03db..90156ac5 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -3632,12 +3632,6 @@ class SyncRecord(models.Model): return super(SyncRecord, self).save(*args, **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: kwargs.pop('rower') except KeyError: @@ -3648,14 +3642,36 @@ def create_or_update_syncrecord(rower, workout, **kwargs): except KeyError: 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: value = kwargs.get(field.name, None) if value: + print(field.name, value) setattr(record, field.name, value) try: record.save() except IntegrityError: + print('err') pass return record diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index f59a6ec8044d9be569ee477e364abab39cca2427..06c68648b7319e7de13ea9391e1885bc6c0f5631 100644 GIT binary patch delta 3942 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 AvH$=8 delta 3942 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 Date: Tue, 18 Jul 2023 22:24:47 +0200 Subject: [PATCH 2/7] remove prrint statements --- rowers/models.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/rowers/models.py b/rowers/models.py index 90156ac5..3480a3ba 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -3665,13 +3665,11 @@ def create_or_update_syncrecord(rower, workout, **kwargs): for field in record._meta.fields: value = kwargs.get(field.name, None) if value: - print(field.name, value) setattr(record, field.name, value) try: record.save() except IntegrityError: - print('err') pass return record From a897a496c2a94658924144d733b9f716a37db05b Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 18 Jul 2023 22:34:38 +0200 Subject: [PATCH 3/7] fix and now passing tests --- rowers/integrations/nk.py | 4 ++-- rowers/tests/testdata/testdata.tcx.gz | Bin 4001 -> 4001 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rowers/integrations/nk.py b/rowers/integrations/nk.py index fc22d965..1e3908df 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 +from rowers.models import User, Rower, Workout, TombStone, SyncRecord from django.db.utils import IntegrityError from rowers import mytypes @@ -91,7 +91,7 @@ class NKIntegration(SyncIntegration): _ = self.open() r = self.rower - record = create_or_update_syncrecord(rower, None, nkid=id) + record = create_or_update_syncrecord(r, None, nkid=id) before = kwargs.get('before',0) after = kwargs.get('after',0) diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 06c68648b7319e7de13ea9391e1885bc6c0f5631..e3b7263cdc292eddcdf20ab01e05c8d34018dcdb 100644 GIT binary patch literal 4001 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 H#DD<+S+hia literal 4001 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 H#DD<+3CuEc From 1404d7b80aa5161610a562ca6f323da190768d6d Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 19 Jul 2023 19:57:22 +0200 Subject: [PATCH 4/7] improving syncrecord functionality, now also for workout export --- rowers/integrations/c2.py | 18 +++++----------- rowers/integrations/integrations.py | 2 +- rowers/integrations/nk.py | 8 +++---- rowers/models.py | 29 +++++++++++++++++++++++++- rowers/tasks.py | 5 ++++- rowers/tests/testdata/testdata.tcx.gz | Bin 4001 -> 4000 bytes 6 files changed, 41 insertions(+), 21 deletions(-) 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 e3b7263cdc292eddcdf20ab01e05c8d34018dcdb..b25376676d301d5fe7ae7571555d8b5063a0e0b5 100644 GIT binary patch literal 4000 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 H#DD<+S+hia From 88c26ea7134470a38baf2529349c9e1053dfad07 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 19 Jul 2023 21:37:31 +0200 Subject: [PATCH 5/7] running coverage --- rowers/tests/testdata/testdata.tcx.gz | Bin 4000 -> 4000 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index b25376676d301d5fe7ae7571555d8b5063a0e0b5..568f08b79a7be70b713e35b58d5ec92df3924004 100644 GIT binary patch delta 455 zcmV;&0XY7kAD|xwABzYGhb@r?GXlp9kvm9#XSZ4IrJdKCdv{;;{rUc4@%HUobKG5= zuGZ%0>~xX7+#J1Ho_3qX^@lIs(B0iB_PclAaF+W={p!uCfB(z7e!0#!c;y7|HmlFh z@RrTl#qojwaPh~J$IrH>_+ho)^xgVsnU315_IKxfe0J3J+h2R58`#qy^@hy5&5OSh zKJf2d|DZcLyI3tZi#Pb!`@fSE0XG4QlS~0V0c?|t0g@M%=>Z=S=Eu1E`wGR2)$wt< zwPpY6?8UP*0(%U9FT0l=u)K5uzB}%JJXq`wxU)Oc$KRMgUw&HczCUv$vaW{h~WL**>lGakV~v(e+(AZ?}895|vNK9o&E2zdF0P@|xT~KR;O=b$$Bj zmoLWUxxYGD`tIk~tCJU(Klk_aKBhyjJe&_(o^=07m(0#`f~%ju-fgu`o4tJ6Z@c00 z(SC9MgXig{4}V*pEW6Dzamb%OJi06Qb?~@bA3u6{_{-DGX8Y%E`>*LOe){_K&t%Lb<$nn4ZR;>C%UH{s#-fT~Wk<0RXiG1t9DIPIqoh_ zS8H>0cDhJkZjN3pPrJ?H`okA*=5ILrN`e)VS6zyIZ3zg*`VymEqfo7HD$ zc+2MO;&?#-xcKAA<7eAb{IFVY`fh!+Oh;{2`@8c#K0E6A?XSJj4eaTUdPC;j=H*`! zANcpKf6$$rU96Uy#T)$V{r{5`0XG55lS~0V0dA9v0g@M&=>Z=S=Eu1E`wGR2)$wt< zwPpY6?B%mG0(%U9e;&yTv_~#>@ZE9$zCch$@XcbkE`|Z%dYRzdAr@)m8g6=?%@9G{?*yVmDl9{`T5D}sO!^D zzkD$+&;8ZO(sw_7qT@}&Dux@2~87F_-O^=_+m+U(`ie%lR~ zkM@i6A3RStefZn*WZ7+&i9`PM;n7{WuY Date: Thu, 20 Jul 2023 08:45:51 +0200 Subject: [PATCH 6/7] 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 From 9b0a40ca70c58cfcfecf82cb8e47c6b2ba60e798 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 20 Jul 2023 09:02:59 +0200 Subject: [PATCH 7/7] fix --- rowers/tests/testdata/testdata.tcx.gz | Bin 3999 -> 4002 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index f2afd5909d71079a71282b86b2f08f7ad8294236..254504ee1fabe83e88223ae771f613c58288228b 100644 GIT binary patch delta 1353 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