@@ -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
89125class 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
220240class TurnoutReportByGenderAndAdminAreasView (
221241 LoginRequiredMixin ,
0 commit comments