def finalize_support_and_oppose_positions_count(voter_id, show_positions_this_voter_follows, organizations_followed_by_voter, support_positions_list_for_one_ballot_item, oppose_positions_list_for_one_ballot_item): position_list_manager = PositionListManager() if show_positions_this_voter_follows: support_positions_followed = position_list_manager.calculate_positions_followed_by_voter( voter_id, support_positions_list_for_one_ballot_item, organizations_followed_by_voter) support_positions_count = len(support_positions_followed) oppose_positions_followed = position_list_manager.calculate_positions_followed_by_voter( voter_id, oppose_positions_list_for_one_ballot_item, organizations_followed_by_voter) oppose_positions_count = len(oppose_positions_followed) else: support_positions_not_followed = position_list_manager.calculate_positions_not_followed_by_voter( support_positions_list_for_one_ballot_item, organizations_followed_by_voter) support_positions_count = len(support_positions_not_followed) oppose_positions_not_followed = position_list_manager.calculate_positions_not_followed_by_voter( oppose_positions_list_for_one_ballot_item, organizations_followed_by_voter) oppose_positions_count = len(oppose_positions_not_followed) results = { 'support_positions_count': support_positions_count, 'oppose_positions_count': oppose_positions_count, } return results
def positions_public_count_for_candidate_campaign(candidate_id, stance_we_are_looking_for): """ We want to return a JSON file with the number of orgs and public figures who support this particular candidate's campaign """ # This implementation is built to make only two database calls. All other calculations are done here in the # application layer position_list_manager = PositionListManager() candidate_we_vote_id = '' all_positions_count_for_candidate_campaign = \ position_list_manager.retrieve_public_positions_count_for_candidate_campaign( candidate_id, candidate_we_vote_id, stance_we_are_looking_for) json_data = { 'status': 'SUCCESSFUL_RETRIEVE_OF_PUBLIC_POSITION_COUNT_RE_CANDIDATE', 'success': True, 'count': all_positions_count_for_candidate_campaign, } results = { 'json_data': json_data, } return results
def position_list_view(request): authority_required = {'verified_volunteer'} # admin, verified_volunteer if not voter_has_authority(request, authority_required): return redirect_to_sign_in_page(request, authority_required) messages_on_stage = get_messages(request) google_civic_election_id = convert_to_int(request.GET.get('google_civic_election_id', 0)) position_list_manager = PositionListManager() if positive_value_exists(google_civic_election_id): public_only = True position_list = position_list_manager.retrieve_all_positions_for_election(google_civic_election_id, ANY_STANCE, public_only) else: position_list = PositionEntered.objects.order_by('position_id')[:500] # This order_by is temp election_list = Election.objects.order_by('-election_day_text') template_values = { 'messages_on_stage': messages_on_stage, 'position_list': position_list, 'election_list': election_list, 'google_civic_election_id': google_civic_election_id, } return render(request, 'position/position_list.html', template_values)
def positions_public_count_for_contest_measure(measure_id, measure_we_vote_id, stance_we_are_looking_for): """ We want to return a JSON file with the number of orgs and public figures who support this particular measure """ # This implementation is built to make only two database calls. All other calculations are done here in the # application layer position_list_manager = PositionListManager() all_positions_count_for_contest_measure = \ position_list_manager.retrieve_public_positions_count_for_contest_measure( measure_id, measure_we_vote_id, stance_we_are_looking_for) if positive_value_exists(measure_id) or positive_value_exists(measure_we_vote_id): contest_measure_manager = ContestMeasureManager() # Since we can take in either measure_id or measure_we_vote_id, we need to retrieve the value we don't have if positive_value_exists(measure_id): measure_we_vote_id = contest_measure_manager.fetch_contest_measure_we_vote_id_from_id(measure_id) elif positive_value_exists(measure_we_vote_id): measure_id = contest_measure_manager.fetch_contest_measure_id_from_we_vote_id(measure_we_vote_id) json_data = { 'status': 'SUCCESSFUL_RETRIEVE_OF_PUBLIC_POSITION_COUNT_FOR_CONTEST_MEASURE', 'success': True, 'count': all_positions_count_for_contest_measure, 'ballot_item_id': convert_to_int(measure_id), 'ballot_item_we_vote_id': measure_we_vote_id, 'kind_of_ballot_item': MEASURE, } results = { 'json_data': json_data, } return results
def get(self, request, format=None): google_civic_election_id = convert_to_int(request.GET.get('google_civic_election_id', 0)) position_list_manager = PositionListManager() public_only = True position_list = position_list_manager.retrieve_all_positions_for_election(google_civic_election_id, ANY_STANCE, public_only) serializer = PositionSerializer(position_list, many=True) return Response(serializer.data)
def candidate_delete_process_view(request): """ Delete this candidate :param request: :return: """ authority_required = {'verified_volunteer'} # admin, verified_volunteer if not voter_has_authority(request, authority_required): return redirect_to_sign_in_page(request, authority_required) candidate_id = convert_to_int(request.GET.get('candidate_id', 0)) google_civic_election_id = request.GET.get('google_civic_election_id', 0) # Retrieve this candidate candidate_on_stage_found = False candidate_on_stage = CandidateCampaign() if positive_value_exists(candidate_id): try: candidate_query = CandidateCampaign.objects.filter(id=candidate_id) if len(candidate_query): candidate_on_stage = candidate_query[0] candidate_on_stage_found = True except Exception as e: messages.add_message(request, messages.ERROR, 'Could not find candidate -- exception.') if not candidate_on_stage_found: messages.add_message(request, messages.ERROR, 'Could not find candidate.') return HttpResponseRedirect(reverse('candidate:candidate_list', args=()) + "?google_civic_election_id=" + str(google_civic_election_id)) # Are there any positions attached to this candidate that should be moved to another # instance of this candidate? position_list_manager = PositionListManager() retrieve_public_positions = True # The alternate is positions for friends-only position_list = position_list_manager.retrieve_all_positions_for_candidate_campaign(retrieve_public_positions, candidate_id) if positive_value_exists(len(position_list)): positions_found_for_this_candidate = True else: positions_found_for_this_candidate = False try: if not positions_found_for_this_candidate: # Delete the candidate candidate_on_stage.delete() messages.add_message(request, messages.INFO, 'Candidate Campaign deleted.') else: messages.add_message(request, messages.ERROR, 'Could not delete -- ' 'positions still attached to this candidate.') return HttpResponseRedirect(reverse('candidate:candidate_edit', args=(candidate_id,))) except Exception as e: messages.add_message(request, messages.ERROR, 'Could not delete candidate -- exception.') return HttpResponseRedirect(reverse('candidate:candidate_edit', args=(candidate_id,))) return HttpResponseRedirect(reverse('candidate:candidate_list', args=()) + "?google_civic_election_id=" + str(google_civic_election_id))
def politician_delete_process_view(request): # TODO DALE Transition fully to politician """ Delete this politician :param request: :return: """ authority_required = {'verified_volunteer'} # admin, verified_volunteer if not voter_has_authority(request, authority_required): return redirect_to_sign_in_page(request, authority_required) politician_id = convert_to_int(request.GET.get('politician_id', 0)) # Retrieve this politician politician_on_stage_found = False politician_on_stage = Politician() if positive_value_exists(politician_id): try: politician_query = Politician.objects.filter(id=politician_id) if len(politician_query): politician_on_stage = politician_query[0] politician_on_stage_found = True except Exception as e: messages.add_message(request, messages.ERROR, 'Could not find politician -- exception.') if not politician_on_stage_found: messages.add_message(request, messages.ERROR, 'Could not find politician.') return HttpResponseRedirect(reverse('politician:politician_list', args=())) # Are there any positions attached to this politician that should be moved to another # instance of this politician? position_list_manager = PositionListManager() retrieve_public_positions = True # The alternate is positions for friends-only position_list = position_list_manager.retrieve_all_positions_for_politician(retrieve_public_positions, politician_id) if positive_value_exists(len(position_list)): positions_found_for_this_politician = True else: positions_found_for_this_politician = False try: if not positions_found_for_this_politician: # Delete the politician politician_on_stage.delete() messages.add_message(request, messages.INFO, 'Candidate Campaign deleted.') else: messages.add_message(request, messages.ERROR, 'Could not delete -- ' 'positions still attached to this politician.') return HttpResponseRedirect(reverse('politician:politician_edit', args=(politician_id,))) except Exception as e: messages.add_message(request, messages.ERROR, 'Could not delete politician -- exception.') return HttpResponseRedirect(reverse('politician:politician_edit', args=(politician_id,))) return HttpResponseRedirect(reverse('politician:politician_list', args=()))
def voter_guide_list_view(request): authority_required = {'verified_volunteer'} # admin, verified_volunteer if not voter_has_authority(request, authority_required): return redirect_to_sign_in_page(request, authority_required) google_civic_election_id = convert_to_int( request.GET.get('google_civic_election_id', 0)) voter_guide_list = [] voter_guide_list_object = VoterGuideListManager() if positive_value_exists(google_civic_election_id): results = voter_guide_list_object.retrieve_voter_guides_for_election( google_civic_election_id=google_civic_election_id) if results['success']: voter_guide_list = results['voter_guide_list'] else: order_by = "google_civic_election_id" results = voter_guide_list_object.retrieve_all_voter_guides(order_by) if results['success']: voter_guide_list = results['voter_guide_list'] modified_voter_guide_list = [] position_list_manager = PositionListManager() for one_voter_guide in voter_guide_list: # How many Publicly visible positions are there in this election on this voter guide? retrieve_public_positions = True one_voter_guide.number_of_public_positions = position_list_manager.fetch_positions_count_for_voter_guide( one_voter_guide.organization_we_vote_id, one_voter_guide.google_civic_election_id, retrieve_public_positions) # How many Friends-only visible positions are there in this election on this voter guide? retrieve_public_positions = False one_voter_guide.number_of_friends_only_positions = position_list_manager.fetch_positions_count_for_voter_guide( one_voter_guide.organization_we_vote_id, one_voter_guide.google_civic_election_id, retrieve_public_positions) modified_voter_guide_list.append(one_voter_guide) election_list = Election.objects.order_by('-election_day_text') messages_on_stage = get_messages(request) template_values = { 'election_list': election_list, 'google_civic_election_id': google_civic_election_id, 'messages_on_stage': messages_on_stage, 'voter_guide_list': modified_voter_guide_list, } return render(request, 'voter_guide/voter_guide_list.html', template_values)
def voter_guide_list_view(request): authority_required = {'verified_volunteer'} # admin, verified_volunteer if not voter_has_authority(request, authority_required): return redirect_to_sign_in_page(request, authority_required) google_civic_election_id = convert_to_int(request.GET.get('google_civic_election_id', 0)) voter_guide_list = [] voter_guide_list_object = VoterGuideListManager() if positive_value_exists(google_civic_election_id): results = voter_guide_list_object.retrieve_voter_guides_for_election( google_civic_election_id=google_civic_election_id) if results['success']: voter_guide_list = results['voter_guide_list'] else: order_by = "google_civic_election_id" results = voter_guide_list_object.retrieve_all_voter_guides(order_by) if results['success']: voter_guide_list = results['voter_guide_list'] modified_voter_guide_list = [] position_list_manager = PositionListManager() for one_voter_guide in voter_guide_list: # How many Publicly visible positions are there in this election on this voter guide? retrieve_public_positions = True one_voter_guide.number_of_public_positions = position_list_manager.fetch_positions_count_for_voter_guide( one_voter_guide.organization_we_vote_id, one_voter_guide.google_civic_election_id, retrieve_public_positions) # How many Friends-only visible positions are there in this election on this voter guide? retrieve_public_positions = False one_voter_guide.number_of_friends_only_positions = position_list_manager.fetch_positions_count_for_voter_guide( one_voter_guide.organization_we_vote_id, one_voter_guide.google_civic_election_id, retrieve_public_positions) modified_voter_guide_list.append(one_voter_guide) election_list = Election.objects.order_by('-election_day_text') messages_on_stage = get_messages(request) template_values = { 'election_list': election_list, 'google_civic_election_id': google_civic_election_id, 'messages_on_stage': messages_on_stage, 'voter_guide_list': modified_voter_guide_list, } return render(request, 'voter_guide/voter_guide_list.html', template_values)
def positions_count_for_candidate_campaign(voter_id, candidate_id, stance_we_are_looking_for, show_positions_this_voter_follows=True): """ We want to return a JSON file with the number of orgs, friends and public figures the voter follows who support this particular candidate's campaign """ # This implementation is built to make only two database calls. All other calculations are done here in the # application layer position_list_manager = PositionListManager() candidate_we_vote_id = '' all_positions_list_for_candidate_campaign = \ position_list_manager.retrieve_all_positions_for_candidate_campaign( candidate_id, candidate_we_vote_id, stance_we_are_looking_for) follow_organization_list_manager = FollowOrganizationList() organizations_followed_by_voter = \ follow_organization_list_manager.retrieve_follow_organization_by_voter_id_simple_id_array(voter_id) if show_positions_this_voter_follows: positions_followed = position_list_manager.calculate_positions_followed_by_voter( voter_id, all_positions_list_for_candidate_campaign, organizations_followed_by_voter) positions_followed_count = len(positions_followed) json_data = { 'status': 'SUCCESSFUL_RETRIEVE_OF_POSITIONS_FOLLOWED_RE_CANDIDATE', 'success': True, 'count': positions_followed_count, } results = { 'json_data': json_data, } return results else: positions_not_followed = position_list_manager.calculate_positions_not_followed_by_voter( all_positions_list_for_candidate_campaign, organizations_followed_by_voter) positions_not_followed_count = len(positions_not_followed) json_data = { 'status': 'SUCCESSFUL_RETRIEVE_OF_POSITIONS_NOT_FOLLOWED_CC', 'success': True, 'count': positions_not_followed_count, } results = { 'json_data': json_data, } return results
def positions_public_count_for_candidate_campaign(candidate_id, candidate_we_vote_id, stance_we_are_looking_for): """ We want to return a JSON file with the number of orgs and public figures who support this particular candidate's campaign """ # This implementation is built to make only two database calls. All other calculations are done here in the # application layer position_list_manager = PositionListManager() all_positions_count_for_candidate_campaign = \ position_list_manager.retrieve_public_positions_count_for_candidate_campaign( candidate_id, candidate_we_vote_id, stance_we_are_looking_for) if positive_value_exists(candidate_id) or positive_value_exists( candidate_we_vote_id): candidate_campaign_manager = CandidateCampaignManager() # Since we can take in either candidate_id or candidate_we_vote_id, we need to retrieve the value we don't have if positive_value_exists(candidate_id): candidate_we_vote_id = candidate_campaign_manager.fetch_candidate_campaign_we_vote_id_from_id( candidate_id) elif positive_value_exists(candidate_we_vote_id): candidate_id = candidate_campaign_manager.fetch_candidate_campaign_id_from_we_vote_id( candidate_we_vote_id) json_data = { 'status': 'SUCCESSFUL_RETRIEVE_OF_PUBLIC_POSITION_COUNT_RE_CANDIDATE', 'success': True, 'count': all_positions_count_for_candidate_campaign, 'ballot_item_id': convert_to_int(candidate_id), 'ballot_item_we_vote_id': candidate_we_vote_id, 'kind_of_ballot_item': CANDIDATE, } results = { 'json_data': json_data, } return results
def finalize_support_and_oppose_positions_count( voter_id, show_positions_this_voter_follows, organizations_followed_by_voter, support_positions_list_for_one_ballot_item, oppose_positions_list_for_one_ballot_item): position_list_manager = PositionListManager() if show_positions_this_voter_follows: support_positions_followed = position_list_manager.calculate_positions_followed_by_voter( voter_id, support_positions_list_for_one_ballot_item, organizations_followed_by_voter) support_positions_count = len(support_positions_followed) oppose_positions_followed = position_list_manager.calculate_positions_followed_by_voter( voter_id, oppose_positions_list_for_one_ballot_item, organizations_followed_by_voter) oppose_positions_count = len(oppose_positions_followed) else: support_positions_not_followed = position_list_manager.calculate_positions_not_followed_by_voter( support_positions_list_for_one_ballot_item, organizations_followed_by_voter) support_positions_count = len(support_positions_not_followed) oppose_positions_not_followed = position_list_manager.calculate_positions_not_followed_by_voter( oppose_positions_list_for_one_ballot_item, organizations_followed_by_voter) oppose_positions_count = len(oppose_positions_not_followed) results = { 'support_positions_count': support_positions_count, 'oppose_positions_count': oppose_positions_count, } return results
def retrieve_voter_guides_to_follow_by_election_for_api(voter_id, google_civic_election_id, search_string, maximum_number_to_retrieve=0, sort_by='', sort_order=''): voter_guide_list_found = False # Start with orgs followed and ignored by this voter follow_organization_list_manager = FollowOrganizationList() organizations_followed_by_voter = \ follow_organization_list_manager.retrieve_follow_organization_by_voter_id_simple_id_array(voter_id) organizations_ignored_by_voter = \ follow_organization_list_manager.retrieve_ignore_organization_by_voter_id_simple_id_array(voter_id) position_list_manager = PositionListManager() if positive_value_exists(google_civic_election_id): # This method finds all ballot_items in this election, and then retrieves *all* positions by any org or person # about each ballot_item. This will pick up We Vote positions or Vote Smart ratings, regardless of what time # period they were entered for. public_only = True # Do not return positions that are from friends only since we only want public positions all_positions_list_for_election = position_list_manager.retrieve_all_positions_for_election( google_civic_election_id, ANY_STANCE, public_only) else: voter_guide_list = [] results = { 'success': False, 'status': "VOTER_GUIDES_BALLOT_RELATED_VARIABLES_MISSING", 'voter_guide_list_found': False, 'voter_guide_list': voter_guide_list, } return results positions_list_minus_ignored = position_list_manager.remove_positions_ignored_by_voter( all_positions_list_for_election, organizations_ignored_by_voter) positions_list_minus_ignored_and_followed = position_list_manager.calculate_positions_not_followed_by_voter( positions_list_minus_ignored, organizations_followed_by_voter) if not len(positions_list_minus_ignored_and_followed): # If no positions are found, exit voter_guide_list = [] results = { 'success': True, 'status': "NO_VOTER_GUIDES_FOUND_FOR_THIS_ELECTION", 'voter_guide_list_found': False, 'voter_guide_list': voter_guide_list, } return results # We want to retrieve an ordered list of organization_we_vote_id's (not followed or ignored) that have a position # in this election. For speed we only retrieve full voter_guide data for the limited list that we need voter_guide_list_manager = VoterGuideListManager() # This is a list of orgs that the voter isn't following or ignoring org_list_found_by_google_civic_election_id = [] for one_position in positions_list_minus_ignored_and_followed: # If the if positive_value_exists(one_position.organization_we_vote_id) and \ positive_value_exists(one_position.google_civic_election_id): # Make sure we haven't already recorded that we want to retrieve the voter_guide for this org if one_position.organization_we_vote_id in org_list_found_by_google_civic_election_id: continue org_list_found_by_google_civic_election_id.append(one_position.organization_we_vote_id) # First, retrieve the voter_guides stored by org and google_civic_election_id if positive_value_exists(len(org_list_found_by_google_civic_election_id)): voter_guide_results = voter_guide_list_manager.retrieve_voter_guides_to_follow_by_election( google_civic_election_id, org_list_found_by_google_civic_election_id, search_string, maximum_number_to_retrieve, sort_by, sort_order) if voter_guide_results['voter_guide_list_found']: voter_guide_list_from_election_id = voter_guide_results['voter_guide_list'] else: voter_guide_list_from_election_id = [] else: voter_guide_list_from_election_id = [] # Second, retrieve the voter_guides stored by org & vote_smart_time_span # All positions were found above with position_list_manager.retrieve_all_positions_for_election # We give precedence to full voter guides from above, where we have an actual position of an org (as opposed to # Vote Smart ratings) maximum_number_of_guides_to_retrieve_by_time_span = \ maximum_number_to_retrieve - len(voter_guide_list_from_election_id) voter_guide_list = [] if positive_value_exists(maximum_number_of_guides_to_retrieve_by_time_span): org_list_found_by_time_span = [] orgs_we_need_found_by_position_and_time_span_list_of_dicts = [] for one_position in positions_list_minus_ignored_and_followed: # If this was a position found that was based on vote_smart_time_span... # (That is, ignore the positions already retrieved based on google_civic_election_id) if positive_value_exists(one_position.organization_we_vote_id) and \ positive_value_exists(one_position.vote_smart_time_span): # This shouldn't be possible, but we have it here for safety org_found_by_election_id_above = one_position.organization_we_vote_id in \ org_list_found_by_google_civic_election_id # If we already recorded that we want to look for this org under a different time span... org_found_by_different_time_span = one_position.organization_we_vote_id in \ org_list_found_by_time_span # Don't record that we want to look for a voter guide by this org we_vote_id or time span if org_found_by_election_id_above or org_found_by_different_time_span: continue org_list_found_by_time_span.append(one_position.organization_we_vote_id) one_position_dict = {'organization_we_vote_id': one_position.organization_we_vote_id, 'vote_smart_time_span': one_position.vote_smart_time_span} orgs_we_need_found_by_position_and_time_span_list_of_dicts.append(one_position_dict) voter_guide_time_span_results = voter_guide_list_manager.retrieve_voter_guides_to_follow_by_time_span( orgs_we_need_found_by_position_and_time_span_list_of_dicts, search_string, maximum_number_of_guides_to_retrieve_by_time_span, sort_by, sort_order) if voter_guide_time_span_results['voter_guide_list_found']: voter_guide_list_from_time_span = voter_guide_time_span_results['voter_guide_list'] else: voter_guide_list_from_time_span = [] # Merge these two lists # IFF we wanted to sort here: # voter_guide_list = sorted( # chain(voter_guide_list_from_election_id, voter_guide_list_from_time_span), # key=attrgetter(sort_by)) # But we don't, we just want to combine them with existing order voter_guide_list = list(chain(voter_guide_list_from_election_id, voter_guide_list_from_time_span)) status = 'SUCCESSFUL_RETRIEVE_OF_VOTER_GUIDES_BY_ELECTION' success = True if len(voter_guide_list): voter_guide_list_found = True results = { 'success': success, 'status': status, 'voter_guide_list_found': voter_guide_list_found, 'voter_guide_list': voter_guide_list, } return results
def election_migration_view(request): authority_required = {'admin'} # admin, verified_volunteer if not voter_has_authority(request, authority_required): return redirect_to_sign_in_page(request, authority_required) messages_on_stage = get_messages(request) election_manager = ElectionManager() we_vote_election = Election() office_list_manager = ContestOfficeListManager() candidate_list_manager = CandidateCampaignListManager() position_list_manager = PositionListManager() we_vote_election_office_list = [] google_civic_election_office_list = [] results = election_manager.retrieve_we_vote_elections() we_vote_election_list = results['election_list'] state_code_list = [] for election in we_vote_election_list: if election.state_code not in state_code_list: state_code_list.append(election.state_code) google_civic_election = Election() results = election_manager.retrieve_google_civic_elections_in_state_list( state_code_list) google_civic_election_list = results['election_list'] we_vote_election_id = convert_to_int( request.GET.get('we_vote_election_id', 0)) if not positive_value_exists(we_vote_election_id): we_vote_election_id = convert_to_int( request.POST.get('we_vote_election_id', 0)) if positive_value_exists(we_vote_election_id): results = election_manager.retrieve_election(we_vote_election_id) if results['election_found']: we_vote_election = results['election'] return_list_of_objects = True results = office_list_manager.retrieve_all_offices_for_upcoming_election( we_vote_election_id, return_list_of_objects) if results['office_list_found']: we_vote_election_office_list = results['office_list_objects'] # Go through each office and attach a list of candidates under this office we_vote_election_office_list_new = [] for one_office in we_vote_election_office_list: candidate_results = candidate_list_manager.retrieve_all_candidates_for_office( 0, one_office.we_vote_id) if candidate_results['candidate_list_found']: candidate_list = candidate_results['candidate_list'] new_candidate_list = [] # Go through candidate_list and find the number of positions saved for each candidate for candidate in candidate_list: retrieve_public_positions = True # The alternate is positions for friends-only position_list = position_list_manager.retrieve_all_positions_for_candidate_campaign( retrieve_public_positions, 0, candidate.we_vote_id) candidate.position_count = len( position_list ) # This is wasteful (instead of using count), but ok # Now find the candidates from the Google Civic Election that we might want to transfer data to new_candidate_list.append(candidate) one_office.candidate_list = new_candidate_list else: one_office.candidate_list = [] we_vote_election_office_list_new.append(one_office) google_civic_election_id = convert_to_int( request.GET.get('google_civic_election_id', 0)) if not positive_value_exists(google_civic_election_id): google_civic_election_id = convert_to_int( request.POST.get('google_civic_election_id', 0)) if positive_value_exists(google_civic_election_id): results = election_manager.retrieve_election(google_civic_election_id) if results['election_found']: google_civic_election = results['election'] return_list_of_objects = True results = office_list_manager.retrieve_all_offices_for_upcoming_election( google_civic_election_id, return_list_of_objects) if results['office_list_found']: google_civic_election_office_list = results[ 'office_list_objects'] # We want to transfer the transfer_array = {} transfer_array['wv01off1461'] = "wv02off269" template_values = { 'messages_on_stage': messages_on_stage, 'we_vote_election': we_vote_election, 'we_vote_election_id': we_vote_election_id, 'we_vote_election_list': we_vote_election_list, 'we_vote_election_office_list': we_vote_election_office_list_new, 'google_civic_election': google_civic_election, 'google_civic_election_id': google_civic_election_id, 'google_civic_election_list': google_civic_election_list, 'google_civic_election_office_list': google_civic_election_office_list, } return render(request, 'election/election_migration.html', template_values)
def positions_count_for_all_ballot_items_for_api( voter_device_id, google_civic_election_id=0, show_positions_this_voter_follows=True): """ We want to return a JSON file with the a list of the support and oppose counts from the orgs, friends and public figures the voter follows """ # Get voter_id from the voter_device_id so we can know whose stars to retrieve results = is_voter_device_id_valid(voter_device_id) if not results['success']: json_data = { 'status': "VALID_VOTER_DEVICE_ID_MISSING-COUNT_FOR_ALL_BALLOT_ITEMS", 'success': False, 'google_civic_election_id': google_civic_election_id, 'ballot_item_list': [], } return json_data voter_id = fetch_voter_id_from_voter_device_link(voter_device_id) if not positive_value_exists(voter_id): json_data = { 'status': "VALID_VOTER_ID_MISSING-COUNT_FOR_ALL_BALLOT_ITEMS", 'success': False, 'google_civic_election_id': google_civic_election_id, 'ballot_item_list': [], } return json_data if not positive_value_exists(google_civic_election_id): # We must have an election id to proceed -- otherwise we don't know what ballot items to work with voter_device_link_manager = VoterDeviceLinkManager() voter_device_link_results = voter_device_link_manager.retrieve_voter_device_link( voter_device_id) if voter_device_link_results['voter_device_link_found']: voter_device_link = voter_device_link_results['voter_device_link'] if positive_value_exists( voter_device_link.google_civic_election_id): google_civic_election_id = voter_device_link.google_civic_election_id if not positive_value_exists(google_civic_election_id): voter_address_manager = VoterAddressManager() voter_address_results = voter_address_manager.retrieve_address( 0, voter_id) if voter_address_results['voter_address_found']: voter_address = voter_address_results['voter_address'] if positive_value_exists( voter_address.google_civic_election_id): google_civic_election_id = voter_address.google_civic_election_id google_civic_election_id = convert_to_int(google_civic_election_id) if not positive_value_exists(google_civic_election_id): json_data = { 'status': "GOOGLE_CIVIC_ELECTION_ID_MISSING-COUNT_FOR_ALL_BALLOT_ITEMS", 'success': False, 'google_civic_election_id': google_civic_election_id, 'ballot_item_list': [], } return json_data position_list_manager = PositionListManager() candidate_list_object = CandidateCampaignList() follow_organization_list_manager = FollowOrganizationList() organizations_followed_by_voter = \ follow_organization_list_manager.retrieve_follow_organization_by_voter_id_simple_id_array(voter_id) # Get a list of all candidates and measures from this election (in the active election) ballot_item_results = voter_ballot_items_retrieve_for_one_election_for_api( voter_device_id, voter_id, google_civic_election_id) ballot_item_list = ballot_item_results['ballot_item_list'] # The list where we capture results ballot_item_list_results = [] # ballot_item_list is populated with contest_office and contest_measure entries for one_ballot_item in ballot_item_list: # Retrieve all positions for each ballot item if one_ballot_item['kind_of_ballot_item'] == OFFICE: results = candidate_list_object.retrieve_all_candidates_for_office( 0, one_ballot_item['we_vote_id']) success = results['success'] candidate_list = results['candidate_list'] if success: for candidate in candidate_list: # Loop through all candidates under this office support_positions_list_for_one_ballot_item = \ position_list_manager.retrieve_all_positions_for_candidate_campaign( 0, candidate.we_vote_id, SUPPORT) oppose_positions_list_for_one_ballot_item = \ position_list_manager.retrieve_all_positions_for_candidate_campaign( 0, candidate.we_vote_id, OPPOSE) finalize_results = finalize_support_and_oppose_positions_count( voter_id, show_positions_this_voter_follows, organizations_followed_by_voter, support_positions_list_for_one_ballot_item, oppose_positions_list_for_one_ballot_item) one_ballot_item_results = { 'ballot_item_we_vote_id': candidate.we_vote_id, 'support_count': finalize_results['support_positions_count'], 'oppose_count': finalize_results['oppose_positions_count'], } ballot_item_list_results.append(one_ballot_item_results) elif one_ballot_item['kind_of_ballot_item'] == MEASURE: support_positions_list_for_one_ballot_item = \ position_list_manager.retrieve_all_positions_for_contest_measure(0, one_ballot_item['we_vote_id'], SUPPORT) oppose_positions_list_for_one_ballot_item = \ position_list_manager.retrieve_all_positions_for_contest_measure(0, one_ballot_item['we_vote_id'], OPPOSE) finalize_results = finalize_support_and_oppose_positions_count( voter_id, show_positions_this_voter_follows, organizations_followed_by_voter, support_positions_list_for_one_ballot_item, oppose_positions_list_for_one_ballot_item) one_ballot_item_results = { 'ballot_item_we_vote_id': one_ballot_item['we_vote_id'], 'support_count': finalize_results['support_positions_count'], 'oppose_count': finalize_results['oppose_positions_count'], } ballot_item_list_results.append(one_ballot_item_results) else: # Skip the rest of this loop continue json_data = { 'success': True, 'status': "POSITIONS_COUNT_FOR_ALL_BALLOT_ITEMS", 'google_civic_election_id': google_civic_election_id, 'ballot_item_list': ballot_item_list_results, } return json_data
def positions_count_for_candidate_campaign(voter_id, candidate_id, candidate_we_vote_id, stance_we_are_looking_for, show_positions_this_voter_follows=True): """ We want to return a JSON file with the number of orgs, friends and public figures the voter follows who support this particular candidate's campaign """ # This implementation is built to make limited database calls. We do as many calculations as we can here in the # application layer position_list_manager = PositionListManager() all_positions_list_for_candidate_campaign = \ position_list_manager.retrieve_all_positions_for_candidate_campaign( candidate_id, candidate_we_vote_id, stance_we_are_looking_for) follow_organization_list_manager = FollowOrganizationList() organizations_followed_by_voter = \ follow_organization_list_manager.retrieve_follow_organization_by_voter_id_simple_id_array(voter_id) # Since we can take in either candidate_id or candidate_we_vote_id, we need to retrieve the candidate object # so we make sure we have both of these values to return if positive_value_exists(candidate_id): candidate_campaign_manager = CandidateCampaignManager() results = candidate_campaign_manager.retrieve_candidate_campaign_from_id(candidate_id) if results['candidate_campaign_found']: candidate_campaign = results['candidate_campaign'] candidate_we_vote_id = candidate_campaign.we_vote_id elif positive_value_exists(candidate_we_vote_id): candidate_campaign_manager = CandidateCampaignManager() results = candidate_campaign_manager.retrieve_candidate_campaign_from_we_vote_id(candidate_we_vote_id) if results['candidate_campaign_found']: candidate_campaign = results['candidate_campaign'] candidate_id = candidate_campaign.id if show_positions_this_voter_follows: positions_followed = position_list_manager.calculate_positions_followed_by_voter( voter_id, all_positions_list_for_candidate_campaign, organizations_followed_by_voter) positions_followed_count = len(positions_followed) json_data = { 'status': 'SUCCESSFUL_RETRIEVE_OF_POSITIONS_FOLLOWED_RE_CANDIDATE', 'success': True, 'count': positions_followed_count, 'ballot_item_id': convert_to_int(candidate_id), 'ballot_item_we_vote_id': candidate_we_vote_id, 'kind_of_ballot_item': CANDIDATE, } results = { 'json_data': json_data, } return results else: positions_not_followed = position_list_manager.calculate_positions_not_followed_by_voter( all_positions_list_for_candidate_campaign, organizations_followed_by_voter) positions_not_followed_count = len(positions_not_followed) json_data = { 'status': 'SUCCESSFUL_RETRIEVE_OF_POSITIONS_NOT_FOLLOWED_CC', 'success': True, 'count': positions_not_followed_count, 'ballot_item_id': convert_to_int(candidate_id), 'ballot_item_we_vote_id': candidate_we_vote_id, 'kind_of_ballot_item': CANDIDATE, } results = { 'json_data': json_data, } return results
def election_migration_view(request): authority_required = {'admin'} # admin, verified_volunteer if not voter_has_authority(request, authority_required): return redirect_to_sign_in_page(request, authority_required) messages_on_stage = get_messages(request) election_manager = ElectionManager() we_vote_election = Election() office_list_manager = ContestOfficeListManager() candidate_list_manager = CandidateCampaignListManager() position_list_manager = PositionListManager() we_vote_election_office_list = [] google_civic_election_office_list = [] results = election_manager.retrieve_we_vote_elections() we_vote_election_list = results['election_list'] state_code_list = [] for election in we_vote_election_list: if election.state_code not in state_code_list: state_code_list.append(election.state_code) google_civic_election = Election() results = election_manager.retrieve_google_civic_elections_in_state_list(state_code_list) google_civic_election_list = results['election_list'] we_vote_election_id = convert_to_int(request.GET.get('we_vote_election_id', 0)) if not positive_value_exists(we_vote_election_id): we_vote_election_id = convert_to_int(request.POST.get('we_vote_election_id', 0)) if positive_value_exists(we_vote_election_id): results = election_manager.retrieve_election(we_vote_election_id) if results['election_found']: we_vote_election = results['election'] return_list_of_objects = True results = office_list_manager.retrieve_all_offices_for_upcoming_election(we_vote_election_id, return_list_of_objects) if results['office_list_found']: we_vote_election_office_list = results['office_list_objects'] # Go through each office and attach a list of candidates under this office we_vote_election_office_list_new = [] for one_office in we_vote_election_office_list: candidate_results = candidate_list_manager.retrieve_all_candidates_for_office(0, one_office.we_vote_id) if candidate_results['candidate_list_found']: candidate_list = candidate_results['candidate_list'] new_candidate_list = [] # Go through candidate_list and find the number of positions saved for each candidate for candidate in candidate_list: retrieve_public_positions = True # The alternate is positions for friends-only position_list = position_list_manager.retrieve_all_positions_for_candidate_campaign( retrieve_public_positions, 0, candidate.we_vote_id) candidate.position_count = len(position_list) # This is wasteful (instead of using count), but ok # Now find the candidates from the Google Civic Election that we might want to transfer data to new_candidate_list.append(candidate) one_office.candidate_list = new_candidate_list else: one_office.candidate_list = [] we_vote_election_office_list_new.append(one_office) google_civic_election_id = convert_to_int(request.GET.get('google_civic_election_id', 0)) if not positive_value_exists(google_civic_election_id): google_civic_election_id = convert_to_int(request.POST.get('google_civic_election_id', 0)) if positive_value_exists(google_civic_election_id): results = election_manager.retrieve_election(google_civic_election_id) if results['election_found']: google_civic_election = results['election'] return_list_of_objects = True results = office_list_manager.retrieve_all_offices_for_upcoming_election(google_civic_election_id, return_list_of_objects) if results['office_list_found']: google_civic_election_office_list = results['office_list_objects'] # We want to transfer the transfer_array = {} transfer_array['wv01off1461'] = "wv02off269" template_values = { 'messages_on_stage': messages_on_stage, 'we_vote_election': we_vote_election, 'we_vote_election_id': we_vote_election_id, 'we_vote_election_list': we_vote_election_list, 'we_vote_election_office_list': we_vote_election_office_list_new, 'google_civic_election': google_civic_election, 'google_civic_election_id': google_civic_election_id, 'google_civic_election_list': google_civic_election_list, 'google_civic_election_office_list': google_civic_election_office_list, } return render(request, 'election/election_migration.html', template_values)
def retrieve_voter_guides_to_follow_by_ballot_item(voter_id, kind_of_ballot_item, ballot_item_we_vote_id, search_string): voter_guide_list_found = False position_list_manager = PositionListManager() if (kind_of_ballot_item == CANDIDATE) and positive_value_exists(ballot_item_we_vote_id): candidate_id = 0 all_positions_list = position_list_manager.retrieve_all_positions_for_candidate_campaign( candidate_id, ballot_item_we_vote_id, ANY_STANCE) elif (kind_of_ballot_item == MEASURE) and positive_value_exists(ballot_item_we_vote_id): measure_id = 0 all_positions_list = position_list_manager.retrieve_all_positions_for_contest_measure( measure_id, ballot_item_we_vote_id, ANY_STANCE) elif (kind_of_ballot_item == OFFICE) and positive_value_exists(ballot_item_we_vote_id): office_id = 0 all_positions_list = position_list_manager.retrieve_all_positions_for_contest_office( office_id, ballot_item_we_vote_id, ANY_STANCE) else: voter_guide_list = [] results = { 'success': False, 'status': "VOTER_GUIDES_BALLOT_RELATED_VARIABLES_MISSING", 'search_string': search_string, 'voter_guide_list_found': False, 'voter_guide_list': voter_guide_list, } return results follow_organization_list_manager = FollowOrganizationList() organizations_followed_by_voter = \ follow_organization_list_manager.retrieve_follow_organization_by_voter_id_simple_id_array(voter_id) positions_list = position_list_manager.calculate_positions_not_followed_by_voter( all_positions_list, organizations_followed_by_voter) voter_guide_list = [] # Cycle through the positions held by groups that you don't currently follow voter_guide_manager = VoterGuideManager() for one_position in positions_list: if positive_value_exists(one_position.organization_we_vote_id): if one_position.google_civic_election_id: results = voter_guide_manager.retrieve_voter_guide( voter_guide_id=0, google_civic_election_id=one_position. google_civic_election_id, vote_smart_time_span=None, organization_we_vote_id=one_position. organization_we_vote_id) else: # vote_smart_time_span results = voter_guide_manager.retrieve_voter_guide( voter_guide_id=0, google_civic_election_id=0, vote_smart_time_span=one_position.vote_smart_time_span, organization_we_vote_id=one_position. organization_we_vote_id) elif positive_value_exists(one_position.public_figure_we_vote_id): results['voter_guide_found'] = False elif positive_value_exists(one_position.voter_we_vote_id): results['voter_guide_found'] = False else: results['voter_guide_found'] = False if results['voter_guide_found']: voter_guide = results['voter_guide'] # If we passed in search_string, make sure they are in this entry. # If they aren't, don't return voter guide if positive_value_exists(search_string): search_string = str( search_string) # Make sure search_string is a string twitter_handle = str(voter_guide.twitter_handle) display_name = str(voter_guide.display_name) if search_string.lower() in twitter_handle.lower( ) or search_string.lower() in display_name.lower(): voter_guide_list.append(voter_guide) else: voter_guide_list.append(voter_guide) status = 'SUCCESSFUL_RETRIEVE_OF_VOTER_GUIDES_BY_BALLOT_ITEM' success = True if len(voter_guide_list): voter_guide_list_found = True results = { 'success': success, 'status': status, 'search_string': search_string, 'voter_guide_list_found': voter_guide_list_found, 'voter_guide_list': voter_guide_list, } return results
def retrieve_voter_guides_to_follow_by_election_for_api( voter_id, google_civic_election_id, search_string, maximum_number_to_retrieve=0, sort_by='', sort_order=''): voter_guide_list_found = False # Start with orgs followed and ignored by this voter follow_organization_list_manager = FollowOrganizationList() organizations_followed_by_voter = \ follow_organization_list_manager.retrieve_follow_organization_by_voter_id_simple_id_array(voter_id) organizations_ignored_by_voter = \ follow_organization_list_manager.retrieve_ignore_organization_by_voter_id_simple_id_array(voter_id) position_list_manager = PositionListManager() if positive_value_exists(google_civic_election_id): # This method finds all ballot_items in this election, and then retrieves *all* positions by any org or person # about each ballot_item. This will pick up We Vote positions or Vote Smart ratings, regardless of what time # period they were entered for. all_positions_list_for_election = position_list_manager.retrieve_all_positions_for_election( google_civic_election_id, ANY_STANCE) else: voter_guide_list = [] results = { 'success': False, 'status': "VOTER_GUIDES_BALLOT_RELATED_VARIABLES_MISSING", 'voter_guide_list_found': False, 'voter_guide_list': voter_guide_list, } return results positions_list_minus_ignored = position_list_manager.remove_positions_ignored_by_voter( all_positions_list_for_election, organizations_ignored_by_voter) positions_list_minus_ignored_and_followed = position_list_manager.calculate_positions_not_followed_by_voter( positions_list_minus_ignored, organizations_followed_by_voter) if not len(positions_list_minus_ignored_and_followed): # If no positions are found, exit voter_guide_list = [] results = { 'success': True, 'status': "NO_VOTER_GUIDES_FOUND_FOR_THIS_ELECTION", 'voter_guide_list_found': False, 'voter_guide_list': voter_guide_list, } return results # We want to retrieve an ordered list of organization_we_vote_id's (not followed or ignored) that have a position # in this election. For speed we only retrieve full voter_guide data for the limited list that we need voter_guide_list_manager = VoterGuideList() # This is a list of orgs that the voter isn't following or ignoring org_list_found_by_google_civic_election_id = [] for one_position in positions_list_minus_ignored_and_followed: # If the if positive_value_exists(one_position.organization_we_vote_id) and \ positive_value_exists(one_position.google_civic_election_id): # Make sure we haven't already recorded that we want to retrieve the voter_guide for this org if one_position.organization_we_vote_id in org_list_found_by_google_civic_election_id: continue org_list_found_by_google_civic_election_id.append( one_position.organization_we_vote_id) # First, retrieve the voter_guides stored by org and google_civic_election_id if positive_value_exists(len(org_list_found_by_google_civic_election_id)): voter_guide_results = voter_guide_list_manager.retrieve_voter_guides_to_follow_by_election( google_civic_election_id, org_list_found_by_google_civic_election_id, search_string, maximum_number_to_retrieve, sort_by, sort_order) if voter_guide_results['voter_guide_list_found']: voter_guide_list_from_election_id = voter_guide_results[ 'voter_guide_list'] else: voter_guide_list_from_election_id = [] else: voter_guide_list_from_election_id = [] # Second, retrieve the voter_guides stored by org & vote_smart_time_span # All positions were found above with position_list_manager.retrieve_all_positions_for_election # We give precedence to full voter guides from above, where we have an actual position of an org (as opposed to # Vote Smart ratings) maximum_number_of_guides_to_retrieve_by_time_span = \ maximum_number_to_retrieve - len(voter_guide_list_from_election_id) voter_guide_list = [] if positive_value_exists( maximum_number_of_guides_to_retrieve_by_time_span): org_list_found_by_time_span = [] orgs_we_need_found_by_position_and_time_span_list_of_dicts = [] for one_position in positions_list_minus_ignored_and_followed: # If this was a position found that was based on vote_smart_time_span... # (That is, ignore the positions already retrieved based on google_civic_election_id) if positive_value_exists(one_position.organization_we_vote_id) and \ positive_value_exists(one_position.vote_smart_time_span): # This shouldn't be possible, but we have it here for safety org_found_by_election_id_above = one_position.organization_we_vote_id in \ org_list_found_by_google_civic_election_id # If we already recorded that we want to look for this org under a different time span... org_found_by_different_time_span = one_position.organization_we_vote_id in \ org_list_found_by_time_span # Don't record that we want to look for a voter guide by this org we_vote_id or time span if org_found_by_election_id_above or org_found_by_different_time_span: continue org_list_found_by_time_span.append( one_position.organization_we_vote_id) one_position_dict = { 'organization_we_vote_id': one_position.organization_we_vote_id, 'vote_smart_time_span': one_position.vote_smart_time_span } orgs_we_need_found_by_position_and_time_span_list_of_dicts.append( one_position_dict) voter_guide_time_span_results = voter_guide_list_manager.retrieve_voter_guides_to_follow_by_time_span( orgs_we_need_found_by_position_and_time_span_list_of_dicts, search_string, maximum_number_of_guides_to_retrieve_by_time_span, sort_by, sort_order) if voter_guide_time_span_results['voter_guide_list_found']: voter_guide_list_from_time_span = voter_guide_time_span_results[ 'voter_guide_list'] else: voter_guide_list_from_time_span = [] # Merge these two lists # IFF we wanted to sort here: # voter_guide_list = sorted( # chain(voter_guide_list_from_election_id, voter_guide_list_from_time_span), # key=attrgetter(sort_by)) # But we don't, we just want to combine them with existing order voter_guide_list = list( chain(voter_guide_list_from_election_id, voter_guide_list_from_time_span)) status = 'SUCCESSFUL_RETRIEVE_OF_VOTER_GUIDES_BY_ELECTION' success = True if len(voter_guide_list): voter_guide_list_found = True results = { 'success': success, 'status': status, 'voter_guide_list_found': voter_guide_list_found, 'voter_guide_list': voter_guide_list, } return results
def positions_count_for_all_ballot_items_for_api(voter_device_id, google_civic_election_id=0, show_positions_this_voter_follows=True): """ We want to return a JSON file with the a list of the support and oppose counts from the orgs, friends and public figures the voter follows """ # Get voter_id from the voter_device_id so we can know whose stars to retrieve results = is_voter_device_id_valid(voter_device_id) if not results['success']: json_data = { 'status': "VALID_VOTER_DEVICE_ID_MISSING-COUNT_FOR_ALL_BALLOT_ITEMS", 'success': False, 'google_civic_election_id': google_civic_election_id, 'ballot_item_list': [], } return json_data voter_id = fetch_voter_id_from_voter_device_link(voter_device_id) if not positive_value_exists(voter_id): json_data = { 'status': "VALID_VOTER_ID_MISSING-COUNT_FOR_ALL_BALLOT_ITEMS", 'success': False, 'google_civic_election_id': google_civic_election_id, 'ballot_item_list': [], } return json_data if not positive_value_exists(google_civic_election_id): # We must have an election id to proceed -- otherwise we don't know what ballot items to work with voter_device_link_manager = VoterDeviceLinkManager() voter_device_link_results = voter_device_link_manager.retrieve_voter_device_link(voter_device_id) if voter_device_link_results['voter_device_link_found']: voter_device_link = voter_device_link_results['voter_device_link'] if positive_value_exists(voter_device_link.google_civic_election_id): google_civic_election_id = voter_device_link.google_civic_election_id if not positive_value_exists(google_civic_election_id): voter_address_manager = VoterAddressManager() voter_address_results = voter_address_manager.retrieve_address(0, voter_id) if voter_address_results['voter_address_found']: voter_address = voter_address_results['voter_address'] if positive_value_exists(voter_address.google_civic_election_id): google_civic_election_id = voter_address.google_civic_election_id google_civic_election_id = convert_to_int(google_civic_election_id) if not positive_value_exists(google_civic_election_id): json_data = { 'status': "GOOGLE_CIVIC_ELECTION_ID_MISSING-COUNT_FOR_ALL_BALLOT_ITEMS", 'success': False, 'google_civic_election_id': google_civic_election_id, 'ballot_item_list': [], } return json_data position_list_manager = PositionListManager() candidate_list_object = CandidateCampaignList() follow_organization_list_manager = FollowOrganizationList() organizations_followed_by_voter = \ follow_organization_list_manager.retrieve_follow_organization_by_voter_id_simple_id_array(voter_id) # Get a list of all candidates and measures from this election (in the active election) ballot_item_results = voter_ballot_items_retrieve_for_one_election_for_api(voter_device_id, voter_id, google_civic_election_id) ballot_item_list = ballot_item_results['ballot_item_list'] # The list where we capture results ballot_item_list_results = [] # ballot_item_list is populated with contest_office and contest_measure entries for one_ballot_item in ballot_item_list: # Retrieve all positions for each ballot item if one_ballot_item['kind_of_ballot_item'] == OFFICE: results = candidate_list_object.retrieve_all_candidates_for_office(0, one_ballot_item['we_vote_id']) success = results['success'] candidate_list = results['candidate_list'] if success: for candidate in candidate_list: # Loop through all candidates under this office support_positions_list_for_one_ballot_item = \ position_list_manager.retrieve_all_positions_for_candidate_campaign( 0, candidate.we_vote_id, SUPPORT) oppose_positions_list_for_one_ballot_item = \ position_list_manager.retrieve_all_positions_for_candidate_campaign( 0, candidate.we_vote_id, OPPOSE) finalize_results = finalize_support_and_oppose_positions_count( voter_id, show_positions_this_voter_follows, organizations_followed_by_voter, support_positions_list_for_one_ballot_item, oppose_positions_list_for_one_ballot_item) one_ballot_item_results = { 'ballot_item_we_vote_id': candidate.we_vote_id, 'support_count': finalize_results['support_positions_count'], 'oppose_count': finalize_results['oppose_positions_count'], } ballot_item_list_results.append(one_ballot_item_results) elif one_ballot_item['kind_of_ballot_item'] == MEASURE: support_positions_list_for_one_ballot_item = \ position_list_manager.retrieve_all_positions_for_contest_measure(0, one_ballot_item['we_vote_id'], SUPPORT) oppose_positions_list_for_one_ballot_item = \ position_list_manager.retrieve_all_positions_for_contest_measure(0, one_ballot_item['we_vote_id'], OPPOSE) finalize_results = finalize_support_and_oppose_positions_count( voter_id, show_positions_this_voter_follows, organizations_followed_by_voter, support_positions_list_for_one_ballot_item, oppose_positions_list_for_one_ballot_item) one_ballot_item_results = { 'ballot_item_we_vote_id': one_ballot_item['we_vote_id'], 'support_count': finalize_results['support_positions_count'], 'oppose_count': finalize_results['oppose_positions_count'], } ballot_item_list_results.append(one_ballot_item_results) else: # Skip the rest of this loop continue json_data = { 'success': True, 'status': "POSITIONS_COUNT_FOR_ALL_BALLOT_ITEMS", 'google_civic_election_id': google_civic_election_id, 'ballot_item_list': ballot_item_list_results, } return json_data
def politician_delete_process_view( request): # TODO DALE Transition fully to politician """ Delete this politician :param request: :return: """ authority_required = {'verified_volunteer'} # admin, verified_volunteer if not voter_has_authority(request, authority_required): return redirect_to_sign_in_page(request, authority_required) politician_id = convert_to_int(request.GET.get('politician_id', 0)) # Retrieve this politician politician_on_stage_found = False politician_on_stage = Politician() if positive_value_exists(politician_id): try: politician_query = Politician.objects.filter(id=politician_id) if len(politician_query): politician_on_stage = politician_query[0] politician_on_stage_found = True except Exception as e: messages.add_message(request, messages.ERROR, 'Could not find politician -- exception.') if not politician_on_stage_found: messages.add_message(request, messages.ERROR, 'Could not find politician.') return HttpResponseRedirect( reverse('politician:politician_list', args=())) # Are there any positions attached to this politician that should be moved to another # instance of this politician? position_list_manager = PositionListManager() retrieve_public_positions = True # The alternate is positions for friends-only position_list = position_list_manager.retrieve_all_positions_for_politician( retrieve_public_positions, politician_id) if positive_value_exists(len(position_list)): positions_found_for_this_politician = True else: positions_found_for_this_politician = False try: if not positions_found_for_this_politician: # Delete the politician politician_on_stage.delete() messages.add_message(request, messages.INFO, 'Candidate Campaign deleted.') else: messages.add_message( request, messages.ERROR, 'Could not delete -- ' 'positions still attached to this politician.') return HttpResponseRedirect( reverse('politician:politician_edit', args=(politician_id, ))) except Exception as e: messages.add_message(request, messages.ERROR, 'Could not delete politician -- exception.') return HttpResponseRedirect( reverse('politician:politician_edit', args=(politician_id, ))) return HttpResponseRedirect(reverse('politician:politician_list', args=()))
def retrieve_voter_guides_to_follow_by_ballot_item(voter_id, kind_of_ballot_item, ballot_item_we_vote_id, search_string): voter_guide_list_found = False retrieve_public_positions = True # The alternate is positions for friends-only. Since this method returns positions # to follow, we never need to return friend's positions here position_list_manager = PositionListManager() if (kind_of_ballot_item == CANDIDATE) and positive_value_exists(ballot_item_we_vote_id): candidate_id = 0 all_positions_list = position_list_manager.retrieve_all_positions_for_candidate_campaign( retrieve_public_positions, candidate_id, ballot_item_we_vote_id, ANY_STANCE) elif (kind_of_ballot_item == MEASURE) and positive_value_exists(ballot_item_we_vote_id): measure_id = 0 all_positions_list = position_list_manager.retrieve_all_positions_for_contest_measure( retrieve_public_positions, measure_id, ballot_item_we_vote_id, ANY_STANCE) elif (kind_of_ballot_item == OFFICE) and positive_value_exists(ballot_item_we_vote_id): office_id = 0 all_positions_list = position_list_manager.retrieve_all_positions_for_contest_office( office_id, ballot_item_we_vote_id, ANY_STANCE) else: voter_guide_list = [] results = { 'success': False, 'status': "VOTER_GUIDES_BALLOT_RELATED_VARIABLES_MISSING", 'search_string': search_string, 'voter_guide_list_found': False, 'voter_guide_list': voter_guide_list, } return results follow_organization_list_manager = FollowOrganizationList() organizations_followed_by_voter = \ follow_organization_list_manager.retrieve_follow_organization_by_voter_id_simple_id_array(voter_id) positions_list = position_list_manager.calculate_positions_not_followed_by_voter( all_positions_list, organizations_followed_by_voter) voter_guide_list = [] # Cycle through the positions held by groups that you don't currently follow voter_guide_manager = VoterGuideManager() for one_position in positions_list: if positive_value_exists(one_position.organization_we_vote_id): if one_position.google_civic_election_id: results = voter_guide_manager.retrieve_voter_guide( voter_guide_id=0, google_civic_election_id=one_position.google_civic_election_id, vote_smart_time_span=None, organization_we_vote_id=one_position.organization_we_vote_id) else: # vote_smart_time_span results = voter_guide_manager.retrieve_voter_guide( voter_guide_id=0, google_civic_election_id=0, vote_smart_time_span=one_position.vote_smart_time_span, organization_we_vote_id=one_position.organization_we_vote_id) elif positive_value_exists(one_position.public_figure_we_vote_id): results['voter_guide_found'] = False elif positive_value_exists(one_position.voter_we_vote_id): results['voter_guide_found'] = False else: results['voter_guide_found'] = False if results['voter_guide_found']: voter_guide = results['voter_guide'] # If we passed in search_string, make sure they are in this entry. # If they aren't, don't return voter guide if positive_value_exists(search_string): search_string = str(search_string) # Make sure search_string is a string twitter_handle = str(voter_guide.twitter_handle) display_name = str(voter_guide.display_name) if search_string.lower() in twitter_handle.lower() or search_string.lower() in display_name.lower(): voter_guide_list.append(voter_guide) else: voter_guide_list.append(voter_guide) status = 'SUCCESSFUL_RETRIEVE_OF_VOTER_GUIDES_BY_BALLOT_ITEM' success = True if len(voter_guide_list): voter_guide_list_found = True results = { 'success': success, 'status': status, 'search_string': search_string, 'voter_guide_list_found': voter_guide_list_found, 'voter_guide_list': voter_guide_list, } return results
def positions_count_for_candidate_campaign( voter_id, candidate_id, candidate_we_vote_id, stance_we_are_looking_for, show_positions_this_voter_follows=True): """ We want to return a JSON file with the number of orgs, friends and public figures the voter follows who support this particular candidate's campaign """ # This implementation is built to make limited database calls. We do as many calculations as we can here in the # application layer position_list_manager = PositionListManager() all_positions_list_for_candidate_campaign = \ position_list_manager.retrieve_all_positions_for_candidate_campaign( candidate_id, candidate_we_vote_id, stance_we_are_looking_for) follow_organization_list_manager = FollowOrganizationList() organizations_followed_by_voter = \ follow_organization_list_manager.retrieve_follow_organization_by_voter_id_simple_id_array(voter_id) # Since we can take in either candidate_id or candidate_we_vote_id, we need to retrieve the candidate object # so we make sure we have both of these values to return if positive_value_exists(candidate_id): candidate_campaign_manager = CandidateCampaignManager() results = candidate_campaign_manager.retrieve_candidate_campaign_from_id( candidate_id) if results['candidate_campaign_found']: candidate_campaign = results['candidate_campaign'] candidate_we_vote_id = candidate_campaign.we_vote_id elif positive_value_exists(candidate_we_vote_id): candidate_campaign_manager = CandidateCampaignManager() results = candidate_campaign_manager.retrieve_candidate_campaign_from_we_vote_id( candidate_we_vote_id) if results['candidate_campaign_found']: candidate_campaign = results['candidate_campaign'] candidate_id = candidate_campaign.id if show_positions_this_voter_follows: positions_followed = position_list_manager.calculate_positions_followed_by_voter( voter_id, all_positions_list_for_candidate_campaign, organizations_followed_by_voter) positions_followed_count = len(positions_followed) json_data = { 'status': 'SUCCESSFUL_RETRIEVE_OF_POSITIONS_FOLLOWED_RE_CANDIDATE', 'success': True, 'count': positions_followed_count, 'ballot_item_id': convert_to_int(candidate_id), 'ballot_item_we_vote_id': candidate_we_vote_id, 'kind_of_ballot_item': CANDIDATE, } results = { 'json_data': json_data, } return results else: positions_not_followed = position_list_manager.calculate_positions_not_followed_by_voter( all_positions_list_for_candidate_campaign, organizations_followed_by_voter) positions_not_followed_count = len(positions_not_followed) json_data = { 'status': 'SUCCESSFUL_RETRIEVE_OF_POSITIONS_NOT_FOLLOWED_CC', 'success': True, 'count': positions_not_followed_count, 'ballot_item_id': convert_to_int(candidate_id), 'ballot_item_we_vote_id': candidate_we_vote_id, 'kind_of_ballot_item': CANDIDATE, } results = { 'json_data': json_data, } return results
def retrieve_voter_guides_to_follow_by_election(voter_id, google_civic_election_id): voter_guide_list_found = False position_list_manager = PositionListManager() if positive_value_exists(google_civic_election_id): all_positions_list = position_list_manager.retrieve_all_positions_for_election( google_civic_election_id, ANY_STANCE) else: voter_guide_list = [] results = { 'success': False, 'status': "VOTER_GUIDES_BALLOT_RELATED_VARIABLES_MISSING", 'voter_guide_list_found': False, 'voter_guide_list': voter_guide_list, } return results follow_organization_list_manager = FollowOrganizationList() organizations_followed_by_voter = \ follow_organization_list_manager.retrieve_follow_organization_by_voter_id_simple_id_array(voter_id) positions_list = position_list_manager.calculate_positions_not_followed_by_voter( all_positions_list, organizations_followed_by_voter) voter_guide_list = [] # Cycle through the positions held by groups that you don't currently follow voter_guide_manager = VoterGuideManager() for one_position in positions_list: if positive_value_exists(one_position.organization_we_vote_id): if one_position.google_civic_election_id: results = voter_guide_manager.retrieve_voter_guide( voter_guide_id=0, google_civic_election_id=one_position.google_civic_election_id, vote_smart_time_span=None, organization_we_vote_id=one_position.organization_we_vote_id) else: # vote_smart_time_span results = voter_guide_manager.retrieve_voter_guide( voter_guide_id=0, google_civic_election_id=0, vote_smart_time_span=one_position.vote_smart_time_span, organization_we_vote_id=one_position.organization_we_vote_id) elif positive_value_exists(one_position.public_figure_we_vote_id): results['voter_guide_found'] = False elif positive_value_exists(one_position.voter_we_vote_id): results['voter_guide_found'] = False else: results['voter_guide_found'] = False if results['voter_guide_found']: voter_guide_list.append(results['voter_guide']) status = 'SUCCESSFUL_RETRIEVE_OF_POSITIONS_NOT_FOLLOWED' success = True if len(voter_guide_list): voter_guide_list_found = True results = { 'success': success, 'status': status, 'voter_guide_list_found': voter_guide_list_found, 'voter_guide_list': voter_guide_list, } return results