From 0f65537eda5f498f4c282805e5e9552691c2b186 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1?= <git@imaniti.org>
Date: Thu, 26 Jan 2023 15:37:17 +0100
Subject: [PATCH] working on voting API

---
 .../templates/rv_voting_calc/index.html       | 20 +++++--
 rv_voting_calc/views.py                       | 59 ++++++++++++++++++-
 static_src/rv_voting_calc.js                  | 18 ++++--
 3 files changed, 84 insertions(+), 13 deletions(-)

diff --git a/rv_voting_calc/templates/rv_voting_calc/index.html b/rv_voting_calc/templates/rv_voting_calc/index.html
index 63a81b0..7858b29 100644
--- a/rv_voting_calc/templates/rv_voting_calc/index.html
+++ b/rv_voting_calc/templates/rv_voting_calc/index.html
@@ -14,16 +14,16 @@
     <main>
         <h1 class="text-6xl font-bebas mb-5">Kalkulačka hlasování RV</h1>
 
-        <div class="grid grid-cols-2 gap-7 mb-5 items-center">
+        <div class="grid grid-cols-2 gap-7 mb-5 pb-4 items-center border-b border-gray-100">
+            <h2 class="text-2xl font-bebas">Hlasy členů</h2>
+
             <div class="flex items-center gap-3 justify-between">
-                <h2 class="text-2xl font-bebas">Hlasy členů</h2>
+                <h2 class="text-2xl font-bebas">Výsledky</h2>
                 <button
                     class="bg-black text-white px-5 py-3 duration-100 hover:bg-gray-800"
                     id="count-votes"
                 >Vypočítat</button>
             </div>
-
-            <h2 class="text-2xl font-bebas">Výsledky</h2>
         </div>
 
         <div class="grid grid-cols-2 gap-7">
@@ -34,14 +34,22 @@
                             <i class="ico--user text-xl mr-2"></i>
                             {{ member.displayName }}
                         </div>
-                        <select class="grow w-full __vote-selection" multiple="multiple"></select>
+                        <select
+                            id="{{ member.username }}-selection"
+                            class="__vote-selection grow w-full"
+                            multiple="multiple"
+                        ></select>
                     </li>
                 {% endfor %}
             </ul>
+
+            <div>
+                
+            </div>
         </div>
     </main>
 
     <script>
-        const RV_MEMBERS = {{ rv_members|safe }};
+        const RV_MEMBERS = {{ json_rv_members|safe }};
     </script>
 {% endblock %}
diff --git a/rv_voting_calc/views.py b/rv_voting_calc/views.py
index 2267894..4bd47b3 100644
--- a/rv_voting_calc/views.py
+++ b/rv_voting_calc/views.py
@@ -1,4 +1,5 @@
 import json
+import typing
 
 import gql
 import requests
@@ -6,11 +7,12 @@ import requests
 from gql.transport.requests import RequestsHTTPTransport
 
 from django.conf import settings
+from django.http import HttpResponseBadRequest
 from django.shortcuts import render
+from django.views.decorators.http import require_POST
 
-# Create your views here.
 
-def index(request):
+def get_rv_members() -> list:
     transport = RequestsHTTPTransport(url=settings.CHOBOTNICE_API_URL)
     client = gql.Client(
         transport=transport,
@@ -44,12 +46,63 @@ def index(request):
     # Sort alphabetically
     rv_members.sort(key=lambda value: value["displayName"])
 
+    return rv_members
+
+
+def convert_rv_members_to_dict(source: list) -> dict:
+    rv_members = {}
+
+    for member in source:
+        # Convert to username: {data}
+        rv_members[member["username"]] = {
+            "displayName": member["displayName"],
+            "officialLastName": member["officialLastName"]
+        }
+
+    return rv_members
+
+
+def index(request):
+    rv_members = get_rv_members()
+    json_rv_members = json.dumps(convert_rv_members_to_dict(rv_members))
+
     return render(
         request,
         "rv_voting_calc/index.html",
         {
             "rv_members": rv_members,
             # JS-Readable format
-            "json_rv_members": json.dumps(rv_members),
+            "json_rv_members": json.dumps(json_rv_members),
         }
     )
+
+
+@require_POST
+def get_calculated_votes(request):
+    votes = request.GET.get("votes")
+
+    if votes is None:
+        return HttpResponseBadRequest("Nebyly zadány žádné hlasy")
+
+    try:
+        votes = json.loads(votes)
+
+        if not isinstance(votes, dict):
+            raise ValueError
+    except ValueError:
+        return HttpResponseBadRequest("Formát hlasů není validní")
+
+    rv_members = convert_rv_members_to_dict(get_rv_members())
+
+    rv_member_names_to_clear = rv_members.keys()
+
+    integrity_check_failed = False
+
+    for key, value in votes.items():
+        if key not in rv_member_names_to_clear:
+            integrity_check_failed = True
+            break
+
+        if not isinstance(
+
+        rv_member_names_to_clear.pop(key)
diff --git a/static_src/rv_voting_calc.js b/static_src/rv_voting_calc.js
index 4f8b9b6..7d21f59 100644
--- a/static_src/rv_voting_calc.js
+++ b/static_src/rv_voting_calc.js
@@ -103,12 +103,22 @@ $(window).ready(
                     $(selection).trigger("change");
                 }
             }
-        )
+        );
 
-        $(".__vote-selection").on(
-            "change.select2",
+        $("#count-votes").on(
+            "click",
             event => {
-                console.log("change");
+                let votes = {};
+
+                for (const username of Object.keys(RV_MEMBERS)) {
+                    votes[username] = [];
+
+                    for (const data of $(`#${$.escapeSelector(username)}-selection`).select2("data")) {
+                        votes[username].push(data.id);
+                    }
+                }
+
+                console.log(votes);
             }
         );
     }
-- 
GitLab