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

Commit

Permalink
Merge 70291be into fe9bb37
Browse files Browse the repository at this point in the history
  • Loading branch information
aguilerapy committed Aug 4, 2020
2 parents fe9bb37 + 70291be commit 4dbd1c7
Show file tree
Hide file tree
Showing 17 changed files with 370 additions and 366 deletions.
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):
@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, 'media/' + new_file.folder)
# 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;
}
89 changes: 59 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) {
whenAjaxReqFails(jqXHR);
})
.always(function () {
_done = true
});
Expand All @@ -149,28 +155,34 @@ 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) {
params = '?sendResult=true&type=' + JSON.parse($('#fileupload').attr('data-form-data')).type
performAction($('#fileupload').attr('data-perform-action') + params);
} 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 +209,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 +225,10 @@ var app = {};
;
}

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

/** plugin initialization & listeners**/

var fileupload = $('#fileupload')
Expand All @@ -234,10 +244,29 @@ 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();
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('result.zip');
$('.actions').removeClass('hidden');
$('#upload-button').addClass('sendResult');
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>
<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

0 comments on commit 4dbd1c7

Please sign in to comment.