Skip to content

Commit 2bd7c49

Browse files
committed
Make sure we are displaying all admin area gender turnout reports
1 parent d304754 commit 2bd7c49

File tree

1 file changed

+64
-44
lines changed

1 file changed

+64
-44
lines changed

tally_ho/apps/tally/views/reports/turnout_reports_by_gender.py

Lines changed: 64 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,42 @@ def get_invalid_votes_from_reconciliation_form(
8585
invalid_votes=Coalesce(Sum('number_invalid_votes'), 0)
8686
).get('invalid_votes')
8787

88+
def group_data_by_gender(
89+
tally_id,
90+
admin_level_filter_name
91+
):
92+
"""
93+
Group the data by gender
94+
:param tally_id: The id of the tally
95+
:param admin_level_filter_name: The name of the admin level filter
96+
:return: The grouped data by gender
97+
"""
98+
return ResultForm.objects.filter(
99+
tally__id=tally_id,
100+
).annotate(
101+
station_gender_code=station_gender_query(
102+
tally_id,
103+
center_code_filter_name='center__code',
104+
station_number_filter_name='station_number'),
105+
station_registrants=station_registrants_query(
106+
tally_id,
107+
center_code_filter_name='center__code',
108+
station_number_filter_name='station_number'),
109+
station_gender=Case(
110+
When(station_gender_code=0,
111+
then=V('Man')),
112+
default=V('Woman'),
113+
output_field=CharField()),
114+
admit_area_name=F(admin_level_filter_name),
115+
sub_race_type=F('ballot__electrol_race__ballot_name')
116+
).values(
117+
'admit_area_name',
118+
'station_gender_code',
119+
'station_gender',
120+
'sub_race_type'
121+
).annotate(
122+
total_registrants=Sum('station_registrants')
123+
)
88124

89125
class TurnoutReportByGenderAndAdminAreasDataView(
90126
LoginRequiredMixin, mixins.GroupRequiredMixin, mixins.TallyAccessMixin,
@@ -103,43 +139,22 @@ class TurnoutReportByGenderAndAdminAreasDataView(
103139
def get_initial_queryset(self):
104140
tally_id = self.kwargs.get('tally_id')
105141
admin_level = self.kwargs.get('admin_level')
106-
admin_level_filter_name = 'office__region__name'
142+
admin_level_filter_name = None
107143

108144
if admin_level == "office":
109145
admin_level_filter_name = 'office__name'
110146
elif admin_level == "constituency":
111147
admin_level_filter_name = 'center__constituency__name'
112148
elif admin_level == "sub_constituency":
113149
admin_level_filter_name = 'center__sub_constituency__name'
150+
else:
151+
admin_level_filter_name = 'office__region__name'
114152

115153
ret_value = []
116154

117-
turnout_data = ResultForm.objects.filter(
118-
tally__id=tally_id,
119-
form_state=FormState.ARCHIVED,
120-
).annotate(
121-
station_gender_code=station_gender_query(
122-
tally_id,
123-
center_code_filter_name='center__code',
124-
station_number_filter_name='station_number'),
125-
station_registrants=station_registrants_query(
126-
tally_id,
127-
center_code_filter_name='center__code',
128-
station_number_filter_name='station_number'),
129-
station_gender=Case(
130-
When(station_gender_code=0,
131-
then=V('Man')),
132-
default=V('Woman'),
133-
output_field=CharField()),
134-
admit_area_name=F(admin_level_filter_name),
135-
sub_race_type=F('ballot__electrol_race__ballot_name')
136-
).values(
137-
'admit_area_name',
138-
'station_gender_code',
139-
'station_gender',
140-
'sub_race_type'
141-
).annotate(
142-
total_registrants=Sum('station_registrants')
155+
turnout_data = group_data_by_gender(
156+
tally_id,
157+
admin_level_filter_name
143158
)
144159
for data in turnout_data:
145160
response = {}
@@ -185,8 +200,14 @@ def get_initial_queryset(self):
185200
response['turnout'] =\
186201
round(100 * voters / response['registrants'], 2)
187202
ret_value.append(response)
203+
ret_value = sorted(ret_value, key=lambda x: -x['turnout'])
188204
return ret_value
189205

206+
def get_aggregate(self, data):
207+
aggregate = get_aggregate_data(data)
208+
return self.prepare_results([aggregate])
209+
210+
190211
def render_column(self, row, column):
191212
if column in self.columns:
192213
col_value = row[column]
@@ -199,23 +220,22 @@ def render_column(self, row, column):
199220
TurnoutReportByGenderAndAdminAreasDataView, self
200221
).render_column(row, column)
201222

202-
def get_aggregate(self, data):
203-
aggregate = {}
204-
aggregate['admit_area_name'] = "Total"
205-
aggregate["sub_race"] = ""
206-
aggregate["human"] = ""
207-
aggregate["voters"] = sum(
208-
entry['voters'] for entry in
209-
data
210-
)
211-
aggregate["registrants"] = sum(
212-
entry['registrants'] for entry in
213-
data
214-
)
215-
aggregate["turnout"] =\
216-
round(100 * aggregate["voters"] / aggregate["registrants"], 2)
217-
return self.prepare_results([aggregate])
218-
223+
def get_aggregate_data(data):
224+
aggregate = {}
225+
aggregate['admit_area_name'] = "Total"
226+
aggregate["sub_race"] = "N/A"
227+
aggregate["human"] = "N/A"
228+
aggregate["voters"] = sum(
229+
entry['voters'] for entry in
230+
data
231+
)
232+
aggregate["registrants"] = sum(
233+
entry['registrants'] for entry in
234+
data
235+
)
236+
aggregate["turnout"] =\
237+
round(100 * aggregate["voters"] / aggregate["registrants"], 2)
238+
return aggregate
219239

220240
class TurnoutReportByGenderAndAdminAreasView(
221241
LoginRequiredMixin,

0 commit comments

Comments
 (0)