From 6455dffcf92cef4217ee327036274e6f0d61fc7d Mon Sep 17 00:00:00 2001 From: JOHNMWASHUMA Date: Mon, 14 Oct 2024 18:03:50 +0300 Subject: [PATCH] Add support for exporting final candidates results in json format --- .../apps/tally/static/js/download_results.js | 14 ++-- .../tally/templates/reports/form_results.html | 19 +---- .../reports/administrative_areas_reports.py | 71 +++++++++++++++---- 3 files changed, 64 insertions(+), 40 deletions(-) diff --git a/tally_ho/apps/tally/static/js/download_results.js b/tally_ho/apps/tally/static/js/download_results.js index 1e47676aa..2a76a4402 100644 --- a/tally_ho/apps/tally/static/js/download_results.js +++ b/tally_ho/apps/tally/static/js/download_results.js @@ -10,24 +10,22 @@ $(document).ready(function () { a.remove(); }; - $("#report").on("click", "#export-form-results-presidential", function () { - $("#export-form-results-presidential").html("Exporting..."); - $("#export-form-results-presidential").prop("disabled", true); - const presidentialRaceTypeNumber = [5]; + $("#in-report").on("click", "#export-results", function () { + $("#export-results").html("Exporting..."); + $("#export-results").prop("disabled", true); $.ajax({ url: resultsDownloadUrl, data: { data: JSON.stringify({ tally_id: tallyId, - race_types: presidentialRaceTypeNumber }), }, traditional: true, dataType: 'json', success: (data) => { - downloadResults(data, 'presidential_results.json'); - $("#export-form-results-presidential").removeAttr("disabled"); - $("#export-form-results-presidential").html("Export Presidential Results in JSON"); + downloadResults(data, `results_${Date.now()}.json`); + $("#export-results").removeAttr("disabled"); + $("#export-results").html("Export Results in JSON"); }, }); }); diff --git a/tally_ho/apps/tally/templates/reports/form_results.html b/tally_ho/apps/tally/templates/reports/form_results.html index 3cdc6384c..eb3e88d5b 100644 --- a/tally_ho/apps/tally/templates/reports/form_results.html +++ b/tally_ho/apps/tally/templates/reports/form_results.html @@ -250,24 +250,9 @@

{% trans 'Candidate Results' %}

-
+
- - -
-

{% trans 'Number of leading candidates:' %}

- -
-
-
-
- -
-
+
diff --git a/tally_ho/apps/tally/views/reports/administrative_areas_reports.py b/tally_ho/apps/tally/views/reports/administrative_areas_reports.py index e456efa95..22cca8f2e 100644 --- a/tally_ho/apps/tally/views/reports/administrative_areas_reports.py +++ b/tally_ho/apps/tally/views/reports/administrative_areas_reports.py @@ -751,6 +751,11 @@ def results_queryset( candidate_name=F('candidate__full_name'), total_votes=Sum('votes'), gender=F('result_form__gender'), + center_code=F('result_form__center__code'), + center_name=F('result_form__center__name'), + office_number=F('result_form__office__number'), + office_name=F('result_form__office__name'), + station_number=F('result_form__station_number'), electrol_race_id=F( 'result_form__ballot__electrol_race__id'), election_level=F( @@ -759,6 +764,8 @@ def results_queryset( 'result_form__ballot__electrol_race__ballot_name'), sub_con_name=F( 'result_form__center__sub_constituency__name'), + sub_con_code=F( + 'result_form__center__sub_constituency__code'), order=F('candidate__order'), ballot_number=F('candidate__ballot__number'), candidate_status=Case( @@ -775,6 +782,11 @@ def results_queryset( candidate_name=F('candidate__full_name'), total_votes=Sum('votes'), gender=F('result_form__gender'), + center_code=F('result_form__center__code'), + center_name=F('result_form__center__name'), + office_number=F('result_form__office__number'), + office_name=F('result_form__office__name'), + station_number=F('result_form__station_number'), electrol_race_id=F( 'result_form__ballot__electrol_race__id'), election_level=F( @@ -783,6 +795,8 @@ def results_queryset( 'result_form__ballot__electrol_race__ballot_name'), sub_con_name=F( 'result_form__center__sub_constituency__name'), + sub_con_code=F( + 'result_form__center__sub_constituency__code'), order=F('candidate__order'), ballot_number=F('candidate__ballot__number'), candidate_status=Case( @@ -2147,29 +2161,56 @@ def get_results(request): returns: A JSON response of candidates results """ tally_id = json.loads(request.GET.get('data')).get('tally_id') - race_types = json.loads(request.GET.get('data')).get('race_types') - qs = Result.objects.filter( result_form__tally__id=tally_id, result_form__form_state=FormState.ARCHIVED, - result_form__ballot__electrol_race__election_level__in=\ - race_types, entry_version=EntryVersion.FINAL, active=True) - - data = results_queryset(tally_id, qs).values( - 'candidate_name', - 'total_votes', - 'ballot_number', - 'order', - 'candidate_status', - 'valid_votes', - 'election_level', - 'sub_race_type', + qs = results_queryset( + tally_id, + qs, + data=None ) + electrol_race_ids =\ + list(set([result.get('electrol_race_id') for result in qs])) + valid_votes_per_electrol_race_id =\ + { + id: total_valid_votes_with_recon_forms_per_electrol_race( + tally_id, + id + ) + + total_valid_votes_with_no_recon_forms_per_electrol_race( + tally_id, + id + ) for id in electrol_race_ids + } + results =\ + [{ + 'candidate_name': result.get('candidate_name'), + 'total_votes': result.get('total_votes'), + 'gender': result.get('gender').name, + 'election_level': result.get('election_level'), + 'sub_race_type': result.get('sub_race_type'), + 'order': result.get('order'), + 'ballot_number': result.get('ballot_number'), + 'candidate_status': result.get('candidate_status'), + 'center_code': result.get('center_code'), + 'center_name': result.get('center_name'), + 'office_number': result.get('office_number'), + 'office_name': result.get('office_name'), + 'station_number': result.get('station_number'), + 'sub_con_code': result.get('sub_con_code'), + 'valid_votes': + valid_votes_per_electrol_race_id.get( + result.get('electrol_race_id')), + 'sub_con_name': result.get('sub_con_name'), + } for result in qs] + + sorted_results_report = \ + sorted(results, key=lambda x: -x['total_votes']) return JsonResponse( - data={'data': list(data), 'created_at': timezone.now()}, + data={'data': sorted_results_report, 'created_at': timezone.now()}, safe=False) class SummaryReportDataView(LoginRequiredMixin,