From ccc5d1f1b2cb4b5e2a95b97bbd1a5760ce585f08 Mon Sep 17 00:00:00 2001
From: Andrea Lepori <alepori@student.ethz.ch>
Date: Sat, 20 Jun 2020 15:55:28 +0200
Subject: Document custom field

---
 client/migrations/0013_auto_20200620_1113.py | 19 ++++++
 client/migrations/0014_auto_20200620_1506.py | 23 +++++++
 client/models.py                             |  4 +-
 client/templates/client/doc_create.html      | 95 ++++++++++++++++++++++++----
 client/templates/client/index.html           | 55 +++++++++++-----
 client/views.py                              | 77 +++++++++++++++-------
 6 files changed, 220 insertions(+), 53 deletions(-)
 create mode 100644 client/migrations/0013_auto_20200620_1113.py
 create mode 100644 client/migrations/0014_auto_20200620_1506.py

(limited to 'client')

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:
-- 
cgit v1.2.1