diff options
Diffstat (limited to '')
-rw-r--r-- | client/migrations/0005_documenttype_staff_only.py | 18 | ||||
-rw-r--r-- | client/migrations/0006_documenttype_max_instances.py | 18 | ||||
-rw-r--r-- | client/models.py | 2 | ||||
-rw-r--r-- | client/templates/client/doc_create.html | 123 | ||||
-rw-r--r-- | client/templates/client/doc_edit.html | 6 | ||||
-rw-r--r-- | client/templates/client/index.html | 28 | ||||
-rw-r--r-- | client/views.py | 31 |
7 files changed, 157 insertions, 69 deletions
diff --git a/client/migrations/0005_documenttype_staff_only.py b/client/migrations/0005_documenttype_staff_only.py new file mode 100644 index 0000000..3211c26 --- /dev/null +++ b/client/migrations/0005_documenttype_staff_only.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.2 on 2020-10-30 16:46 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('client', '0004_auto_20200903_1828'), + ] + + operations = [ + migrations.AddField( + model_name='documenttype', + name='staff_only', + field=models.BooleanField(default=False), + ), + ] diff --git a/client/migrations/0006_documenttype_max_instances.py b/client/migrations/0006_documenttype_max_instances.py new file mode 100644 index 0000000..750ff0e --- /dev/null +++ b/client/migrations/0006_documenttype_max_instances.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.2 on 2020-10-30 17:11 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('client', '0005_documenttype_staff_only'), + ] + + operations = [ + migrations.AddField( + model_name='documenttype', + name='max_instances', + field=models.IntegerField(default=0), + ), + ] diff --git a/client/models.py b/client/models.py index c85ca14..d14a267 100644 --- a/client/models.py +++ b/client/models.py @@ -16,6 +16,8 @@ class DocumentType(models.Model): custom_data = models.BooleanField(default=False) custom_message = models.BooleanField(default=False) custom_message_text = models.CharField(default="", max_length=250) + staff_only = models.BooleanField(default=False) + max_instances = models.IntegerField(default=0) name = models.CharField(default="", max_length=250) diff --git a/client/templates/client/doc_create.html b/client/templates/client/doc_create.html index 18940d8..04f08e6 100644 --- a/client/templates/client/doc_create.html +++ b/client/templates/client/doc_create.html @@ -1,9 +1,9 @@ {% extends 'registration/base_client.html' %} -{% block title %}Crea Documento{% endblock %} +{% block title %}Crea iscrizione{% endblock %} {% block breadcrumb %} - <a href="#!" class="breadcrumb hide-on-med-and-down">Crea Documento</a> + <a href="#!" class="breadcrumb hide-on-med-and-down">Crea Iscrizione</a> {% endblock %} {% block content %} @@ -23,7 +23,7 @@ <option value="{{doctype.id}}">{{doctype.name}}</option> {% endfor %} </select> - <label>Documento</label> + <label>Iscrizione</label> </div> </div> <a class="btn waves-effect waves-light {{color}}" onclick="window.history.back();" > @@ -33,75 +33,100 @@ <i class="material-icons right">navigate_next</i> </a> {% else %} - <input type="hidden" name="doctype" value="{{doctype.id}}"> - <div class="row"> - <div class="input-field col s12"> - <select> - <option disabled selected>{{doctype.name}}</option> - </select> - <label>Documento</label> + <input type="hidden" name="doctype" value="{{doctype.id}}"> + <div class="row"> + <div class="input-field col s12"> + <select> + <option disabled selected>{{doctype.name}}</option> + </select> + <label>Iscrizione</label> + </div> </div> - </div> - {% if personal_data %} + {% if no_free_places%} <div class="row"> <div class="col s12"> <div class="card {{color}}"> <div class="card-content"> <p style="color:white"><b> - Il documento conterrà le informazioni personali, prego verificare che siano corrette e aggiornate + Siamo spiacenti abbiamo esaurito i posti disponibili per questa iscrizione. </b></p> </div> </div> </div> </div> - {% endif %} - {% if medical_data %} <div class="row"> <div class="col s12"> - <div class="card {{color}}"> - <div class="card-content"> - <p style="color:white"><b> - Il documento conterrà le informazioni mediche, prego verificare che siano corrette e aggiornate - </b></p> + <br> + <a class="btn waves-effect waves-light {{color}}" onclick="window.history.back();" > + <i class="material-icons left">navigate_before</i>Indietro + </a> + <a class="btn waves-effect waves-light {{color}}" href="/" >Annulla + <i class="material-icons right">cancel</i> + </a> + </div> + </div> + {% else %} + {% if personal_data %} + <div class="row"> + <div class="col s12"> + <div class="card {{color}}"> + <div class="card-content"> + <p style="color:white"><b> + Il documento conterrà le informazioni personali, prego verificare che siano corrette e aggiornate + </b></p> + </div> </div> </div> </div> - </div> - {% endif %} - {% if custom_message %} - <div class="row"> - <div class="col s12"> - <div class="card {{color}}"> - <div class="card-content"> - <p style="color:white"><b> - {{custom_message_text}} - </b></p> + {% endif %} + {% if medical_data %} + <div class="row"> + <div class="col s12"> + <div class="card {{color}}"> + <div class="card-content"> + <p style="color:white"><b> + Il documento conterrà le informazioni mediche, prego verificare che siano corrette e aggiornate + </b></p> + </div> </div> </div> </div> - </div> - {% endif %} - {% if custom_data %} - {% for key in keys %} + {% endif %} + {% if custom_message %} <div class="row"> - <div class="input-field col s12"> - <input value="{{key.1}}" name="{{key.0.id}}" id="{{key.0.id}}" type="text"> - <label for="{{key.0.id}}">{{key.0.key}}</label> + <div class="col s12"> + <div class="card {{color}}"> + <div class="card-content"> + <p style="color:white"><b> + {{custom_message_text}} + </b></p> + </div> + </div> </div> </div> - {% endfor %} - {% endif %} - <div class="row"> - <div class="col s12"> - <br> - <a class="btn waves-effect waves-light {{color}}" onclick="window.history.back();" > - <i class="material-icons left">navigate_before</i>Indietro - </a> - <a class="btn waves-effect waves-light {{color}}" onclick="send('save')" >Crea - <i class="material-icons right">create</i> - </a> + {% endif %} + {% if custom_data %} + {% for key in keys %} + <div class="row"> + <div class="input-field col s12"> + <input value="{{key.1}}" name="{{key.0.id}}" id="{{key.0.id}}" type="text"> + <label for="{{key.0.id}}">{{key.0.key}}</label> + </div> + </div> + {% endfor %} + {% endif %} + <div class="row"> + <div class="col s12"> + <br> + <a class="btn waves-effect waves-light {{color}}" onclick="window.history.back();" > + <i class="material-icons left">navigate_before</i>Indietro + </a> + <a class="btn waves-effect waves-light {{color}}" onclick="send('save')" >Crea + <i class="material-icons right">create</i> + </a> + </div> </div> - </div> + {% endif %} {% endif %} </form> </div> diff --git a/client/templates/client/doc_edit.html b/client/templates/client/doc_edit.html index 278f34c..f7e8f72 100644 --- a/client/templates/client/doc_edit.html +++ b/client/templates/client/doc_edit.html @@ -1,9 +1,9 @@ {% extends 'registration/base_client.html' %} -{% block title %}Modifica documento{% endblock %} +{% block title %}Modifica iscrizione{% endblock %} {% block breadcrumb %} - <a href="#!" class="breadcrumb hide-on-med-and-down">Modifica Documento</a> + <a href="#!" class="breadcrumb hide-on-med-and-down">Modifica iscrizione</a> {% endblock %} {% block content %} @@ -19,7 +19,7 @@ <select> <option disabled selected>{{doc.document_type.name}}</option> </select> - <label>Documento</label> + <label>Iscrizione</label> </div> </div> {% if personal_data %} diff --git a/client/templates/client/index.html b/client/templates/client/index.html index b63fa49..b5d1135 100644 --- a/client/templates/client/index.html +++ b/client/templates/client/index.html @@ -5,8 +5,8 @@ {% block content %} <div class="tap-target {{color}}" data-target="add"> <div class="tap-target-content"> - <h5 style="color:white">Aggiungi un documento</h5> - <p style="color:white">Usa questo bottone per creare un nuovo documento</p> + <h5 style="color:white">Aggiungi un'iscrizione</h5> + <p style="color:white">Usa questo bottone per creare una nuova iscrizione</p> </div> </div> @@ -36,17 +36,17 @@ {% if doc.0.status == "wait" %} <div class="hide-on-med-and-down"> <a class="waves-effect waves-light btn {{color}}" 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 {{color}}" onclick="send('d{{doc.0.id}}')"><i class="material-icons left">delete</i> Elimina documento</a> - <a class="waves-effect waves-light btn {{color}}" onclick="send('e{{doc.0.id}}')"><i class="material-icons left">edit</i> Modifica documento</a> + <a class="waves-effect waves-light btn {{color}}" onclick="send('d{{doc.0.id}}')"><i class="material-icons left">delete</i> Elimina iscrizione</a> + <a class="waves-effect waves-light btn {{color}}" onclick="send('e{{doc.0.id}}')"><i class="material-icons left">edit</i> Modifica iscrizione</a> </div> <div style="margin-bottom: 0px;" class="hide-on-large-only row"> <a class="col s12 waves-effect waves-light btn {{color}}" onclick="send('f{{doc.0.id}}')"><i class="material-icons left">file_download</i> Scarica documento per approvazione</a> <br> <br> - <a class="col s12 waves-effect waves-light btn {{color}}" onclick="send('d{{doc.0.id}}')"><i class="material-icons left">delete</i> Elimina documento</a> + <a class="col s12 waves-effect waves-light btn {{color}}" onclick="send('d{{doc.0.id}}')"><i class="material-icons left">delete</i> Elimina iscrizione</a> <br> <br> - <a class="col s12 waves-effect waves-light btn {{color}}" onclick="send('e{{doc.0.id}}')"><i class="material-icons left">edit</i> Modifica documento</a> + <a class="col s12 waves-effect waves-light btn {{color}}" onclick="send('e{{doc.0.id}}')"><i class="material-icons left">edit</i> Modifica iscrizione</a> </div> <br> <br> @@ -54,8 +54,8 @@ <div id="modal{{doc.0.id}}" class="modal"> <div class="modal-content"> <h4>Attenzione</h4> - <p>Una volta approvato il documento non potrà più essere modificato.<br> - Sei sicuro di volerlo approvare? + <p>Una volta approvata l'iscrizione non potrà più essere modificata.<br> + Sei sicuro di volerla approvare? </p> </div> <div class="modal-footer"> @@ -64,18 +64,18 @@ </div> </div> <div class="hide-on-med-and-down"> - <a class="waves-effect waves-light btn {{color}} modal-trigger" href="#modal{{doc.0.id}}"><i class="material-icons left">check</i>Approva documento</a> - <a class="waves-effect waves-light btn {{color}}" onclick="send('d{{doc.0.id}}')"><i class="material-icons left">delete</i>Elimina documento</a> - <a class="waves-effect waves-light btn {{color}}" onclick="send('e{{doc.0.id}}')"><i class="material-icons left">edit</i>Modifica documento</a> + <a class="waves-effect waves-light btn {{color}} modal-trigger" href="#modal{{doc.0.id}}"><i class="material-icons left">check</i>Approva iscrizione</a> + <a class="waves-effect waves-light btn {{color}}" onclick="send('d{{doc.0.id}}')"><i class="material-icons left">delete</i>Elimina iscrizione</a> + <a class="waves-effect waves-light btn {{color}}" onclick="send('e{{doc.0.id}}')"><i class="material-icons left">edit</i>Modifica iscrizione</a> </div> <div style="margin-bottom: 0px;" class="hide-on-large-only row"> - <a class="col s12 waves-effect waves-light btn {{color}} modal-trigger" href="#modal{{doc.0.id}}"><i class="material-icons left">check</i>Approva documento</a> + <a class="col s12 waves-effect waves-light btn {{color}} modal-trigger" href="#modal{{doc.0.id}}"><i class="material-icons left">check</i>Approva iscrizione</a> <br> <br> - <a class="col s12 waves-effect waves-light btn {{color}}" onclick="send('d{{doc.0.id}}')"><i class="material-icons left">delete</i>Elimina documento</a> + <a class="col s12 waves-effect waves-light btn {{color}}" onclick="send('d{{doc.0.id}}')"><i class="material-icons left">delete</i>Elimina iscrizione</a> <br> <br> - <a class="col s12 waves-effect waves-light btn {{color}}" onclick="send('e{{doc.0.id}}')"><i class="material-icons left">edit</i>Modifica documento</a> + <a class="col s12 waves-effect waves-light btn {{color}}" onclick="send('e{{doc.0.id}}')"><i class="material-icons left">edit</i>Modifica iscrizione</a> </div> <br> <br> diff --git a/client/views.py b/client/views.py index 8b0ac7b..821bc9b 100644 --- a/client/views.py +++ b/client/views.py @@ -15,7 +15,6 @@ from subprocess import check_output from datetime import datetime import pytz - def index(request): context = {} # check if user is logged @@ -138,8 +137,11 @@ def create(request): group = Group.objects.get(name=parent_group) # get available types for user - doctypes = DocumentType.objects.filter( - (Q(group_private=False) | Q(group=group)) & Q(enabled=True)) + filter = (Q(group_private=False) | Q(group=group)) & Q(enabled=True) + if not request.user.is_staff and "capi" not in request.user.groups.values_list('name',flat = True): + filter = filter & Q(staff_only=False) + + doctypes = DocumentType.objects.filter(filter) out = [] for doc in doctypes: # check if user has already that document type @@ -159,7 +161,15 @@ def create(request): context['next'] = True document_type = DocumentType.objects.get( id=request.POST["doctype"]) + context['doctype'] = document_type + + # check if there are still free spaces + context['no_free_places'] = False + if document_type.max_instances != 0: + if len(Document.objects.filter(document_type=document_type)) - len(Document.objects.filter(document_type=document_type, status="archive")) >= document_type.max_instances: + context['no_free_places'] = True + context['personal_data'] = document_type.personal_data context['medical_data'] = document_type.medical_data context['custom_data'] = document_type.custom_data @@ -177,6 +187,21 @@ def create(request): document_type = DocumentType.objects.get( id=request.POST["doctype"]) + # check if there are free spaces + if document_type.max_instances != 0: + if len(Document.objects.filter(document_type=document_type)) - len(Document.objects.filter(document_type=document_type, status="archive")) >= document_type.max_instances: + # there aren't user is cheating + return + + # check if user has permission to use that type + if document_type.staff_only and not request.user.is_staff and "capi" not in request.user.groups.values_list('name', flat = True): + # user is cheating abort + return + + if not document_type.custom_group and document_type.group.name not in request.user.groups.values_list('name', flat=True): + # user is cheating abort + return + # get list of docs with that type current_docs = Document.objects.filter(user=request.user).filter(document_type=document_type) if len(current_docs) > 0: |