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