diff --git a/rowers/models.py b/rowers/models.py index 89069ca1..c67ad31c 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -21,7 +21,7 @@ from django.forms import ModelForm from django.dispatch import receiver from django.forms.widgets import SplitDateTimeWidget, SelectDateWidget from django.forms.formsets import BaseFormSet - +from django.db.models.signals import post_save from django.contrib.admin.widgets import AdminDateWidget, AdminTimeWidget, AdminSplitDateTime import os @@ -1255,6 +1255,8 @@ class Rower(models.Model): getemailnotifications = models.BooleanField(default=False, verbose_name='Receive email notifications') + imports_are_private = models.BooleanField(default=False, verbose_name='Make imports private by default') + # Friends/Team friends = models.ManyToManyField("self", blank=True) mycoachgroup = models.ForeignKey( @@ -3780,6 +3782,15 @@ class Workout(models.Model): super(Workout, self).save(*args, **kwargs) + @classmethod + def post_create(cls, sender, instance, created, *args, **kwargs): + if created: + user = instance.user + if user.imports_are_private: + instance.privacy = 'hidden' + instance.save() + + def __str__(self): try: @@ -3838,6 +3849,8 @@ class Workout(models.Model): return stri +post_save.connect(Workout.post_create, sender=Workout) + class WorkoutRPEForm(ModelForm): class Meta: model = Workout @@ -4581,7 +4594,15 @@ class RowerExportForm(ModelForm): 'rp3_auto_import', 'intervals_auto_import', 'intervals_auto_export', - 'intervals_resample_to_1s' + 'intervals_resample_to_1s', + 'imports_are_private' + ] + +class RowerPrivateImportForm(ModelForm): + class Meta: + model = Rower + fields = [ + 'imports_are_private' ] class RowerExportFormStrava(ModelForm): diff --git a/rowers/templates/panel_comments.html b/rowers/templates/panel_comments.html index 09d0d0f0..2d4fd917 100644 --- a/rowers/templates/panel_comments.html +++ b/rowers/templates/panel_comments.html @@ -11,12 +11,16 @@ Distance:{{ workout.distance }}m Duration:{{ workout.duration |durationprint:"%H:%M:%S.%f" }} - + + {% if workout.privacy != 'hidden' %} + Public link to this workout https://rowsandall.com/rowers/workout/{{ workout.id|encode }} - + + {% endif %} + Comments Comment ({{ aantalcomments }}) diff --git a/rowers/templates/rower_exportsettings.html b/rowers/templates/rower_exportsettings.html index 35c5b974..56c82066 100644 --- a/rowers/templates/rower_exportsettings.html +++ b/rowers/templates/rower_exportsettings.html @@ -46,6 +46,14 @@

Click on the icons to establish the connection or to renew the authorization.

+

+ By default, imported workouts are set to have a public URL. However, new workouts can be set to + private by default with the following setting: + + {{ forms.imports_are_private.as_table }} + +
+

  • API Key

    diff --git a/rowers/templates/rower_form.html b/rowers/templates/rower_form.html index 4912dd0e..1dd250ba 100644 --- a/rowers/templates/rower_form.html +++ b/rowers/templates/rower_form.html @@ -35,6 +35,7 @@
    {{ userform.as_table }} + {{ privateform.as_table }} {{ accountform.as_table }} diff --git a/rowers/templates/workout_form.html b/rowers/templates/workout_form.html index 98034e21..16c461fa 100644 --- a/rowers/templates/workout_form.html +++ b/rowers/templates/workout_form.html @@ -150,25 +150,28 @@ - + + {% if workout.privacy != 'hidden' %} + - {% for course in courses %} - - - - - {% endfor %} -
     Duration:{{ workout.duration |durationprint:"%H:%M:%S.%f" }}
    Source:{{ workout.workoutsource }}
    Public link to this workout: https://rowsandall.com/rowers/workout/{{ workout.id|encode }}/
    - Timed Course: - - {{ course }} -
    -
  • -
  • + {% endif %} + {% for course in courses %} + + + Timed Course: + + + {{ course }} + + +{% endfor %} + +
  • +
  • {% if form.errors %}

    Please correct the error{{ form.errors|pluralize }} below. diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz index 7c4266ea..637692e1 100644 Binary files a/rowers/tests/testdata/testdata.tcx.gz and b/rowers/tests/testdata/testdata.tcx.gz differ diff --git a/rowers/views/statements.py b/rowers/views/statements.py index 07f2ceed..e0b574a1 100644 --- a/rowers/views/statements.py +++ b/rowers/views/statements.py @@ -186,7 +186,7 @@ from rowers.models import ( RowerPowerForm, RowerHRZonesForm, SimpleRowerPowerFo RowerExportFormSportTracks, RowerExportFormTrainingPeaks, RowerExportFormConcept2, RowerExportFormGarmin, RowerExportFormIntervals, RowerExportFormRP3, - RowerExportFormNK, + RowerExportFormNK, RowerPrivateImportForm, ) from rowers.models import ( FavoriteForm, BaseFavoriteFormSet, SiteAnnouncement, BasePlannedSessionFormSet, diff --git a/rowers/views/userviews.py b/rowers/views/userviews.py index cf004032..61f2a9c9 100644 --- a/rowers/views/userviews.py +++ b/rowers/views/userviews.py @@ -479,6 +479,7 @@ def rower_exportsettings_view(request, userid=0): 'intervals': RowerExportFormIntervals(instance=r), 'nk': RowerExportFormNK(instance=r), 'garmin': RowerExportFormGarmin(instance=r), + 'imports_are_private': RowerPrivateImportForm(instance=r) } if request.method == 'POST': @@ -493,6 +494,7 @@ def rower_exportsettings_view(request, userid=0): 'intervals': RowerExportFormIntervals(request.POST, instance=r), 'nk': RowerExportFormNK(request.POST, instance=r), 'garmin': RowerExportFormGarmin(request.POST, instance=r), + 'imports_are_private': RowerPrivateImportForm(request.POST, instance=r), } if form.is_valid(): cd = form.cleaned_data @@ -593,11 +595,13 @@ def rower_edit_view(request, rowerid=0, userid=0, message=""): if request.method == 'POST': accountform = AccountRowerForm(request.POST, instance=r) userform = UserForm(request.POST, instance=r.user) + privateform = RowerPrivateImportForm(request.POST, instance=r) - if accountform.is_valid() and userform.is_valid(): + if accountform.is_valid() and userform.is_valid() and privateform.is_valid(): # process cd = accountform.cleaned_data ucd = userform.cleaned_data + pcd = privateform.cleaned_data first_name = ucd['first_name'] last_name = ucd['last_name'] @@ -633,6 +637,7 @@ def rower_edit_view(request, rowerid=0, userid=0, message=""): resetbounce = True emailalternatives = cd['emailalternatives'] + imports_are_private = pcd['imports_are_private'] u.save() r.defaulttimezone = defaulttimezone @@ -644,6 +649,7 @@ def rower_edit_view(request, rowerid=0, userid=0, message=""): r.defaultlandingpage = defaultlandingpage r.showfavoritechartnotes = showfavoritechartnotes r.share_course_results = share_course_results + r.imports_are_private = imports_are_private r.sex = sex r.birthdate = birthdate r.autojoin = autojoin @@ -658,11 +664,13 @@ def rower_edit_view(request, rowerid=0, userid=0, message=""): accountform = AccountRowerForm(instance=r) userform = UserForm(instance=u) + privateform = RowerPrivateImportForm(instance=r) successmessage = 'Account Information changed' messages.info(request, successmessage) else: accountform = AccountRowerForm(instance=r) userform = UserForm(instance=r.user) + privateform = RowerPrivateImportForm(instance=r) grants = AccessToken.objects.filter(user=request.user) try: @@ -678,6 +686,7 @@ def rower_edit_view(request, rowerid=0, userid=0, message=""): 'grants': grants, 'userform': userform, 'accountform': accountform, + 'privateform': privateform, 'rower': r, 'apikey': apikey.key, }) diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index b5e57156..98257c99 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -687,7 +687,7 @@ def addmanual_view(request, raceid=0): empowerside = form.cleaned_data.get('empowerside','port') if private: # pragma: no cover - privacy = 'private' + privacy = 'hidden' else: privacy = 'visible' @@ -4270,7 +4270,7 @@ def workout_flexchart_stacked_view(request, *args, **kwargs): def workout_unsubscribe_view(request, id=0): w = get_workout(id) - if w.privacy == 'private' and w.user.user != request.user: # pragma: no cover + if w.privacy == 'hidden' and w.user.user != request.user: # pragma: no cover return HttpResponseForbidden("Permission error") comments = WorkoutComment.objects.filter(workout=w, @@ -4300,7 +4300,7 @@ def workout_unsubscribe_view(request, id=0): def workout_comment_view(request, id=0): w = get_workout(id) - if w.privacy == 'private' and w.user.user != request.user: # pragma: no cover + if w.privacy == 'hidden' and w.user.user != request.user: # pragma: no cover return HttpResponseForbidden("Permission error") comments = WorkoutComment.objects.filter(workout=w).order_by("created") @@ -4490,7 +4490,7 @@ def workout_edit_view(request, id=0, message="", successmessage=""): if private: - privacy = 'private' + privacy = 'hidden' else: # pragma: no cover privacy = 'visible' @@ -5197,6 +5197,8 @@ def workout_upload_view(request, is_ajax = False r = getrower(request.user) + if r.imports_are_private: + uploadoptions['makeprivate'] = True if r.rowerplan == 'freecoach': # pragma: no cover url = reverse('team_workout_upload_view') return HttpResponseRedirect(url)