Merge tag 'v23.9.0' into develop
fit export
This commit is contained in:
@@ -357,6 +357,8 @@ def correct_intensity(workout):
|
|||||||
|
|
||||||
return workout
|
return workout
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
import io
|
import io
|
||||||
import zipfile
|
import zipfile
|
||||||
|
|
||||||
@@ -426,6 +428,7 @@ def email_all_user_workouts_zip(rower, start_date=None, end_date=None, debug=Fal
|
|||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
>>>>>>> release/v23.9.0
|
||||||
|
|
||||||
@app.task
|
@app.task
|
||||||
def handle_loadnextweek(rower, debug=False, **kwargs):
|
def handle_loadnextweek(rower, debug=False, **kwargs):
|
||||||
@@ -4591,4 +4594,3 @@ def fetch_strava_workout(stravatoken, oauth_data, stravaid, csvfilename, userid,
|
|||||||
stravaid=stravaid, userid=userid))
|
stravaid=stravaid, userid=userid))
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
{% extends "newbase.html" %}
|
|
||||||
{% load static %}
|
|
||||||
{% load rowerfilters %}
|
|
||||||
|
|
||||||
{% block title %}Export Workouts{% endblock %}
|
|
||||||
|
|
||||||
{% block main %}
|
|
||||||
<div class="container mt-5">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-8 offset-md-2">
|
|
||||||
<h2>Export All Your Workouts</h2>
|
|
||||||
<p>Select a date range to export your workouts as a ZIP file containing individual CSV files.</p>
|
|
||||||
|
|
||||||
<form method="post" enctype="multipart/form-data">
|
|
||||||
{% csrf_token %}
|
|
||||||
<table>
|
|
||||||
{{ form.as_table }}
|
|
||||||
</table>
|
|
||||||
<input name="daterange" type="submit" value="Export Workouts">
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
@@ -7,10 +7,6 @@
|
|||||||
{% block main %}
|
{% block main %}
|
||||||
<h1>Import and Export Settings for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
|
<h1>Import and Export Settings for {{ rower.user.first_name }} {{ rower.user.last_name }}</h1>
|
||||||
|
|
||||||
<p>
|
|
||||||
<a href="/rowers/workouts/alluserworkouts/">Export all workouts</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<form enctype="multipart/form-data" action="" method="post">
|
<form enctype="multipart/form-data" action="" method="post">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<ul class="main-content">
|
<ul class="main-content">
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
{% extends "emailbase.html" %}
|
|
||||||
{% block body %}
|
|
||||||
<p>
|
|
||||||
You can download the file {{ filename }} from the following link: {{ download_url }}. The file will be deleted after downloading, so please make sure to download it as soon as possible.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Best Regards, the Rowsandall Team
|
|
||||||
</p>
|
|
||||||
{% endblock %}
|
|
||||||
BIN
rowers/tests/testdata/testdata.tcx.gz
vendored
BIN
rowers/tests/testdata/testdata.tcx.gz
vendored
Binary file not shown.
@@ -432,10 +432,6 @@ urlpatterns = [
|
|||||||
views.graphs_view, name='graphs_view'),
|
views.graphs_view, name='graphs_view'),
|
||||||
re_path(r'^createmarkerworkouts/user/(?P<userid>\d+)/$', views.create_marker_workouts_view,
|
re_path(r'^createmarkerworkouts/user/(?P<userid>\d+)/$', views.create_marker_workouts_view,
|
||||||
name='create_marker_workouts_view'),
|
name='create_marker_workouts_view'),
|
||||||
re_path(r'^workouts/alluserworkouts/$', views.export_all_workouts_zip_view,
|
|
||||||
name='workout_export_all_workouts_zip_view'),
|
|
||||||
re_path(r'^workouts/download/$', views.download_zip_file_view,
|
|
||||||
name='download_zip_file_view'),
|
|
||||||
re_path(r'^createmarkerworkouts/$', views.create_marker_workouts_view,
|
re_path(r'^createmarkerworkouts/$', views.create_marker_workouts_view,
|
||||||
name='create_marker_workouts_view'),
|
name='create_marker_workouts_view'),
|
||||||
re_path(r'^goldmedalscores/$', views.goldmedalscores_view,
|
re_path(r'^goldmedalscores/$', views.goldmedalscores_view,
|
||||||
|
|||||||
@@ -273,53 +273,6 @@ def workout_csvemail_view(request, id=0):
|
|||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
import io
|
|
||||||
|
|
||||||
# Export all workouts as ZIP file with individual CSV files
|
|
||||||
@login_required()
|
|
||||||
def export_all_workouts_zip_view(request):
|
|
||||||
from datetime import datetime
|
|
||||||
r = getrower(request.user)
|
|
||||||
|
|
||||||
if request.method == 'GET':
|
|
||||||
form = DateRangeForm()
|
|
||||||
elif request.method == 'POST':
|
|
||||||
form = DateRangeForm(request.POST)
|
|
||||||
if not form.is_valid():
|
|
||||||
messages.error(request, "Invalid date range. Please try again.")
|
|
||||||
return render(request, "export_workouts_daterange.html", {'form': form})
|
|
||||||
|
|
||||||
startdate = form.cleaned_data['startdate']
|
|
||||||
enddate = form.cleaned_data['enddate']
|
|
||||||
|
|
||||||
myqueue(queuehigh, email_all_user_workouts_zip, r, startdate, enddate)
|
|
||||||
|
|
||||||
successmessage = "A download link will be sent to you per email"
|
|
||||||
messages.info(request, successmessage)
|
|
||||||
|
|
||||||
# return to export settings view
|
|
||||||
return render(request, "export_workouts_daterange.html", {'form': form})
|
|
||||||
|
|
||||||
def download_zip_file_view(request):
|
|
||||||
# This view would be called when the user clicks the download link in the email
|
|
||||||
zip_file_path = request.GET.get('file')
|
|
||||||
print("Requested ZIP file path:", zip_file_path) # Debugging statement
|
|
||||||
# add media folder
|
|
||||||
zip_file_path = os.path.join(settings.MEDIA_ROOT, zip_file_path)
|
|
||||||
|
|
||||||
if not zip_file_path or not os.path.exists(zip_file_path):
|
|
||||||
messages.error(request, "The requested file does not exist.")
|
|
||||||
return HttpResponseRedirect(reverse('workouts_view'))
|
|
||||||
|
|
||||||
with open(zip_file_path, 'rb') as f:
|
|
||||||
response = HttpResponse(f.read(), content_type='application/zip')
|
|
||||||
response['Content-Disposition'] = f'attachment; filename="{os.path.basename(zip_file_path)}"'
|
|
||||||
|
|
||||||
# remove the file after sending
|
|
||||||
os.remove(zip_file_path)
|
|
||||||
|
|
||||||
return response
|
|
||||||
|
|
||||||
|
|
||||||
# Get Workout CSV file and send it to user's email address
|
# Get Workout CSV file and send it to user's email address
|
||||||
@login_required()
|
@login_required()
|
||||||
@@ -344,5 +297,3 @@ def workout_csvtoadmin_view(request, id=0): # pragma: no cover
|
|||||||
response = HttpResponseRedirect(url)
|
response = HttpResponseRedirect(url)
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -254,7 +254,6 @@ from rowers.rows import handle_uploaded_file, handle_uploaded_image
|
|||||||
from rowers.plannedsessions import *
|
from rowers.plannedsessions import *
|
||||||
from rowers.tasks import handle_makeplot, handle_otwsetpower, handle_sendemailtcx, handle_sendemailcsv
|
from rowers.tasks import handle_makeplot, handle_otwsetpower, handle_sendemailtcx, handle_sendemailcsv
|
||||||
from rowers.tasks import (
|
from rowers.tasks import (
|
||||||
email_all_user_workouts_zip,
|
|
||||||
handle_intervals_updateworkout,
|
handle_intervals_updateworkout,
|
||||||
handle_post_workout_api,
|
handle_post_workout_api,
|
||||||
handle_sendemail_newftp,
|
handle_sendemail_newftp,
|
||||||
|
|||||||
Reference in New Issue
Block a user