def retrieve_voter_guides_followed(voter_id): # voterGuidesFollowedRetrieve voter_guide_list_found = False follow_organization_list_manager = FollowOrganizationList() return_we_vote_id = True organization_we_vote_ids_followed_by_voter = \ follow_organization_list_manager.retrieve_follow_organization_by_voter_id_simple_id_array(voter_id, return_we_vote_id) voter_guide_list_object = VoterGuideListManager() results = voter_guide_list_object.retrieve_voter_guides_by_organization_list( organization_we_vote_ids_followed_by_voter) voter_guide_list = [] if results['voter_guide_list_found']: voter_guide_list = results['voter_guide_list'] status = 'SUCCESSFUL_RETRIEVE_OF_VOTER_GUIDES_FOLLOWED' success = True if len(voter_guide_list): voter_guide_list_found = True else: status = results['status'] success = False results = { 'success': success, 'status': status, 'voter_guide_list_found': voter_guide_list_found, 'voter_guide_list': voter_guide_list, } return results
def retrieve_voter_guides_followed(voter_id): # voterGuidesFollowedRetrieve voter_guide_list_found = False follow_organization_list_manager = FollowOrganizationList() return_we_vote_id = True organization_we_vote_ids_followed_by_voter = \ follow_organization_list_manager.retrieve_follow_organization_by_voter_id_simple_id_array(voter_id, return_we_vote_id) voter_guide_list_object = VoterGuideListManager() results = voter_guide_list_object.retrieve_voter_guides_by_organization_list( organization_we_vote_ids_followed_by_voter) voter_guide_list = [] if results['voter_guide_list_found']: voter_guide_list = results['voter_guide_list'] status = 'SUCCESSFUL_RETRIEVE_OF_VOTER_GUIDES_FOLLOWED' success = True if len(voter_guide_list): voter_guide_list_found = True else: status = results['status'] success = False results = { 'success': success, 'status': status, 'voter_guide_list_found': voter_guide_list_found, 'voter_guide_list': voter_guide_list, } return results
def retrieve_voter_guides_to_follow_generic_for_api(voter_id, search_string, maximum_number_to_retrieve=0, sort_by='', sort_order=''): """ Separate from an election or a ballot item, return a list of voter_guides the voter has not already followed :param voter_id: :param search_string: :param maximum_number_to_retrieve: :param sort_by: :param sort_order: :return: """ voter_guide_list_found = False # Start with orgs followed and ignored by this voter return_we_vote_id = True follow_organization_list_manager = FollowOrganizationList() if positive_value_exists(search_string): # If we are searching for organizations, we don't want to limit the search organization_we_vote_ids_followed_by_voter = [] organization_we_vote_ids_ignored_by_voter = [] else: organization_we_vote_ids_followed_by_voter = \ follow_organization_list_manager.retrieve_follow_organization_by_voter_id_simple_id_array(voter_id, return_we_vote_id) organization_we_vote_ids_ignored_by_voter = \ follow_organization_list_manager.retrieve_ignore_organization_by_voter_id_simple_id_array( voter_id, return_we_vote_id) # This is a list of orgs that the voter is already following or ignoring organization_we_vote_ids_followed_or_ignored_by_voter = list(chain(organization_we_vote_ids_followed_by_voter, organization_we_vote_ids_ignored_by_voter)) voter_guide_list_manager = VoterGuideListManager() # First, retrieve the voter_guides stored by org and google_civic_election_id voter_guide_results = voter_guide_list_manager.retrieve_voter_guides_to_follow_generic( organization_we_vote_ids_followed_or_ignored_by_voter, search_string, maximum_number_to_retrieve, sort_by, sort_order) if voter_guide_results['voter_guide_list_found']: voter_guide_list = voter_guide_results['voter_guide_list'] else: voter_guide_list = [] status = 'SUCCESSFUL_RETRIEVE_OF_VOTER_GUIDES_GENERIC' 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 filter_voter_guides_structured_json_for_local_duplicates(structured_json): """ With this function, we remove voter_guides that seem to be duplicates, but have different we_vote_id's. :param structured_json: :return: """ duplicates_removed = 0 filtered_structured_json = [] voter_guide_list_manager = VoterGuideListManager() for one_voter_guide in structured_json: we_vote_id = one_voter_guide[ 'we_vote_id'] if 'we_vote_id' in one_voter_guide else '' google_civic_election_id = one_voter_guide['google_civic_election_id'] \ if 'google_civic_election_id' in one_voter_guide else '' vote_smart_time_span = one_voter_guide['vote_smart_time_span'] \ if 'vote_smart_time_span' in one_voter_guide else '' organization_we_vote_id = one_voter_guide['organization_we_vote_id'] \ if 'organization_we_vote_id' in one_voter_guide else '' public_figure_we_vote_id = one_voter_guide['public_figure_we_vote_id'] \ if 'public_figure_we_vote_id' in one_voter_guide else '' twitter_handle = one_voter_guide[ 'twitter_handle'] if 'twitter_handle' in one_voter_guide else '' # Check to see if there is an entry that matches in all critical ways, minus the we_vote_id we_vote_id_from_master = we_vote_id results = voter_guide_list_manager.retrieve_possible_duplicate_voter_guides( google_civic_election_id, vote_smart_time_span, organization_we_vote_id, public_figure_we_vote_id, twitter_handle, we_vote_id_from_master) if results['voter_guide_list_found']: # There seems to be a duplicate already in this database using a different we_vote_id duplicates_removed += 1 else: filtered_structured_json.append(one_voter_guide) voter_guides_results = { 'success': True, 'status': "FILTER_VOTER_GUIDES_FOR_DUPLICATES_PROCESS_COMPLETE", 'duplicates_removed': duplicates_removed, 'structured_json': filtered_structured_json, } return voter_guides_results
def filter_voter_guides_structured_json_for_local_duplicates(structured_json): """ With this function, we remove voter_guides that seem to be duplicates, but have different we_vote_id's. :param structured_json: :return: """ duplicates_removed = 0 filtered_structured_json = [] voter_guide_list_manager = VoterGuideListManager() for one_voter_guide in structured_json: we_vote_id = one_voter_guide['we_vote_id'] if 'we_vote_id' in one_voter_guide else '' google_civic_election_id = one_voter_guide['google_civic_election_id'] \ if 'google_civic_election_id' in one_voter_guide else '' vote_smart_time_span = one_voter_guide['vote_smart_time_span'] \ if 'vote_smart_time_span' in one_voter_guide else '' organization_we_vote_id = one_voter_guide['organization_we_vote_id'] \ if 'organization_we_vote_id' in one_voter_guide else '' public_figure_we_vote_id = one_voter_guide['public_figure_we_vote_id'] \ if 'public_figure_we_vote_id' in one_voter_guide else '' twitter_handle = one_voter_guide['twitter_handle'] if 'twitter_handle' in one_voter_guide else '' # Check to see if there is an entry that matches in all critical ways, minus the we_vote_id we_vote_id_from_master = we_vote_id results = voter_guide_list_manager.retrieve_possible_duplicate_voter_guides( google_civic_election_id, vote_smart_time_span, organization_we_vote_id, public_figure_we_vote_id, twitter_handle, we_vote_id_from_master) if results['voter_guide_list_found']: # There seems to be a duplicate already in this database using a different we_vote_id duplicates_removed += 1 else: filtered_structured_json.append(one_voter_guide) voter_guides_results = { 'success': True, 'status': "FILTER_VOTER_GUIDES_FOR_DUPLICATES_PROCESS_COMPLETE", 'duplicates_removed': duplicates_removed, 'structured_json': filtered_structured_json, } return voter_guides_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 retrieve_voter_guides_to_follow_generic_for_api( voter_id, search_string, maximum_number_to_retrieve=0, sort_by='', sort_order=''): """ Separate from an election or a ballot item, return a list of voter_guides the voter has not already followed :param voter_id: :param search_string: :param maximum_number_to_retrieve: :param sort_by: :param sort_order: :return: """ voter_guide_list_found = False # Start with orgs followed and ignored by this voter return_we_vote_id = True follow_organization_list_manager = FollowOrganizationList() if positive_value_exists(search_string): # If we are searching for organizations, we don't want to limit the search organization_we_vote_ids_followed_by_voter = [] organization_we_vote_ids_ignored_by_voter = [] else: organization_we_vote_ids_followed_by_voter = \ follow_organization_list_manager.retrieve_follow_organization_by_voter_id_simple_id_array(voter_id, return_we_vote_id) organization_we_vote_ids_ignored_by_voter = \ follow_organization_list_manager.retrieve_ignore_organization_by_voter_id_simple_id_array( voter_id, return_we_vote_id) # This is a list of orgs that the voter is already following or ignoring organization_we_vote_ids_followed_or_ignored_by_voter = list( chain(organization_we_vote_ids_followed_by_voter, organization_we_vote_ids_ignored_by_voter)) voter_guide_list_manager = VoterGuideListManager() # First, retrieve the voter_guides stored by org and google_civic_election_id voter_guide_results = voter_guide_list_manager.retrieve_voter_guides_to_follow_generic( organization_we_vote_ids_followed_or_ignored_by_voter, search_string, maximum_number_to_retrieve, sort_by, sort_order) if voter_guide_results['voter_guide_list_found']: voter_guide_list = voter_guide_results['voter_guide_list'] else: voter_guide_list = [] status = 'SUCCESSFUL_RETRIEVE_OF_VOTER_GUIDES_GENERIC' 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 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