Private
Public Access
1
0

Merge branch 'release/v20.4.0'

This commit is contained in:
2024-01-20 15:36:07 +01:00
6 changed files with 81 additions and 26 deletions
+19
View File
@@ -1265,6 +1265,25 @@ class ForceCurveMultipleCompareForm(forms.Form):
widget=forms.CheckboxSelectMultiple() widget=forms.CheckboxSelectMultiple()
) )
bulkactions = (
('remove','remove'),
('export','export'),
)
destinations = (
('C2','C2'),
('strava','strava'),
('sporttracks','sporttracks'),
('trainingpeaks','trainingpeaks')
)
class WorkoutBulkActions(forms.Form):
action = forms.ChoiceField(
choices=bulkactions, label='Action', required=True, initial='remove')
class ExportChoices(forms.Form):
destination = forms.ChoiceField(
choices=destinations, label='Destination', required=False, initial='strava'
)
class WorkoutMultipleCompareForm(forms.Form): class WorkoutMultipleCompareForm(forms.Form):
workouts = forms.ModelMultipleChoiceField( workouts = forms.ModelMultipleChoiceField(
+1 -4
View File
@@ -97,10 +97,7 @@
<form enctype="multipart/form-data" method="post"> <form enctype="multipart/form-data" method="post">
<h3>Bulk Operation</h3> <h3>Bulk Operation</h3>
<p>Please select workouts from the list to do a bulk operation on.</p> <p>Please select workouts from the list to do a bulk operation on.</p>
<select name="selectworkouts_operation" id="selectworkouts_operation"> {{ actionform.as_p }}
<option value="">--Please choose an option--</option>
<option value="remove">Remove</option>
</select>
{% csrf_token %} {% csrf_token %}
<input name='selectworkouts' type="submit" value="Submit"> <input name='selectworkouts' type="submit" value="Submit">
</li> </li>
+19 -14
View File
@@ -7,23 +7,28 @@
{% block main %} {% block main %}
<h1>Bulk Actions</h1> <h1>Bulk Actions</h1>
<ul class="main-content"> <ul class="main-content">
<li class="grid_2"> <li class="grid_4">
<p> <form action="" method="post">
Edit and confirm the action you want to perform on the following workouts: <p>
</p> Edit and confirm the action you want to perform on the following workouts:
{% for workout in workouts %} </p>
<p>{{ workout }}</p> <p>
{% endfor %} {{ form.as_p }}
<p> </p>
Action: {{ action }} <p>
</p> {{ actionform.as_p }}
</li> </p>
<li class="grid_2"> {% if action == 'export' %}
<form action="" method="post"> <p>
{{ exportchoice.as_p }}
</p>
{% endif %}
</li>
<li class="grid_2">
{% csrf_token %} {% csrf_token %}
<input type="submit" value="Confirm"> <input type="submit" value="Confirm">
</li>
</form> </form>
</li>
</ul> </ul>
Binary file not shown.
+1
View File
@@ -96,6 +96,7 @@ from django.http import (
) )
from django.contrib.auth import authenticate, login, logout from django.contrib.auth import authenticate, login, logout
from rowers.forms import ( from rowers.forms import (
WorkoutBulkActions, ExportChoices,
ForceCurveOptionsForm, HistoForm, TeamMessageForm, ForceCurveOptionsForm, HistoForm, TeamMessageForm,
LoginForm, DocumentsForm, UploadOptionsForm, ImageForm, CourseForm, LoginForm, DocumentsForm, UploadOptionsForm, ImageForm, CourseForm,
CourseConfirmForm, ResampleForm, CourseConfirmForm, ResampleForm,
+41 -8
View File
@@ -2,6 +2,7 @@ from shutil import copyfile
from rowers.views.statements import * from rowers.views.statements import *
import rowers.mytypes as mytypes import rowers.mytypes as mytypes
from rowers.integrations import importsources
import numpy import numpy
import rowers.uploads as uploads import rowers.uploads as uploads
import rowers.utils as utils import rowers.utils as utils
@@ -2040,7 +2041,6 @@ def workouts_bulk_actions(request):
workouts = [] workouts = []
try: try:
for encid in workoutids: for encid in workoutids:
print(encid)
w = get_workout_by_opaqueid(request, encid) w = get_workout_by_opaqueid(request, encid)
if w.user == r: if w.user == r:
workouts.append(w) workouts.append(w)
@@ -2048,15 +2048,45 @@ def workouts_bulk_actions(request):
pass pass
if request.method == 'POST': if request.method == 'POST':
if action == 'remove': actionform = WorkoutBulkActions(request.POST)
for w in workouts: form = WorkoutMultipleCompareForm(request.POST)
messages.info(request,'Removed workout '+str(encoder.encode_hex(w.id))) if form.is_valid() and actionform.is_valid():
w.delete() workouts = form.cleaned_data['workouts']
url = reverse('workouts_view') action = actionform.cleaned_data['action']
return HttpResponseRedirect(url) if action == 'remove':
for w in workouts:
messages.info(request,'Removed workout '+str(encoder.encode_hex(w.id)))
w.delete()
elif action == 'export':
exportchoice = ExportChoices(request.POST)
if exportchoice.is_valid():
destination = exportchoice.cleaned_data['destination']
for w in workouts:
integration = importsources[destination](request.user)
try:
id = integration.workout_export(w)
messages.info(request,'Workout {id} exported to {destination}'.format(id=encoder.encode_hex(w.id),
destination=destination))
except NoTokenError:
messages.error(request,'Export to {destination} of workout {id} failed'.format(id=encoder.encode_hex(w.id),
destination=destination))
url = reverse('workouts_view')
return HttpResponseRedirect(url)
else:
exportchoice = ExportChoices()
actionform = WorkoutBulkActions()
actionform.fields["action"].initial = action
form = WorkoutMultipleCompareForm()
form.fields["workouts"].queryset = Workout.objects.filter(id__in=[w.id for w in workouts])
form.fields["workouts"].initial = workouts
return render(request,'workout_bulk_actions.html', return render(request,'workout_bulk_actions.html',
{'action':action, {'action':action,
'exportchoice':exportchoice,
'actionform':actionform,
'form':form,
'workouts':workouts}) 'workouts':workouts})
# List Workouts # List Workouts
@@ -2078,7 +2108,7 @@ def workouts_view(request, message='', successmessage='',
if request.method == 'POST': if request.method == 'POST':
if 'selectworkouts' in request.POST: if 'selectworkouts' in request.POST:
request.session['action']=request.POST['selectworkouts_operation'] request.session['action']=request.POST['action']
request.session['ids'] = request.POST.getlist('workoutid') request.session['ids'] = request.POST.getlist('workoutid')
url = reverse('workouts_bulk_actions') url = reverse('workouts_bulk_actions')
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
@@ -2261,10 +2291,13 @@ def workouts_view(request, message='', successmessage='',
Click <a href="/rowers/workouts/setrpe">here</a> to update them. \ Click <a href="/rowers/workouts/setrpe">here</a> to update them. \
You can switch off this warning in <a href="/rowers/me/edit">settings</a>.') You can switch off this warning in <a href="/rowers/me/edit">settings</a>.')
actionform = WorkoutBulkActions()
return render(request, 'list_workouts.html', return render(request, 'list_workouts.html',
{'workouts': workouts, {'workouts': workouts,
'active': 'nav-workouts', 'active': 'nav-workouts',
'rower': r, 'rower': r,
'actionform': actionform,
'searchform': searchform, 'searchform': searchform,
'breadcrumbs': breadcrumbs, 'breadcrumbs': breadcrumbs,
'dateform': dateform, 'dateform': dateform,