Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix generating Powerpoint report header #431

Merged
merged 6 commits into from
Aug 7, 2024
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ jobs:
python -m pip install --upgrade pip
pip install -r requirements/dev.pip
pip install pytest-cov
ruff . --exit-non-zero-on-fix
ruff check . --exit-non-zero-on-fix
pytest tally_ho --doctest-modules --junitxml=coverage.xml --cov=tally_ho --cov-report=xml --cov-report=html
coverage xml
ls -al
Expand Down
19 changes: 11 additions & 8 deletions tally_ho/apps/tally/views/reports/administrative_areas_reports.py
Original file line number Diff line number Diff line change
Expand Up @@ -1990,7 +1990,12 @@ def create_results_power_point_headers(tally_id, filtered_electrol_races, qs):
'sub_race_type': electrol_race.ballot_name}\
for electrol_race in filtered_electrol_races\
if electrol_race_has_results(qs, electrol_race)}

tally_stations_qs = Station.objects.filter(tally_id=tally_id)
stations_by_id =\
{
station.id:\
station for station in tally_stations_qs
}
# Calculate voters in counted stations and turnout percentage
for race_type_obj in race_data_by_election_level_names.values():
# race_type_obj =\
Expand All @@ -1999,8 +2004,7 @@ def create_results_power_point_headers(tally_id, filtered_electrol_races, qs):
election_level_name = race_type_obj.get('election_level')
# Calculate voters in counted stations
qs =\
Station.objects.filter(
tally_id=tally_id,
tally_stations_qs.filter(
center__resultform__ballot__electrol_race__election_level=\
election_level_name,
center__resultform__ballot__electrol_race__ballot_name=\
Expand All @@ -2015,13 +2019,12 @@ def create_results_power_point_headers(tally_id, filtered_electrol_races, qs):
race=F('center__resultform__ballot__electrol_race__election_level')
).values('id').annotate(
races=ArrayAgg('race', distinct=True),
number=F('station_number'),
num_registrants=F('registrants')
)
voters = 0
stations_processed = 0
registrants_in_processed_stations = 0
for station in station_ids_by_races:
station_obj = stations_by_id.get(station.get('id'))
# Calculate stations processed and total registrants
form_states =\
ResultForm.objects.filter(
Expand All @@ -2031,7 +2034,7 @@ def create_results_power_point_headers(tally_id, filtered_electrol_races, qs):
center__resultform__ballot__electrol_race__ballot_name=\
sub_race_type,
center__stations__id=station.get('id'),
station_number=station.get('number'),
station_number=station_obj.station_number,
).values_list('form_state', flat=True).distinct()

station_is_processed =\
Expand All @@ -2048,7 +2051,7 @@ def create_results_power_point_headers(tally_id, filtered_electrol_races, qs):

stations_processed += 1
registrants_in_processed_stations +=\
station.get('num_registrants')
station_obj.registrants

# Calculate voters voted in processed stations
votes =\
Expand All @@ -2059,7 +2062,7 @@ def create_results_power_point_headers(tally_id, filtered_electrol_races, qs):
result_form__ballot__electrol_race__ballot_name=\
sub_race_type,
result_form__center__stations__id=station.get('id'),
result_form__station_number=station.get('number'),
result_form__station_number=station_obj.station_number,
entry_version=EntryVersion.FINAL,
active=True,
).annotate(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ def get_stations_in_admin_area(tally_id, admin_level, admin_area):


def get_result_forms_for_station_in_admin_area(
tally_id, admin_level, admin_area, station
tally_id, admin_level, admin_area, station, station_obj
):
"""
get distinct result forms for a given station
Expand All @@ -84,12 +84,12 @@ def get_result_forms_for_station_in_admin_area(
tally__id=tally_id,
**area_filter_map,
center__stations__id=station.get('id'),
station_number=station.get('number'),
station_number=station_obj.station_number,
).values_list('form_state', flat=True).distinct()


def get_station_votes_in_admin_area(
tally_id, admin_level, admin_area, station
tally_id, admin_level, admin_area, station, station_obj
):
"""
Gets the station votes grouped by races for the given station.
Expand All @@ -108,7 +108,7 @@ def get_station_votes_in_admin_area(
result_form__tally__id=tally_id,
**area_filter_map,
result_form__center__stations__id=station.get('id'),
result_form__station_number=station.get('number'),
result_form__station_number=station_obj.station_number,
result_form__ballot__electrol_race_id__in=station.get('races'),
entry_version=EntryVersion.FINAL,
active=True,
Expand Down Expand Up @@ -148,6 +148,13 @@ def get_initial_queryset(self):

ret_value = []

tally_stations_qs = Station.objects.filter(tally_id=tally_id)
stations_by_id =\
{
station.id:\
station for station in tally_stations_qs
}

# Calculate voters in counted stations and turnout percentage
for area in admin_areas_qs:
response = {}
Expand All @@ -168,28 +175,30 @@ def get_initial_queryset(self):
race=F('center__resultform__ballot__electrol_race_id')
).values('id').annotate(
races=ArrayAgg('race', distinct=True),
number=F('station_number'),
num_registrants=F('registrants')
)
voters = 0
stations_processed = 0
registrants_in_processed_stations = 0
for station in station_ids_by_race:
station_obj = stations_by_id.get(station.get('id'))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same Could raise AttributeError if station.get('id') returns None

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The above response also applies here

# Calculate stations processed and total registrants
form_states = get_result_forms_for_station_in_admin_area(
tally_id,
admin_level, area_code, station
admin_level,
area_code,
station,
station_obj
)

if form_states.count() == 1 and \
form_states[0] == FormState.ARCHIVED:
stations_processed += 1
registrants_in_processed_stations += \
station.get('num_registrants')
station_obj.registrants
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could raise AttributeError if station_obj is None

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, so I have made sure we reuse the tally stations queryset used when creating stations_by_id that's used when defining station_obj. This will ensure we never encounter such an error


# Calculate voters voted in processed stations
votes = get_station_votes_in_admin_area(
tally_id, admin_level, area_code, station
tally_id, admin_level, area_code, station, station_obj
)

if votes.count() != 0:
Expand Down
Loading