diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 827a9717..28bf84be 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -369,7 +369,7 @@ def workout_summary_to_df( return df -def resample(id, r, parent, overwrite='copy'): +def resample(id, r, parent, overwrite=False): data, row = getrowdata_db(id=id) messages = [] @@ -393,7 +393,7 @@ def resample(id, r, parent, overwrite='copy'): data['pace'] = data['pace'] / 1000. data['time'] = data['time'] / 1000. - if overwrite == 'overwrite': + if overwrite == True: # remove CP data try: cpfile = 'media/cpdata_{id}.parquet.gz'.format(id=parent.id) diff --git a/rowers/forms.py b/rowers/forms.py index 0ebc5fb3..506f900f 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -67,13 +67,12 @@ class FlexibleDecimalField(forms.DecimalField): class ResampleForm(forms.Form): - resamplechoices = ( - ('overwrite', 'Overwrite Workout'), - ('copy', 'Create a Duplicate Workout') - ) - + # add resamplechoice field, the result is a True or False boolean, labels are "overwrite" and "create copy" resamplechoice = forms.ChoiceField( - initial='copy', choices=resamplechoices, label='Copy behavior') + required=True, + choices=((True, 'overwrite'), (False, 'create copy')), + label='Resample choice', + widget=forms.RadioSelect) class TrainingZonesForm(forms.Form): @@ -582,6 +581,11 @@ class UploadOptionsForm(forms.Form): races = VirtualRace.objects.filter( registration_closure__gt=timezone.now()) + # set upload_to_X based on r.X_auto_export + for field in ['C2', 'Strava', 'SportTracks', 'TrainingPeaks', 'Intervals']: + if getattr(r, field.lower()+'_auto_export') and r.rowerplan in ['pro', 'plan','coach']: + self.fields['upload_to_'+field].initial = True + registrations = IndoorVirtualRaceResult.objects.filter( race__in=races, userid=r.id) @@ -665,6 +669,10 @@ class TeamUploadOptionsForm(forms.Form): upload_to_TrainingPeaks = forms.BooleanField(initial=False, required=False, label='Export to TrainingPeaks') + + upload_to_Intervals = forms.BooleanField(initial=False, + required=False, + label='Export to TrainingPeaks') # do_physics = forms.BooleanField(initial=False,required=False,label='Power Estimate (OTW)') makeprivate = forms.BooleanField(initial=False, required=False, label='Make Workout Private') diff --git a/rowers/integrations/intervals.py b/rowers/integrations/intervals.py index 1cdcbfb0..7db883ae 100644 --- a/rowers/integrations/intervals.py +++ b/rowers/integrations/intervals.py @@ -17,6 +17,7 @@ import os from uuid import uuid4 from django.utils import timezone from datetime import timedelta +import rowers.dataprep as dataprep from rowsandall_app.settings import ( INTERVALS_CLIENT_ID, INTERVALS_REDIRECT_URI, INTERVALS_CLIENT_SECRET, SITE_URL diff --git a/rowers/models.py b/rowers/models.py index cd2500f7..047d8d0a 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -4561,6 +4561,7 @@ class RowerExportForm(ModelForm): 'rp3_auto_import', 'intervals_auto_import', 'intervals_auto_export', + 'intervals_resample_to_1s' ] class RowerExportFormStrava(ModelForm): @@ -4616,7 +4617,6 @@ class RowerExportFormTrainingPeaks(ModelForm): model = Rower fields = [ 'trainingpeaks_auto_export', - 'rp3_auto_import', ] class RowerExportFormRP3(ModelForm): diff --git a/rowers/templates/rower_exportsettings.html b/rowers/templates/rower_exportsettings.html index 0d7d3858..13418d15 100644 --- a/rowers/templates/rower_exportsettings.html +++ b/rowers/templates/rower_exportsettings.html @@ -64,13 +64,12 @@ {% endif %}
  • -

    Intervals.icu

    +

    NK

    - {{ forms.intervals.as_table }} + {{ forms.nk.as_table }}
    -

    connect with intervals.icu

    +

    connect with NK Logbook

  • Concept2

    @@ -81,12 +80,27 @@

    connect with Concept2

  • -

    NK

    +

    RP3

    - {{ forms.nk.as_table }} + {{ forms.rp3.as_table }}
    -

    connect with NK Logbook

    +

    connect with RP3

    +
  • +
  • +

    Rojabo

    +

    connect with Rojabo

    +
  • +
  • +

    Intervals.icu

    + + {{ forms.intervals.as_table }} + +
    +

    connect with intervals.icu

  • SportTracks

    @@ -102,6 +116,8 @@ {{ forms.trainingpeaks.as_table }} +

    connect with Polar

  • Polar

    @@ -112,11 +128,6 @@

    connect with Polar

  • -
  • -

    Rojabo

    -

    connect with Rojabo

    -
  • Garmin Connect

    @@ -153,24 +164,6 @@

    -
  • -

    TrainingPeaks

    -
  • - {{ forms.trainingpeaks.as_table }} - -
    -

    connect with Polar

    -
  • -
  • -

    RP3

    - - {{ forms.rp3.as_table }} - -
    -

    connect with RP3

    -
  • {% if grants %}
  • Applications

    diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 3a4eca33..dd7306f8 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 71f07553..fae902d5 100644 --- a/rowers/uploads.py +++ b/rowers/uploads.py @@ -245,23 +245,6 @@ def do_sync(w, options, quick=False): dologging('c2_log.log','Error C2') pass - if do_strava_export: # pragma: no cover - strava_integration = StravaIntegration(w.user.user) - try: - id = strava_integration.workout_export(w) - dologging( - 'strava_export_log.log', - 'exporting workout {id} as {type}'.format( - id=w.id, - type=w.workouttype, - ) - ) - except NoTokenError: # pragma: no cover - id = 0 - message = "Please connect to Strava first" - except Exception as e: - dologging('stravalog.log', e) - if do_icu_export: intervals_integration = IntervalsIntegration(w.user.user) try: @@ -334,4 +317,23 @@ def do_sync(w, options, quick=False): dologging('tp_export.log','No Token Error') return 0 + # we do Strava last. + if do_strava_export: # pragma: no cover + strava_integration = StravaIntegration(w.user.user) + try: + id = strava_integration.workout_export(w) + dologging( + 'strava_export_log.log', + 'exporting workout {id} as {type}'.format( + id=w.id, + type=w.workouttype, + ) + ) + except NoTokenError: # pragma: no cover + id = 0 + message = "Please connect to Strava first" + except Exception as e: + dologging('stravalog.log', e) + + return 1 diff --git a/rowers/views/userviews.py b/rowers/views/userviews.py index d2d22e25..cf004032 100644 --- a/rowers/views/userviews.py +++ b/rowers/views/userviews.py @@ -465,6 +465,7 @@ def rower_exportsettings_view(request, userid=0): 'rp3_auto_import': 'rp3token', 'nk_auto_import': 'nktoken', 'intervals_auto_export': 'intervals_token', + 'intervals_resample_to_1s': 'intervals_token', } r = getrequestrowercoachee(request, userid=userid) diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index 14112726..0412c7ff 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -5609,17 +5609,6 @@ def workout_upload_view(request, return response else: if not is_ajax: - if r.c2_auto_export and ispromember(r.user): # pragma: no cover - uploadoptions['upload_to_C2'] = True - - if r.strava_auto_export and ispromember(r.user): # pragma: no cover - uploadoptions['upload_to_Strava'] = True - - if r.sporttracks_auto_export and ispromember(r.user): # pragma: no cover - uploadoptions['upload_to_SportTracks'] = True - - if r.trainingpeaks_auto_export and ispromember(r.user): # pragma: no cover - uploadoptions['upload_to_TrainingPeaks'] = True form = DocumentsForm(initial=docformoptions) optionsform = UploadOptionsForm(initial=uploadoptions, diff --git a/static/img/intervals_logo_with_name.png b/static/img/intervals_logo_with_name.png new file mode 100644 index 00000000..b448dd4e Binary files /dev/null and b/static/img/intervals_logo_with_name.png differ