From 4bbe761215dbe989e8b2efc3823740416f403e71 Mon Sep 17 00:00:00 2001
From: Andrea Lepori <alepori@student.ethz.ch>
Date: Thu, 25 Jun 2020 18:18:20 +0200
Subject: reset password and decorators for login check

---
 server/views.py | 953 ++++++++++++++++++++++++++++----------------------------
 1 file changed, 470 insertions(+), 483 deletions(-)

(limited to 'server')

diff --git a/server/views.py b/server/views.py
index 0954a1f..b04cce1 100644
--- a/server/views.py
+++ b/server/views.py
@@ -6,6 +6,7 @@ from django.http import HttpResponseRedirect, FileResponse
 from django.db.models.deletion import ProtectedError
 from django.template.loader import get_template
 from django.conf import settings
+from django.contrib.admin.views.decorators import staff_member_required
 
 import dateparser
 from datetime import datetime
@@ -17,520 +18,506 @@ from io import BytesIO
 # Create your views here.
 
 
+@staff_member_required
 def index(request):
     context = {}
-    if (request.user.is_staff):
-        parent_group = request.user.groups.values_list('name', flat=True)[
-            0]
-        users = User.objects.filter(groups__name=parent_group)
-        users_out = []
-        for user in users:
-            code = ""
-            if len(UserCode.objects.filter(user=user)) > 0:
-                code = 'U' + str(UserCode.objects.filter(user=user)[0].code)
-            status = ""
-            if user.is_staff:
-                status = "Staff"
-            elif user.has_perm("client.approved"):
-                status = "Attivo"
-            else:
-                status = "In attesa"
-            users_out.append([user.username, user.first_name,
-                        user.last_name, code, status])
-
-        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) & Q(enabled=True))
-        docs = []
-        for doc in public_types:
-            ref_docs = Document.objects.filter(document_type=doc)
-            docs.append([doc, len(ref_docs)])
-
-        context = {
-            'docs': docs,
-            'users': users_out,
-            }
-        return render(request, 'server/index.html', context)
-    else:
-        return render(request, 'client/index.html', context)
+    parent_group = request.user.groups.values_list('name', flat=True)[
+        0]
+    users = User.objects.filter(groups__name=parent_group)
+    users_out = []
+    for user in users:
+        code = ""
+        if len(UserCode.objects.filter(user=user)) > 0:
+            code = 'U' + str(UserCode.objects.filter(user=user)[0].code)
+        status = ""
+        if user.is_staff:
+            status = "Staff"
+        elif user.has_perm("client.approved"):
+            status = "Attivo"
+        else:
+            status = "In attesa"
+        users_out.append([user.username, user.first_name,
+                    user.last_name, code, status])
+
+    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) & Q(enabled=True))
+    docs = []
+    for doc in public_types:
+        ref_docs = Document.objects.filter(document_type=doc)
+        docs.append([doc, len(ref_docs)])
+
+    context = {
+        'docs': docs,
+        'users': users_out,
+        }
+    return render(request, 'server/index.html', context)
 
 
+@staff_member_required
 def uapprove(request):
     context = {}
-    if (request.user.is_staff):
-        data = []
-        if request.method == "POST":
-            parent_group = request.user.groups.values_list('name', flat=True)[
-                0]
-            group = Group.objects.get(name=parent_group)
-            permission = Permission.objects.get(codename='approved')
-            data = request.POST["codes"]
-            data.replace("\r", "")
-            data = data.split("\n")
-            for i in range(len(data)):
-                if not data[i].startswith("U"):
-                    data[i] = data[i] + " - Formato errato"
-                elif not data[i][1:].isdigit():
-                    data[i] = data[i] + " - Formato errato"
-                elif int(data[i][1:]) < 100000 or int(data[i][1:]) > 999999:
-                    data[i] = data[i] + " - Formato errato"
-                elif len(UserCode.objects.filter(code=data[i][1:])) == 0:
-                    data[i] = data[i] + " - Invalido"
+    data = []
+    if request.method == "POST":
+        parent_group = request.user.groups.values_list('name', flat=True)[
+            0]
+        group = Group.objects.get(name=parent_group)
+        permission = Permission.objects.get(codename='approved')
+        data = request.POST["codes"]
+        data.replace("\r", "")
+        data = data.split("\n")
+        for i in range(len(data)):
+            if not data[i].startswith("U"):
+                data[i] = data[i] + " - Formato errato"
+            elif not data[i][1:].isdigit():
+                data[i] = data[i] + " - Formato errato"
+            elif int(data[i][1:]) < 100000 or int(data[i][1:]) > 999999:
+                data[i] = data[i] + " - Formato errato"
+            elif len(UserCode.objects.filter(code=data[i][1:])) == 0:
+                data[i] = data[i] + " - Invalido"
+            else:
+                user = UserCode.objects.filter(code=data[i][1:])[0].user
+                if len(user.groups.values_list('name', flat=True)) == 0:
+                    user.groups.add(group)
+                    user.user_permissions.add(permission)
+                    data[i] = data[i] + " - Ok"
                 else:
-                    user = UserCode.objects.filter(code=data[i][1:])[0].user
-                    if len(user.groups.values_list('name', flat=True)) == 0:
-                        user.groups.add(group)
+                    if user.groups.values_list('name', flat=True)[0] == parent_group:
                         user.user_permissions.add(permission)
                         data[i] = data[i] + " - Ok"
                     else:
-                        if user.groups.values_list('name', flat=True)[0] == parent_group:
-                            user.user_permissions.add(permission)
-                            data[i] = data[i] + " - Ok"
-                        else:
-                            user.groups.clear()
-                            user.groups.add(group)
-                            user.user_permissions.add(permission)
-                            data[i] = data[i] + " - Ok, cambio branca"
-
-        context = {
-            'messages': data,
-            'empty': len(data) == 0,
-        }
+                        user.groups.clear()
+                        user.groups.add(group)
+                        user.user_permissions.add(permission)
+                        data[i] = data[i] + " - Ok, cambio branca"
+
+    context = {
+        'messages': data,
+        'empty': len(data) == 0,
+    }
 
-        return render(request, 'server/approve_user.html', context)
-    else:
-        return render(request, 'client/index.html', context)
+    return render(request, 'server/approve_user.html', context)
 
 
+@staff_member_required
 def docapprove(request):
     context = {}
-    if (request.user.is_staff):
-        data = []
-        if request.method == "POST":
-            data = request.POST["codes"]
-            data.replace("\r", "")
-            data = data.split("\n")
-            for i in range(len(data)):
-                if not data[i].isdigit():
-                    data[i] = data[i] + " - Formato errato"
-                elif int(data[i]) < 100000 or int(data[i]) > 999999:
-                    data[i] = data[i] + " - Formato errato"
-                elif len(Document.objects.filter(code=data[i])) == 0:
-                    data[i] = data[i] + " - Invalido"
+    data = []
+    if request.method == "POST":
+        data = request.POST["codes"]
+        data.replace("\r", "")
+        data = data.split("\n")
+        for i in range(len(data)):
+            if not data[i].isdigit():
+                data[i] = data[i] + " - Formato errato"
+            elif int(data[i]) < 100000 or int(data[i]) > 999999:
+                data[i] = data[i] + " - Formato errato"
+            elif len(Document.objects.filter(code=data[i])) == 0:
+                data[i] = data[i] + " - Invalido"
+            else:
+                document = Document.objects.filter(code=data[i])[0]
+                if document.status == 'ok':
+                    data[i] = data[i] + " - Già approvato"
                 else:
-                    document = Document.objects.filter(code=data[i])[0]
-                    if document.status == 'ok':
-                        data[i] = data[i] + " - Già approvato"
-                    else:
-                        document.status = 'ok'
-                        document.save()
-                        data[i] = data[i] + " - Ok"
+                    document.status = 'ok'
+                    document.save()
+                    data[i] = data[i] + " - Ok"
 
-        context = {
-            'messages': data,
-            'empty': len(data) == 0,
-        }
+    context = {
+        'messages': data,
+        'empty': len(data) == 0,
+    }
 
-        return render(request, 'server/approve_doc.html', context)
-    else:
-        return render(request, 'client/index.html', context)
+    return render(request, 'server/approve_doc.html', context)
 
 
+@staff_member_required
 def ulist(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)
-        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")
-        users = User.objects.filter(groups__name=parent_group).order_by("first_name")
-        out = []
-        for user in users:
-            usercode = UserCode.objects.filter(user=user)[0]
-            documents = Document.objects.filter(Q(user=user) & ~Q(status='archive'))
-            out.append([user, usercode, parent_group, documents])
-        context = {'users': out}
-        return render(request, 'server/user_list.html', context)
-    else:
-        return render(request, 'client/index.html', context)
-
-
+    parent_group = request.user.groups.values_list('name', flat=True)[0]
+    group = Group.objects.get(name=parent_group)
+    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")
+    users = User.objects.filter(groups__name=parent_group).order_by("first_name")
+    out = []
+    for user in users:
+        usercode = UserCode.objects.filter(user=user)[0]
+        documents = Document.objects.filter(Q(user=user) & ~Q(status='archive'))
+        out.append([user, usercode, parent_group, documents])
+    context = {'users': out}
+    return render(request, 'server/user_list.html', context)
+
+
+@staff_member_required
 def doctype(request):
     context = {}
-    if request.user.is_staff:
-        error = False
-        error_text = ""
-
-        public = True
-        selfsign = True
-        hidden = False
-        personal = True
-        medic = True
-        custom = True
-        message = True
-        group_bool = True
-        public_check = 'checked="checked"'
-        selfsign_check = 'checked="checked"'
-        hidden_check = 'checked="checked"'
-        personal_check = 'checked="checked"'
-        medic_check = 'checked="checked"'
-        custom_check = 'checked="checked"'
-        message_check = 'checked="checked"'
-        group_check = 'checked="checked"'
-        if request.method == "POST":
-            selected = []
-            parent_groups = request.user.groups.values_list('name', flat=True)
-            for i in request.POST.keys():
-                if i.isdigit():
-                    docc = DocumentType.objects.get(id=i)
-                    if docc.group.name in parent_groups:
-                        selected.append(docc)
-
-            for i in selected:
-                if request.POST["action"] == 'delete':
-                    try:
-                        i.delete()
-                    except ProtectedError:
-                        error = True
-                        error_text = "Non puoi eliminare un tipo a cui é collegato uno o piú documenti"
-                elif request.POST["action"] == 'hide':
-                    i.enabled = False
-                    i.save()
-                elif request.POST["action"] == 'show':
-                    i.enabled = True
-                    i.save()
-
-            public = "filter_public" in request.POST
-            selfsign = "filter_selfsign" in request.POST
-            hidden = "filter_hidden" in request.POST
-            personal = "filter_personal" in request.POST
-            medic = "filter_medic" in request.POST
-            custom = "filter_custom" in request.POST
-            message = "filter_message" in request.POST
-            group_bool = "filter_group" in request.POST
-
-            if request.POST["action"] == 'clear':
-                public = True
-                selfsign = True
-                hidden = False
-                personal = True
-                medic = True
-                custom = True
-                message = True
-                group_bool = True
-
-        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))
-        if not public:
-            public_types = public_types.filter(group_private=True)
-            public_check = ""
-        if not selfsign:
-            public_types = public_types.filter(auto_sign=False)
-            selfsign_check = ""
-        if not hidden:
-            public_types = public_types.filter(enabled=True)
-            hidden_check = ""
-        if not personal:
-            public_types = public_types.filter(personal_data=False)
-            personal_check = ""
-        if not medic:
-            public_types = public_types.filter(medical_data=False)
-            medic_check = ""
-        if not custom:
-            public_types = public_types.filter(custom_data=False)
-            custom_check = ""
-        if not message:
-            public_types = public_types.filter(custom_message=False)
-            message_check = ""
-        if not group_bool:
-            public_types = public_types.filter(custom_group=False)
-            group_check = ""
-
-        out = []
-        for doc in public_types:
-            custom_keys = Keys.objects.filter(container=doc)
-            ref_docs = Document.objects.filter(document_type=doc)
-            out.append([doc, custom_keys, len(ref_docs)])
-
-        context = {
-            'docs': out,
-            'public_check': public_check,
-            'selfsign_check': selfsign_check,
-            'hidden_check': hidden_check,
-            'personal_check': personal_check,
-            'medic_check': medic_check,
-            'custom_check': custom_check,
-            'message_check': message_check,
-            'group_check': group_check,
-            'error': error,
-            'error_text': error_text,
-            }
-        return render(request, 'server/doc_type.html', context)
-    else:
-        return render(request, 'client/index.html', context)
+    error = False
+    error_text = ""
+
+    public = True
+    selfsign = True
+    hidden = False
+    personal = True
+    medic = True
+    custom = True
+    message = True
+    group_bool = True
+    public_check = 'checked="checked"'
+    selfsign_check = 'checked="checked"'
+    hidden_check = 'checked="checked"'
+    personal_check = 'checked="checked"'
+    medic_check = 'checked="checked"'
+    custom_check = 'checked="checked"'
+    message_check = 'checked="checked"'
+    group_check = 'checked="checked"'
+    if request.method == "POST":
+        selected = []
+        parent_groups = request.user.groups.values_list('name', flat=True)
+        for i in request.POST.keys():
+            if i.isdigit():
+                docc = DocumentType.objects.get(id=i)
+                if docc.group.name in parent_groups:
+                    selected.append(docc)
+
+        for i in selected:
+            if request.POST["action"] == 'delete':
+                try:
+                    i.delete()
+                except ProtectedError:
+                    error = True
+                    error_text = "Non puoi eliminare un tipo a cui é collegato uno o piú documenti"
+            elif request.POST["action"] == 'hide':
+                i.enabled = False
+                i.save()
+            elif request.POST["action"] == 'show':
+                i.enabled = True
+                i.save()
+
+        public = "filter_public" in request.POST
+        selfsign = "filter_selfsign" in request.POST
+        hidden = "filter_hidden" in request.POST
+        personal = "filter_personal" in request.POST
+        medic = "filter_medic" in request.POST
+        custom = "filter_custom" in request.POST
+        message = "filter_message" in request.POST
+        group_bool = "filter_group" in request.POST
+
+        if request.POST["action"] == 'clear':
+            public = True
+            selfsign = True
+            hidden = False
+            personal = True
+            medic = True
+            custom = True
+            message = True
+            group_bool = True
+
+    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))
+    if not public:
+        public_types = public_types.filter(group_private=True)
+        public_check = ""
+    if not selfsign:
+        public_types = public_types.filter(auto_sign=False)
+        selfsign_check = ""
+    if not hidden:
+        public_types = public_types.filter(enabled=True)
+        hidden_check = ""
+    if not personal:
+        public_types = public_types.filter(personal_data=False)
+        personal_check = ""
+    if not medic:
+        public_types = public_types.filter(medical_data=False)
+        medic_check = ""
+    if not custom:
+        public_types = public_types.filter(custom_data=False)
+        custom_check = ""
+    if not message:
+        public_types = public_types.filter(custom_message=False)
+        message_check = ""
+    if not group_bool:
+        public_types = public_types.filter(custom_group=False)
+        group_check = ""
+
+    out = []
+    for doc in public_types:
+        custom_keys = Keys.objects.filter(container=doc)
+        ref_docs = Document.objects.filter(document_type=doc)
+        out.append([doc, custom_keys, len(ref_docs)])
+
+    context = {
+        'docs': out,
+        'public_check': public_check,
+        'selfsign_check': selfsign_check,
+        'hidden_check': hidden_check,
+        'personal_check': personal_check,
+        'medic_check': medic_check,
+        'custom_check': custom_check,
+        'message_check': message_check,
+        'group_check': group_check,
+        'error': error,
+        'error_text': error_text,
+        }
+    return render(request, 'server/doc_type.html', context)
 
 
+@staff_member_required
 def doccreate(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)
-        enabled = False
-        group_private = False
-        personal_data = False
-        medical_data = False
-        custom_data = False
-        custom_group_bool = False
-        name = ""
-        custom_group = ""
-
-        enabled_check = 'checked="checked"'
-        private_check = 'checked="checked"'
-        personal_check = 'checked="checked"'
-        sign_check = 'checked="checked"'
-        medical_check = ""
-        custom_check = ""
-        custom_message_check = ""
-        context = {
-            "enabled_check": enabled_check,
-            "private_check": private_check,
-            "sign_check": sign_check,
-            "personal_check": personal_check,
-            "medical_check": medical_check,
-            "custom_check": custom_check,
-            "custom_message_check": custom_message_check,
-        }
-        if request.method == "POST":
-            enabled = "enabled" in request.POST.keys()
-            auto_sign = "sign" not in request.POST.keys()
-            group_private = "group_private" in request.POST.keys()
-            personal_data = "personal_data" in request.POST.keys()
-            medical_data = "medical_data" in request.POST.keys()
-            custom_data = "custom_data" in request.POST.keys()
-            custom_message = "custom_message" in request.POST.keys()
-            custom_message_text = request.POST["custom_message_text"]
-            name = request.POST["name"]
-            custom_group = request.POST["custom_group"]
-
-            if custom_group != "":
-                print("here")
-                if custom_group not in request.user.groups.values_list('name', flat=True):
-                    context["error"] = "true"
-                    context["error_text"] = "Non puoi creare un tipo assegnato ad un gruppo di cui non fai parte"
-                    return render(request, 'server/doc_create.html', context)
-                else:
-                    group = Group.objects.filter(name=custom_group)[0]
-                    custom_group_bool = True
-
-            doctype = DocumentType(
-                custom_group=custom_group_bool, auto_sign=auto_sign, custom_message=custom_message, custom_message_text=custom_message_text, name=request.POST["name"], enabled=enabled, group_private=group_private, group=group, personal_data=personal_data, medical_data=medical_data, custom_data=custom_data)
-            doctype.save()
-            if custom_data:
-                custom = request.POST["custom"]
-                custom.replace("\r", "")
-                custom = custom.split("\n")
-                for i in custom:
-                    key = Keys(key=i, container=doctype)
-                    key.save()
-            return HttpResponseRedirect('doctype')
-
-        return render(request, 'server/doc_create.html', context)
-    else:
-        return render(request, 'client/index.html', context)
+    parent_group = request.user.groups.values_list('name', flat=True)[
+        0]
+    group = Group.objects.get(name=parent_group)
+    enabled = False
+    group_private = False
+    personal_data = False
+    medical_data = False
+    custom_data = False
+    custom_group_bool = False
+    name = ""
+    custom_group = ""
+
+    enabled_check = 'checked="checked"'
+    private_check = 'checked="checked"'
+    personal_check = 'checked="checked"'
+    sign_check = 'checked="checked"'
+    medical_check = ""
+    custom_check = ""
+    custom_message_check = ""
+    context = {
+        "enabled_check": enabled_check,
+        "private_check": private_check,
+        "sign_check": sign_check,
+        "personal_check": personal_check,
+        "medical_check": medical_check,
+        "custom_check": custom_check,
+        "custom_message_check": custom_message_check,
+    }
+    if request.method == "POST":
+        enabled = "enabled" in request.POST.keys()
+        auto_sign = "sign" not in request.POST.keys()
+        group_private = "group_private" in request.POST.keys()
+        personal_data = "personal_data" in request.POST.keys()
+        medical_data = "medical_data" in request.POST.keys()
+        custom_data = "custom_data" in request.POST.keys()
+        custom_message = "custom_message" in request.POST.keys()
+        custom_message_text = request.POST["custom_message_text"]
+        name = request.POST["name"]
+        custom_group = request.POST["custom_group"]
+
+        if custom_group != "":
+            print("here")
+            if custom_group not in request.user.groups.values_list('name', flat=True):
+                context["error"] = "true"
+                context["error_text"] = "Non puoi creare un tipo assegnato ad un gruppo di cui non fai parte"
+                return render(request, 'server/doc_create.html', context)
+            else:
+                group = Group.objects.filter(name=custom_group)[0]
+                custom_group_bool = True
+
+        doctype = DocumentType(
+            custom_group=custom_group_bool, auto_sign=auto_sign, custom_message=custom_message, custom_message_text=custom_message_text, name=request.POST["name"], enabled=enabled, group_private=group_private, group=group, personal_data=personal_data, medical_data=medical_data, custom_data=custom_data)
+        doctype.save()
+        if custom_data:
+            custom = request.POST["custom"]
+            custom.replace("\r", "")
+            custom = custom.split("\n")
+            for i in custom:
+                key = Keys(key=i, container=doctype)
+                key.save()
+        return HttpResponseRedirect('doctype')
 
+    return render(request, 'server/doc_create.html', context)
 
+
+@staff_member_required
 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 = ""
-
-        hidden = False
-        wait = True
-        selfsign = True
-        ok = True
-
-        hidden_check = 'checked="checked"'
-        wait_check = 'checked="checked"'
-        selfsign_check = 'checked="checked"'
-        ok_check = 'checked="checked"'
-        newer = zurich.localize(dateparser.parse("1970-01-01"))
-        older = zurich.localize(datetime.now())
-        owner = []
-        types = []
-        groups = []
-        chips_owner = []
-        chips_types = []
-        chips_groups = []
-
-        if request.method == "POST":
-            if request.POST["action"][0] == 'k':
-                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 = []
-            parent_groups = request.user.groups.values_list('name', flat=True)
-            for i in request.POST.keys():
-                if i.isdigit():
-                    docc = Document.objects.get(id=i)
-                    if docc.group.name in parent_groups:
-                        selected.append(docc)
-
-            for i in selected:
-                if request.POST["action"] == 'delete':
-                    i.delete()
-                elif request.POST["action"] == 'approve':
+    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 = ""
+
+    hidden = False
+    wait = True
+    selfsign = True
+    ok = True
+
+    hidden_check = 'checked="checked"'
+    wait_check = 'checked="checked"'
+    selfsign_check = 'checked="checked"'
+    ok_check = 'checked="checked"'
+    newer = zurich.localize(dateparser.parse("1970-01-01"))
+    older = zurich.localize(datetime.now())
+    owner = []
+    types = []
+    groups = []
+    chips_owner = []
+    chips_types = []
+    chips_groups = []
+
+    if request.method == "POST":
+        if request.POST["action"][0] == 'k':
+            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 = []
+        parent_groups = request.user.groups.values_list('name', flat=True)
+        for i in request.POST.keys():
+            if i.isdigit():
+                docc = Document.objects.get(id=i)
+                if docc.group.name in parent_groups:
+                    selected.append(docc)
+
+        for i in selected:
+            if request.POST["action"] == 'delete':
+                i.delete()
+            elif request.POST["action"] == 'approve':
+                i.status = 'ok'
+                i.save()
+            elif request.POST["action"] == 'archive':
+                if i.status == 'ok':
+                    i.status = 'archive'
+                    i.save()
+                else:
+                    error = True
+                    error_text = "Non puoi archiviare un documento non approvato"
+            elif request.POST["action"] == 'unarchive':
+                if i.status == 'archive':
                     i.status = 'ok'
                     i.save()
-                elif request.POST["action"] == 'archive':
-                    if i.status == 'ok':
-                        i.status = 'archive'
-                        i.save()
-                    else:
-                        error = True
-                        error_text = "Non puoi archiviare un documento non approvato"
-                elif request.POST["action"] == 'unarchive':
-                    if i.status == 'archive':
-                        i.status = 'ok'
-                        i.save()
-                    else:
-                        error = True
-                        error_text = "Non puoi dearchiviare un documento non archiviato"
-            
-            hidden = "filter_hidden" in request.POST
-            wait = "filter_wait" in request.POST
-            selfsign = "filter_selfsign" in request.POST
-            ok = "filter_ok" in request.POST
-            newer = zurich.localize(dateparser.parse(request.POST["newer"]))
-            older = zurich.localize(dateparser.parse(request.POST["older"]) + timedelta(days=1))
-            owner = request.POST["owner"].split("^|")
-            types = request.POST["type"].split("^|")
-            groups = request.POST["groups"].split("^|")
-
-            if request.POST["action"] == 'clear':
-                hidden = False
-                wait = True
-                selfsign = True
-                ok = True
-                newer = zurich.localize(dateparser.parse("1970-01-01"))
-                older = zurich.localize(datetime.now())
-                owner = []
-                types = []
-                groups = []
-
-        parent_groups = request.user.groups.values_list('name', flat=True)
-        q_obj = Q()
-        for i in parent_groups:
-            q_obj |= Q(group__name=i)
-
-        documents = Document.objects.filter(q_obj)
-
-        if not hidden:
-            documents = documents.filter(~Q(status="archive"))
-            hidden_check = ""
-        if not wait:
-            documents = documents.filter(~Q(status="wait"))
-            wait_check = ""
-        if not selfsign:
-            documents = documents.filter(~Q(status="autosign"))
-            selfsign_check = ""
-        if not ok:
-            documents = documents.filter(~Q(status="ok"))
-            ok_check = ""
-
-        documents = documents.filter(compilation_date__range=[newer, older])
-
-        if len(types) > 0:
-            if types[0] != "":
-                q_obj = Q()
-                for t in types:
-                    q_obj |= Q(document_type__name=t)
-                    chips_types.append(t)
-
-                documents = documents.filter(q_obj)
-
-        if len(owner) > 0:
-            if owner[0] != "":
-                q_obj = Q()
-                for u in owner:
-                    user = u.split("(")[0][:-1]
-                    q_obj |= Q(user__username=user)
-                    chips_owner.append(u)
-
-                documents = documents.filter(q_obj)
-
-        if len(groups) > 0:
-            if groups[0] != "":
-                q_obj = Q()
-                for g in groups:
-                    q_obj |= Q(group__name=g)
-                    chips_groups.append(g)
-
-                documents = documents.filter(q_obj)
-
-        out = []
-        for i in documents:
-            personal = None
-            medical = None
-            if i.document_type.personal_data:
-                personal = i.personal_data
-            if i.document_type.medical_data:
-                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, doc_group])
-
-        auto_types = DocumentType.objects.filter(Q(group_private=False) | Q(group=group))
-        users = User.objects.filter(groups__name=parent_group)
-        context = {
-            "types": auto_types,
-            "users": users,
-            "groups": parent_groups,
-            "docs": out,
-            "hidden_check": hidden_check,
-            "wait_check": wait_check,
-            "selfsign_check": selfsign_check,
-            "ok_check": ok_check,
-            "newer": newer,
-            "older": older,
-            "chips_owner": chips_owner,
-            "chips_type": chips_types,
-            "chips_groups": chips_groups,
-            'error': error,
-            'error_text': error_text,
-            'settings': settings,
-            }
-        return render(request, 'server/doc_list.html', context)
-    else:
-        return render(request, 'client/index.html', context)
\ No newline at end of file
+                else:
+                    error = True
+                    error_text = "Non puoi dearchiviare un documento non archiviato"
+        
+        hidden = "filter_hidden" in request.POST
+        wait = "filter_wait" in request.POST
+        selfsign = "filter_selfsign" in request.POST
+        ok = "filter_ok" in request.POST
+        newer = zurich.localize(dateparser.parse(request.POST["newer"]))
+        older = zurich.localize(dateparser.parse(request.POST["older"]) + timedelta(days=1))
+        owner = request.POST["owner"].split("^|")
+        types = request.POST["type"].split("^|")
+        groups = request.POST["groups"].split("^|")
+
+        if request.POST["action"] == 'clear':
+            hidden = False
+            wait = True
+            selfsign = True
+            ok = True
+            newer = zurich.localize(dateparser.parse("1970-01-01"))
+            older = zurich.localize(datetime.now())
+            owner = []
+            types = []
+            groups = []
+
+    parent_groups = request.user.groups.values_list('name', flat=True)
+    q_obj = Q()
+    for i in parent_groups:
+        q_obj |= Q(group__name=i)
+
+    documents = Document.objects.filter(q_obj)
+
+    if not hidden:
+        documents = documents.filter(~Q(status="archive"))
+        hidden_check = ""
+    if not wait:
+        documents = documents.filter(~Q(status="wait"))
+        wait_check = ""
+    if not selfsign:
+        documents = documents.filter(~Q(status="autosign"))
+        selfsign_check = ""
+    if not ok:
+        documents = documents.filter(~Q(status="ok"))
+        ok_check = ""
+
+    documents = documents.filter(compilation_date__range=[newer, older])
+
+    if len(types) > 0:
+        if types[0] != "":
+            q_obj = Q()
+            for t in types:
+                q_obj |= Q(document_type__name=t)
+                chips_types.append(t)
+
+            documents = documents.filter(q_obj)
+
+    if len(owner) > 0:
+        if owner[0] != "":
+            q_obj = Q()
+            for u in owner:
+                user = u.split("(")[0][:-1]
+                q_obj |= Q(user__username=user)
+                chips_owner.append(u)
+
+            documents = documents.filter(q_obj)
+
+    if len(groups) > 0:
+        if groups[0] != "":
+            q_obj = Q()
+            for g in groups:
+                q_obj |= Q(group__name=g)
+                chips_groups.append(g)
+
+            documents = documents.filter(q_obj)
+
+    out = []
+    for i in documents:
+        personal = None
+        medical = None
+        if i.document_type.personal_data:
+            personal = i.personal_data
+        if i.document_type.medical_data:
+            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, doc_group])
+
+    auto_types = DocumentType.objects.filter(Q(group_private=False) | Q(group=group))
+    users = User.objects.filter(groups__name=parent_group)
+    context = {
+        "types": auto_types,
+        "users": users,
+        "groups": parent_groups,
+        "docs": out,
+        "hidden_check": hidden_check,
+        "wait_check": wait_check,
+        "selfsign_check": selfsign_check,
+        "ok_check": ok_check,
+        "newer": newer,
+        "older": older,
+        "chips_owner": chips_owner,
+        "chips_type": chips_types,
+        "chips_groups": chips_groups,
+        'error': error,
+        'error_text': error_text,
+        'settings': settings,
+        }
+    return render(request, 'server/doc_list.html', context)
\ No newline at end of file
-- 
cgit v1.2.1