Skip to content

Commit

Permalink
Add support for exporting final candidates results in json format
Browse files Browse the repository at this point in the history
  • Loading branch information
JohnMwashuma committed Oct 14, 2024
1 parent 1940021 commit 6455dff
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 40 deletions.
14 changes: 6 additions & 8 deletions tally_ho/apps/tally/static/js/download_results.js
Original file line number Diff line number Diff line change
Expand Up @@ -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");
},
});
});
Expand Down
19 changes: 2 additions & 17 deletions tally_ho/apps/tally/templates/reports/form_results.html
Original file line number Diff line number Diff line change
Expand Up @@ -250,24 +250,9 @@ <h1>{% trans 'Candidate Results' %}</h1>

<table class="display" id="candidate-results-report">
<caption style="margin-top: 2em; margin-left: -0.5em; margin-bottom: 2em;">
<div id="in-report" class="row">
<div id="in-report" class="row" style="float: left;margin-left: 0.5em;">
<div class="col-12" style="margin-bottom: 2em;">
<div class="col-3" style="padding-left: 0.5em; display: none">
<button id="export-form-results-presidential" class="btn btn-default btn-small">{% trans 'Export Presidential Results in JSON' %}</button>
</div>
<div class="col-3" style="padding-left: 0.5em; display: none">
<button id="export-form-results-parliamentary" class="btn btn-default btn-small">{% trans 'Export Parliamentary Results in JSON' %}</button>
</div>
<div class="col-6">
<p style="float: left; margin-right: 1em;" class="card-text">{% trans 'Number of leading candidates:' %}</p>
<input style="float: left; width: 4em;" type="number" min="1" value="0" id="export-number">
</div>
<div class="col-6">
<div class="card">
<div class="card-body">
<button style="float: right;" id="inc-ppt-export-report" class="btn btn-default btn-small">{% trans 'PowerPoint Export' %}</button>
</div>
</div>
<button id="export-results" class="btn btn-default btn-small">{% trans 'Export Results in JSON' %}</button>
</div>
</div>
<div class="col-12" style="margin-bottom: 2em;">
Expand Down
71 changes: 56 additions & 15 deletions tally_ho/apps/tally/views/reports/administrative_areas_reports.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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(
Expand All @@ -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(
Expand All @@ -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(
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit 6455dff

Please sign in to comment.