adding privacy default on import or upload
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
<form enctype="multipart/form-data" action="" method="post">
|
||||
<table>
|
||||
{{ userform.as_table }}
|
||||
{{ privateform.as_table }}
|
||||
{{ accountform.as_table }}
|
||||
<tr>
|
||||
<th> </th><td></td>
|
||||
|
||||
@@ -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.
|
||||
|
||||
BIN
rowers/tests/testdata/testdata.tcx.gz
vendored
BIN
rowers/tests/testdata/testdata.tcx.gz
vendored
Binary file not shown.
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user