aboutsummaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorAndrea Lepori <alepori@student.ethz.ch>2020-06-20 15:55:28 +0200
committerAndrea Lepori <alepori@student.ethz.ch>2020-06-20 15:55:28 +0200
commitccc5d1f1b2cb4b5e2a95b97bbd1a5760ce585f08 (patch)
tree6912e8d96bce8bdf7782c7877a7a0928560c7a1a /client
parentDocument support (diff)
downloadscout-subs-ccc5d1f1b2cb4b5e2a95b97bbd1a5760ce585f08.tar.gz
scout-subs-ccc5d1f1b2cb4b5e2a95b97bbd1a5760ce585f08.zip
Document custom field
Diffstat (limited to 'client')
-rw-r--r--client/migrations/0013_auto_20200620_1113.py19
-rw-r--r--client/migrations/0014_auto_20200620_1506.py23
-rw-r--r--client/models.py4
-rw-r--r--client/templates/client/doc_create.html95
-rw-r--r--client/templates/client/index.html55
-rw-r--r--client/views.py77
6 files changed, 220 insertions, 53 deletions
diff --git a/client/migrations/0013_auto_20200620_1113.py b/client/migrations/0013_auto_20200620_1113.py
new file mode 100644
index 0000000..d05a33d
--- /dev/null
+++ b/client/migrations/0013_auto_20200620_1113.py
@@ -0,0 +1,19 @@
+# Generated by Django 3.0.7 on 2020-06-20 09:13
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('client', '0012_document_group'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='document',
+ name='personal_data',
+ field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.PROTECT, to='client.PersonalData'),
+ ),
+ ]
diff --git a/client/migrations/0014_auto_20200620_1506.py b/client/migrations/0014_auto_20200620_1506.py
new file mode 100644
index 0000000..d0abc9c
--- /dev/null
+++ b/client/migrations/0014_auto_20200620_1506.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.0.7 on 2020-06-20 13:06
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('client', '0013_auto_20200620_1113'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='documenttype',
+ name='custom_message',
+ field=models.BooleanField(default=False),
+ ),
+ migrations.AddField(
+ model_name='documenttype',
+ name='custom_message_text',
+ field=models.CharField(default='', max_length=250),
+ ),
+ ]
diff --git a/client/models.py b/client/models.py
index 01d5f4c..e7142ac 100644
--- a/client/models.py
+++ b/client/models.py
@@ -12,6 +12,8 @@ class DocumentType(models.Model):
personal_data = models.BooleanField(default=False)
medical_data = models.BooleanField(default=False)
custom_data = models.BooleanField(default=False)
+ custom_message = models.BooleanField(default=False)
+ custom_message_text = models.CharField(default="", max_length=250)
name = models.CharField(default="", max_length=250)
@@ -36,7 +38,7 @@ class Document(models.Model):
DocumentType, default=None, on_delete=models.PROTECT)
personal_data = models.ForeignKey(
- PersonalData, default=None, on_delete=models.PROTECT)
+ PersonalData, default=None, on_delete=models.PROTECT, null=True)
class Meta:
permissions = [
diff --git a/client/templates/client/doc_create.html b/client/templates/client/doc_create.html
index a52518f..550eb54 100644
--- a/client/templates/client/doc_create.html
+++ b/client/templates/client/doc_create.html
@@ -4,7 +4,7 @@
{% block nav %}
<a style="margin-left: 10px;" href="{% url 'index' %}" class="breadcrumb">Home</a>
- <a href="#!" class="breadcrumb hide-on-med-and-down">Crea Doc</a>
+ <a href="#!" class="breadcrumb hide-on-med-and-down">Crea Documento</a>
{% endblock %}
{% block content %}
@@ -14,20 +14,78 @@
<div class="row">
<form id="form" action="{% url 'create'%}" method="post" class="col s12">
{% csrf_token %}
- <div class="row">
- <div class="input-field col s12">
- <select name="doctype">
- <option value="" disabled selected>Scegli</option>
- {% for doctype in docs%}
- <option value="{{doctype.id}}">{{doctype.name}}</option>
- {% endfor %}
- </select>
- <label>Documento</label>
+ <input type="hidden" name="action" id="action">
+ {% if not next %}
+ <div class="row">
+ <div class="input-field col s12">
+ <select name="doctype">
+ <option value="" disabled selected>Scegli</option>
+ {% for doctype in docs%}
+ <option value="{{doctype.id}}">{{doctype.name}}</option>
+ {% endfor %}
+ </select>
+ <label>Documento</label>
+ </div>
</div>
- </div>
- <button class="btn waves-effect waves-light" type="submit" name="action">Invia
- <i class="material-icons right">send</i>
- </button>
+ <a class="btn waves-effect waves-light" onclick="window.history.back();" >
+ <i class="material-icons left">navigate_before</i>Indietro
+ </a>
+ <a class="btn waves-effect waves-light" onclick="send('details')" >Avanti
+ <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>
+ </div>
+ </div>
+ {% if personal_data %}
+ <div class="row">
+ <div class="col s12">
+ <a style="pointer-events: none; cursor: default;" class="btn red lighten-1"> Il documento conterr&aacute le informazioni personali, prego verificare che siano corrette e aggiornate</a>
+ </div>
+ </div>
+ {% endif %}
+ {% if medical_data %}
+ <div class="row">
+ <div class="col s12">
+ <a style="pointer-events: none; cursor: default;" class="btn red lighten-1"> Il documento conterr&aacute le informazioni mediche, prego verificare che siano corrette e aggiornate</a>
+ </div>
+ </div>
+ {% endif %}
+ {% if custom_message %}
+ <div class="row">
+ <div class="col s12">
+ <a style="pointer-events: none; cursor: default;" class="btn red lighten-1">{{custom_message_text}}</a>
+ </div>
+ </div>
+ {% 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" class="validate">
+ <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" onclick="window.history.back();" >
+ <i class="material-icons left">navigate_before</i>Indietro
+ </a>
+ <a class="btn waves-effect waves-light" onclick="send('save')" >Crea
+ <i class="material-icons right">create</i>
+ </a>
+ </div>
+ </div>
+ {% endif %}
</form>
</div>
</div>
@@ -38,5 +96,14 @@
{% block script %}
$(document).ready(function(){
$('select').formSelect();
+ {% if error %}
+ M.toast({html: '{{ error_text}}', classes: 'orange'})
+ {% endif %}
});
+function send(id) {
+ var form = document.getElementById('form')
+ var action = document.getElementById('action')
+ action.setAttribute('value', id);
+ form.submit()
+}
{% endblock %} \ No newline at end of file
diff --git a/client/templates/client/index.html b/client/templates/client/index.html
index 2b19f30..96179b2 100644
--- a/client/templates/client/index.html
+++ b/client/templates/client/index.html
@@ -15,34 +15,56 @@
</div>
{% if user.is_authenticated %}
{% if user.is_staff or perms.client.approved %}
- <form id="selection" action="{% url 'doctype' %}" method="post">
- {% csrf_token %}
+ {% if not empty %}
<ul class="collapsible">
{% for doc in docs %}
<li>
<div class="collapsible-header">
- <label>
- <input name={{doc.id}} type="checkbox" class="filled-in"/>
- <span></span>
- </label>
- {% if doc.enabled %}
- <i class="material-icons">visibility_on</i>
- {% else %}
- <i class="material-icons">visibility_off</i>
+ {% if doc.0.status == "wait" %}
+ <i class="material-icons">timelapse</i>
+ {% elif doc.0.status == "ok" %}
+ <i class="material-icons">check</i>
{% endif %}
- {{doc.document_type.name}}
+ {{doc.0.document_type.name}}
+ <span class="badge" data-badge-caption="">{{doc.0.compilation_date}}</span></div>
</div>
<div class="collapsible-body"><span>
- {% for key in keys %}
- {{key}}<br>
- {% endfor %}
+ {% if doc.0.status == "wait" %}
+ <a class="waves-effect waves-light btn red lighten-1" href="{%url 'server'%}"><i class="material-icons left">file_download</i> Scarica documento per approvazione</a>
+ <a class="waves-effect waves-light btn red lighten-1" href="{%url 'server'%}"><i class="material-icons left">delete</i> Elimina documento</a>
+ <a class="waves-effect waves-light btn red lighten-1" href="{%url 'server'%}"><i class="material-icons left">edit</i> Modifica documento</a>
+ <br>
+ <br>
+ {% endif %}
+ {% if doc.0.document_type.personal_data %}
+ <i class="material-icons">person</i>
+ {% endif %}
+ {% if doc.0.document_type.medical_data %}
+ <i class="material-icons">healing</i>
+ {% endif %}
+ {% if doc.0.document_type.custom_data %}
+ <i class="material-icons">add_circle_outline</i>
+ {% endif %}
+ {% if doc.0.document_type.custom_data %}
+ <br>
+ <table class="striped">
+ <tbody>
+ {% for key in doc.1 %}
+ <tr>
+ <td>{{key.key}}</td>
+ <td>{{key.value}}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ {% endif %}
</span></div>
</li>
{% endfor %}
</ul>
- </form>
+ {% endif %}
<div class="fixed-action-btn">
- <a id="add" class="btn-floating btn-large red lightend-1" href="{% url 'create'%}">
+ <a id="add" class="btn-floating btn-large red lighten-1" href="{% url 'create'%}">
<i class="large material-icons">add</i>
</a>
</div>
@@ -75,6 +97,7 @@
{% block script %}
$(document).ready(function(){
+ $('.collapsible').collapsible();
$('.tap-target').tapTarget();
{% if empty %}
$('.tap-target').tapTarget('open');
diff --git a/client/views.py b/client/views.py
index 78ca7d1..f70d930 100644
--- a/client/views.py
+++ b/client/views.py
@@ -1,7 +1,8 @@
from random import randint
from django.contrib.auth.models import Group, Permission, User
-from client.models import UserCode, Keys, DocumentType, Document, PersonalData
+from client.models import UserCode, Keys, DocumentType, Document, PersonalData, KeyVal
from django.db.models import Q
+from django.http import HttpResponseRedirect
from django.shortcuts import render
@@ -21,10 +22,10 @@ def index(request):
userCode = UserCode(user=request.user, code=code)
userCode.save()
- documents = Document.objects.filter(user=request.user)
+ documents = Document.objects.filter(Q(user=request.user) & ~Q(status='archive'))
out = []
for i in documents:
- out.append(i)
+ out.append([i, KeyVal.objects.filter(container=i)])
context = {
"docs": out,
"empty": len(out) == 0,
@@ -51,31 +52,63 @@ def create(request):
parent_group = request.user.groups.values_list('name', flat=True)[
0]
group = Group.objects.get(name=parent_group)
- public_types = DocumentType.objects.filter(
- Q(group_private=False) | Q(group=group))
+ doctypes = DocumentType.objects.filter(
+ (Q(group_private=False) | Q(group=group)) & Q(enabled=True))
out = []
- for doc in public_types:
- out.append(doc)
+ for doc in doctypes:
+ if len(Document.objects.filter(Q(user=request.user) & Q(document_type=doc))) == 0:
+ out.append(doc)
context = {'docs': out}
if request.method == "POST":
- usercode = UserCode.objects.filter(user=request.user)[0]
- code = 0
- status = 0
- document_type = DocumentType.objects.get(
- id=request.POST["doctype"])
- personal_data = PersonalData(parent_name=usercode.parent_name, via=usercode.via, cap=usercode.cap, country=usercode.country,
- nationality=usercode.nationality, born_date=usercode.born_date, home_phone=usercode.home_phone, phone=usercode.phone)
- personal_data.save()
+ if request.POST["action"] == "details":
+ if "doctype" not in request.POST.keys():
+ context['error'] = True
+ context['error_text'] = "Seleziona un documento"
+ else:
+ context['next'] = True
+ document_type = DocumentType.objects.get(
+ id=request.POST["doctype"])
+ context['doctype'] = document_type
+ context['personal_data'] = document_type.personal_data
+ context['medical_data'] = document_type.medical_data
+ context['custom_data'] = document_type.custom_data
+ keys = Keys.objects.filter(container=document_type)
+ out_keys = []
+ for i in keys:
+ out_keys.append([i, ""])
+ context['keys'] = out_keys
+ context['custom_message'] = document_type.custom_message
+ context['custom_message_text'] = document_type.custom_message_text
+ elif request.POST["action"] == "save":
+ usercode = UserCode.objects.filter(user=request.user)[0]
+ code = 0
+ status = "wait"
+ personal_data = None
+ document_type = DocumentType.objects.get(
+ id=request.POST["doctype"])
+ keys = []
+ if document_type.personal_data:
+ personal_data = PersonalData(parent_name=usercode.parent_name, via=usercode.via, cap=usercode.cap, country=usercode.country,
+ nationality=usercode.nationality, born_date=usercode.born_date, home_phone=usercode.home_phone, phone=usercode.phone)
+ personal_data.save()
- while (True):
- code = randint(100000, 999999)
- if len(Document.objects.filter(code=code)) == 0:
- break
+ while (True):
+ code = randint(100000, 999999)
+ if len(Document.objects.filter(code=code)) == 0:
+ break
+
+ document = Document(
+ user=request.user, group=group, code=code, status=status, document_type=document_type, personal_data=personal_data)
+ document.save()
+
+ for i in request.POST.keys():
+ if i == "doctype" or i=="csrfmiddlewaretoken" or i=="action":
+ continue
+ key = KeyVal(container=document, key=Keys.objects.get(id=i).key, value=request.POST[i])
+ key.save()
- document = Document(
- user=request.user, group=group, code=code, status=status, document_type=document_type, personal_data=personal_data)
- document.save()
+ return HttpResponseRedirect('/')
return render(request, 'client/doc_create.html', context)
else: