From 2b1df1438c56546dff059869ad0e9a071e5bf07c Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 6 Nov 2017 12:02:17 +0100 Subject: [PATCH 1/8] css --- static/css/rowsandall.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/static/css/rowsandall.css b/static/css/rowsandall.css index 0188e56f..f13c422f 100644 --- a/static/css/rowsandall.css +++ b/static/css/rowsandall.css @@ -790,3 +790,7 @@ a.wh:hover { -webkit-margin-before: 0em; -webkit-margin-after: 0em; } + +#drop-files { + +} From 355329dd36c5e639a8bef584c015680a2ecdde49 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 6 Nov 2017 15:21:36 +0100 Subject: [PATCH 2/8] drag/drop is working --- rowers/forms.py | 3 +- rowers/templates/document_form.html | 77 +++++++- rowers/urls.py | 1 + rowers/views.py | 287 +++++++++++++++++++++++++++- static/css/rowsandall.css | 4 +- 5 files changed, 367 insertions(+), 5 deletions(-) diff --git a/rowers/forms.py b/rowers/forms.py index 744c47a3..bad60f81 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -49,8 +49,9 @@ class StrokeDataForm(forms.Form): # The form used for uploading files class DocumentsForm(forms.Form): title = forms.CharField(required=False) - file = forms.FileField(required=True, + file = forms.FileField(required=False, validators=[validate_file_extension]) + workouttype = forms.ChoiceField(required=True, choices=Workout.workouttypes) # initial='rower') diff --git a/rowers/templates/document_form.html b/rowers/templates/document_form.html index 3c02acee..7818fe52 100644 --- a/rowers/templates/document_form.html +++ b/rowers/templates/document_form.html @@ -48,7 +48,8 @@ {% endblock %} -{% block content %} + {% block content %} +

Upload Workout File

@@ -90,5 +91,77 @@ - + +
{% endblock %} + + {% block scripts %} + + + + {% endblock %} diff --git a/rowers/urls.py b/rowers/urls.py index 9179e415..3a8c367d 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -195,6 +195,7 @@ urlpatterns = [ url(r'^workout/(?P\d+)/get-testscript$',views.get_testscript), url(r'^workout/upload/team/$',views.team_workout_upload_view), url(r'^workout/upload/$',views.workout_upload_view,name='workout_upload_view'), + url(r'^workout/upload_ajax/$',views.workout_upload_ajax), url(r'^workout/(?P\d+)/histo$',views.workout_histo_view), url(r'^workout/(?P\d+)/task$',views.workout_test_task_view), url(r'^workout/(?P\d+)/forcecurve$',views.workout_forcecurve_view), diff --git a/rowers/views.py b/rowers/views.py index 11cbea23..308255b7 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -8401,7 +8401,287 @@ def workout_getc2workout_view(request,c2id): return HttpResponseRedirect(url) # This is the main view for processing uploaded files +@csrf_exempt @login_required() +def workout_upload_ajax(request, + uploadoptions={ + 'makeprivate':False, + 'make_plot':False, + 'upload_to_C2':False, + 'plottype':'timeplot', + 'landingpage':'workout_edit_view', + }, + docformoptions={ + 'workouttype':'rower', + }): + + r = getrower(request.user) + + if 'uploadoptions' in request.session: + uploadoptions = request.session['uploadoptions'] + try: + defaultlandingpage = uploadoptions['landingpage'] + except KeyError: + uploadoptions['landingpage'] = r.defaultlandingpage + defaultlandingpage = r.defaultlandingpage + else: + request.session['uploadoptions'] = uploadoptions + + if 'docformoptions' in request.session: + docformoptions = request.session['docformoptions'] + else: + request.session['docformoptions'] = docformoptions + + try: + makeprivate = uploadoptions['makeprivate'] + except KeyError: + makeprivate = False + try: + make_plot = uploadoptions['make_plot'] + except KeyError: + make_plot = False + + try: + workouttype = docformoptions['workouttype'] + except KeyError: + workouttype = 'rower' + + try: + plottype = uploadoptions['plottype'] + except KeyError: + plottype = 'timeplot' + + try: + landingpage = uploadoptions['landingpage'] + except KeyError: + landingpage = r.defaultlandingpage + uploadoptions['landingpage'] = landingpage + + try: + upload_to_c2 = uploadoptions['upload_to_C2'] + except KeyError: + upload_to_c2 = False + + try: + upload_to_strava = uploadoptions['upload_to_Strava'] + except KeyError: + upload_to_strava = False + + try: + upload_to_st = uploadoptions['upload_to_SportTracks'] + except KeyError: + upload_to_st = False + + try: + upload_to_rk = uploadoptions['upload_to_RunKeeper'] + except KeyError: + upload_to_rk = False + + try: + upload_to_ua = uploadoptions['upload_to_MapMyFitness'] + except KeyError: + upload_to_ua = False + + try: + upload_to_tp = uploadoptions['upload_to_TrainingPeaks'] + except KeyError: + upload_to_tp = False + + if request.method == 'POST': + form = DocumentsForm(request.POST,request.FILES) + optionsform = UploadOptionsForm(request.POST) + + if form.is_valid(): + try: + f = request.FILES['file'] + except: + f = request.FILES['file2'] + res = handle_uploaded_file(f) + t = form.cleaned_data['title'] + workouttype = form.cleaned_data['workouttype'] + request.session['docformoptions'] = { + 'workouttype':workouttype, + } + + notes = form.cleaned_data['notes'] + offline = form.cleaned_data['offline'] + + if optionsform.is_valid(): + make_plot = optionsform.cleaned_data['make_plot'] + plottype = optionsform.cleaned_data['plottype'] + upload_to_c2 = optionsform.cleaned_data['upload_to_C2'] + upload_to_strava = optionsform.cleaned_data['upload_to_Strava'] + upload_to_st = optionsform.cleaned_data['upload_to_SportTracks'] + upload_to_rk = optionsform.cleaned_data['upload_to_RunKeeper'] + upload_to_ua = optionsform.cleaned_data['upload_to_MapMyFitness'] + upload_to_tp = optionsform.cleaned_data['upload_to_TrainingPeaks'] + makeprivate = optionsform.cleaned_data['makeprivate'] + landingpage = optionsform.cleaned_data['landingpage'] + uploadoptions = { + 'makeprivate':makeprivate, + 'make_plot':make_plot, + 'plottype':plottype, + 'upload_to_C2':upload_to_c2, + 'upload_to_Strava':upload_to_strava, + 'upload_to_SportTracks':upload_to_st, + 'upload_to_RunKeeper':upload_to_rk, + 'upload_to_MapMyFitness':upload_to_ua, + 'upload_to_TrainingPeaks':upload_to_tp, + 'landingpage':landingpage, + } + + + request.session['uploadoptions'] = uploadoptions + + f1 = res[0] # file name + f2 = res[1] # file name incl media directory + + if not offline: + id,message,f2 = dataprep.new_workout_from_file( + r,f2, + workouttype=workouttype, + makeprivate=makeprivate, + title = t, + notes='' + ) + else: + job = myqueue( + queuehigh, + handle_zip_file, + r.user.email, + t, + f2) + + messages.info( + request, + "The file was too large to process in real time. It will be processed in a background process. You will receive an email when it is ready") + url = reverse(workout_upload_view) + return JSONResponse({'result':1,'url':url}) + + if not id: + messages.error(request,message) + return JSONResponse({'result':0}) + elif id == -1: + message = 'The zip archive will be processed in the background. The files in the archive will only be uploaded without the extra actions. You will receive email when the workouts are ready.' + messages.info(request,message) + return JSONResponse({'result':1}) + else: + if message: + messages.error(request,message) + + + url = reverse(workout_edit_view, + kwargs = { + 'id':int(id), + }) + response = {'result': 1,'url':url} + w = Workout.objects.get(id=id) + + r = getrower(request.user) + if (make_plot): + id = uploads.make_plot(r,w,f1,f2,plottype,t) + + # upload to C2 + if (upload_to_c2): + try: + message,id = c2stuff.workout_c2_upload(request.user,w) + except C2NoTokenError: + id = 0 + message = "Something went wrong with the Concept2 sync" + if id>1: + messages.info(request,message) + else: + messages.error(request,message) + + if (upload_to_strava): + try: + message,id = stravastuff.workout_strava_upload( + request.user,w + ) + except StravaNoTokenError: + id = 0 + message = "Please connect to Strava first" + if id>1: + messages.info(request,message) + else: + messages.error(request,message) + + if (upload_to_st): + try: + message,id = sporttracksstuff.workout_sporttracks_upload( + request.user,w + ) + except SportTracksNoTokenError: + message = "Please connect to SportTracks first" + id = 0 + if id>1: + messages.info(request,message) + else: + messages.error(request,message) + + if (upload_to_rk): + try: + message,id = runkeeperstuff.workout_runkeeper_upload( + request.user,w + ) + except RunKeeperNoTokenError: + message = "Please connect to Runkeeper first" + id = 0 + + if id>1: + messages.info(request,message) + else: + messages.error(request,message) + + + if (upload_to_ua): + try: + message,id = underarmourstuff.workout_ua_upload( + request.user,w + ) + except UnderArmourNoTokenError: + message = "Please connect to MapMyFitness first" + id = 0 + + if id>1: + messages.info(request,message) + else: + messages.error(request,message) + + + if (upload_to_tp): + try: + message,id = tpstuff.workout_tp_upload( + request.user,w + ) + except TPNoTokenError: + message = "Please connect to TrainingPeaks first" + id = 0 + + if id>1: + messages.info(request,message) + else: + messages.error(request,message) + + if landingpage != 'workout_upload_view': + url = reverse(landingpage, + kwargs = { + 'id':w.id, + }) + response = {'result':1, 'url':url} + else: + url = reverse(landingpage) + response = {'result':1, 'url':url} + + return JSONResponse(response) + else: + response = {'result':0} + + return JSONResponse(response) + else: + response = {'result':0} + return JSONResponse(response) + def workout_upload_view(request, uploadoptions={ 'makeprivate':False, @@ -8489,8 +8769,12 @@ def workout_upload_view(request, if request.method == 'POST': form = DocumentsForm(request.POST,request.FILES) optionsform = UploadOptionsForm(request.POST) + if form.is_valid(): - f = request.FILES['file'] + try: + f = request.FILES['file'] + except: + f = request.FILES['file2'] res = handle_uploaded_file(f) t = form.cleaned_data['title'] workouttype = form.cleaned_data['workouttype'] @@ -8691,6 +8975,7 @@ def workout_upload_view(request, 'optionsform': optionsform, }) + # This is the main view for processing uploaded files @user_passes_test(iscoachmember,login_url="/",redirect_field_name=None) def team_workout_upload_view(request,message="", diff --git a/static/css/rowsandall.css b/static/css/rowsandall.css index f13c422f..fe739c64 100644 --- a/static/css/rowsandall.css +++ b/static/css/rowsandall.css @@ -791,6 +791,8 @@ a.wh:hover { -webkit-margin-after: 0em; } -#drop-files { +.drop-files { + border: 1px solid #000; + color: #000; } From c6346f9ed23427c0c2ef8385404e8553bf3e4248 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 6 Nov 2017 15:39:11 +0100 Subject: [PATCH 3/8] small change --- rowers/templates/document_form.html | 1 + 1 file changed, 1 insertion(+) diff --git a/rowers/templates/document_form.html b/rowers/templates/document_form.html index 7818fe52..a7236160 100644 --- a/rowers/templates/document_form.html +++ b/rowers/templates/document_form.html @@ -86,6 +86,7 @@ If you check "make private", this workout will not be visible to your followers and will not show up in your teams' workouts list. With the Landing Page option, you can select to which (workout related) page you will be taken after a successfull upload.

+

Select Files with the File button or drag them on the marked area

From 1f477d3b7c7faa8367fb441007d859ba7f4d2664 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 6 Nov 2017 16:56:38 +0100 Subject: [PATCH 4/8] stops on error --- rowers/mailprocessing.py | 5 ++- rowers/templates/document_form.html | 56 ++++++++++++++++++----------- rowers/views.py | 3 +- 3 files changed, 41 insertions(+), 23 deletions(-) diff --git a/rowers/mailprocessing.py b/rowers/mailprocessing.py index bc478527..98180c61 100644 --- a/rowers/mailprocessing.py +++ b/rowers/mailprocessing.py @@ -3,7 +3,10 @@ import shutil import time from django.conf import settings -from rowers.tasks import handle_sendemail_unrecognized +from rowers.tasks import ( + handle_sendemail_unrecognized, + handle_sendemail_unrecognizedowner + ) from django_mailbox.models import Message, MessageAttachment from rowers.models import User, Rower, RowerForm diff --git a/rowers/templates/document_form.html b/rowers/templates/document_form.html index a7236160..95a98a66 100644 --- a/rowers/templates/document_form.html +++ b/rowers/templates/document_form.html @@ -98,7 +98,7 @@ {% block scripts %} - + - - + + + {% endblock %} {% block content %} @@ -101,6 +102,20 @@ {% endblock %} diff --git a/rowers/views.py b/rowers/views.py index 12eb0650..a5b0b086 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -8401,7 +8401,7 @@ def workout_getc2workout_view(request,c2id): return HttpResponseRedirect(url) # This is the main view for processing uploaded files -@csrf_exempt +#@csrf_exempt @login_required() def workout_upload_ajax(request, uploadoptions={ From fe11d30b1a8c27ff01dcef86376df370da47e93f Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 6 Nov 2017 23:32:27 +0100 Subject: [PATCH 6/8] small cosmetic change --- rowers/templates/document_form.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rowers/templates/document_form.html b/rowers/templates/document_form.html index 7e90fccc..6e6de784 100644 --- a/rowers/templates/document_form.html +++ b/rowers/templates/document_form.html @@ -159,7 +159,7 @@ processData: false, error: function(result) { $("#id_waiting").replaceWith( - '
Your upload failed
' + '
Your upload failed
' ); setTimeout(function() { location.reload(); From edcd1f1c8628c5cf200e7687e685d4460e452a10 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 6 Nov 2017 23:38:24 +0100 Subject: [PATCH 7/8] another small cosmetic change --- rowers/templates/document_form.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rowers/templates/document_form.html b/rowers/templates/document_form.html index 6e6de784..016b14ed 100644 --- a/rowers/templates/document_form.html +++ b/rowers/templates/document_form.html @@ -50,7 +50,7 @@ {% endblock %} {% block content %} -
+

Upload Workout File

From 663576a3697f12521a6d5b7715baf5107d61977a Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 7 Nov 2017 08:32:07 +0100 Subject: [PATCH 8/8] code reduces using request.is_ajax() --- rowers/templates/document_form.html | 2 +- rowers/urls.py | 1 - rowers/views.py | 366 +++++----------------------- 3 files changed, 57 insertions(+), 312 deletions(-) diff --git a/rowers/templates/document_form.html b/rowers/templates/document_form.html index 016b14ed..c5b03d79 100644 --- a/rowers/templates/document_form.html +++ b/rowers/templates/document_form.html @@ -154,7 +154,7 @@ $.ajax({ data: data, type: $(this).attr('method'), - url: '/rowers/workout/upload_ajax/', + url: '/rowers/workout/upload/', contentType: false, processData: false, error: function(result) { diff --git a/rowers/urls.py b/rowers/urls.py index 3a8c367d..9179e415 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -195,7 +195,6 @@ urlpatterns = [ url(r'^workout/(?P\d+)/get-testscript$',views.get_testscript), url(r'^workout/upload/team/$',views.team_workout_upload_view), url(r'^workout/upload/$',views.workout_upload_view,name='workout_upload_view'), - url(r'^workout/upload_ajax/$',views.workout_upload_ajax), url(r'^workout/(?P\d+)/histo$',views.workout_histo_view), url(r'^workout/(?P\d+)/task$',views.workout_test_task_view), url(r'^workout/(?P\d+)/forcecurve$',views.workout_forcecurve_view), diff --git a/rowers/views.py b/rowers/views.py index a5b0b086..5f6c87a8 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -1671,6 +1671,7 @@ def workout_csvtoadmin_view(request,id=0): # Send workout to TP @login_required() def workout_tp_upload_view(request,id=0): + message = "" r = getrower(request.user) res = -1 @@ -8401,287 +8402,6 @@ def workout_getc2workout_view(request,c2id): return HttpResponseRedirect(url) # This is the main view for processing uploaded files -#@csrf_exempt -@login_required() -def workout_upload_ajax(request, - uploadoptions={ - 'makeprivate':False, - 'make_plot':False, - 'upload_to_C2':False, - 'plottype':'timeplot', - 'landingpage':'workout_edit_view', - }, - docformoptions={ - 'workouttype':'rower', - }): - - r = getrower(request.user) - - if 'uploadoptions' in request.session: - uploadoptions = request.session['uploadoptions'] - try: - defaultlandingpage = uploadoptions['landingpage'] - except KeyError: - uploadoptions['landingpage'] = r.defaultlandingpage - defaultlandingpage = r.defaultlandingpage - else: - request.session['uploadoptions'] = uploadoptions - - if 'docformoptions' in request.session: - docformoptions = request.session['docformoptions'] - else: - request.session['docformoptions'] = docformoptions - - try: - makeprivate = uploadoptions['makeprivate'] - except KeyError: - makeprivate = False - try: - make_plot = uploadoptions['make_plot'] - except KeyError: - make_plot = False - - try: - workouttype = docformoptions['workouttype'] - except KeyError: - workouttype = 'rower' - - try: - plottype = uploadoptions['plottype'] - except KeyError: - plottype = 'timeplot' - - try: - landingpage = uploadoptions['landingpage'] - except KeyError: - landingpage = r.defaultlandingpage - uploadoptions['landingpage'] = landingpage - - try: - upload_to_c2 = uploadoptions['upload_to_C2'] - except KeyError: - upload_to_c2 = False - - try: - upload_to_strava = uploadoptions['upload_to_Strava'] - except KeyError: - upload_to_strava = False - - try: - upload_to_st = uploadoptions['upload_to_SportTracks'] - except KeyError: - upload_to_st = False - - try: - upload_to_rk = uploadoptions['upload_to_RunKeeper'] - except KeyError: - upload_to_rk = False - - try: - upload_to_ua = uploadoptions['upload_to_MapMyFitness'] - except KeyError: - upload_to_ua = False - - try: - upload_to_tp = uploadoptions['upload_to_TrainingPeaks'] - except KeyError: - upload_to_tp = False - - if request.method == 'POST': - form = DocumentsForm(request.POST,request.FILES) - optionsform = UploadOptionsForm(request.POST) - - if form.is_valid(): - try: - f = request.FILES['file'] - except: - f = request.FILES['file2'] - res = handle_uploaded_file(f) - t = form.cleaned_data['title'] - workouttype = form.cleaned_data['workouttype'] - request.session['docformoptions'] = { - 'workouttype':workouttype, - } - - notes = form.cleaned_data['notes'] - offline = form.cleaned_data['offline'] - - if optionsform.is_valid(): - make_plot = optionsform.cleaned_data['make_plot'] - plottype = optionsform.cleaned_data['plottype'] - upload_to_c2 = optionsform.cleaned_data['upload_to_C2'] - upload_to_strava = optionsform.cleaned_data['upload_to_Strava'] - upload_to_st = optionsform.cleaned_data['upload_to_SportTracks'] - upload_to_rk = optionsform.cleaned_data['upload_to_RunKeeper'] - upload_to_ua = optionsform.cleaned_data['upload_to_MapMyFitness'] - upload_to_tp = optionsform.cleaned_data['upload_to_TrainingPeaks'] - makeprivate = optionsform.cleaned_data['makeprivate'] - landingpage = optionsform.cleaned_data['landingpage'] - uploadoptions = { - 'makeprivate':makeprivate, - 'make_plot':make_plot, - 'plottype':plottype, - 'upload_to_C2':upload_to_c2, - 'upload_to_Strava':upload_to_strava, - 'upload_to_SportTracks':upload_to_st, - 'upload_to_RunKeeper':upload_to_rk, - 'upload_to_MapMyFitness':upload_to_ua, - 'upload_to_TrainingPeaks':upload_to_tp, - 'landingpage':landingpage, - } - - - request.session['uploadoptions'] = uploadoptions - - f1 = res[0] # file name - f2 = res[1] # file name incl media directory - - if not offline: - id,message,f2 = dataprep.new_workout_from_file( - r,f2, - workouttype=workouttype, - makeprivate=makeprivate, - title = t, - notes='' - ) - else: - job = myqueue( - queuehigh, - handle_zip_file, - r.user.email, - t, - f2) - - messages.info( - request, - "The file was too large to process in real time. It will be processed in a background process. You will receive an email when it is ready") - url = reverse(workout_upload_view) - return JSONResponse({'result':1,'url':url}) - - if not id: - messages.error(request,message) - return JSONResponse({'result':0}) - elif id == -1: - message = 'The zip archive will be processed in the background. The files in the archive will only be uploaded without the extra actions. You will receive email when the workouts are ready.' - messages.info(request,message) - return JSONResponse({'result':1}) - else: - if message: - messages.error(request,message) - - - url = reverse(workout_edit_view, - kwargs = { - 'id':int(id), - }) - response = {'result': 1,'url':url} - w = Workout.objects.get(id=id) - - r = getrower(request.user) - if (make_plot): - id = uploads.make_plot(r,w,f1,f2,plottype,t) - - # upload to C2 - if (upload_to_c2): - try: - message,id = c2stuff.workout_c2_upload(request.user,w) - except C2NoTokenError: - id = 0 - message = "Something went wrong with the Concept2 sync" - if id>1: - messages.info(request,message) - else: - messages.error(request,message) - - if (upload_to_strava): - try: - message,id = stravastuff.workout_strava_upload( - request.user,w - ) - except StravaNoTokenError: - id = 0 - message = "Please connect to Strava first" - if id>1: - messages.info(request,message) - else: - messages.error(request,message) - - if (upload_to_st): - try: - message,id = sporttracksstuff.workout_sporttracks_upload( - request.user,w - ) - except SportTracksNoTokenError: - message = "Please connect to SportTracks first" - id = 0 - if id>1: - messages.info(request,message) - else: - messages.error(request,message) - - if (upload_to_rk): - try: - message,id = runkeeperstuff.workout_runkeeper_upload( - request.user,w - ) - except RunKeeperNoTokenError: - message = "Please connect to Runkeeper first" - id = 0 - - if id>1: - messages.info(request,message) - else: - messages.error(request,message) - - - if (upload_to_ua): - try: - message,id = underarmourstuff.workout_ua_upload( - request.user,w - ) - except UnderArmourNoTokenError: - message = "Please connect to MapMyFitness first" - id = 0 - - if id>1: - messages.info(request,message) - else: - messages.error(request,message) - - - if (upload_to_tp): - try: - message,id = tpstuff.workout_tp_upload( - request.user,w - ) - except TPNoTokenError: - message = "Please connect to TrainingPeaks first" - id = 0 - - if id>1: - messages.info(request,message) - else: - messages.error(request,message) - - if landingpage != 'workout_upload_view': - url = reverse(landingpage, - kwargs = { - 'id':w.id, - }) - response = {'result':1, 'url':url} - else: - url = reverse(landingpage) - response = {'result':1, 'url':url} - - return JSONResponse(response) - else: - response = {'result':0} - - return JSONResponse(response) - else: - response = {'result':0} - return JSONResponse(response) - @login_required() def workout_upload_view(request, uploadoptions={ @@ -8695,6 +8415,10 @@ def workout_upload_view(request, 'workouttype':'rower', }): + is_ajax = False + if request.is_ajax(): + is_ajax = True + r = getrower(request.user) if 'uploadoptions' in request.session: @@ -8772,10 +8496,8 @@ def workout_upload_view(request, optionsform = UploadOptionsForm(request.POST) if form.is_valid(): - try: - f = request.FILES['file'] - except: - f = request.FILES['file2'] + f = request.FILES['file'] + res = handle_uploaded_file(f) t = form.cleaned_data['title'] workouttype = form.cleaned_data['workouttype'] @@ -8837,20 +8559,29 @@ def workout_upload_view(request, request, "The file was too large to process in real time. It will be processed in a background process. You will receive an email when it is ready") url = reverse(workout_upload_view) - response = HttpResponseRedirect(url) - return response + if is_ajax: + return JSONResponse({'result':1,'url':url}) + else: + response = HttpResponseRedirect(url) + return response if not id: messages.error(request,message) url = reverse(workout_upload_view) - response = HttpResponseRedirect(url) - return response + if is_ajax: + return JSONResponse({'result':0,'url':url}) + else: + response = HttpResponseRedirect(url) + return response elif id == -1: message = 'The zip archive will be processed in the background. The files in the archive will only be uploaded without the extra actions. You will receive email when the workouts are ready.' messages.info(request,message) url = reverse(workout_upload_view) - response = HttpResponseRedirect(url) - return response + if is_ajax: + return JSONResponse({'result':1,'url':url}) + else: + response = HttpResponseRedirect(url) + return response else: if message: messages.error(request,message) @@ -8859,8 +8590,12 @@ def workout_upload_view(request, kwargs = { 'id':int(id), }) - - response = HttpResponseRedirect(url) + + if is_ajax: + response = {'result': 1,'url':url} + else: + response = HttpResponseRedirect(url) + w = Workout.objects.get(id=id) r = getrower(request.user) @@ -8956,25 +8691,36 @@ def workout_upload_view(request, }) else: url = reverse(landingpage) - - return HttpResponseRedirect(url) - else: - response = render(request, - 'document_form.html', - {'form':form, - 'teams':get_my_teams(request.user), - 'optionsform': optionsform, - }) - return response + if is_ajax: + response = {'result':1,'url':url} + else: + response = HttpResponseRedirect(url) + else: + if not is_ajax: + response = render(request, + 'document_form.html', + {'form':form, + 'teams':get_my_teams(request.user), + 'optionsform': optionsform, + }) + + + if is_ajax: + return JSONResponse(response) + else: + return response else: - form = DocumentsForm(initial=docformoptions) - optionsform = UploadOptionsForm(initial=uploadoptions) - return render(request, 'document_form.html', - {'form':form, - 'teams':get_my_teams(request.user), - 'optionsform': optionsform, - }) + if not is_ajax: + form = DocumentsForm(initial=docformoptions) + optionsform = UploadOptionsForm(initial=uploadoptions) + return render(request, 'document_form.html', + {'form':form, + 'teams':get_my_teams(request.user), + 'optionsform': optionsform, + }) + else: + return {'result':0} # This is the main view for processing uploaded files