diff --git a/rowers/integrations/integrations.py b/rowers/integrations/integrations.py index 20e6af60..8ef81207 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, SyncRecord from rowers.utils import NoTokenError,dologging import requests @@ -266,4 +266,5 @@ class SyncIntegration(metaclass=ABCMeta): return access_token + diff --git a/rowers/models.py b/rowers/models.py index 719518bc..bacd03db 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -3631,6 +3631,35 @@ class SyncRecord(models.Model): self.rower = self.workout.user 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: + pass + + try: + kwargs.pop('workout') + except KeyError: + pass + + for field in record._meta.fields: + value = kwargs.get(field.name, None) + if value: + setattr(record, field.name, value) + + try: + record.save() + except IntegrityError: + pass + + return record + diff --git a/rowers/tasks.py b/rowers/tasks.py index 3a085a8c..b7394de6 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -15,7 +15,7 @@ application = get_wsgi_application() from rowers.models import ( Workout, GeoPolygon, GeoPoint, GeoCourse, VirtualRaceResult, CourseTestResult, Rower, - GraphImage, SyncRecord + GraphImage ) import math @@ -35,6 +35,7 @@ import arrow import rowers.longtask as longtask import requests import rowers.datautils as datautils +from rowers.models import create_or_update_syncrecord """ Background tasks done by QR (production) """ import time @@ -523,8 +524,8 @@ def handle_c2_sync(workoutid, url, headers, data, debug=False, **kwargs): workout.uploadedtoc2 = c2id workout.save() - record = SyncRecord(workout=workout,c2id=c2id) - record.save() + record = create_or_update_syncrecord(workout.user, workout, c2id=c2id) + return 1 @@ -3409,19 +3410,7 @@ def handle_nk_async_workout(alldata, userid, nktoken, nkid, delaysec, defaulttim workout = Workout.objects.get(id=workoutid) newnkid = workout.uploadedtonk - sr = SyncRecord.objects.filter(nkid=newnkid) - if len(sr): - sr[0].workout = workout - try: - sr[0].save() - except IntegrityError: - pass - else: - sr = SyncRecord(workout=workout,nkid=newnkid) - try: - sr.save() - except IntegrityError: - pass + sr = create_or_update_syncrecord(workout.user, workout, nkid=newnkid) return workoutid @@ -3696,7 +3685,7 @@ def handle_c2_async_workout(alldata, userid, c2token, c2id, delaysec, workout = Workout.objects.get(id=workoutid) newc2id = workout.uploadedtoc2 - record = SyncRecord(workout=workout,c2id=newc2id) + record = create_or_update_syncrecord(workout.user, workout, c2id=newc2id) # set distance, time diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index a6d7ca33..f59a6ec8 100644 Binary files a/rowers/tests/testdata/testdata.tcx.gz and b/rowers/tests/testdata/testdata.tcx.gz differ diff --git a/rowers/uploads.py b/rowers/uploads.py index 5d89477a..960a4e0d 100644 --- a/rowers/uploads.py +++ b/rowers/uploads.py @@ -10,6 +10,7 @@ from rowers.utils import ( # for actions related to uploads from django.conf import settings from django.utils import timezone, translation + from rowers.tasks import ( handle_sendemail_unrecognized, handle_sendemailnewcomment, handle_sendemailnewresponse, handle_updatedps, @@ -17,7 +18,7 @@ from rowers.tasks import ( handle_sendemailcsv ) -from rowers.models import GraphImage, SyncRecord +from rowers.models import GraphImage, create_or_update_syncrecord from rowers.rower_rules import ispromember from rowers.utils import dologging @@ -148,11 +149,7 @@ def do_sync(w, options, quick=False): if options['nkid'] != 0 and options['nkid'] != '': # pragma: no cover w.uploadedtonk = options['nkid'] w.save() - record = SyncRecord(workout=w,nkid=options['nkid']) - try: - record.save() - except: - pass + record = create_or_update_syncrecord(w.user, w, {nkid:options['nkid']}) except KeyError: pass @@ -187,11 +184,7 @@ def do_sync(w, options, quick=False): # upload_to_c2 = False do_c2_export = False w.save() - record = SyncRecord(workout=w,c2id=options['c2id']) - try: - record.save() - except: - pass + record = create_or_update_syncrecord(w.user, w, {c2id:options['c2id']}) except KeyError: pass diff --git a/rowers/utils.py b/rowers/utils.py index cbcaf10f..72e4b799 100644 --- a/rowers/utils.py +++ b/rowers/utils.py @@ -1388,3 +1388,5 @@ def get_startdatetime_from_c2data(data): ).strftime('%H:%M:%S') return startdatetime, starttime, workoutdate, duration, starttimeunix, timezone + +