Private
Public Access
1
0

adding privacy default on import or upload

This commit is contained in:
2024-12-19 15:51:17 +01:00
parent 9d500265e1
commit 009cdd289b
9 changed files with 72 additions and 24 deletions

View File

@@ -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):

View File

@@ -11,12 +11,16 @@
<th>Distance:</th><td>{{ workout.distance }}m</td>
</tr><tr>
<th>Duration:</th><td>{{ workout.duration |durationprint:"%H:%M:%S.%f" }}</td>
</tr><tr>
</tr>
{% if workout.privacy != 'hidden' %}
<tr>
<th>Public link to this workout</th>
<td>
<a href="/rowers/workout/{{ workout.id|encode }}">https://rowsandall.com/rowers/workout/{{ workout.id|encode }}</a>
</td>
</tr><tr>
</tr>
{% endif %}
<tr>
<th>Comments</th>
<td>
<a href="/rowers/workout/{{ workout.id|encode }}/comment">Comment ({{ aantalcomments }})</a>

View File

@@ -46,6 +46,14 @@
<p>
Click on the icons to establish the connection or to renew the authorization.
</p>
<p>
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:
<table>
{{ forms.imports_are_private.as_table }}
<input type="submit" value="Save">
</table>
</p>
</li>
<li class="grid_4">
<h2>API Key</h2>

View File

@@ -35,6 +35,7 @@
<form enctype="multipart/form-data" action="" method="post">
<table>
{{ userform.as_table }}
{{ privateform.as_table }}
{{ accountform.as_table }}
<tr>
<th>&nbsp;</th><td></td>

View File

@@ -150,25 +150,28 @@
<th>Duration:</th><td>{{ workout.duration |durationprint:"%H:%M:%S.%f" }}</td>
</tr><tr>
<th>Source:</th><td>{{ workout.workoutsource }}</td>
</tr><tr>
</tr>
{% if workout.privacy != 'hidden' %}
<tr>
<th>Public link to this workout:</th>
<td>
<a href="/rowers/workout/{{ workout.id|encode }}/">https://rowsandall.com/rowers/workout/{{ workout.id|encode }}/</a>
</td>
</tr>
{% for course in courses %}
<tr>
<th>
Timed Course:
</th>
<td>
<a href="/rowers/courses/{{ course.id }}"/>{{ course }}</a>
</td>
</tr>
{% endfor %}
</table>
</li>
<li class="grid_2">
{% endif %}
{% for course in courses %}
<tr>
<th>
Timed Course:
</th>
<td>
<a href="/rowers/courses/{{ course.id }}"/>{{ course }}</a>
</td>
</tr>
{% endfor %}
</table>
</li>
<li class="grid_2">
{% if form.errors %}
<p style="color: red;">
Please correct the error{{ form.errors|pluralize }} below.

Binary file not shown.

View File

@@ -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,

View File

@@ -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,
})

View File

@@ -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)