Skip to content

Commit 3f7be0f

Browse files
Merge pull request #777 from dinukadesilva/gh-735-enable-result-release-structure-pe-national-reports
gh-735: Enable result release structure for PE national reports
2 parents f8b8648 + 22a0718 commit 3f7be0f

File tree

5 files changed

+258
-88
lines changed

5 files changed

+258
-88
lines changed

results-tabulation-api/ext/ExtendedElection/ExtendedElectionParliamentaryElection2020/ExtendedTallySheet/ExtendedTallySheet_PE_21.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ def json(self):
116116
{
117117
"party_code": candidate_wise_result.partyAbbreviation,
118118
"party_name": candidate_wise_result.partyName,
119-
"candidate_number": candidate_wise_result.candidateNumber,
119+
"candidate_number": str(candidate_wise_result.candidateNumber),
120120
"candidate_name": candidate_wise_result.candidateName,
121121
"candidate_type": candidate_wise_result.candidateType
122122
} for candidate_wise_result in candidate_wise_results.itertuples()

results-tabulation-api/ext/ExtendedElection/ExtendedElectionParliamentaryElection2020/ExtendedTallySheet/ExtendedTallySheet_PE_AI_1.py

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,59 @@
99

1010

1111
class ExtendedTallySheet_PE_AI_1(ExtendedTallySheetReport):
12+
def on_get_release_result_params(self):
13+
pd_code = None
14+
pd_name = None
15+
ed_code = None
16+
ed_name = None
17+
18+
result_type = "RN_VSN"
19+
result_code = "FINAL"
20+
result_level = "NATIONAL"
21+
22+
return result_type, result_code, result_level, ed_code, ed_name, pd_code, pd_name
23+
1224
class ExtendedTallySheetVersion(ExtendedTallySheetReport.ExtendedTallySheetVersion):
25+
def json(self):
26+
extended_tally_sheet = self.tallySheet.get_extended_tally_sheet()
27+
result_type, result_code, result_level, ed_code, ed_name, pd_code, pd_name = extended_tally_sheet.on_get_release_result_params()
28+
29+
party_wise_results = self.get_party_wise_results().sort_values(
30+
by=["totalSeatsAllocated", "numValue", "electionPartyId"], ascending=[False, False, True]
31+
).reset_index()
32+
33+
registered_voters_count = self.tallySheetVersion.submission.area.get_registered_voters_count(
34+
vote_type=self.tallySheetVersion.submission.election.voteType)
35+
total_valid_vote_count = 0
36+
total_rejected_vote_count = self.get_rejected_vote_count_result()["numValue"].values[0]
37+
for party_wise_result in party_wise_results.itertuples():
38+
total_valid_vote_count += float(party_wise_result.numValue)
39+
total_vote_count = total_valid_vote_count + total_rejected_vote_count
40+
41+
return {
42+
"type": result_type,
43+
"level": result_level,
44+
"by_party": [
45+
{
46+
"party_code": party_wise_result.partyAbbreviation,
47+
"party_name": party_wise_result.partyName,
48+
"vote_count": int(party_wise_result.numValue),
49+
"vote_percentage": to_percentage((party_wise_result.numValue / total_valid_vote_count) * 100),
50+
"seat_count": int(party_wise_result.seatsAllocated),
51+
"national_list_seat_count": int(party_wise_result.nationalListSeatsAllocated),
52+
} for party_wise_result in party_wise_results.itertuples()
53+
],
54+
"summary": {
55+
"valid": int(total_valid_vote_count),
56+
"rejected": int(total_rejected_vote_count),
57+
"polled": int(total_vote_count),
58+
"electors": int(registered_voters_count),
59+
"percent_valid": to_percentage((total_valid_vote_count / registered_voters_count) * 100),
60+
"percent_rejected": to_percentage((total_rejected_vote_count / registered_voters_count) * 100),
61+
"percent_polled": to_percentage((total_vote_count / registered_voters_count) * 100)
62+
}
63+
}
64+
1365
def get_party_wise_results(self):
1466
party_wise_calculations_df = self.get_party_wise_valid_vote_count_result()
1567

@@ -88,9 +140,8 @@ def html(self, title="", total_registered_voters=None):
88140
content["totalVoteCounts"][0] = to_comma_seperated_num(total_vote_count)
89141
content["totalVoteCounts"][1] = to_percentage((total_vote_count / registered_voters_count) * 100)
90142

91-
# sort by total seat count descending
92-
party_wise_results = party_wise_results.sort_values(
93-
by=['totalSeatsAllocated'], ascending=False
143+
party_wise_results = self.get_party_wise_results().sort_values(
144+
by=["totalSeatsAllocated", "numValue", "electionPartyId"], ascending=[False, False, True]
94145
).reset_index()
95146

96147
for party_wise_result in party_wise_results.itertuples():
@@ -163,9 +214,8 @@ def html_letter(self, title="", total_registered_voters=None):
163214
content["totalVoteCounts"][0] = to_comma_seperated_num(total_vote_count)
164215
content["totalVoteCounts"][1] = to_percentage((total_vote_count / registered_voters_count) * 100)
165216

166-
# sort by total seat count descending
167-
party_wise_results = party_wise_results.sort_values(
168-
by=['totalSeatsAllocated'], ascending=False
217+
party_wise_results = self.get_party_wise_results().sort_values(
218+
by=["totalSeatsAllocated", "numValue", "electionPartyId"], ascending=[False, False, True]
169219
).reset_index()
170220

171221
for party_wise_result in party_wise_results.itertuples():

results-tabulation-api/ext/ExtendedElection/ExtendedElectionParliamentaryElection2020/ExtendedTallySheet/ExtendedTallySheet_PE_AI_2.py

Lines changed: 49 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,42 @@
88

99

1010
class ExtendedTallySheet_PE_AI_2(ExtendedTallySheetReport):
11+
def on_get_release_result_params(self):
12+
pd_code = None
13+
pd_name = None
14+
ed_code = None
15+
ed_name = None
16+
17+
result_type = "RN_SCNC"
18+
result_code = "FINAL"
19+
result_level = "NATIONAL"
20+
21+
return result_type, result_code, result_level, ed_code, ed_name, pd_code, pd_name
22+
1123
class ExtendedTallySheetVersion(ExtendedTallySheetReport.ExtendedTallySheetVersion):
12-
def get_elected_candidates(self):
24+
def json(self):
25+
extended_tally_sheet = self.tallySheet.get_extended_tally_sheet()
26+
result_type, result_code, result_level, ed_code, ed_name, pd_code, pd_name = extended_tally_sheet.on_get_release_result_params()
27+
28+
candidate_wise_results = self.get_candidate_wise_results().sort_values(
29+
by=['electionPartyId', "candidateId"], ascending=[True, True]
30+
).reset_index()
31+
32+
return {
33+
"type": result_type,
34+
"level": result_level,
35+
"by_candidate": [
36+
{
37+
"party_code": candidate_wise_result.partyAbbreviation,
38+
"party_name": candidate_wise_result.partyName,
39+
"candidate_number": candidate_wise_result.candidateNumber,
40+
"candidate_name": candidate_wise_result.candidateName,
41+
"candidate_type": candidate_wise_result.candidateType
42+
} for candidate_wise_result in candidate_wise_results.itertuples()
43+
]
44+
}
45+
46+
def get_candidate_wise_results(self):
1347
elected_candidates = self.df.loc[
1448
(self.df['templateRowType'] == TEMPLATE_ROW_TYPE_ELECTED_CANDIDATE) & (self.df['numValue'] == 0)]
1549

@@ -38,15 +72,15 @@ def html(self, title="", total_registered_voters=None):
3872
"time": stamp.createdAt.strftime("%H:%M:%S %p")
3973
}
4074

41-
elected_candidates = self.get_elected_candidates()
75+
candidate_wise_results = self.get_candidate_wise_results()
4276

43-
for elected_candidate in elected_candidates.itertuples():
77+
for candidate_wise_result in candidate_wise_results.itertuples():
4478
data_row = [
45-
elected_candidate.partyName,
46-
elected_candidate.partyAbbreviation,
47-
"National List" if elected_candidate.candidateType == CANDIDATE_TYPE_NATIONAL_LIST else elected_candidate.areaName,
48-
elected_candidate.candidateNumber,
49-
elected_candidate.candidateName
79+
candidate_wise_result.partyName,
80+
candidate_wise_result.partyAbbreviation,
81+
"National List" if candidate_wise_result.candidateType == CANDIDATE_TYPE_NATIONAL_LIST else candidate_wise_result.areaName,
82+
candidate_wise_result.candidateNumber,
83+
candidate_wise_result.candidateName
5084
]
5185

5286
content["data"].append(data_row)
@@ -77,15 +111,15 @@ def html_letter(self, title="", total_registered_voters=None):
77111
"time": stamp.createdAt.strftime("%H:%M:%S %p")
78112
}
79113

80-
elected_candidates = self.get_elected_candidates()
114+
candidate_wise_results = self.get_candidate_wise_results()
81115

82-
for elected_candidate in elected_candidates.itertuples():
116+
for candidate_wise_result in candidate_wise_results.itertuples():
83117
data_row = [
84-
elected_candidate.partyName,
85-
elected_candidate.partyAbbreviation,
86-
"National List" if elected_candidate.candidateType == CANDIDATE_TYPE_NATIONAL_LIST else elected_candidate.areaName,
87-
elected_candidate.candidateNumber,
88-
elected_candidate.candidateName
118+
candidate_wise_result.partyName,
119+
candidate_wise_result.partyAbbreviation,
120+
"National List" if candidate_wise_result.candidateType == CANDIDATE_TYPE_NATIONAL_LIST else candidate_wise_result.areaName,
121+
candidate_wise_result.candidateNumber,
122+
candidate_wise_result.candidateName
89123
]
90124

91125
content["data"].append(data_row)

results-tabulation-api/ext/ExtendedElection/ExtendedElectionParliamentaryElection2020/ExtendedTallySheet/ExtendedTallySheet_PE_AI_NL_2.py

Lines changed: 59 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,50 @@
1717

1818

1919
class ExtendedTallySheet_PE_AI_NL_2(ExtendedEditableTallySheetReport):
20+
def on_get_release_result_params(self):
21+
pd_code = None
22+
pd_name = None
23+
ed_code = None
24+
ed_name = None
25+
26+
result_type = "RN_NC"
27+
result_code = "FINAL"
28+
result_level = "NATIONAL"
29+
30+
return result_type, result_code, result_level, ed_code, ed_name, pd_code, pd_name
31+
2032
class ExtendedTallySheetVersion(ExtendedEditableTallySheetReport.ExtendedTallySheetVersion):
33+
def json(self):
34+
extended_tally_sheet = self.tallySheet.get_extended_tally_sheet()
35+
result_type, result_code, result_level, ed_code, ed_name, pd_code, pd_name = extended_tally_sheet.on_get_release_result_params()
36+
37+
candidate_wise_results = self.get_candidate_wise_results().sort_values(
38+
by=['electionPartyId', "candidateId"], ascending=[True, True]
39+
).reset_index()
40+
41+
return {
42+
"type": result_type,
43+
"level": result_level,
44+
"by_candidate": [
45+
{
46+
"party_code": candidate_wise_result.partyAbbreviation,
47+
"party_name": candidate_wise_result.partyName,
48+
"candidate_number": str(candidate_wise_result.candidateNumber),
49+
"candidate_name": candidate_wise_result.candidateName,
50+
"candidate_type": candidate_wise_result.candidateType
51+
} for candidate_wise_result in candidate_wise_results.itertuples()
52+
]
53+
}
54+
55+
def get_candidate_wise_results(self):
56+
candidate_wise_results = self.df.loc[
57+
(self.df['templateRowType'] == TEMPLATE_ROW_TYPE_ELECTED_CANDIDATE) & (self.df['numValue'] == 0)]
58+
59+
candidate_wise_results = candidate_wise_results.sort_values(
60+
by=['electionPartyId', 'candidateId'], ascending=True
61+
)
62+
63+
return candidate_wise_results
2164

2265
def get_post_save_request_content(self):
2366
tally_sheet_id = self.tallySheetVersion.tallySheetId
@@ -100,18 +143,15 @@ def html(self, title="", total_registered_voters=None):
100143
"time": stamp.createdAt.strftime("%H:%M:%S %p")
101144
}
102145

103-
elected_candidates_df = self.df.loc[
104-
(self.df['templateRowType'] == TEMPLATE_ROW_TYPE_ELECTED_CANDIDATE) & (self.df['numValue'] == 0)]
105-
106-
elected_candidates_df = elected_candidates_df.sort_values(
107-
by=['partyId', 'candidateId'], ascending=True
108-
)
146+
candidate_wise_results = self.get_candidate_wise_results().sort_values(
147+
by=['electionPartyId', "candidateId"], ascending=[True, True]
148+
).reset_index()
109149

110-
for index in elected_candidates_df.index:
111-
party_name = elected_candidates_df.at[index, "partyName"]
112-
party_abbreviation = elected_candidates_df.at[index, "partyAbbreviation"]
113-
candidate_number = elected_candidates_df.at[index, "candidateNumber"]
114-
candidate_name = elected_candidates_df.at[index, "candidateName"]
150+
for candidate_wise_result in candidate_wise_results.itertuples():
151+
party_name = candidate_wise_result.partyName
152+
party_abbreviation = candidate_wise_result.partyAbbreviation
153+
candidate_number = candidate_wise_result.candidateNumber
154+
candidate_name = candidate_wise_result.candidateName
115155
content["data"].append([
116156
party_name,
117157
party_abbreviation,
@@ -146,18 +186,15 @@ def html_letter(self, title="", total_registered_voters=None):
146186
"time": stamp.createdAt.strftime("%H:%M:%S %p")
147187
}
148188

149-
elected_candidates_df = self.df.loc[
150-
(self.df['templateRowType'] == TEMPLATE_ROW_TYPE_ELECTED_CANDIDATE) & (self.df['numValue'] == 0)]
151-
152-
elected_candidates_df = elected_candidates_df.sort_values(
153-
by=['partyId', 'candidateId'], ascending=True
154-
)
189+
candidate_wise_results = self.get_candidate_wise_results().sort_values(
190+
by=['electionPartyId', "candidateId"], ascending=[True, True]
191+
).reset_index()
155192

156-
for index in elected_candidates_df.index:
157-
party_name = elected_candidates_df.at[index, "partyName"]
158-
party_abbreviation = elected_candidates_df.at[index, "partyAbbreviation"]
159-
candidate_number = elected_candidates_df.at[index, "candidateNumber"]
160-
candidate_name = elected_candidates_df.at[index, "candidateName"]
193+
for candidate_wise_result in candidate_wise_results.itertuples():
194+
party_name = candidate_wise_result.partyName
195+
party_abbreviation = candidate_wise_result.partyAbbreviation
196+
candidate_number = candidate_wise_result.candidateNumber
197+
candidate_name = candidate_wise_result.candidateName
161198
content["data"].append([
162199
party_name,
163200
party_abbreviation,

0 commit comments

Comments
 (0)