aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrea Lepori <alepori@student.ethz.ch>2020-07-26 21:28:06 +0200
committerAndrea Lepori <alepori@student.ethz.ch>2020-07-26 21:28:06 +0200
commite1deaaf4a239db742cea2d1e6c4f48a9656d8a0f (patch)
treec3bbe11e47616f702f4c56734430005a5fc04504
parentuse webp to save images (diff)
downloadscout-subs-e1deaaf4a239db742cea2d1e6c4f48a9656d8a0f.tar.gz
scout-subs-e1deaaf4a239db742cea2d1e6c4f48a9656d8a0f.zip
bug fixes and visual improvements
-rw-r--r--accounts/templates/accounts/index.html21
-rw-r--r--accounts/views.py10
-rw-r--r--client/templates/client/index.html34
-rw-r--r--client/views.py15
-rw-r--r--server/templates/server/doc_list.html8
-rw-r--r--server/templates/server/doc_type.html31
-rw-r--r--server/templates/server/index.html12
-rw-r--r--server/templates/server/user_list.html31
-rw-r--r--server/views.py21
9 files changed, 144 insertions, 39 deletions
diff --git a/accounts/templates/accounts/index.html b/accounts/templates/accounts/index.html
index 9a8a79c..69d0717 100644
--- a/accounts/templates/accounts/index.html
+++ b/accounts/templates/accounts/index.html
@@ -75,7 +75,7 @@
<label for="birth_date">Data di nascita</label>
</div>
<div class="input-field col l4 s12">
- <select name="branca">
+ <select name="branca" disabled>
<option value="" disabled {{branca_default}}>Scegli</option>
<option value="colonia" {{branca_castorini}}>Castorini</option>
<option value="muta" {{branca_lupetti}}>Lupetti</option>
@@ -278,7 +278,7 @@
<div class="file-field input-field">
<div class="btn teal">
<span><i class="material-icons left">file_upload</i>File</span>
- <input type="file" name="vac_certificate">
+ <input type="file" name="vac_certificate" id="vac_certificate">
</div>
<div class="file-path-wrapper">
<input id="vac_file" value="{{vac_certificate}}" class="file-path" type="text" placeholder="Certificato di vacinazione">
@@ -298,7 +298,7 @@
<div class="file-field input-field">
<div class="btn teal">
<span><i class="material-icons left">file_upload</i>File</span>
- <input type="file" name="health_care_certificate">
+ <input type="file" name="health_care_certificate" id="health_care_certificate">
</div>
<div class="file-path-wrapper">
<input id="health_care_file" value="{{health_care_certificate}}" class="file-path" type="text" placeholder="Tessera cassa malati">
@@ -377,6 +377,21 @@ $(document).ready(function() {
{% if error %}
M.toast({html: '{{ error_text}}', classes: 'orange'})
{% endif %}
+
+ document.getElementById("vac_certificate").onchange = function() {
+ if(this.files[0].size > 1048576*10){
+ M.toast({html: 'Il file è troppo grande. Grandezza massima 10MB', classes: 'orange'});
+ this.value = "";
+ }
+ };
+
+ document.getElementById("health_care_certificate").onchange = function() {
+ if(this.files[0].size > 1048576*10){
+ M.toast({html: 'Il file è troppo grande. Grandezza massima 10MB', classes: 'orange'});
+ this.value = "";
+ }
+ };
+
});
/*!
diff --git a/accounts/views.py b/accounts/views.py
index 562524e..cc402d2 100644
--- a/accounts/views.py
+++ b/accounts/views.py
@@ -86,11 +86,11 @@ def personal(request):
medic.misc = request.POST["misc"]
medic.save()
- if "branca" in request.POST:
- if request.POST["branca"] != "":
- request.user.groups.clear()
- request.user.groups.add(
- Group.objects.get(name=request.POST["branca"]))
+ #if "branca" in request.POST:
+ # if request.POST["branca"] != "":
+ # request.user.groups.clear()
+ # request.user.groups.add(
+ # Group.objects.get(name=request.POST["branca"]))
if "vac_certificate" in request.FILES:
myfile = request.FILES['vac_certificate']
diff --git a/client/templates/client/index.html b/client/templates/client/index.html
index 2ddbfdc..b368630 100644
--- a/client/templates/client/index.html
+++ b/client/templates/client/index.html
@@ -38,9 +38,20 @@
</div>
<div class="collapsible-body"><span>
{% if doc.0.status == "wait" %}
- <a class="waves-effect waves-light btn teal" onclick="send('f{{doc.0.id}}')"><i class="material-icons left">file_download</i> Scarica documento per approvazione</a>
- <a class="waves-effect waves-light btn teal" onclick="send('d{{doc.0.id}}')"><i class="material-icons left">delete</i> Elimina documento</a>
- <a class="waves-effect waves-light btn teal" onclick="send('e{{doc.0.id}}')"><i class="material-icons left">edit</i> Modifica documento</a>
+ <div class="hide-on-med-and-down">
+ <a class="waves-effect waves-light btn teal" onclick="send('f{{doc.0.id}}')"><i class="material-icons left">file_download</i> Scarica documento per approvazione</a>
+ <a class="waves-effect waves-light btn teal" onclick="send('d{{doc.0.id}}')"><i class="material-icons left">delete</i> Elimina documento</a>
+ <a class="waves-effect waves-light btn teal" onclick="send('e{{doc.0.id}}')"><i class="material-icons left">edit</i> Modifica documento</a>
+ </div>
+ <div class="hide-on-large-only">
+ <a class="s12 waves-effect waves-light btn teal" onclick="send('f{{doc.0.id}}')"><i class="material-icons left">file_download</i> Scarica documento per approvazione</a>
+ <br>
+ <br>
+ <a class="s12 waves-effect waves-light btn teal" onclick="send('d{{doc.0.id}}')"><i class="material-icons left">delete</i> Elimina documento</a>
+ <br>
+ <br>
+ <a class="s12 waves-effect waves-light btn teal" onclick="send('e{{doc.0.id}}')"><i class="material-icons left">edit</i> Modifica documento</a>
+ </div>
<br>
<br>
{% elif doc.0.status == "autosign" %}
@@ -56,9 +67,20 @@
<a onclick="send('a{{doc.0.id}}')" class="modal-close waves-effect waves-green btn-flat">Approva</a>
</div>
</div>
- <a class="waves-effect waves-light btn teal modal-trigger" href="#modal{{doc.0.id}}"><i class="material-icons left">check</i>Approva documento</a>
- <a class="waves-effect waves-light btn teal" onclick="send('d{{doc.0.id}}')"><i class="material-icons left">delete</i> Elimina documento</a>
- <a class="waves-effect waves-light btn teal" onclick="send('e{{doc.0.id}}')"><i class="material-icons left">edit</i> Modifica documento</a>
+ <div class="hide-on-med-and-down">
+ <a class="waves-effect waves-light btn teal modal-trigger" href="#modal{{doc.0.id}}"><i class="material-icons left">check</i>Approva documento</a>
+ <a class="waves-effect waves-light btn teal" onclick="send('d{{doc.0.id}}')"><i class="material-icons left">delete</i>Elimina documento</a>
+ <a class="waves-effect waves-light btn teal" onclick="send('e{{doc.0.id}}')"><i class="material-icons left">edit</i>Modifica documento</a>
+ </div>
+ <div class="hide-on-large-only">
+ <a class="s12 waves-effect waves-light btn teal modal-trigger" href="#modal{{doc.0.id}}"><i class="material-icons left">check</i>Approva documento</a>
+ <br>
+ <br>
+ <a class="s12 waves-effect waves-light btn teal" onclick="send('d{{doc.0.id}}')"><i class="material-icons left">delete</i>Elimina documento</a>
+ <br>
+ <br>
+ <a class="s12 waves-effect waves-light btn teal" onclick="send('e{{doc.0.id}}')"><i class="material-icons left">edit</i>Modifica documento</a>
+ </div>
<br>
<br>
{% endif %}
diff --git a/client/views.py b/client/views.py
index 6cc7a15..c9bb89b 100644
--- a/client/views.py
+++ b/client/views.py
@@ -52,8 +52,10 @@ def index(request):
if document.status == "autosign":
document.status = "ok"
document.save()
+ return HttpResponseRedirect("/")
elif request.POST["action"][0] == 'd':
document.delete()
+ return HttpResponseRedirect("/")
elif request.POST["action"][0] == 'e':
document_type = document.document_type
context = {
@@ -151,13 +153,18 @@ def create(request):
context['custom_message'] = document_type.custom_message
context['custom_message_text'] = document_type.custom_message_text
elif request.POST["action"] == "save":
+ document_type = DocumentType.objects.get(
+ id=request.POST["doctype"])
+
+ current_docs = Document.objects.filter(document_type=document_type)
+ if len(current_docs) > 0:
+ return
+
usercode = UserCode.objects.filter(user=request.user)[0]
code = 0
status = "wait"
personal_data = None
medical_data = None
- document_type = DocumentType.objects.get(
- id=request.POST["doctype"])
if document_type.auto_sign:
status = "autosign"
@@ -202,6 +209,10 @@ def edit_wrapper(request, context):
if request.method == "POST":
if "action" not in request.POST.keys():
document = Document.objects.get(id=request.POST["doc"])
+
+ if document.user != request.user:
+ return
+
usercode = UserCode.objects.filter(user=document.user)[0]
if document.document_type.personal_data:
diff --git a/server/templates/server/doc_list.html b/server/templates/server/doc_list.html
index e5be168..fb201d5 100644
--- a/server/templates/server/doc_list.html
+++ b/server/templates/server/doc_list.html
@@ -124,7 +124,7 @@
<li>
<div class="collapsible-header">
<label>
- <input name={{doc.0.id}} type="checkbox" class="filled-in"/>
+ <input name={{doc.0.id}} type="checkbox" class="filled-in allselect"/>
<span></span>
</label>
{% if doc.0.status == "wait" %}
@@ -165,6 +165,8 @@
<i class="material-icons">send</i>{{doc.0.compilation_date}}
</div>
</li>
+ </ul>
+ <ul class="collapsible">
{% if doc.0.document_type.personal_data %}
<li>
<div class="collapsible-header">
@@ -517,11 +519,11 @@ function send(id) {
$('#select-all').click(function(event) {
if(this.checked) {
// Iterate each checkbox
- $(':checkbox').each(function() {
+ $('.allselect').each(function() {
this.checked = true;
});
} else {
- $(':checkbox').each(function() {
+ $('.allselect').each(function() {
this.checked = false;
});
}
diff --git a/server/templates/server/doc_type.html b/server/templates/server/doc_type.html
index e95cef1..82adf83 100644
--- a/server/templates/server/doc_type.html
+++ b/server/templates/server/doc_type.html
@@ -44,7 +44,6 @@
<div class="input-field">
<input autocomplete="off" id="search" type="search" onkeyup="filterResults()" required>
<label class="label-icon" for="search"><i class="material-icons">search</i></label>
- <i class="material-icons">close</i>
</div>
</form>
</li>
@@ -57,6 +56,7 @@
<ul id='dropdown1' class='dropdown-content'>
<li><a Onclick="send('clear')"><i class="material-icons">clear</i>Pulisci</a></li>
<li><a href="#modal1" data-target="modal1" class="modal-trigger"><i class="material-icons">filter_list</i>Filtri</a></li>
+ <li><a href="#modal2" data-target="modal2" class="modal-trigger"><i class="material-icons">search</i>Cerca</a></li>
</ul>
{% endblock %}
@@ -118,19 +118,22 @@
</label>
</div>
</div>
- <div class="row hide-on-large-only">
- <div class="col s12">
- <div class="input-field">
- <input autocomplete="off" id="searchs" type="text" onkeyup="filterResultsSmall()" required>
- <label for="searchs"><i class="material-icons">search</i></label>
- </div>
- </div>
- </div>
</div>
<div class="modal-footer">
<a href="#!" onclick="send('filter')" class="modal-close waves-effect waves-green btn-flat">Applica</a>
</div>
</div>
+<div id="modal2" class="modal">
+ <div class="modal-content">
+ <div class="input-field">
+ <input autocomplete="off" id="searchs" type="text" onkeyup="filterResultsSmall()" required>
+ <label for="searchs"><i class="material-icons">search</i></label>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <a href="#!" class="modal-close waves-effect waves-green btn-flat">Chiudi</a>
+ </div>
+</div>
<input type="hidden" name="action" id="action">
<ul class="collapsible">
@@ -138,7 +141,7 @@
<li>
<div class="collapsible-header list">
<label>
- <input name={{doctype.0.id}} type="checkbox" class="filled-in"/>
+ <input name={{doctype.0.id}} type="checkbox" class="filled-in allselect"/>
<span></span>
</label>
{% if not doctype.0.enabled %}
@@ -179,6 +182,9 @@
</div>
</li>
{% endif %}
+ </ul>
+ {% if doctype.0.custom_data or doctype.0.custom_message %}
+ <ul class="collapsible">
{% if doctype.0.custom_data %}
<li>
<div class="collapsible-header">
@@ -208,6 +214,7 @@
</li>
{% endif %}
</ul>
+ {% endif %}
</span></div>
</li>
{% endfor %}
@@ -241,11 +248,11 @@ function send(id) {
$('#select-all').click(function(event) {
if(this.checked) {
// Iterate each checkbox
- $(':checkbox').each(function() {
+ $('.allselect').each(function() {
this.checked = true;
});
} else {
- $(':checkbox').each(function() {
+ $('.allselect').each(function() {
this.checked = false;
});
}
diff --git a/server/templates/server/index.html b/server/templates/server/index.html
index 2676c3a..a049f4f 100644
--- a/server/templates/server/index.html
+++ b/server/templates/server/index.html
@@ -60,9 +60,21 @@
</ul>
</div>
<div class="card-action">
+ <div class="hide-on-small-only">
<a class="waves-effect waves-light btn red lighten-1" href="{% url 'doctype' %}">Lista tipo doc</a>
<a class="waves-effect waves-light btn red lighten-1" href="{% url 'doclist' %}">Lista documenti</a>
<a class="waves-effect waves-light btn red lighten-1" href="{% url 'docapprove' %}">Approva documento</a>
+ </div>
+
+ <div class="hide-on-med-and-up">
+ <a class="col s12 waves-effect waves-light btn red lighten-1" href="{% url 'doctype' %}">Lista tipo doc</a>
+ <br>
+ <br>
+ <a class="col s12 waves-effect waves-light btn red lighten-1" href="{% url 'doclist' %}">Lista documenti</a>
+ <br>
+ <br>
+ <a class="col s12 waves-effect waves-light btn red lighten-1" href="{% url 'docapprove' %}">Approva documento</a>
+ </div>
</div>
</div>
</div>
diff --git a/server/templates/server/user_list.html b/server/templates/server/user_list.html
index 8ee2008..1010bd4 100644
--- a/server/templates/server/user_list.html
+++ b/server/templates/server/user_list.html
@@ -30,7 +30,6 @@
<div class="input-field">
<input autocomplete="off" id="search" type="search" onkeyup="filterResults()" required>
<label class="label-icon" for="search"><i class="material-icons">search</i></label>
- <i class="material-icons">close</i>
</div>
</form>
</div>
@@ -51,6 +50,30 @@
{{user.0.first_name}} {{user.0.last_name}}
</div>
<div class="collapsible-body"><span>
+ {% if not user.0.is_staff %}
+ <div id="modal{{user.0.id}}" class="modal">
+ <div class="modal-content">
+ <h4>Attenzione</h4>
+ <p>
+ Sei sicuro di volerlere deapprovare l'utente {{user.0.first_name}} {{user.0.last_name}}?<br>
+ Una volta deapprovato l'utente non potrà più creare documenti e per essere riapprovato dovrà essere usato il codice di approvazione.
+ </p>
+ </div>
+ <div class="modal-footer">
+ <a style="color:red" href="#!" class="modal-close waves-effect waves-green btn-flat">Annulla</a>
+ <a onclick="send('d{{user.0.id}}')" class="modal-close waves-effect waves-green btn-flat">Deapprova</a>
+ </div>
+ </div>
+ <a class="waves-effect waves-light btn red lighten-1 modal-trigger" href="#modal{{user.0.id}}"><i class="material-icons left">remove_circle_outline</i>Deapprova utente</a>
+ <br><br>
+ {% endif %}
+ <ul class="collapsible">
+ <li>
+ <div class="collapsible-header">
+ <i class="material-icons">confirmation_number</i>U{{user.1.code}}
+ </div>
+ </li>
+ </ul>
<ul class="collapsible">
<li>
<div class="collapsible-header">
@@ -292,9 +315,9 @@
{% endblock %}
{% block script %}
-document.addEventListener('DOMContentLoaded', function() {
- var elems = document.querySelectorAll('.collapsible');
- var instances = M.Collapsible.init(elems, {});
+$(document).ready(function(){
+ $('.modal').modal();
+ $('.collapsible').collapsible();
});
function send(id) {
diff --git a/server/views.py b/server/views.py
index e4fea63..e4b70ff 100644
--- a/server/views.py
+++ b/server/views.py
@@ -7,6 +7,7 @@ from django.db.models.deletion import ProtectedError
from django.template.loader import get_template
from django.conf import settings
from django.contrib.admin.views.decorators import staff_member_required
+from django.contrib.contenttypes.models import ContentType
import dateparser
from datetime import datetime
@@ -80,18 +81,16 @@ def uapprove(request):
data[i] = data[i] + " - Invalido"
else:
user = UserCode.objects.filter(code=data[i][1:])[0].user
+ user.user_permissions.add(permission)
if len(user.groups.values_list('name', flat=True)) == 0:
user.groups.add(group)
- user.user_permissions.add(permission)
data[i] = data[i] + " - Ok"
else:
if user.groups.values_list('name', flat=True)[0] == parent_group:
- user.user_permissions.add(permission)
data[i] = data[i] + " - Ok"
else:
user.groups.clear()
user.groups.add(group)
- user.user_permissions.add(permission)
data[i] = data[i] + " - Ok, cambio branca"
context = {
@@ -163,9 +162,19 @@ def ulist(request):
result.seek(0)
return FileResponse(result, as_attachment=True, filename=document.user.username+"_"+document.document_type.name+".pdf")
+ elif request.POST["action"][0] == 'd':
+ user = User.objects.get(id=request.POST["action"][1:])
+ if user.groups.all()[0] == group:
+ content_type = ContentType.objects.get_for_model(Document)
+ permission = Permission.objects.get(content_type=content_type, codename="approved")
+ user.user_permissions.remove(permission)
+
users = User.objects.filter(groups__name=parent_group).order_by("first_name")
out = []
for user in users:
+ if not user.has_perm("client.approved") and not user.is_staff:
+ continue
+
usercode = UserCode.objects.filter(user=user)[0]
documents = Document.objects.filter(Q(user=user) & ~Q(status='archive') & Q(group__name=parent_group))
vac_file = ""
@@ -345,8 +354,12 @@ def doccreate(request):
name = request.POST["name"]
custom_group = request.POST["custom_group"]
+ if len(DocumentType.objects.filter(name=name)) > 0:
+ context["error"] = "true"
+ context["error_text"] = "Questo nome esiste già. Prego usarne un altro."
+ return render(request, 'server/doc_create.html', context)
+
if custom_group != "":
- print("here")
if custom_group not in request.user.groups.values_list('name', flat=True):
context["error"] = "true"
context["error_text"] = "Non puoi creare un tipo assegnato ad un gruppo di cui non fai parte"