aboutsummaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorAndrea Lepori <alepori@student.ethz.ch>2022-08-06 22:11:59 +0200
committerAndrea Lepori <alepori@student.ethz.ch>2022-08-06 22:11:59 +0200
commited8abf016412ed8b0594b775530f6eaefef69eb5 (patch)
tree8d4ef3f3cb0237298278a3b5231f384828aa82d2 /server
parentfix heading prefix and add custom param preview (diff)
downloadscout-subs-ed8abf016412ed8b0594b775530f6eaefef69eb5.tar.gz
scout-subs-ed8abf016412ed8b0594b775530f6eaefef69eb5.zip
unified approve doc page
Diffstat (limited to 'server')
-rw-r--r--server/templates/server/approve_doc.html84
-rw-r--r--server/templates/server/index.html1
-rw-r--r--server/views.py103
3 files changed, 166 insertions, 22 deletions
diff --git a/server/templates/server/approve_doc.html b/server/templates/server/approve_doc.html
index 23eef4f..f9985bb 100644
--- a/server/templates/server/approve_doc.html
+++ b/server/templates/server/approve_doc.html
@@ -29,6 +29,7 @@
<form id="form" action="{% url 'docapprove'%}" method="post">
{% csrf_token %}
<div class="card-content">
+ <span class="card-title">Approvazione multipla</span>
<p>Inserire un codice per riga</p>
<textarea name="codes" class="materialize-textarea"></textarea>
</div>
@@ -39,4 +40,87 @@
</div>
</div>
</div>
+
+<form target="_blank" action="{% url 'docpreview' %}" method="post" id="preview_form">
+ {% csrf_token %}
+ <input type="hidden" name="preview" id="code_submit">
+</form>
+
+<div class="row">
+ <div class="col l4 offset-l4 m8 offset-m2 s12">
+ <div class="card">
+ <form id="form2" action="{% url 'docapprove'%}" method="post" enctype="multipart/form-data">
+ {% csrf_token %}
+ <div class="card-content">
+ <span class="card-title">Approvazione singola</span>
+ <p>Possibilità di caricare foto della firma e visualizzare il documento prima di approvarlo</p>
+ {{error_text}}
+ <div class="row">
+ <div class="input-field col s12">
+ <input name="code" id="code" type="text">
+ <label for="code">Codice documento</label>
+ </div>
+ </div>
+ <div class="row">
+ <div class="file-field input-field col s12">
+ <div class="btn {{color}}">
+ <span><i class="material-icons left">file_upload</i>File</span>
+ <input type="file" name="doc_sign" id="doc_sign" onchange="loadFile(event)">
+ </div>
+ <div class="file-path-wrapper">
+ <input id="doc_sign_name" class="file-path" type="text" placeholder="Documento firmato">
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="card-action">
+ <a id="send_button" class="waves-effect waves-light btn {{color}}" href="#" onclick="confirm()">Approva</a>
+ <a class="right waves-effect waves-light btn {{color}}" onclick="send()">Anteprima documento</a>
+ </div>
+ </form>
+ </div>
+ </div>
+</div>
+
+<div class="row">
+ <div class="col l4 offset-l4 m8 offset-m2 s12">
+ <div class="card">
+ <div class="card-image">
+ <img id="preview"/>
+ </div>
+ </div>
+ </div>
+</div>
+{% endblock %}
+
+{% block script %}
+function confirm() {
+ var button = document.getElementById('send_button')
+ button.innerHTML = "Sicuro?"
+ button.setAttribute('onclick', "document.getElementById('form2').submit()")
+ button.setAttribute('class', "waves-effect waves-light btn green")
+}
+
+function send() {
+ var form = document.getElementById('preview_form')
+ var action = document.getElementById('code_submit')
+ var text = document.getElementById('code').value
+ action.setAttribute('value', text);
+ form.submit()
+}
+
+var loadFile = function(event) {
+ var output = document.getElementById('preview');
+ output.src = URL.createObjectURL(event.target.files[0]);
+ output.onload = function() {
+ URL.revokeObjectURL(output.src) // free memory
+ }
+};
+$(document).ready(function(){
+ {% if error %}
+ M.toast({html: '{{ error_text }}', classes: 'orange'})
+ {% elif success %}
+ M.toast({html: '{{ success_text }}', classes: 'green'})
+ {% endif %}
+});
{% endblock %} \ No newline at end of file
diff --git a/server/templates/server/index.html b/server/templates/server/index.html
index 8c60b48..1d78a74 100644
--- a/server/templates/server/index.html
+++ b/server/templates/server/index.html
@@ -89,7 +89,6 @@
<a class="waves-effect waves-light btn {{color}}" href="{% url 'doctype' %}">Tipi</a>
<a class="waves-effect waves-light btn {{color}}" href="{% url 'doclist' %}">Documenti</a>
<a class="waves-effect waves-light btn {{color}}" href="{% url 'docapprove' %}">Approva documento</a>
- <a class="waves-effect waves-light btn {{color}}" href="{% url 'docupload' %}">Carica firma</a>
</div>
<div class="hide-on-large-only">
diff --git a/server/views.py b/server/views.py
index 35fb232..96b8d9f 100644
--- a/server/views.py
+++ b/server/views.py
@@ -180,40 +180,101 @@ def docapprove(request):
context = {}
data = []
- # if user not staff of primary has only controll of non primary groups
+ # if user not staff of primary has only control of non primary groups
if request.user.is_staff:
groups = request.user.groups.values_list('name', flat=True)
else:
groups = request.user.groups.values_list('name', flat=True)[1:]
+ # setup variables for error text and success text
+ error = False
+ success = False
+ error_text = ""
+ success_text = ""
+
+ document = None
+ messages = []
+
if request.method == "POST":
- # parse text in array
- data = request.POST["codes"]
- data = split_codes(data)
- # check if code valid
- for i in range(len(data)):
- if not data[i].isdigit():
- data[i] = data[i] + " - Formato errato"
- elif int(data[i]) < 100000 or int(data[i]) > 999999:
- data[i] = data[i] + " - Formato errato"
- elif Document.objects.filter(code=data[i]).count() == 0:
- data[i] = data[i] + " - Invalido"
- elif Document.objects.filter(code=data[i])[0].group.name not in groups:
- # check if user has permission to approve document
- data[i] = data[i] + " - Invalido"
+ # check if bulk approve or single
+ if "codes" in request.POST:
+ # parse text in array
+ data = request.POST["codes"]
+ data = split_codes(data)
+ # check if code valid
+ for i in range(len(data)):
+ if not data[i].isdigit():
+ messages.append(data[i] + " - Formato errato")
+ elif int(data[i]) < 100000 or int(data[i]) > 999999:
+ messages.append(data[i] + " - Formato errato")
+ elif Document.objects.filter(code=data[i]).count() == 0:
+ messages.append(data[i] + " - Invalido")
+ elif Document.objects.filter(code=data[i])[0].group.name not in groups:
+ # check if user has permission to approve document
+ messages.append(data[i] + " - Invalido")
+ else:
+ document = Document.objects.filter(code=data[i])[0]
+ if document.status == 'ok':
+ # do nothing document already approved
+ messages.append(data[i] + " - Già approvato")
+ else:
+ document.status = 'ok'
+ document.save()
+ messages.append(data[i] + " - Ok")
+
+ elif "code" in request.POST:
+ print("doing this")
+ data = request.POST["code"]
+ if not data.isdigit():
+ error_text = "Formato codice errato"
+ error = True
+ elif int(data) < 100000 or int(data) > 999999:
+ error_text = "Formato codice errato"
+ error = True
+ elif Document.objects.filter(code=data).count() == 0:
+ error_text = "Codice invalido"
+ error = True
+ elif Document.objects.filter(code=data)[0].group.name not in groups:
+ error_text = "Codice invalido"
+ error = True
else:
- document = Document.objects.filter(code=data[i])[0]
+ # get document
+ document = Document.objects.filter(code=data)[0]
+
+ # prepare success message
if document.status == 'ok':
- # do nothing document already approved
- data[i] = data[i] + " - Già approvato"
+ success_text = "File caricato"
+ success = True
else:
document.status = 'ok'
document.save()
- data[i] = data[i] + " - Ok"
+ success_text = "Documento approvato e file caricato"
+ success = True
+
+ # check for errors and upload files
+ if "doc_sign" in request.FILES and not error:
+ myfile = request.FILES['doc_sign']
+ try:
+ im = Image.open(myfile)
+ im_io = BytesIO()
+ # compress image in WEBP
+ im.save(im_io, 'WEBP', quality=50)
+ document.signed_doc.save(data+"_"+myfile.name, im_io)
+ document.save()
+ except UnidentifiedImageError:
+ error = True
+ error_text = "Il file non è un immagine valida"
+ else:
+ error = True
+ error_text = "Prego caricare un file"
context = {
- 'messages': data,
- 'empty': len(data) == 0,
+ 'messages': messages,
+ 'empty': len(messages) == 0,
+ "error": error,
+ "error_text": error_text,
+ "success": success,
+ "success_text": success_text,
}
return render(request, 'server/approve_doc.html', context)