Skip to content
This repository has been archived by the owner on Dec 13, 2022. It is now read-only.

Allow the results of one function to be the input for another function #96

Merged
merged 43 commits into from
Sep 16, 2020
Merged
Show file tree
Hide file tree
Changes from 27 commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
c9d5e39
Add form-send class
aguilerapy May 8, 2020
dd85638
Add response boxes and AJAX methods
aguilerapy May 19, 2020
3804074
Add add_result method
aguilerapy May 19, 2020
4f59692
Update translations
aguilerapy May 19, 2020
cf6e4c8
Fix footer and page content overlapping
aguilerapy May 19, 2020
73497cb
Add tests
aguilerapy May 19, 2020
b2c8b37
Update clear_files decorator
aguilerapy Jun 16, 2020
1010293
Add receive_result function
aguilerapy Jun 16, 2020
3f82c7c
Add new url
aguilerapy Jun 16, 2020
44082c6
Update templates
aguilerapy Jun 16, 2020
8517c91
Update uploader
aguilerapy Jun 16, 2020
00f5a51
Update tests
aguilerapy Jun 16, 2020
53d8edd
Update templates
aguilerapy Jun 16, 2020
7a7249d
Add result type validation
aguilerapy Jun 18, 2020
6403242
Update templates for translations
aguilerapy Jun 18, 2020
9511870
Update translations
aguilerapy Jun 18, 2020
2d46a91
Update tests
aguilerapy Jun 18, 2020
b49e5ef
Merge branch 'master' into 14-send_results
aguilerapy Jul 1, 2020
f97f75b
Manual conflicts fix
aguilerapy Jul 1, 2020
be4ffc4
Merge branch 'master' into 14-send_results
aguilerapy Jul 28, 2020
80f95d2
Update require_files decorator
aguilerapy Aug 4, 2020
5833bb1
Update templates
aguilerapy Aug 4, 2020
2cad0b1
Update changes
aguilerapy Aug 4, 2020
8299d06
Update tests
aguilerapy Aug 4, 2020
6469c83
Update translations
aguilerapy Aug 4, 2020
70291be
Remove unused lines
aguilerapy Aug 4, 2020
778486d
Update changes
aguilerapy Aug 8, 2020
443689e
Merge branch 'master' into 14-send_results
aguilerapy Aug 11, 2020
1e9a0b0
Fix merge conflicts
aguilerapy Aug 12, 2020
1976627
Minor changes
aguilerapy Aug 12, 2020
4fda27c
Update translations
aguilerapy Aug 12, 2020
346767a
Update decorators
aguilerapy Aug 12, 2020
4a5c2ae
Add output description
aguilerapy Aug 19, 2020
0dbd7fe
Add translations
aguilerapy Aug 19, 2020
d442bae
Merge branch 'master' into 14-send_results
aguilerapy Sep 8, 2020
a3f4824
Fix merge conflicts in to-spreadsheet
aguilerapy Sep 10, 2020
b585b1b
Merge branch 'master' into 14-send_results
aguilerapy Sep 10, 2020
78332a5
Fix merge conflicts
aguilerapy Sep 10, 2020
ba248a3
Update translations
aguilerapy Sep 10, 2020
492e740
Update tests
aguilerapy Sep 10, 2020
d472d67
Add inclusion tags for send results options
aguilerapy Sep 15, 2020
d4cc898
Update translations
aguilerapy Sep 15, 2020
ab2118c
Update changes
aguilerapy Sep 16, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 31 additions & 2 deletions default/decorators.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
import os
from functools import wraps
from zipfile import ZipFile

from dateutil import parser
from django.http import JsonResponse
from django.http import HttpResponse, JsonResponse
from django.utils.translation import gettext as _

from default.data_file import DataFile
from default.util import invalid_request_file_message


def clear_files(function):
@wraps(function)
Expand All @@ -14,11 +19,35 @@ def wrap(request, *args, **kwargs):
return wrap


def require_files(function):
def validate_files(function):
aguilerapy marked this conversation as resolved.
Show resolved Hide resolved
@wraps(function)
def wrap(request, *args, **kwargs):
if 'files' not in request.session:
return JsonResponse({'error': 'No files uploaded'}, status=400, reason='No files available for operation')

send_result = request.GET.get('sendResult')
if send_result:
# Set files session to the last generated results
for file in request.session['results']:
data_file = DataFile(**file)
# All json results are compressed in a zip file
if data_file.ext == '.zip':
with ZipFile(data_file.path) as zipfile:
for f in zipfile.infolist():
prefix, ext = os.path.splitext(f.filename)
new_file = DataFile(prefix, ext)
path, f.filename = os.path.split(new_file.path)
zipfile.extract(f, path)
# Open the file to check if it is the correct type
with open(new_file.path, 'rb') as h:
file_type = request.GET.get('type', None)
message = invalid_request_file_message(h, file_type)
if message:
return HttpResponse(message, status=401) # error 401 for invalid type
else:
request.session['files'].append(new_file.as_dict())
request.session.modified = True

return function(request, *args, **kwargs)

return wrap
Expand Down
4 changes: 4 additions & 0 deletions default/static/css/custom.css
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,7 @@
.content-wrap.ocp-content {
padding-bottom: 12rem;
}
.form-send {
margin-bottom: 0;
margin-top: 10px;
}
101 changes: 71 additions & 30 deletions default/static/js/uploader.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ var app = {};
function disableAddFiles() {
$('.fileinput-button').attr('disabled', true);
$('.fileinput-button input:file').attr('disabled', true);
$('.fileinput-button label').removeAttr("for");
}

function enableAddFiles() {
Expand Down Expand Up @@ -113,7 +114,10 @@ var app = {};
}

function whenAjaxReqFails(jqXHR) {
$('.response-fail').removeClass('hidden');
if (jqXHR.status === 401)
$('.response-warning.file-process-failed').removeClass('hidden');
else
$('.response-fail').removeClass('hidden');
hideProcessingModal();
}

Expand All @@ -138,7 +142,9 @@ var app = {};
$('.actions').hide();
$('#fileupload').fileupload('destroy');
})
.fail(whenAjaxReqFails)
.fail(function(jqXHR, textStatus, errorThrown) {
aguilerapy marked this conversation as resolved.
Show resolved Hide resolved
whenAjaxReqFails(jqXHR);
})
.always(function () {
_done = true
});
Expand All @@ -149,28 +155,38 @@ var app = {};
disableAddFiles();
hideMessages();

var promises = $.map(_fileItems, function (val) {
return val.submit();
});
$.when.apply($, promises)
.done(function () {
performAction($('#fileupload').attr('data-perform-action'));
})
.fail(function () {
enableAddFiles();
$('.response-warning.file-process-failed').removeClass('hidden');
})
.always(function () {
clearFiles(); // so they will not be uploaded again
var failures = $.grep(promises, function (promise) {
return promise.state() === 'rejected';
});
if (failures.length){
// validations failed for some files, show message
/* check if results were sent and performAction directly, otherwise files are uploaded first */
if ($('#upload-button').hasClass('sendResult') == true) {
app.setParams(function(params){
params['sendResult'] = 'true';
params['type'] = JSON.parse($('#fileupload').attr('data-form-data')).type;
return params;
});
performAction($('#fileupload').attr('data-perform-action'));
} else {
var promises = $.map(_fileItems, function (val) {
return val.submit();
});
$.when.apply($, promises)
.done(function () {
performAction($('#fileupload').attr('data-perform-action'));
})
.fail(function () {
enableAddFiles();
$('.response-warning.file-process-failed').removeClass('hidden');
}
})
;
})
.always(function () {
clearFiles(); // so they will not be uploaded again
var failures = $.grep(promises, function (promise) {
return promise.state() === 'rejected';
});
if (failures.length){
// validations failed for some files, show message
$('.response-warning.file-process-failed').removeClass('hidden');
}
})
;
}
}

function upload_url() {
Expand All @@ -197,13 +213,7 @@ var app = {};
$(slt).addClass('has-error');
$(slt).append('<div class="help-block">' + msg + '</div>');
});
if (jqXHR.status === 400) {
$('.response-fail').removeClass('hidden');
}
if (jqXHR.status === 401) {
$('.response-warning.file-process-failed').removeClass('hidden');
}
hideProcessingModal();
whenAjaxReqFails(jqXHR);
$('#processing-modal .downloading-status').addClass('hidden');
})
.always(function () {
Expand All @@ -219,6 +229,10 @@ var app = {};
;
}

function send_to() {
window.location.href = $('.to-function').val() + '?sendResult=true';
}

/** plugin initialization & listeners**/

var fileupload = $('#fileupload')
Expand All @@ -234,10 +248,37 @@ var app = {};
/* click upload url button behaviour */
$("#url-button").click(upload_url);

/* click send button behaviour */
$('.send-button').click(send_to);

/* add warning before closing/navigating away from page */
window.onload = function () {
/* clear URL input text */
$('#input_url_0 input').val('');

/* check if results were sent to this page */
if (window.location.search == '?sendResult=true') {
showProcessingModal();
$.ajax('/send-result/validate/', {'dataType': 'json', type: 'GET'})
.done(function (data) {
disableAddFiles();
enableUploadButton();
$('.drop-area').removeClass('empty');
$('.drop-area').addClass('single');
$('.drop-area .file-selector-empty').addClass('hidden');
$('.drop-area .drop-area-received-msg').removeClass('hidden');
$('.drop-area .drop-area-received-msg .file-result').html(data);
$('.actions').removeClass('hidden');
$('#upload-button').addClass('sendResult');
})
.fail(function () {
$('.response-fail').removeClass('hidden');
})
.always(function () {
hideProcessingModal();
});
}

/* add warning before closing/navigating away from page */
window.addEventListener("beforeunload", function (e) {
if (_fileItems.length === 0 || _done) {
Expand Down
14 changes: 12 additions & 2 deletions default/templates/default/base-uploader.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,22 @@
<div class="response-success alert alert-info hidden">
<b>{% trans "Success!" %}</b> result.zip(<span class="file-size"></span>)
<a href="javascript:void(0)" class="download" target="_blank">{% trans "Download" %}</a>
<div class="form-group form-inline form-send hidden">
<label>{% trans "Send result to function:" %}</label>
<select class="form-control to-function">
<option id="compile" value="/compile/">{% trans "Compile Releases" %}</option>
<option id="upgrade" value="/upgrade/">{% trans "Upgrade from 1.0 to 1.1" %}</option>
<option id="convert" value="/to-spreadsheet/">{% trans "Convert to CSV/Excel" %}</option>
</select>
<a class="send-button" href="#" role="button">{% trans "Send" %}</a>
</div>
</div>
<div class="response-warning action-failed alert alert-warning hidden">
<ul></ul>
</div>
<div class="response-warning file-process-failed alert alert-warning hidden">
{% trans "We couldn't check that all files were JSON or of the OCDS type requested." %}
{% trans "You can add more files or remove them, then click on <b>Start</b> again." %}
{% trans "Please verify each file and try again." %}
{% trans "Files with validation issues will be ignored by default." %}
</div>
<div class="response-fail alert alert-danger hidden">
Expand Down Expand Up @@ -126,6 +135,7 @@
<span class="file-selector-empty"><label for="file">{% trans "Add a file" %}</label> {% trans "or drag and drop here." %}</span>
<div class="files hidden">
</div>
<span class="drop-area-received-msg hidden">{% trans "<b>Received</b>: " %}<span class="file-result"></span></span>
</div>
<div class="actions hidden">
<div class="buttons">
Expand All @@ -136,7 +146,7 @@
<button type="submit" class="btn btn-primary pull-right start" id="upload-button" disabled>
<i class="glyphicon glyphicon-cloud-upload"></i>
<span>{% trans "Start" %}</span>
</button>
</button>
</div>
</div>
</form>
Expand Down
1 change: 1 addition & 0 deletions default/templates/default/combine-packages.html
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
{% block scripts %}
{{ block.super }}
<script type="text/javascript">
$('.response-success .form-send').removeClass('hidden');
(function(){
app.setParams(function(params){
if ($('.packageType').val() == 'release')
Expand Down
3 changes: 3 additions & 0 deletions default/templates/default/package-releases.html
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,8 @@

{% block scripts %}
{{ block.super }}
<script type="text/javascript">
$('.response-success .form-send').removeClass('hidden');
</script>
{% include "default/snippets/published_date_scripts.html" %}
{% endblock %}
27 changes: 17 additions & 10 deletions default/templates/default/to-json.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,16 @@

{% block body %}
<div class="response-success alert alert-info hidden">
<b>{% trans "Success!" %}</b>
<ul>
<li>
result.zip (<span class="file-size-json"></span>)
<a href="javascript:void(0)" class="download-json">{% trans "Download" %}</a>
</li>
</ul>
<b>{% trans "Success!" %}</b> result.zip(<span class="file-size-json"></span>)
<a href="javascript:void(0)" class="download-json">{% trans "Download" %}</a>
aguilerapy marked this conversation as resolved.
Show resolved Hide resolved
<div class="form-group form-inline form-send">
<label>{% trans "Send result to function:" %}</label>
<select class="form-control to-function">
<option id="compile" value="/compile/">{% trans "Compile Releases" %}</option>
<option id="upgrade" value="/upgrade/">{% trans "Upgrade from 1.0 to 1.1" %}</option>
</select>
<a class="send-button" href="#" role="button">{% trans "Send" %}</a>
</div>
</div>
<div class="response-fail alert alert-danger hidden">
<b>{% trans "An error has occurred!" %}</b>
Expand Down Expand Up @@ -144,7 +147,7 @@

$('#fileupload').fileupload('disable');

/* click upload button behaviour */
/** click upload button behaviour **/
$('#upload-button').click(function(){
$('#fileupload').fileupload('option', 'dropZone', undefined)
data
Expand All @@ -171,9 +174,13 @@
});
});

/* click url button behaviour */
/** click send button behaviour **/
$('.send-button').click(function(){
window.location.href = $('.to-function').val() + '?sendResult=true';
});

/** click url button behaviour **/
$("#url-button-ts").click(function(){
$('.response-warning').addClass('hidden');
$('#processing-modal').modal('show');
$('.response-fail').addClass('hidden');
$('.form-group').removeClass('has-error');
Expand Down
Loading