diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | accounts/templates/accounts/index.html | 656 | ||||
-rw-r--r-- | accounts/views.py | 48 | ||||
-rw-r--r-- | client/migrations/0023_auto_20200622_1708.py | 24 | ||||
-rw-r--r-- | client/migrations/0024_auto_20200622_1930.py | 23 | ||||
-rw-r--r-- | client/models.py | 2 | ||||
-rw-r--r-- | client/templates/client/approve.html | 2 | ||||
-rw-r--r-- | client/templates/client/doc_create.html | 8 | ||||
-rw-r--r-- | client/templates/client/doc_edit.html | 26 | ||||
-rw-r--r-- | client/templates/client/index.html | 218 | ||||
-rw-r--r-- | client/views.py | 20 | ||||
-rw-r--r-- | documents_qtCfYLF | 0 | ||||
-rw-r--r-- | manager/settings.py | 1 | ||||
-rw-r--r-- | server/templates/server/doc_list.html | 205 | ||||
-rw-r--r-- | server/templates/server/download_doc.html | 265 | ||||
-rw-r--r-- | server/views.py | 34 | ||||
-rw-r--r-- | templates/registration/base_client.html | 51 |
17 files changed, 1293 insertions, 291 deletions
@@ -1,2 +1,3 @@ **/__pycache__ **/*.pyc +documents
\ No newline at end of file diff --git a/accounts/templates/accounts/index.html b/accounts/templates/accounts/index.html index c1f4624..a6e6edd 100644 --- a/accounts/templates/accounts/index.html +++ b/accounts/templates/accounts/index.html @@ -4,7 +4,7 @@ {%block nav%} <nav class="nav-extended"> - <div class="nav-wrapper red lighten-1"> + <div class="nav-wrapper teal"> <a style="margin-left: 10px;" href="{% url 'index' %}" class="breadcrumb">Home</a> <a href="#!" class="breadcrumb hide-on-med-and-down">Account</a> <ul class="right"> @@ -24,7 +24,7 @@ {% endif %} </ul> </div> - <div class="nav-content red lighten-1"> + <div class="nav-content teal"> <ul class="tabs tabs-transparent"> <li class="tab"><a class="active" href="#personal">Info Personali</a></li> <li class="tab"><a href="#medic">Info Mediche</a></li> @@ -55,24 +55,25 @@ <div class="col l8 offset-l2 s12"> <div class="card-panel"> <div class="row"> - <form action="{% url 'personal'%}" method="post" id="form" class="col s12"> + <form action="{% url 'personal'%}" method="post" id="form" class="col s12" enctype="multipart/form-data"> + <input type="hidden" name="action" id="action"> + <input type="hidden" name="delete_vac" id="delete_vac"> + <input type="hidden" name="delete_health" id="delete_health"> {% csrf_token %} <div class="row"> - <div class="input-field col s4"> + <div class="input-field col l4 s12"> <input name="first_name" value="{{first_name}}" id="first_name" type="text" > <label for="first_name">Nome</label> </div> - <div class="input-field col s4"> + <div class="input-field col l4 s12"> <input name="last_name" value="{{last_name}}" id="last_name" type="text" > <label for="last_name">Cognome</label> </div> - <div class="input-field col s4"> + <div class="input-field col l4 s12"> <input name="birth_date" value="{{birth_date}}" id="birth_date" type="text" class="datepicker"> <label for="birth_date">Data di nascita</label> </div> - </div> - <div class="row"> - <div class="input-field col s4"> + <div class="input-field col l4 s12"> <select name="branca"> <option value="" disabled {{branca_default}}>Scegli</option> <option value="colonia" {{branca_castorini}}>Castorini</option> @@ -83,57 +84,49 @@ </select> <label>Branca</label> </div> - <div class="input-field col s8"> + <div class="input-field col l8 s12"> <input value="{{parent_name}}" name="parent_name" id="parent_name" type="text" > <label for="parent_name">Nome dei genitori</label> </div> - </div> - <div class="row"> - <div class="input-field col s12"> + <div class="input-field col l12 s12"> <input value="{{via}}" name="via" id="via" type="text" > <label for="via">Via e numero</label> </div> - </div> - <div class="row"> - <div class="input-field col s4"> + <div class="input-field col l4 s12"> <input value="{{cap}}" name="cap" id="cap" type="text" > <label for="cap">CAP</label> </div> - <div class="input-field col s4"> + <div class="input-field col l4 s12"> <input value="{{country}}" name="country" id="country" type="text" > <label for="country">Paese</label> </div> - <div class="input-field col s4"> + <div class="input-field col l4 s12"> <input value="{{nationality}}" name="nationality" id="nationality" type="text" > <label for="nationality">Nazionalità</label> </div> - </div> - <div class="row"> - <div class="input-field col s4"> + <div class="input-field col l4 s12"> <input value="{{phone}}" name="phone" id="phone" type="text" > <label for="phone">Cellulare</label> </div> - <div class="input-field col s4"> + <div class="input-field col l4 s12"> <input value="{{home_phone}}" name="home_phone" id="home_phone" type="text" > <label for="home_phone">Telefono di casa</label> </div> - <div class="input-field col s4"> + <div class="input-field col l4 s12"> <input value="{{email}}" name="email" id="email" type="text" > <label for="email">Email</label> </div> - </div> - <div class="row"> - <div class="input-field col s8"> + <div class="input-field col l8 s12"> <input value="{{school}}" name="school" id="school" type="text" > <label for="school">Scuola frequentata</label> </div> - <div class="input-field col s4"> + <div class="input-field col l4 s12"> <input value="{{year}}" name="year" id="year" type="text" > <label for="year">Classe</label> </div> </div> <div class="fixed-action-btn"> - <a class="btn-floating btn-large red lighten-1" onclick="document.getElementById('form').submit()"> + <a class="btn-floating btn-large teal" onclick="document.getElementById('form').submit()"> <i class="large material-icons">save</i> </a> </div> @@ -145,210 +138,437 @@ <div class="col l8 offset-l2 s12"> <div class="card-panel"> <div class="row"> - {% csrf_token %} - <div class="row"> - <div class="col s12"> - <h6>Persona di contatto in caso di necessità</h6> - </div> - </div> - <div class="row"> - <div class="input-field col s6"> - <input name="emer_name" value="{{emer_name}}" id="emer_name" type="text" > - <label for="emer_name">Nome e cognome</label> - </div> - <div class="input-field col s3"> - <input name="emer_relative" value="{{emer_relative}}" id="emer_relative" type="text" > - <label for="emer_releative">Parentela</label> - </div> - <div class="input-field col s3"> - <input name="cell_phone" value="{{cell_phone}}" id="cellphone" type="text" > - <label for="cell_phone">Cellulare</label> - </div> - </div> - <div class="row"> - <div class="input-field col s9"> - <input value="{{address}}" name="address" id="address" type="text" > - <label for="address">Indirizzo completo</label> - </div> - <div class="input-field col s3"> - <input value="{{emer_phone}}" name="emer_phone" id="emer_phone" type="text" > - <label for="emer_phone">Telefono di casa</label> - </div> - </div> - <div class="row"> - <div class="col s12"> - <h6>Assicurazione</h6> - </div> - </div> - <div class="row"> - <div class="input-field col s4"> - <input value="{{health_care}}" name="health_care" id="health_care" type="text" > - <label for="health_care">Cassa Malati</label> - </div> - <div class="input-field col s4"> - <input value="{{injuries}}" name="injuries" id="injuries" type="text" > - <label for="injuries">Infortuni</label> - </div> - <div class="input-field col s4"> - <input value="{{rc}}" name="rc" id="rc" type="text" > - <label for="rc">Responsabilità civile</label> - </div> - </div> - <div class="row"> - <div class="switch col s12"> - È sostenitore REGA - <label> - No - <input name="rega" type="checkbox" {{rega_check}}> - <span class="lever"></span> - Si - </label> - </div> - </div> - <div class="row"> - <div class="col s12"> - <h6>Medico di famiglia</h6> - </div> - </div> - <div class="row"> - <div class="input-field col s6"> - <input value="{{medic_name}}" name="medic_name" id="medic_name" type="text" > - <label for="medic_name">Nome e cognome</label> - </div> - <div class="input-field col s6"> - <input value="{{medic_phone}}" name="medic_phone" id="medic_phone" type="text" > - <label for="medic_phone">Telefono studio</label> - </div> - </div> - <div class="row"> - <div class="input-field col s12"> - <input value="{{medic_address}}" name="medic_address" id="medic_address" type="text" > - <label for="medic_address">Indirizzo completo</label> - </div> - </div> - <div class="row"> - <div class="col s12"> - <h6>Scheda medica personale</h6> - </div> - </div> - <div class="row"> - <div class="input-field col s12"> - <input value="{{sickness}}" name="sickness" id="sickness" type="text" data-length="250"> - <label for="sickness">Principali malattie avute</label> - </div> - </div> - <div class="row"> - <div class="input-field col s8"> - <input value="{{vaccine}}" name="vaccine" id="vaccine" type="text" data-length="250"> - <label for="vaccine">Vacinazioni fatte</label> - </div> - <div class="input-field col s4"> - <label for="tetanus_date">Ultima vacinazione contro il tetano</label> - <input value="{{tetanus_date}}" name="tetanus_date" id="tetanus_date" type="text" class="datepicker"> - </div> - </div> - <div class="row"> - <div class="input-field col s12"> - <input value="{{allergy}}" name="allergy" id="allergy" type="text" data-length="250"> - <label for="allergy">Allergie particolari/Intolleraze alimentari</label> - </div> - </div> - <div class="row"> - <div class="switch col s12"> - Deve assumere regolarmente medicamenti - <label> - No - <input name="drugs_bool" type="checkbox" {{drugs_check}}> - <span class="lever"></span> - Si - </label> + <div class="col s12"> + <h6>Persona di contatto in caso di necessità</h6> + </div> + </div> + <div class="row"> + <div class="input-field col l6 s12"> + <input name="emer_name" value="{{emer_name}}" id="emer_name" type="text" > + <label for="emer_name">Nome e cognome</label> + </div> + <div class="input-field col l3 s12"> + <input name="emer_relative" value="{{emer_relative}}" id="emer_relative" type="text" > + <label for="emer_releative">Parentela</label> + </div> + <div class="input-field col l3 s12"> + <input name="cell_phone" value="{{cell_phone}}" id="cellphone" type="text" > + <label for="cell_phone">Cellulare</label> + </div> + <div class="input-field col l9 s12"> + <input value="{{address}}" name="address" id="address" type="text" > + <label for="address">Indirizzo completo</label> + </div> + <div class="input-field col l3 s12"> + <input value="{{emer_phone}}" name="emer_phone" id="emer_phone" type="text" > + <label for="emer_phone">Telefono di casa</label> + </div> + </div> + <div class="row"> + <div class="col s12"> + <h6>Assicurazione</h6> + </div> + </div> + <div class="row"> + <div class="input-field col l4 s12"> + <input value="{{health_care}}" name="health_care" id="health_care" type="text" > + <label for="health_care">Cassa Malati</label> + </div> + <div class="input-field col l4 s12"> + <input value="{{injuries}}" name="injuries" id="injuries" type="text" > + <label for="injuries">Infortuni</label> + </div> + <div class="input-field col l4 s12"> + <input value="{{rc}}" name="rc" id="rc" type="text" > + <label for="rc">Responsabilità civile</label> + </div> + </div> + <div class="row"> + <div class="switch col s12"> + È sostenitore REGA + <label> + No + <input name="rega" type="checkbox" {{rega_check}}> + <span class="lever"></span> + Si + </label> + </div> + </div> + <div class="row"> + <div class="col s12"> + <h6>Medico di famiglia</h6> + </div> + <div class="input-field col l6 s12"> + <input value="{{medic_name}}" name="medic_name" id="medic_name" type="text" > + <label for="medic_name">Nome e cognome</label> + </div> + <div class="input-field col l6 s12"> + <input value="{{medic_phone}}" name="medic_phone" id="medic_phone" type="text" > + <label for="medic_phone">Telefono studio</label> + </div> + <div class="input-field col l12 s12"> + <input value="{{medic_address}}" name="medic_address" id="medic_address" type="text" > + <label for="medic_address">Indirizzo completo</label> + </div> + </div> + <div class="row"> + <div class="col s12"> + <h6>Scheda medica personale</h6> + </div> + <div class="input-field col s12"> + <input value="{{sickness}}" name="sickness" id="sickness" type="text" data-length="250"> + <label for="sickness">Principali malattie avute</label> + </div> + <div class="input-field col l8 s12"> + <input value="{{vaccine}}" name="vaccine" id="vaccine" type="text" data-length="250"> + <label for="vaccine">Vacinazioni fatte</label> + </div> + <div class="input-field col l4 s12"> + <label for="tetanus_date">Ultima vacinazione contro il tetano</label> + <input value="{{tetanus_date}}" name="tetanus_date" id="tetanus_date" type="text" class="datepicker"> + </div> + <div class="input-field col s12"> + <input value="{{allergy}}" name="allergy" id="allergy" type="text" data-length="250"> + <label for="allergy">Allergie particolari/Intolleraze alimentari</label> + </div> + <div class="switch col s12"> + Deve assumere regolarmente medicamenti + <label> + No + <input name="drugs_bool" type="checkbox" {{drugs_check}}> + <span class="lever"></span> + Si + </label> + </div> + <div class="col s12"> + <div class="card teal"> + <div class="card-content"> + <p style="color:white"><b>In caso dovesse assumere farmaci, avvisare comunque i capi</b></p> </div> </div> - <div class="row"> - <div class="col s12"> - <div class="card red lighten-1"> - <div class="card-content"> - <p style="color:white"><b>In caso dovesse assumere farmaci, avvisare comunque i capi</b></p> + </div> + <div class="input-field col s12"> + <input value="{{drugs}}" name="drugs" id="drugs" type="text" data-length="250"> + <label for="drugs">Se sì quali, in che dosi e prescrizioni</label> + </div> + <div class="switch col s12"> + Informazioni particolari sullo stato di salute: (postumi di operazioni, incidenti, malattie, disturbi fisici) + <label> + No + <input name="misc_bool" type="checkbox" {{misc_check}}> + <span class="lever"></span> + Si + </label> + </div> + <div class="input-field col s12"> + <input value="{{misc}}" name="misc" id="misc" type="text" data-length="250"> + <label for="misc">Se sì quali</label> + </div> + </div> + <div class="row"> + <div class="col s12"> + <h6>Allegati</h6> + </div> + <div class="col s12"> + <div class="card"> + <div class="card-content"> + Certificato di vacinazione + <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"> + </div> + <div class="file-path-wrapper"> + <input id="vac_file" value="{{vac_certificate}}" class="file-path" type="text" placeholder="Certificato di vacinazione"> </div> </div> - </div> - <div class="input-field col s12"> - <input value="{{drugs}}" name="drugs" id="drugs" type="text" data-length="250"> - <label for="drugs">Se sì quali, in che dosi e prescrizioni</label> - </div> - </div> - <div class="row"> - <div class="switch col s12"> - Informazioni particolari sullo stato di salute: (postumi di operazioni, incidenti, malattie, disturbi fisici) - <label> - No - <input name="misc_bool" type="checkbox" {{misc_check}}> - <span class="lever"></span> - Si - </label> - </div> - <div class="input-field col s12"> - <input value="{{misc}}" name="misc" id="misc" type="text" data-length="250"> - <label for="misc">Se sì quali</label> - </div> - </div> - <div class="row"> - <div class="col s12"> - <h6>Allegati</h6> + {% if vac_certificate != ''%} + <a class="btn teal" onclick="send('download_vac')"><i class="material-icons left">file_download</i>Download</a> + <a class="btn teal" onclick="delete_vac()"><i class="material-icons left">delete</i><span>Elimina</span></a> + {% endif %} </div> </div> - <div class="row"> - <div class="col s6"> - Certificato delle vacinazioni - </div> - <div class="col s6"> - Tessera della cassa malati + </div> + <div class="col s12"> + <div class="card"> + <div class="card-content"> + Tessera cassa malati + <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"> + </div> + <div class="file-path-wrapper"> + <input id="health_care_file" value="{{health_care_certificate}}" class="file-path" type="text" placeholder="Tessera cassa malati"> + </div> + </div> + {% if health_care_certificate != ''%} + <a class="btn teal" onclick="send('download_health')"><i class="material-icons left">file_download</i>Download</a> + <a class="btn teal" onclick="delete_health()"><i class="material-icons left">delete</i><span>Elimina</span></a> + {% endif %} </div> </div> - <div class="fixed-action-btn"> - <a class="btn-floating btn-large red lighten-1" onclick="document.getElementById('form').submit()"> - <i class="large material-icons">save</i> - </a> - </div> - </form> + </div> + </div> + <div class="fixed-action-btn"> + <a class="btn-floating btn-large teal" onclick="send('save')"> + <i class="large material-icons">save</i> + </a> </div> + </form> </div> </div> </div> {% endblock %} {% block script %} - var elem = $('.tabs') - var options = { - yearRange:100, - format:'dd mmmm yyyy', - i18n: { - months: [ 'gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno', 'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre' ], - monthsShort: [ 'gen', 'feb', 'mar', 'apr', 'mag', 'giu', 'lug', 'ago', 'set', 'ott', 'nov', 'dic' ], - weekdays: [ 'domenica', 'lunedì', 'martedì', 'mercoledì', 'giovedì', 'venerdì', 'sabato' ], - weekdaysShort: [ 'dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab' ], - weekdaysAbbrev: [ 'D', 'L', 'M', 'M', 'G', 'V', 'S' ], - today: 'Oggi', - clear: 'Cancella', - close: 'Chiudi', - firstDay: 1, - format: 'dddd d mmmm yyyy', - formatSubmit: 'yyyy/mm/dd', - labelMonthNext: 'Mese successivo', - labelMonthPrev: 'Mese precedente', - labelMonthSelect: 'Seleziona un mese', - labelYearSelect: 'Seleziona un anno' - }} - var instance = M.Tabs.init(elem, options); - document.addEventListener('DOMContentLoaded', function() { - var elems = document.querySelectorAll('.datepicker'); - var instances = M.Datepicker.init(elems, options); - }); - document.addEventListener('DOMContentLoaded', function() { - var elems = document.querySelectorAll('select'); - var instances = M.FormSelect.init(elems, options); - }); - $(document).ready(function() { - $('input#sickness, input#vaccine, input#allergy, input#drugs, input#misc').characterCounter(); +function send(id) { + var form = document.getElementById('form'); + var action = document.getElementById('action'); + action.setAttribute('value', id); + form.submit(); +} + +function delete_vac() { + var action = document.getElementById('delete_vac'); + var text = document.getElementById('vac_file'); + action.setAttribute('value', 'vac'); + text.setAttribute('value', ''); +} + +function delete_health() { + var action = document.getElementById('delete_health'); + var text = document.getElementById('health_care_file'); + action.setAttribute('value', 'health'); + text.setAttribute('value', ''); +} + +var elem = $('.tabs') +var options = { + yearRange:100, + format:'dd mmmm yyyy', + i18n: { + months: [ 'gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno', 'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre' ], + monthsShort: [ 'gen', 'feb', 'mar', 'apr', 'mag', 'giu', 'lug', 'ago', 'set', 'ott', 'nov', 'dic' ], + weekdays: [ 'domenica', 'lunedì', 'martedì', 'mercoledì', 'giovedì', 'venerdì', 'sabato' ], + weekdaysShort: [ 'dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab' ], + weekdaysAbbrev: [ 'D', 'L', 'M', 'M', 'G', 'V', 'S' ], + today: 'Oggi', + clear: 'Cancella', + close: 'Chiudi', + firstDay: 1, + format: 'dddd d mmmm yyyy', + formatSubmit: 'yyyy/mm/dd', + labelMonthNext: 'Mese successivo', + labelMonthPrev: 'Mese precedente', + labelMonthSelect: 'Seleziona un mese', + labelYearSelect: 'Seleziona un anno' + }} +var instance = M.Tabs.init(elem, options); +document.addEventListener('DOMContentLoaded', function() { +var elems = document.querySelectorAll('.datepicker'); +var instances = M.Datepicker.init(elems, options); +}); +document.addEventListener('DOMContentLoaded', function() { +var elems = document.querySelectorAll('select'); +var instances = M.FormSelect.init(elems, options); +}); +$(document).ready(function() { +$('input#sickness, input#vaccine, input#allergy, input#drugs, input#misc').characterCounter(); +}); + +/*! + * jQuery Plugin: Are-You-Sure (Dirty Form Detection) + * https://github.com/codedance/jquery.AreYouSure/ + * + * Copyright (c) 2012-2014, Chris Dance and PaperCut Software http://www.papercut.com/ + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Author: chris.dance@papercut.com + * Version: 1.9.0 + * Date: 13th August 2014 + */ +(function($) { + + $.fn.areYouSure = function(options) { + + var settings = $.extend( + { + 'message' : 'You have unsaved changes!', + 'dirtyClass' : 'dirty', + 'change' : null, + 'silent' : false, + 'addRemoveFieldsMarksDirty' : false, + 'fieldEvents' : 'change keyup propertychange input', + 'fieldSelector': ":input:not(input[type=submit]):not(input[type=button])" + }, options); + + var getValue = function($field) { + if ($field.hasClass('ays-ignore') + || $field.hasClass('aysIgnore') + || $field.attr('data-ays-ignore') + || $field.attr('name') === undefined) { + return null; + } + + if ($field.is(':disabled')) { + return 'ays-disabled'; + } + + var val; + var type = $field.attr('type'); + if ($field.is('select')) { + type = 'select'; + } + + switch (type) { + case 'checkbox': + case 'radio': + val = $field.is(':checked'); + break; + case 'select': + val = ''; + $field.find('option').each(function(o) { + var $option = $(this); + if ($option.is(':selected')) { + val += $option.val(); + } + }); + break; + default: + val = $field.val(); + } + + return val; + }; + + var storeOrigValue = function($field) { + $field.data('ays-orig', getValue($field)); + }; + + var checkForm = function(evt) { + + var isFieldDirty = function($field) { + var origValue = $field.data('ays-orig'); + if (undefined === origValue) { + return false; + } + return (getValue($field) != origValue); + }; + + var $form = ($(this).is('form')) + ? $(this) + : $(this).parents('form'); + + // Test on the target first as it's the most likely to be dirty + if (isFieldDirty($(evt.target))) { + setDirtyStatus($form, true); + return; + } + + $fields = $form.find(settings.fieldSelector); + + if (settings.addRemoveFieldsMarksDirty) { + // Check if field count has changed + var origCount = $form.data("ays-orig-field-count"); + if (origCount != $fields.length) { + setDirtyStatus($form, true); + return; + } + } + + // Brute force - check each field + var isDirty = false; + $fields.each(function() { + var $field = $(this); + if (isFieldDirty($field)) { + isDirty = true; + return false; // break + } + }); + + setDirtyStatus($form, isDirty); + }; + + var initForm = function($form) { + var fields = $form.find(settings.fieldSelector); + $(fields).each(function() { storeOrigValue($(this)); }); + $(fields).unbind(settings.fieldEvents, checkForm); + $(fields).bind(settings.fieldEvents, checkForm); + $form.data("ays-orig-field-count", $(fields).length); + setDirtyStatus($form, false); + }; + + var setDirtyStatus = function($form, isDirty) { + var changed = isDirty != $form.hasClass(settings.dirtyClass); + $form.toggleClass(settings.dirtyClass, isDirty); + + // Fire change event if required + if (changed) { + if (settings.change) settings.change.call($form, $form); + + if (isDirty) $form.trigger('dirty.areYouSure', [$form]); + if (!isDirty) $form.trigger('clean.areYouSure', [$form]); + $form.trigger('change.areYouSure', [$form]); + } + }; + + var rescan = function() { + var $form = $(this); + var fields = $form.find(settings.fieldSelector); + $(fields).each(function() { + var $field = $(this); + if (!$field.data('ays-orig')) { + storeOrigValue($field); + $field.bind(settings.fieldEvents, checkForm); + } + }); + // Check for changes while we're here + $form.trigger('checkform.areYouSure'); + }; + + var reinitialize = function() { + initForm($(this)); + } + + if (!settings.silent && !window.aysUnloadSet) { + window.aysUnloadSet = true; + $(window).bind('beforeunload', function() { + $dirtyForms = $("form").filter('.' + settings.dirtyClass); + if ($dirtyForms.length == 0) { + return; + } + // Prevent multiple prompts - seen on Chrome and IE + if (navigator.userAgent.toLowerCase().match(/msie|chrome/)) { + if (window.aysHasPrompted) { + return; + } + window.aysHasPrompted = true; + window.setTimeout(function() {window.aysHasPrompted = false;}, 900); + } + return settings.message; + }); + } + + return this.each(function(elem) { + if (!$(this).is('form')) { + return; + } + var $form = $(this); + + $form.submit(function() { + $form.removeClass(settings.dirtyClass); + }); + $form.bind('reset', function() { setDirtyStatus($form, false); }); + // Add a custom events + $form.bind('rescan.areYouSure', rescan); + $form.bind('reinitialize.areYouSure', reinitialize); + $form.bind('checkform.areYouSure', checkForm); + initForm($form); }); + }; +})(jQuery); +$('form').areYouSure(); + {% endblock %}
\ No newline at end of file diff --git a/accounts/views.py b/accounts/views.py index 804a841..9c2efeb 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -3,10 +3,12 @@ from django.contrib.auth.forms import UserCreationForm from django.urls import reverse_lazy from django.views import generic from django.contrib.auth.models import Group +from django.core.files.storage import FileSystemStorage +from django.http import FileResponse from client.models import UserCode -import dateparser +import dateparser, os class SignUp(generic.CreateView): @@ -29,6 +31,18 @@ def personal(request): branca_rover = "" if request.method == "POST": + if request.POST['action'] == "download_vac": + if medic.vac_certificate != None: + filename = os.path.basename(medic.vac_certificate.name) + filename = filename[filename.find("_")+1:] + return FileResponse(medic.vac_certificate.file, as_attachment=True, filename=filename) + + if request.POST['action'] == "download_health": + if medic.health_care_certificate != None: + filename = os.path.basename(medic.health_care_certificate.name) + filename = filename[filename.find("_")+1:] + return FileResponse(medic.health_care_certificate.file, as_attachment=True, filename=filename) + request.user.first_name = request.POST["first_name"] request.user.last_name = request.POST["last_name"] request.user.email = request.POST["email"] @@ -71,6 +85,24 @@ def personal(request): 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'] + medic.vac_certificate.save(request.user.username+"_"+myfile.name, myfile) + medic.save() + + if "health_care_certificate" in request.FILES: + myfile = request.FILES['health_care_certificate'] + medic.health_care_certificate.save(request.user.username+"_"+myfile.name, myfile) + medic.save() + + if request.POST["delete_vac"] == 'vac': + medic.vac_certificate.delete() + medic.save() + + if request.POST["delete_health"] == 'health': + medic.health_care_certificate.delete() + medic.save() if len(request.user.groups.values_list('name', flat=True)) == 0: branca_default = "selected" @@ -100,6 +132,18 @@ def personal(request): if medic.misc_bool: misc = "checked='checked'" + if (medic.vac_certificate != None): + vac_name = os.path.basename(medic.vac_certificate.name) + vac_name = vac_name[vac_name.find("_")+1:] + else: + vac_name = '' + + if (medic.health_care_certificate != None): + card_name = os.path.basename(medic.health_care_certificate.name) + card_name = card_name[card_name.find("_")+1:] + else: + card_name = '' + context = { 'first_name': request.user.first_name, 'last_name': request.user.last_name, @@ -140,6 +184,8 @@ def personal(request): 'drugs': medic.drugs, 'misc_check': misc, 'misc': medic.misc, + 'health_care_certificate': card_name, + 'vac_certificate': vac_name, } return render(request, 'accounts/index.html', context) diff --git a/client/migrations/0023_auto_20200622_1708.py b/client/migrations/0023_auto_20200622_1708.py new file mode 100644 index 0000000..458ec6d --- /dev/null +++ b/client/migrations/0023_auto_20200622_1708.py @@ -0,0 +1,24 @@ +# Generated by Django 3.0.7 on 2020-06-22 15:08 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('client', '0022_auto_20200620_2316'), + ] + + operations = [ + migrations.AddField( + model_name='medicaldata', + name='health_care_certificate', + field=models.FileField(default=None, upload_to='documents/'), + ), + migrations.AddField( + model_name='medicaldata', + name='vac_certificate', + field=models.FileField(default=None, upload_to='documents/'), + preserve_default=False, + ), + ] diff --git a/client/migrations/0024_auto_20200622_1930.py b/client/migrations/0024_auto_20200622_1930.py new file mode 100644 index 0000000..f721298 --- /dev/null +++ b/client/migrations/0024_auto_20200622_1930.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0.7 on 2020-06-22 17:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('client', '0023_auto_20200622_1708'), + ] + + operations = [ + migrations.AlterField( + model_name='medicaldata', + name='health_care_certificate', + field=models.FileField(default=None, null=True, upload_to='documents/'), + ), + migrations.AlterField( + model_name='medicaldata', + name='vac_certificate', + field=models.FileField(null=True, upload_to='documents/'), + ), + ] diff --git a/client/models.py b/client/models.py index 78b8df4..105165b 100644 --- a/client/models.py +++ b/client/models.py @@ -51,6 +51,8 @@ class MedicalData(models.Model): drugs = models.CharField(default="", max_length=250) misc_bool = models.BooleanField(default=False) misc = models.CharField(default="", max_length=250) + vac_certificate = models.FileField(upload_to='documents/', null=True) + health_care_certificate = models.FileField(default=None, upload_to='documents/', null=True) class Document(models.Model): diff --git a/client/templates/client/approve.html b/client/templates/client/approve.html index e00aedc..f440fbe 100644 --- a/client/templates/client/approve.html +++ b/client/templates/client/approve.html @@ -1,4 +1,4 @@ -{% extends 'registration/base.html' %} +{% extends 'registration/base_client.html' %} {% block title %}Approva{% endblock %} diff --git a/client/templates/client/doc_create.html b/client/templates/client/doc_create.html index a095c04..710ba29 100644 --- a/client/templates/client/doc_create.html +++ b/client/templates/client/doc_create.html @@ -1,4 +1,4 @@ -{% extends 'registration/base.html' %} +{% extends 'registration/base_client.html' %} {% block title %}Crea Documento{% endblock %} @@ -46,7 +46,7 @@ {% if personal_data %} <div class="row"> <div class="col s12"> - <div class="card red lighten-1"> + <div class="card teal"> <div class="card-content"> <p style="color:white"><b> Il documento conterrà le informazioni personali, prego verificare che siano corrette e aggiornate @@ -59,7 +59,7 @@ {% if medical_data %} <div class="row"> <div class="col s12"> - <div class="card red lighten-1"> + <div class="card teal"> <div class="card-content"> <p style="color:white"><b> Il documento conterrà le informazioni mediche, prego verificare che siano corrette e aggiornate @@ -72,7 +72,7 @@ {% if custom_message %} <div class="row"> <div class="col s12"> - <div class="card red lighten-1"> + <div class="card teal"> <div class="card-content"> <p style="color:white"><b> {{custom_message_text}} diff --git a/client/templates/client/doc_edit.html b/client/templates/client/doc_edit.html index 8cd5a98..0048fd5 100644 --- a/client/templates/client/doc_edit.html +++ b/client/templates/client/doc_edit.html @@ -1,4 +1,4 @@ -{% extends 'registration/base.html' %} +{% extends 'registration/base_client.html' %} {% block title %}Modifica documento{% endblock %} @@ -26,21 +26,39 @@ {% 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à le informazioni personali, prego verificare che siano corrette e aggiornate</a> + <div class="card teal"> + <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> {% 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à le informazioni mediche, prego verificare che siano corrette e aggiornate</a> + <div class="card teal"> + <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> {% 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 class="card teal"> + <div class="card-content"> + <p style="color:white"><b> + {{custom_message_text}} + </b></p> + </div> + </div> </div> </div> {% endif %} diff --git a/client/templates/client/index.html b/client/templates/client/index.html index 733f62f..ff12e74 100644 --- a/client/templates/client/index.html +++ b/client/templates/client/index.html @@ -1,4 +1,4 @@ -{% extends 'registration/base.html' %} +{% extends 'registration/base_client.html' %} {% block title %}Home{% endblock %} @@ -7,10 +7,10 @@ {% endblock%} {% block content %} -<div class="tap-target" data-target="add"> +<div class="tap-target teal" data-target="add"> <div class="tap-target-content"> - <h5>Aggiungi un documento</h5> - <p>Usa questo bottone per creare un nuovo documento</p> + <h5 style="color:white">Aggiungi un documento</h5> + <p style="color:white">Usa questo bottone per creare un nuovo documento</p> </div> </div> @@ -38,15 +38,15 @@ </div> <div class="collapsible-body"><span> {% if doc.0.status == "wait" %} - <a class="waves-effect waves-light btn red lighten-1" 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 red lighten-1" onclick="send('d{{doc.0.id}}')"><i class="material-icons left">delete</i> Elimina documento</a> - <a class="waves-effect waves-light btn red lighten-1" onclick="send('e{{doc.0.id}}')"><i class="material-icons left">edit</i> Modifica documento</a> + <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> <br> <br> {% elif doc.0.status == "autosign" %} - <a class="waves-effect waves-light btn red lighten-1" onclick="send('a{{doc.0.id}}')"><i class="material-icons left">check</i>Approva documento</a> - <a class="waves-effect waves-light btn red lighten-1" onclick="send('d{{doc.0.id}}')"><i class="material-icons left">delete</i> Elimina documento</a> - <a class="waves-effect waves-light btn red lighten-1" onclick="send('e{{doc.0.id}}')"><i class="material-icons left">edit</i> Modifica documento</a> + <a class="waves-effect waves-light btn teal" onclick="send('a{{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> <br> <br> {% endif %} @@ -57,15 +57,64 @@ <i class="material-icons">person</i>Dati personali </div> <div class="collapsible-body"><span> - <table class="striped"> - <tbody> - {% for field in doc.2 %} - <tr> - <td>{{field}}</td> - </tr> - {% endfor %} - </tbody> - </table> + <div class="row"> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.0.user.first_name}}" id="first_name" type="text" > + <label for="first_name">Nome</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.0.user.last_name}}" id="last_name" type="text" > + <label for="last_name">Cognome</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.2.born_date}}" id="birth_date" type="text"> + <label for="birth_date">Data di nascita</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.4}}" id="branca" type="text"> + <label for="branca">Branca</label> + </div> + <div class="input-field col l8 s12"> + <input disabled value="{{doc.2.parent_name}}" id="parent_name" type="text" > + <label for="parent_name">Nome dei genitori</label> + </div> + <div class="input-field col l12 s12"> + <input value="{{doc.2.via}}" disabled id="via" type="text" > + <label for="via">Via e numero</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.2.cap}}" name="cap" id="cap" type="text" > + <label for="cap">CAP</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.2.country}}" name="country" id="country" type="text" > + <label for="country">Paese</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.2.nationality}}" name="nationality" id="nationality" type="text" > + <label for="nationality">Nazionalità</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.2.phone}}" name="phone" id="phone" type="text" > + <label for="phone">Cellulare</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.2.home_phone}}" name="home_phone" id="home_phone" type="text" > + <label for="home_phone">Telefono di casa</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.2.email}}" name="email" id="email" type="text" > + <label for="email">Email</label> + </div> + <div class="input-field col l8 s12"> + <input disabled value="{{doc.2.school}}" name="school" id="school" type="text" > + <label for="school">Scuola frequentata</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.2.year}}" name="year" id="year" type="text" > + <label for="year">Classe</label> + </div> + </div> </span></div> </li> {% endif %} @@ -75,15 +124,126 @@ <i class="material-icons">healing</i>Dati medici </div> <div class="collapsible-body"><span> - <table class="striped"> - <tbody> - {% for field in doc.3 %} - <tr> - <td>{{field}}</td> - </tr> - {% endfor %} - </tbody> - </table> + <div class="row"> + <div class="col s12"> + <h6>Persona di contatto in caso di necessità</h6> + </div> + </div> + <div class="row"> + <div class="input-field col l6 s12"> + <input disabled name="emer_name" value="{{doc.3.emer_name}}" id="emer_name" type="text" > + <label for="emer_name">Nome e cognome</label> + </div> + <div class="input-field col l3 s12"> + <input disabled name="emer_relative" value="{{doc.3.emer_relative}}" id="emer_relative" type="text" > + <label for="emer_releative">Parentela</label> + </div> + <div class="input-field col l3 s12"> + <input disabled name="cell_phone" value="{{doc.3.cell_phone}}" id="cellphone" type="text" > + <label for="cell_phone">Cellulare</label> + </div> + <div class="input-field col l9 s12"> + <input disabled value="{{doc.3.address}}" name="address" id="address" type="text" > + <label for="address">Indirizzo completo</label> + </div> + <div class="input-field col l3 s12"> + <input disabled value="{{doc.3.emer_phone}}" name="emer_phone" id="emer_phone" type="text" > + <label for="emer_phone">Telefono di casa</label> + </div> + </div> + <div class="row"> + <div class="col s12"> + <h6>Assicurazione</h6> + </div> + </div> + <div class="row"> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.3.health_care}}" name="health_care" id="health_care" type="text" > + <label for="health_care">Cassa Malati</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.3.injuries}}" name="injuries" id="injuries" type="text" > + <label for="injuries">Infortuni</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.3.rc}}" name="rc" id="rc" type="text" > + <label for="rc">Responsabilità civile</label> + </div> + </div> + <div class="row"> + <div class="switch col s12"> + È sostenitore REGA + <label> + No + <input disabled name="rega" type="checkbox" {% if doc.3.rega %}checked="checked"{%endif%}> + <span class="lever"></span> + Si + </label> + </div> + </div> + <div class="row"> + <div class="col s12"> + <h6>Medico di famiglia</h6> + </div> + <div class="input-field col l6 s12"> + <input disabled value="{{doc.3.medic_name}}" name="medic_name" id="medic_name" type="text" > + <label for="medic_name">Nome e cognome</label> + </div> + <div class="input-field col l6 s12"> + <input disabled value="{{doc.3.medic_phone}}" name="medic_phone" id="medic_phone" type="text" > + <label for="medic_phone">Telefono studio</label> + </div> + <div class="input-field col l12 s12"> + <input disabled value="{{doc.3.medic_address}}" name="medic_address" id="medic_address" type="text" > + <label for="medic_address">Indirizzo completo</label> + </div> + </div> + <div class="row"> + <div class="col s12"> + <h6>Scheda medica personale</h6> + </div> + <div class="input-field col s12"> + <input disabled value="{{doc.3.sickness}}" name="sickness" id="sickness" type="text"> + <label for="sickness">Principali malattie avute</label> + </div> + <div class="input-field col l8 s12"> + <input disabled value="{{doc.3.vaccine}}" name="vaccine" id="vaccine" type="text"> + <label for="vaccine">Vacinazioni fatte</label> + </div> + <div class="input-field col l4 s12"> + <label for="tetanus_date">Ultima vacinazione contro il tetano</label> + <input disabled value="{{doc.3.tetanus_date}}" name="tetanus_date" id="tetanus_date" type="text"> + </div> + <div class="input-field col s12"> + <input disabled value="{{doc.3.allergy}}" name="allergy" id="allergy" type="text"> + <label for="allergy">Allergie particolari/Intolleraze alimentari</label> + </div> + <div class="switch col s12"> + Deve assumere regolarmente medicamenti + <label> + No + <input disabled name="drugs_bool" type="checkbox" {% if doc.3.drugs_bool %}checked="checked"{%endif%}> + <span class="lever"></span> + Si + </label> + </div> + <div class="input-field col s12"> + <input disabled value="{{doc.3.drugs}}" name="drugs" id="drugs" type="text"> + <label for="drugs">Se sì quali, in che dosi e prescrizioni</label> + </div> + <div class="switch col s12"> + Informazioni particolari sullo stato di salute: (postumi di operazioni, incidenti, malattie, disturbi fisici) + <label> + No + <input disabled name="misc_bool" type="checkbox" {% if doc.3.misc_bool %}checked="checked"{%endif%}> + <span class="lever"></span> + Si + </label> + </div> + <div class="input-field col s12"> + <input disabled value="{{doc.3.misc}}" name="misc" id="misc" type="text"> + <label for="misc">Se sì quali</label> + </div> </span></div> </li> {% endif %} @@ -113,7 +273,7 @@ </ul> {% endif %} <div class="fixed-action-btn"> - <a id="add" class="btn-floating btn-large red lighten-1" href="{% url 'create'%}"> + <a id="add" class="btn-floating btn-large teal" href="{% url 'create'%}"> <i class="large material-icons">add</i> </a> </div> diff --git a/client/views.py b/client/views.py index b16e64a..b43a3c9 100644 --- a/client/views.py +++ b/client/views.py @@ -6,9 +6,9 @@ from django.http import HttpResponseRedirect, FileResponse from django.shortcuts import render -from xhtml2pdf import pisa from django.template.loader import get_template from io import BytesIO +import pdfkit # Create your views here. @@ -30,15 +30,19 @@ def index(request): if request.method == "POST": document = Document.objects.get(id=request.POST["action"][1:]) + + if document.user != request.user: + return + if request.POST["action"][0] == 'f': template = get_template('client/approve_doc_pdf.html') context = {'doc': document} html = template.render(context) - result = BytesIO() - pdf = pisa.pisaDocument(BytesIO(html.encode("ISO-8859-1")), result) - + pdf = pdfkit.from_string(html, False) + result = BytesIO(pdf) result.seek(0) return FileResponse(result, as_attachment=True, filename=document.document_type.name+".pdf") + elif request.POST["action"][0] == 'a': document.status = "ok" document.save() @@ -68,11 +72,13 @@ def index(request): personal = None medical = None if i.document_type.personal_data: - personal = i.personal_data.__dict__.values() + personal = i.personal_data if i.document_type.medical_data: - medical = i.medical_data.__dict__.values() + medical = i.medical_data + + doc_group = i.user.groups.values_list('name', flat=True)[0] - out.append([i, KeyVal.objects.filter(container=i), personal, medical]) + out.append([i, KeyVal.objects.filter(container=i), personal, medical, doc_group]) context = { "docs": out, "empty": len(out) == 0, diff --git a/documents_qtCfYLF b/documents_qtCfYLF new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/documents_qtCfYLF diff --git a/manager/settings.py b/manager/settings.py index 169c56e..087d7da 100644 --- a/manager/settings.py +++ b/manager/settings.py @@ -34,6 +34,7 @@ INSTALLED_APPS = [ 'server.apps.ServerConfig', 'accounts.apps.AccountsConfig', 'client.apps.ClientConfig', + 'django_cleanup', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', diff --git a/server/templates/server/doc_list.html b/server/templates/server/doc_list.html index 8a6be37..961b9ab 100644 --- a/server/templates/server/doc_list.html +++ b/server/templates/server/doc_list.html @@ -128,12 +128,19 @@ <span class="badge" data-badge-caption="">{{doc.0.user.first_name}} {{doc.0.user.last_name}}</span> </div> <div class="collapsible-body"><span> + {% if doc.0.status == "ok" or doc.0.status == 'archive' %} + <a class="waves-effect waves-light btn red lighten-1" onclick="send('f{{doc.0.id}}')"><i class="material-icons left">file_download</i> Scarica documento</a> + <br> + <br> + {% endif %} <ul class="collapsible"> + {% if doc.0.status == 'ok' or doc.0.status == 'archive' %} <li> <div class="collapsible-header"> - <i class="material-icons">confirmation_number</i>DEBUG {{doc.0.code}} + <i class="material-icons">confirmation_number</i>{{doc.0.code}} </div> </li> + {% endif %} <li> <div class="collapsible-header"> <i class="material-icons">send</i>{{doc.0.compilation_date}} @@ -145,15 +152,64 @@ <i class="material-icons">person</i>Dati personali </div> <div class="collapsible-body"><span> - <table class="striped"> - <tbody> - {% for field in doc.2 %} - <tr> - <td>{{field}}</td> - </tr> - {% endfor %} - </tbody> - </table> + <div class="row"> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.0.user.first_name}}" id="first_name" type="text" > + <label for="first_name">Nome</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.0.user.last_name}}" id="last_name" type="text" > + <label for="last_name">Cognome</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.2.born_date}}" id="birth_date" type="text"> + <label for="birth_date">Data di nascita</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.4}}" id="branca" type="text"> + <label for="branca">Branca</label> + </div> + <div class="input-field col l8 s12"> + <input disabled value="{{doc.2.parent_name}}" id="parent_name" type="text" > + <label for="parent_name">Nome dei genitori</label> + </div> + <div class="input-field col l12 s12"> + <input value="{{doc.2.via}}" disabled id="via" type="text" > + <label for="via">Via e numero</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.2.cap}}" name="cap" id="cap" type="text" > + <label for="cap">CAP</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.2.country}}" name="country" id="country" type="text" > + <label for="country">Paese</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.2.nationality}}" name="nationality" id="nationality" type="text" > + <label for="nationality">Nazionalità</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.2.phone}}" name="phone" id="phone" type="text" > + <label for="phone">Cellulare</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.2.home_phone}}" name="home_phone" id="home_phone" type="text" > + <label for="home_phone">Telefono di casa</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.2.email}}" name="email" id="email" type="text" > + <label for="email">Email</label> + </div> + <div class="input-field col l8 s12"> + <input disabled value="{{doc.2.school}}" name="school" id="school" type="text" > + <label for="school">Scuola frequentata</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.2.year}}" name="year" id="year" type="text" > + <label for="year">Classe</label> + </div> + </div> </span></div> </li> {% endif %} @@ -163,15 +219,126 @@ <i class="material-icons">healing</i>Dati medici </div> <div class="collapsible-body"><span> - <table class="striped"> - <tbody> - {% for field in doc.3 %} - <tr> - <td>{{field}}</td> - </tr> - {% endfor %} - </tbody> - </table> + <div class="row"> + <div class="col s12"> + <h6>Persona di contatto in caso di necessità</h6> + </div> + </div> + <div class="row"> + <div class="input-field col l6 s12"> + <input disabled name="emer_name" value="{{doc.3.emer_name}}" id="emer_name" type="text" > + <label for="emer_name">Nome e cognome</label> + </div> + <div class="input-field col l3 s12"> + <input disabled name="emer_relative" value="{{doc.3.emer_relative}}" id="emer_relative" type="text" > + <label for="emer_releative">Parentela</label> + </div> + <div class="input-field col l3 s12"> + <input disabled name="cell_phone" value="{{doc.3.cell_phone}}" id="cellphone" type="text" > + <label for="cell_phone">Cellulare</label> + </div> + <div class="input-field col l9 s12"> + <input disabled value="{{doc.3.address}}" name="address" id="address" type="text" > + <label for="address">Indirizzo completo</label> + </div> + <div class="input-field col l3 s12"> + <input disabled value="{{doc.3.emer_phone}}" name="emer_phone" id="emer_phone" type="text" > + <label for="emer_phone">Telefono di casa</label> + </div> + </div> + <div class="row"> + <div class="col s12"> + <h6>Assicurazione</h6> + </div> + </div> + <div class="row"> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.3.health_care}}" name="health_care" id="health_care" type="text" > + <label for="health_care">Cassa Malati</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.3.injuries}}" name="injuries" id="injuries" type="text" > + <label for="injuries">Infortuni</label> + </div> + <div class="input-field col l4 s12"> + <input disabled value="{{doc.3.rc}}" name="rc" id="rc" type="text" > + <label for="rc">Responsabilità civile</label> + </div> + </div> + <div class="row"> + <div class="switch col s12"> + È sostenitore REGA + <label> + No + <input disabled name="rega" type="checkbox" {% if doc.3.rega %}checked="checked"{%endif%}> + <span class="lever"></span> + Si + </label> + </div> + </div> + <div class="row"> + <div class="col s12"> + <h6>Medico di famiglia</h6> + </div> + <div class="input-field col l6 s12"> + <input disabled value="{{doc.3.medic_name}}" name="medic_name" id="medic_name" type="text" > + <label for="medic_name">Nome e cognome</label> + </div> + <div class="input-field col l6 s12"> + <input disabled value="{{doc.3.medic_phone}}" name="medic_phone" id="medic_phone" type="text" > + <label for="medic_phone">Telefono studio</label> + </div> + <div class="input-field col l12 s12"> + <input disabled value="{{doc.3.medic_address}}" name="medic_address" id="medic_address" type="text" > + <label for="medic_address">Indirizzo completo</label> + </div> + </div> + <div class="row"> + <div class="col s12"> + <h6>Scheda medica personale</h6> + </div> + <div class="input-field col s12"> + <input disabled value="{{doc.3.sickness}}" name="sickness" id="sickness" type="text"> + <label for="sickness">Principali malattie avute</label> + </div> + <div class="input-field col l8 s12"> + <input disabled value="{{doc.3.vaccine}}" name="vaccine" id="vaccine" type="text"> + <label for="vaccine">Vacinazioni fatte</label> + </div> + <div class="input-field col l4 s12"> + <label for="tetanus_date">Ultima vacinazione contro il tetano</label> + <input disabled value="{{doc.3.tetanus_date}}" name="tetanus_date" id="tetanus_date" type="text"> + </div> + <div class="input-field col s12"> + <input disabled value="{{doc.3.allergy}}" name="allergy" id="allergy" type="text"> + <label for="allergy">Allergie particolari/Intolleraze alimentari</label> + </div> + <div class="switch col s12"> + Deve assumere regolarmente medicamenti + <label> + No + <input disabled name="drugs_bool" type="checkbox" {% if doc.3.drugs_bool %}checked="checked"{%endif%}> + <span class="lever"></span> + Si + </label> + </div> + <div class="input-field col s12"> + <input disabled value="{{doc.3.drugs}}" name="drugs" id="drugs" type="text"> + <label for="drugs">Se sì quali, in che dosi e prescrizioni</label> + </div> + <div class="switch col s12"> + Informazioni particolari sullo stato di salute: (postumi di operazioni, incidenti, malattie, disturbi fisici) + <label> + No + <input disabled name="misc_bool" type="checkbox" {% if doc.3.misc_bool %}checked="checked"{%endif%}> + <span class="lever"></span> + Si + </label> + </div> + <div class="input-field col s12"> + <input disabled value="{{doc.3.misc}}" name="misc" id="misc" type="text"> + <label for="misc">Se sì quali</label> + </div> </span></div> </li> {% endif %} diff --git a/server/templates/server/download_doc.html b/server/templates/server/download_doc.html new file mode 100644 index 0000000..0f36372 --- /dev/null +++ b/server/templates/server/download_doc.html @@ -0,0 +1,265 @@ +{% extends 'registration/base_custom.html' %} + +{% block title %}Admin - Documenti{% endblock %} + +{% block content %} +<ul class="collapsible"> + <li class="active"> + <div class="collapsible-header"> + {% if doc.0.status == "wait" %} + <i class="material-icons">timelapse</i> + {% elif doc.0.status == "ok" %} + <i class="material-icons">check</i> + {% elif doc.0.status == "archive" %} + <i class="material-icons">archive</i> + {% elif doc.0.status == "autosign" %} + <i class="material-icons">assignment_turned_in</i> + {% endif %} + {{doc.0.document_type.name}} + <span class="badge" data-badge-caption="">{{doc.0.compilation_date}}</span> + </div> + <div class="collapsible-body"><span> + <ul class="collapsible"> + {% if doc.0.status == 'ok' or doc.0.status == 'archive' %} + <li> + <div class="collapsible-header"> + <i class="material-icons">confirmation_number</i>{{doc.0.code}} + </div> + </li> + {% endif %} + <li> + <div class="collapsible-header"> + <i class="material-icons">send</i>{{doc.0.compilation_date}} + </div> + </li> + {% if doc.0.document_type.personal_data %} + <li class="active"> + <div class="collapsible-header"> + <i class="material-icons">person</i>Dati personali + </div> + <div class="collapsible-body"><span> + <div class="row"> + <div class="input-field col l4 s12"> + <input value="{{doc.0.user.first_name}}" id="first_name" type="text" > + <label for="first_name">Nome</label> + </div> + <div class="input-field col l4 s12"> + <input value="{{doc.0.user.last_name}}" id="last_name" type="text" > + <label for="last_name">Cognome</label> + </div> + <div class="input-field col l4 s12"> + <input value="{{doc.2.born_date}}" id="birth_date" type="text"> + <label for="birth_date">Data di nascita</label> + </div> + <div class="input-field col l4 s12"> + <input value="{{doc.4}}" id="branca" type="text"> + <label for="branca">Branca</label> + </div> + <div class="input-field col l8 s12"> + <input value="{{doc.2.parent_name}}" id="parent_name" type="text" > + <label for="parent_name">Nome dei genitori</label> + </div> + <div class="input-field col l12 s12"> + <input value="{{doc.2.via}}" id="via" type="text" > + <label for="via">Via e numero</label> + </div> + <div class="input-field col l4 s12"> + <input value="{{doc.2.cap}}" name="cap" id="cap" type="text" > + <label for="cap">CAP</label> + </div> + <div class="input-field col l4 s12"> + <input value="{{doc.2.country}}" name="country" id="country" type="text" > + <label for="country">Paese</label> + </div> + <div class="input-field col l4 s12"> + <input value="{{doc.2.nationality}}" name="nationality" id="nationality" type="text" > + <label for="nationality">Nazionalità</label> + </div> + <div class="input-field col l4 s12"> + <input value="{{doc.2.phone}}" name="phone" id="phone" type="text" > + <label for="phone">Cellulare</label> + </div> + <div class="input-field col l4 s12"> + <input value="{{doc.2.home_phone}}" name="home_phone" id="home_phone" type="text" > + <label for="home_phone">Telefono di casa</label> + </div> + <div class="input-field col l4 s12"> + <input value="{{doc.2.email}}" name="email" id="email" type="text" > + <label for="email">Email</label> + </div> + <div class="input-field col l8 s12"> + <input value="{{doc.2.school}}" name="school" id="school" type="text" > + <label for="school">Scuola frequentata</label> + </div> + <div class="input-field col l4 s12"> + <input value="{{doc.2.year}}" name="year" id="year" type="text" > + <label for="year">Classe</label> + </div> + </div> + </span></div> + </li> + {% endif %} + {% if doc.0.document_type.medical_data %} + <li class="active"> + <div class="collapsible-header"> + <i class="material-icons">healing</i>Dati medici + </div> + <div class="collapsible-body"><span> + <div class="row"> + <div class="col s12"> + <h6>Persona di contatto in caso di necessità</h6> + </div> + </div> + <div class="row"> + <div class="input-field col l6 s12"> + <input name="emer_name" value="{{doc.3.emer_name}}" id="emer_name" type="text" > + <label for="emer_name">Nome e cognome</label> + </div> + <div class="input-field col l3 s12"> + <input name="emer_relative" value="{{doc.3.emer_relative}}" id="emer_relative" type="text" > + <label for="emer_releative">Parentela</label> + </div> + <div class="input-field col l3 s12"> + <input name="cell_phone" value="{{doc.3.cell_phone}}" id="cellphone" type="text" > + <label for="cell_phone">Cellulare</label> + </div> + <div class="input-field col l9 s12"> + <input value="{{doc.3.address}}" name="address" id="address" type="text" > + <label for="address">Indirizzo completo</label> + </div> + <div class="input-field col l3 s12"> + <input value="{{doc.3.emer_phone}}" name="emer_phone" id="emer_phone" type="text" > + <label for="emer_phone">Telefono di casa</label> + </div> + </div> + <div class="row"> + <div class="col s12"> + <h6>Assicurazione</h6> + </div> + </div> + <div class="row"> + <div class="input-field col l4 s12"> + <input value="{{doc.3.health_care}}" name="health_care" id="health_care" type="text" > + <label for="health_care">Cassa Malati</label> + </div> + <div class="input-field col l4 s12"> + <input value="{{doc.3.injuries}}" name="injuries" id="injuries" type="text" > + <label for="injuries">Infortuni</label> + </div> + <div class="input-field col l4 s12"> + <input value="{{doc.3.rc}}" name="rc" id="rc" type="text" > + <label for="rc">Responsabilità civile</label> + </div> + </div> + <div class="row"> + <div class="switch col s12"> + È sostenitore REGA + <label> + No + <input name="rega" type="checkbox" {% if doc.3.rega %}checked="checked"{%endif%}> + <span class="lever"></span> + Si + </label> + </div> + </div> + <div class="row"> + <div class="col s12"> + <h6>Medico di famiglia</h6> + </div> + <div class="input-field col l6 s12"> + <input value="{{doc.3.medic_name}}" name="medic_name" id="medic_name" type="text" > + <label for="medic_name">Nome e cognome</label> + </div> + <div class="input-field col l6 s12"> + <input value="{{doc.3.medic_phone}}" name="medic_phone" id="medic_phone" type="text" > + <label for="medic_phone">Telefono studio</label> + </div> + <div class="input-field col l12 s12"> + <input value="{{doc.3.medic_address}}" name="medic_address" id="medic_address" type="text" > + <label for="medic_address">Indirizzo completo</label> + </div> + </div> + <div class="row"> + <div class="col s12"> + <h6>Scheda medica personale</h6> + </div> + <div class="input-field col s12"> + <input value="{{doc.3.sickness}}" name="sickness" id="sickness" type="text"> + <label for="sickness">Principali malattie avute</label> + </div> + <div class="input-field col l8 s12"> + <input value="{{doc.3.vaccine}}" name="vaccine" id="vaccine" type="text"> + <label for="vaccine">Vacinazioni fatte</label> + </div> + <div class="input-field col l4 s12"> + <label for="tetanus_date">Ultima vacinazione contro il tetano</label> + <input value="{{doc.3.tetanus_date}}" name="tetanus_date" id="tetanus_date" type="text"> + </div> + <div class="input-field col s12"> + <input value="{{doc.3.allergy}}" name="allergy" id="allergy" type="text"> + <label for="allergy">Allergie particolari/Intolleraze alimentari</label> + </div> + <div class="switch col s12"> + Deve assumere regolarmente medicamenti + <label> + No + <input name="drugs_bool" type="checkbox" {% if doc.3.drugs_bool %}checked="checked"{%endif%}> + <span class="lever"></span> + Si + </label> + </div> + <div class="input-field col s12"> + <input value="{{doc.3.drugs}}" name="drugs" id="drugs" type="text"> + <label for="drugs">Se sì quali, in che dosi e prescrizioni</label> + </div> + <div class="switch col s12"> + Informazioni particolari sullo stato di salute: (postumi di operazioni, incidenti, malattie, disturbi fisici) + <label> + No + <input name="misc_bool" type="checkbox" {% if doc.3.misc_bool %}checked="checked"{%endif%}> + <span class="lever"></span> + Si + </label> + </div> + <div class="input-field col s12"> + <input value="{{doc.3.misc}}" name="misc" id="misc" type="text"> + <label for="misc">Se sì quali</label> + </div> + </span></div> + </li> + {% endif %} + {% if doc.0.document_type.custom_data %} + <li class="active"> + <div class="collapsible-header"> + <i class="material-icons">add_circle_outline</i>Dati aggiuntivi + </div> + <div class="collapsible-body"><span> + <table class="striped"> + <tbody> + {% for key in doc.1 %} + <tr> + <td>{{key.key}}</td> + <td>{{key.value}}</td> + </tr> + {% endfor %} + </tbody> + </table> + </span></div> + </li> + {% endif %} + </ul> + </span></div> + </li> +</ul> +</form> +{% endblock %} + +{%block script%} +document.addEventListener('DOMContentLoaded', function() { + var elems = document.querySelectorAll('.collapsible'); + var options = { + accordion: false + } + var instances = M.Collapsible.init(elems, options); + }); +{% endblock %}
\ No newline at end of file diff --git a/server/views.py b/server/views.py index 296dae4..fb6af0f 100644 --- a/server/views.py +++ b/server/views.py @@ -2,13 +2,16 @@ from django.shortcuts import render from client.models import UserCode, Keys, DocumentType, Document, KeyVal from django.contrib.auth.models import Group, Permission, User from django.db.models import Q -from django.http import HttpResponseRedirect +from django.http import HttpResponseRedirect, FileResponse from django.db.models.deletion import ProtectedError +from django.template.loader import get_template import dateparser from datetime import datetime from datetime import timedelta import pytz +import pdfkit +from io import BytesIO # Create your views here. @@ -364,6 +367,9 @@ def doccreate(request): def doclist(request): context = {} if request.user.is_staff: + parent_group = request.user.groups.values_list('name', flat=True)[ + 0] + group = Group.objects.get(name=parent_group) zurich = pytz.timezone('Europe/Zurich') error = False error_text = "" @@ -385,6 +391,19 @@ def doclist(request): chips_types = [] if request.method == "POST": + if request.POST["action"][0] == 'f': + document = Document.objects.get(id=request.POST["action"][1:]) + if document.group == group: + template = get_template('server/download_doc.html') + doc = [document, KeyVal.objects.filter(container=document), document.personal_data, document.medical_data, parent_group] + context = {'doc': doc} + html = template.render(context) + pdf = pdfkit.from_string(html, False) + result = BytesIO(pdf) + result.seek(0) + + return FileResponse(result, as_attachment=True, filename=document.user.username+"_"+document.document_type.name+".pdf") + selected = [] for i in request.POST.keys(): if i.isdigit(): @@ -430,9 +449,6 @@ def doclist(request): owner = [] types = [] - parent_group = request.user.groups.values_list('name', flat=True)[ - 0] - group = Group.objects.get(name=parent_group) documents = Document.objects.filter(group=group) if not hidden: @@ -474,11 +490,13 @@ def doclist(request): personal = None medical = None if i.document_type.personal_data: - personal = i.personal_data.__dict__.values() + personal = i.personal_data if i.document_type.medical_data: - medical = i.medical_data.__dict__.values() + medical = i.medical_data - out.append([i, KeyVal.objects.filter(container=i), personal, medical]) + doc_group = i.user.groups.values_list('name', flat=True)[0] + + out.append([i, KeyVal.objects.filter(container=i), personal, medical, doc_group]) auto_types = DocumentType.objects.filter(Q(group_private=False) | Q(group=group)) users = User.objects.filter(groups__name=parent_group) @@ -499,4 +517,4 @@ def doclist(request): } return render(request, 'server/doc_list.html', context) else: - return render(request, 'client/index.html', context) + return render(request, 'client/index.html', context)
\ No newline at end of file diff --git a/templates/registration/base_client.html b/templates/registration/base_client.html new file mode 100644 index 0000000..6a0da38 --- /dev/null +++ b/templates/registration/base_client.html @@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html> +<head> + <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"> + <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"/> + <meta charset="utf-8"> + <title>{% block title %}Scout Brega{% endblock %}</title> +</head> +<body> + <nav> + <div class="nav-wrapper teal"> + {% block nav %} + {% endblock %} + <ul class="right"> + {% if user.is_staff %} + <li><a href="{% url 'server' %}">Pannello Admin</a></li> + {% endif %} + {% if user.is_authenticated %} + <li><a class="tooltipped" data-position="bottom" data-tooltip="Preferenze" href="{% url 'personal' %}">{{ user.username }}</a></li> + {% endif %} + {% if user.username != "" %} + <li> + <a class="tooltipped" data-position="bottom" data-tooltip="Logout" href="{% url 'logout' %}"><i class="material-icons">exit_to_app</i></a> + </li> + {% else %} + <li><a href="{% url 'signup' %}">Registrazione</a></li> + <li><a href="{% url 'login' %}">Login</a></li> + {% endif %} + </ul> + </div> + </nav> + <main style="margin-left: 10px;margin-right: 10px;margin-top: 10px;"> + {% block content %} + {% endblock %} + </main> + <script + src="https://code.jquery.com/jquery-3.5.1.min.js" + integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" + crossorigin="anonymous"></script> + <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script> + <script> + document.addEventListener('DOMContentLoaded', function() { + var elems = document.querySelectorAll('.tooltipped'); + var instances = M.Tooltip.init(elems, {}); + }); + {% block script %} + {% endblock%} + </script> +</body> +</html>
\ No newline at end of file |