From 3e03caa83ef243c4e6ad377c88ba8ee9ebe213be Mon Sep 17 00:00:00 2001
From: rafestorn <rafaestrada3@gmail.com>
Date: Thu, 24 Nov 2022 18:02:36 +0100
Subject: [PATCH 1/4] feat: Added Groups (Gender and Age) functionality

With this functionality you can add groups of voters to an specific voting.
You can access by census/add/by_group/age and census/add/by_group/gender
The functionality is not working properly until decide-part-rota-main Rota1-003 issue is completed.
---
 decide/census/templates/census_age.html    | 71 +++++++++++++++++
 decide/census/templates/census_gender.html | 74 ++++++++++++++++++
 decide/census/urls.py                      |  6 +-
 decide/census/views.py                     | 88 ++++++++++++++++++++++
 4 files changed, 238 insertions(+), 1 deletion(-)
 create mode 100644 decide/census/templates/census_age.html
 create mode 100644 decide/census/templates/census_gender.html

diff --git a/decide/census/templates/census_age.html b/decide/census/templates/census_age.html
new file mode 100644
index 0000000000..6644a726da
--- /dev/null
+++ b/decide/census/templates/census_age.html
@@ -0,0 +1,71 @@
+{% extends "base.html" %}
+{% load i18n static %}
+
+{% block extrahead %}
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
+    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3" crossorigin="anonymous"></script>
+
+    <link type="text/css" rel="stylesheet" href="{% static 'style.css' %}" />
+{% endblock %}
+
+
+{% block content %}
+<div class="row justify-content-md-center align-items-center">
+    <div class="col-sm-8 justify-content-center align-items-center">
+        <h2 class ="justify-content-center align-items-center">Census Groups</h2>
+    </div>
+</div>
+<div class="row justify-content-md-center">
+    <div class="col-sm-8">
+        <h3>Now you can add groups of voters to an specific voting</h3>
+        <h6>for example, if you select minmun age 22 and maximum age 28, every user who satisfies that requirement will be added to the chosen voting</h6>
+    </div>
+</div>
+
+<div class="row">
+    
+</div>
+
+<form class="row gx-3 gy-2 align-items-center" action="create" method="POST">
+    {% csrf_token %}
+    <div class="row justify-content-md-center">
+        <div class="col-sm-8">
+            <label for="specificSizeSelect">Choose a voting</label>
+            <select class="form-select" id="specificSizeSelect" name="voting-select">
+                {% for voting in votings %}
+                <option value="{{voting.id}}">{{voting}}</option>
+                {%endfor%}
+            </select>
+                
+        </div>
+    </div>
+    <div class="row justify-content-md-center">
+        <div class="col-sm-8">
+            <label>Choose age</label>
+            <input type="number" name="minimum-age" max="100" min="0">
+            <input type="number" name="maximum-age" max="100" min="0">
+        </div>
+    </div>
+    <div class="row justify-content-center submit">
+        <div class="col col-lg-1">
+            <button type="submit" class="btn btn-primary">Submit</button>
+        </div>
+    </div>
+</form>
+
+{% if messages %}
+<ul class="messages" style="margin-top:2%">
+    {% for message in messages %}
+        {% if message.tags == 'error' %}
+        <li class="{{ message.tags }} alert alert-danger" role="alert">{{ message }}</li>
+        {% else %}
+        <li class="{{ message.tags }} alert alert-{{message.tags}}" role="alert">{{ message }}</li>
+        {% endif %}
+        
+    {% endfor %}
+</ul>
+
+{% endif %}
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/decide/census/templates/census_gender.html b/decide/census/templates/census_gender.html
new file mode 100644
index 0000000000..7d1bc038a5
--- /dev/null
+++ b/decide/census/templates/census_gender.html
@@ -0,0 +1,74 @@
+{% extends "base.html" %}
+{% load i18n static %}
+
+{% block extrahead %}
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
+    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3" crossorigin="anonymous"></script>
+
+    <link type="text/css" rel="stylesheet" href="{% static 'style.css' %}" />
+{% endblock %}
+
+
+{% block content %}
+<div class="row justify-content-md-center align-items-center">
+    <div class="col-sm-8 justify-content-center align-items-center">
+        <h2 class ="justify-content-center align-items-center">Census Groups</h2>
+    </div>
+</div>
+<div class="row justify-content-md-center">
+    <div class="col-sm-8">
+        <h3>Now you can add groups of voters to an specific voting</h3>
+        <h6>for example, if you select "Male", every user who satisfies that requirement will be added to the chosen voting</h6>
+    </div>
+</div>
+
+<div class="row">
+    
+</div>
+
+<form class="row gx-3 gy-2 align-items-center" action="create" method="POST">
+    {% csrf_token %}
+    <div class="row justify-content-md-center">
+        <div class="col-sm-8">
+            <label for="specificSizeSelect">Choose a voting</label>
+            <select class="form-select" id="specificSizeSelect" name="voting-select">
+                {% for voting in votings %}
+                <option value="{{voting.id}}">{{voting}}</option>
+                {%endfor%}
+            </select>
+                
+        </div>
+    </div>
+    <div class="row justify-content-md-center">
+        <div class="col-sm-8">
+            <label for="specificSizeSelect">Choose gender</label>
+            <select multiple class="form-select" id="specificSizeSelect" name="gender-select">
+                <!--{% for gender in gender %}
+                <option value="{{gender}}">{{gender}}</option>
+                {%endfor%}-->
+            </select>    
+        </div>
+    </div>
+    <div class="row justify-content-center submit">
+        <div class="col col-lg-1">
+            <button type="submit" class="btn btn-primary">Submit</button>
+        </div>
+    </div>
+</form>
+
+{% if messages %}
+<ul class="messages" style="margin-top:2%">
+    {% for message in messages %}
+        {% if message.tags == 'error' %}
+        <li class="{{ message.tags }} alert alert-danger" role="alert">{{ message }}</li>
+        {% else %}
+        <li class="{{ message.tags }} alert alert-{{message.tags}}" role="alert">{{ message }}</li>
+        {% endif %}
+        
+    {% endfor %}
+</ul>
+
+{% endif %}
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/decide/census/urls.py b/decide/census/urls.py
index 41cc26e1d7..169022b1fa 100644
--- a/decide/census/urls.py
+++ b/decide/census/urls.py
@@ -8,5 +8,9 @@
     path('add/', views.census_add, name='census_add'),
     path('add/add_to_census', views.add_to_census),
     path('remove/', views.census_remove, name='census_remove'),
-    path('remove/remove_from_census', views.remove_from_census)
+    path('remove/remove_from_census', views.remove_from_census),
+    path('add/by_group/age', views.census_age),
+    path('add/by_group/age/create', views.add_by_age_to_census),
+    path('add/by_group/gender', views.census_gender),
+    path('add/by_group/gender/create', views.add_by_gender_to_census),
 ]
diff --git a/decide/census/views.py b/decide/census/views.py
index ee09f11c20..169cbb2262 100644
--- a/decide/census/views.py
+++ b/decide/census/views.py
@@ -145,4 +145,92 @@ def remove_from_census(request):
         messages.error(request, "You must be a staff member to access this page")
         return HttpResponse(template.render({'remove': True}, request), status=ST_401)
 
+def census_gender(request):
+    if request.user.is_staff:
+        template = loader.get_template("census_gender.html")
+        votings = Voting.objects.all()
+        try: 
+            genders = set(u.gender for u in User.objects.all())
+        except:
+            genders = set()
+        context = {
+            'votings': votings,
+            'genders': genders,
+        }
+        return HttpResponse(template.render(context, request))
+    else:
+        template = loader.get_template("result_page.html")
+        messages.error(request, "You must be a staff member to access this page")
+        return HttpResponse(template.render({}, request), status=ST_401)
+
+def add_by_gender_to_census(request):
+        template = loader.get_template("result_page.html")
+        if request.user.is_staff:
+            voting_id = request.POST['voting-select']
+            genders = request.POST['gender-select']
+            users = User.objects.filter(gender in genders)
+            for user in users:
+                try:
+                    census_by_voting = Census.objects.get(voting_id=voting_id,voter_id=user.id)
+                except Census.DoesNotExist:
+                    census_by_voting = None
+                status_code=404
+                if census_by_voting == None:
+                    census = Census(voting_id=voting_id, voter_id=user.id)
+                    census.save()
+                    messages.success(request, "User added to the voting correctly")
+                    status_code=ST_201
+
+                else:
+                    messages.info(request, "The user was already assigned to the voting")
+                    status_code = 200
+
+                return HttpResponse(template.render({}, request), status=status_code)
+
+        else:
+            messages.error(request, "You must be a staff member to access this page")
+            return HttpResponse(template.render({}, request), status=ST_401)
+
+def census_age(request):
+    if request.user.is_staff:
+        template = loader.get_template("census_age.html")
+        votings = Voting.objects.all()
+        context = {
+            'votings': votings,
+        }
+        return HttpResponse(template.render(context, request))
+    else:
+        template = loader.get_template("result_page.html")
+        messages.error(request, "You must be a staff member to access this page")
+        return HttpResponse(template.render({}, request), status=ST_401)
+
+
+def add_by_age_to_census(request):
+    template = loader.get_template("result_page.html")
+    if request.user.is_staff:
+        voting_id = request.POST['voting-select']
+        minAge = request.POST['minimum-age']
+        maxAge = request.POST['maximum-age']
+        users = User.objects.filter(age >= minAge and age<=maxAge)
+        for user in users:
+            try:
+                census_by_voting = Census.objects.get(voting_id=voting_id,voter_id=user.id)
+            except Census.DoesNotExist:
+                census_by_voting = None
+            status_code=404
+            if census_by_voting == None:
+                census = Census(voting_id=voting_id, voter_id=user.id)
+                census.save()
+                messages.success(request, "User added to the voting correctly")
+                status_code=ST_201
 
+            else:
+                messages.info(request, "The user was already assigned to the voting")
+                status_code = 200
+        
+        
+            return HttpResponse(template.render({}, request), status=status_code)
+
+    else:
+        messages.error(request, "You must be a staff member to access this page")
+        return HttpResponse(template.render({}, request), status=ST_401)
\ No newline at end of file

From d09322654dce535a3e75bb6e984e0f06118365a5 Mon Sep 17 00:00:00 2001
From: rafestorn <rafaestrada3@gmail.com>
Date: Thu, 24 Nov 2022 18:26:13 +0100
Subject: [PATCH 2/4] fix: Fix for codacy

Fixes the errors detected by codacy static code analysis.
---
 decide/census/templates/census_age.html    | 2 +-
 decide/census/templates/census_gender.html | 2 +-
 decide/census/views.py                     | 4 ++--
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/decide/census/templates/census_age.html b/decide/census/templates/census_age.html
index 6644a726da..896de0985a 100644
--- a/decide/census/templates/census_age.html
+++ b/decide/census/templates/census_age.html
@@ -26,7 +26,7 @@ <h6>for example, if you select minmun age 22 and maximum age 28, every user who
     
 </div>
 
-<form class="row gx-3 gy-2 align-items-center" action="create" method="POST">
+<form class="row gx-3 gy-2 align-items-center" action="age/create" method="POST">
     {% csrf_token %}
     <div class="row justify-content-md-center">
         <div class="col-sm-8">
diff --git a/decide/census/templates/census_gender.html b/decide/census/templates/census_gender.html
index 7d1bc038a5..2a17c0a4a6 100644
--- a/decide/census/templates/census_gender.html
+++ b/decide/census/templates/census_gender.html
@@ -26,7 +26,7 @@ <h6>for example, if you select "Male", every user who satisfies that requirement
     
 </div>
 
-<form class="row gx-3 gy-2 align-items-center" action="create" method="POST">
+<form class="row gx-3 gy-2 align-items-center" action="gender/create" method="POST">
     {% csrf_token %}
     <div class="row justify-content-md-center">
         <div class="col-sm-8">
diff --git a/decide/census/views.py b/decide/census/views.py
index 169cbb2262..749b64b742 100644
--- a/decide/census/views.py
+++ b/decide/census/views.py
@@ -149,9 +149,9 @@ def census_gender(request):
     if request.user.is_staff:
         template = loader.get_template("census_gender.html")
         votings = Voting.objects.all()
-        try: 
+        try:
             genders = set(u.gender for u in User.objects.all())
-        except:
+        except BaseException:
             genders = set()
         context = {
             'votings': votings,

From 9ed1215f3856ea2595bc1c22207e45cbb6cd153d Mon Sep 17 00:00:00 2001
From: rafestorn <rafaestrada3@gmail.com>
Date: Thu, 24 Nov 2022 18:37:17 +0100
Subject: [PATCH 3/4] fix: Fix for codacy Fix some minor errors for the codacy
 static analysis.

---
 decide/census/views.py | 50 +++++++++++++++++++++---------------------
 1 file changed, 25 insertions(+), 25 deletions(-)

diff --git a/decide/census/views.py b/decide/census/views.py
index 749b64b742..1b66fbf4ec 100644
--- a/decide/census/views.py
+++ b/decide/census/views.py
@@ -164,32 +164,32 @@ def census_gender(request):
         return HttpResponse(template.render({}, request), status=ST_401)
 
 def add_by_gender_to_census(request):
-        template = loader.get_template("result_page.html")
-        if request.user.is_staff:
-            voting_id = request.POST['voting-select']
-            genders = request.POST['gender-select']
-            users = User.objects.filter(gender in genders)
-            for user in users:
-                try:
-                    census_by_voting = Census.objects.get(voting_id=voting_id,voter_id=user.id)
-                except Census.DoesNotExist:
-                    census_by_voting = None
-                status_code=404
-                if census_by_voting == None:
-                    census = Census(voting_id=voting_id, voter_id=user.id)
-                    census.save()
-                    messages.success(request, "User added to the voting correctly")
-                    status_code=ST_201
-
-                else:
-                    messages.info(request, "The user was already assigned to the voting")
-                    status_code = 200
-
-                return HttpResponse(template.render({}, request), status=status_code)
+    template = loader.get_template("result_page.html")
+    if request.user.is_staff:
+        voting_id = request.POST['voting-select']
+        genders = request.POST['gender-select']
+        users = User.objects.filter(gender in genders)
+        for user in users:
+            try:
+                census_by_voting = Census.objects.get(voting_id=voting_id,voter_id=user.id)
+            except Census.DoesNotExist:
+                census_by_voting = None
+            status_code=404
+            if census_by_voting == None:
+                census = Census(voting_id=voting_id, voter_id=user.id)
+                census.save()
+                messages.success(request, "User added to the voting correctly")
+                status_code=ST_201
 
-        else:
-            messages.error(request, "You must be a staff member to access this page")
-            return HttpResponse(template.render({}, request), status=ST_401)
+            else:
+                messages.info(request, "The user was already assigned to the voting")
+                status_code = 200
+
+            return HttpResponse(template.render({}, request), status=status_code)
+
+    else:
+        messages.error(request, "You must be a staff member to access this page")
+        return HttpResponse(template.render({}, request), status=ST_401)
 
 def census_age(request):
     if request.user.is_staff:

From 04deb3da7b266b14772af966d6066631fb649285 Mon Sep 17 00:00:00 2001
From: joseluisps21 <joseluissfc4@gmail.com>
Date: Thu, 24 Nov 2022 19:05:49 +0100
Subject: [PATCH 4/4] fix: Some Conflicts resolved

Conflicts in views.py have been resolved
---
 decide/census/views.py | 132 +++++++++++++++++++++++++----------------
 1 file changed, 80 insertions(+), 52 deletions(-)

diff --git a/decide/census/views.py b/decide/census/views.py
index d95a0ca047..94e9fbe00b 100644
--- a/decide/census/views.py
+++ b/decide/census/views.py
@@ -145,19 +145,6 @@ def remove_from_census(request):
         messages.error(request, "You must be a staff member to access this page")
         return HttpResponse(template.render({'remove': True}, request), status=ST_401)
 
-
-def census_gender(request):
-    if request.user.is_staff:
-        template = loader.get_template("census_gender.html")
-        votings = Voting.objects.all()
-        try:
-            genders = set(u.gender for u in User.objects.all())
-        except BaseException:
-            genders = set()
-        context = {
-            'votings': votings,
-            'genders': genders,
-
 def census_group(request):
     if request.user.is_staff:
         template = loader.get_template("census_by_group.html")
@@ -166,7 +153,6 @@ def census_group(request):
         context = {
             'votings': votings,
             'users': users
-
         }
         return HttpResponse(template.render(context, request))
     else:
@@ -174,13 +160,30 @@ def census_group(request):
         messages.error(request, "You must be a staff member to access this page")
         return HttpResponse(template.render({}, request), status=ST_401)
 
+def census_maritialStatus(request):
+    if request.user.is_staff:
+        template = loader.get_template("census_maritialStatus.html")
+        votings = Voting.objects.all()
+        try:
+            maritialStatus = set(u.maritialStatus for u in User.objects.all())
+        except BaseException:
+            maritialStatus = set()
+        context = {
+            'votings': votings,
+            'maritialStatus': maritialStatus,
+        }
+        return HttpResponse(template.render(context, request))
+    else:
+        template = loader.get_template("result_page.html")
+        messages.error(request, "You must be a staff member to access this page")
+        return HttpResponse(template.render({}, request), status=ST_401)
 
-def add_by_gender_to_census(request):
+def add_by_maritialStatus_to_census(request):
     template = loader.get_template("result_page.html")
     if request.user.is_staff:
         voting_id = request.POST['voting-select']
-        genders = request.POST['gender-select']
-        users = User.objects.filter(gender in genders)
+        maritialStatus = request.POST['maritialStatus-select']
+        users = User.objects.filter(maritial_status in maritialStatus)
         for user in users:
             try:
                 census_by_voting = Census.objects.get(voting_id=voting_id,voter_id=user.id)
@@ -196,31 +199,73 @@ def add_by_gender_to_census(request):
             else:
                 messages.info(request, "The user was already assigned to the voting")
                 status_code = 200
-
+        
+        
             return HttpResponse(template.render({}, request), status=status_code)
 
     else:
         messages.error(request, "You must be a staff member to access this page")
         return HttpResponse(template.render({}, request), status=ST_401)
 
-def census_age(request):
+
+def census_nationality(request):
     if request.user.is_staff:
-        template = loader.get_template("census_age.html")
+        template = loader.get_template("census_nationality.html")
         votings = Voting.objects.all()
+        try:
+            nationality = set(u.nationality for u in User.objects.all())
+        except BaseException:
+            nationality = set()
         context = {
             'votings': votings,
+            'nationality': nationality,
+        }
+        return HttpResponse(template.render(context, request))
+    else:
+        template = loader.get_template("result_page.html")
+        messages.error(request, "You must be a staff member to access this page")
+        return HttpResponse(template.render({}, request), status=ST_401)
 
-def census_maritialStatus(request):
+def add_by_nationality_to_census(request):
+    template = loader.get_template("result_page.html")
     if request.user.is_staff:
-        template = loader.get_template("census_maritialStatus.html")
+        voting_id = request.POST['voting-select']
+        nation = request.POST['nationality-select']
+        users = User.objects.filter(nationality in nation)
+        for user in users:
+            try:
+                census_by_voting = Census.objects.get(voting_id=voting_id,voter_id=user.id)
+            except Census.DoesNotExist:
+                census_by_voting = None
+            status_code=404
+            if census_by_voting == None:
+                census = Census(voting_id=voting_id, voter_id=user.id)
+                census.save()
+                messages.success(request, "User added to the voting correctly")
+                status_code=ST_201
+
+            else:
+                messages.info(request, "The user was already assigned to the voting")
+                status_code = 200
+        
+        
+            return HttpResponse(template.render({}, request), status=status_code)
+
+    else:
+        messages.error(request, "You must be a staff member to access this page")
+        return HttpResponse(template.render({}, request), status=ST_401)
+            
+def census_gender(request):
+    if request.user.is_staff:
+        template = loader.get_template("census_gender.html")
         votings = Voting.objects.all()
         try:
-            maritialStatus = set(u.maritialStatus for u in User.objects.all())
+            genders = set(u.gender for u in User.objects.all())
         except BaseException:
-            maritialStatus = set()
+            genders = set()
         context = {
             'votings': votings,
-            'maritialStatus': maritialStatus,
+            'genders': genders,
         }
         return HttpResponse(template.render(context, request))
     else:
@@ -228,12 +273,12 @@ def census_maritialStatus(request):
         messages.error(request, "You must be a staff member to access this page")
         return HttpResponse(template.render({}, request), status=ST_401)
 
-def add_by_maritialStatus_to_census(request):
+def add_by_gender_to_census(request):
     template = loader.get_template("result_page.html")
     if request.user.is_staff:
         voting_id = request.POST['voting-select']
-        maritialStatus = request.POST['maritialStatus-select']
-        users = User.objects.filter(maritial_status in maritialStatus)
+        genders = request.POST['gender-select']
+        users = User.objects.filter(gender in genders)
         for user in users:
             try:
                 census_by_voting = Census.objects.get(voting_id=voting_id,voter_id=user.id)
@@ -249,26 +294,19 @@ def add_by_maritialStatus_to_census(request):
             else:
                 messages.info(request, "The user was already assigned to the voting")
                 status_code = 200
-        
-        
+
             return HttpResponse(template.render({}, request), status=status_code)
 
     else:
         messages.error(request, "You must be a staff member to access this page")
         return HttpResponse(template.render({}, request), status=ST_401)
 
-
-def census_nationality(request):
+def census_age(request):
     if request.user.is_staff:
-        template = loader.get_template("census_nationality.html")
+        template = loader.get_template("census_age.html")
         votings = Voting.objects.all()
-        try:
-            nationality = set(u.nationality for u in User.objects.all())
-        except BaseException:
-            nationality = set()
         context = {
             'votings': votings,
-            'nationality': nationality,
         }
         return HttpResponse(template.render(context, request))
     else:
@@ -276,6 +314,7 @@ def census_nationality(request):
         messages.error(request, "You must be a staff member to access this page")
         return HttpResponse(template.render({}, request), status=ST_401)
 
+
 def add_by_age_to_census(request):
     template = loader.get_template("result_page.html")
     if request.user.is_staff:
@@ -283,13 +322,6 @@ def add_by_age_to_census(request):
         minAge = request.POST['minimum-age']
         maxAge = request.POST['maximum-age']
         users = User.objects.filter(age >= minAge and age<=maxAge)
-
-def add_by_nationality_to_census(request):
-    template = loader.get_template("result_page.html")
-    if request.user.is_staff:
-        voting_id = request.POST['voting-select']
-        nation = request.POST['nationality-select']
-        users = User.objects.filter(nationality in nation)
         for user in users:
             try:
                 census_by_voting = Census.objects.get(voting_id=voting_id,voter_id=user.id)
@@ -305,14 +337,10 @@ def add_by_nationality_to_census(request):
             else:
                 messages.info(request, "The user was already assigned to the voting")
                 status_code = 200
-        
-        
+
+
             return HttpResponse(template.render({}, request), status=status_code)
 
     else:
         messages.error(request, "You must be a staff member to access this page")
-        return HttpResponse(template.render({}, request), status=ST_401)
-            
-    else:
-        messages.error(request, "You must be a staff member to access this page")
-        return HttpResponse(template.render({}, request), status=ST_401)
+        return HttpResponse(template.render({}, request), status=ST_401)
\ No newline at end of file