def scrape_and_save_social_media_for_candidates_in_one_election( google_civic_election_id=0): facebook_pages_found = 0 twitter_handles_found = 0 force_retrieve = False status = "" google_civic_election_id = convert_to_int(google_civic_election_id) candidate_manager = CandidateCampaignManager() candidate_list_manager = CandidateCampaignListManager() return_list_of_objects = True results = candidate_list_manager.retrieve_all_candidates_for_upcoming_election( google_civic_election_id, return_list_of_objects) status += results['status'] if results['success']: candidate_list = results['candidate_list_objects'] else: candidate_list = [] for candidate in candidate_list: twitter_handle = False facebook_page = False if not candidate.candidate_url: continue if (not positive_value_exists( candidate.candidate_twitter_handle)) or force_retrieve: scrape_results = scrape_social_media_from_one_site( candidate.candidate_url) # Only include a change if we have a new value (do not try to save blank value) if scrape_results['twitter_handle_found'] and positive_value_exists( scrape_results['twitter_handle']): twitter_handle = scrape_results['twitter_handle'] twitter_handles_found += 1 if scrape_results['facebook_page_found'] and positive_value_exists( scrape_results['facebook_page']): facebook_page = scrape_results['facebook_page'] facebook_pages_found += 1 save_results = candidate_manager.update_candidate_social_media( candidate, twitter_handle, facebook_page) # ###################################### # We refresh the Twitter information in another function status = "ORGANIZATION_SOCIAL_MEDIA_RETRIEVED" results = { 'success': True, 'status': status, 'twitter_handles_found': twitter_handles_found, 'facebook_pages_found': facebook_pages_found, } return results
def refresh_twitter_candidate_details_for_election(google_civic_election_id): twitter_handles_added = 0 profiles_refreshed_with_twitter_data = 0 google_civic_election_id = convert_to_int(google_civic_election_id) candidate_list_manager = CandidateCampaignListManager() return_list_of_objects = True candidates_results = candidate_list_manager.retrieve_all_candidates_for_upcoming_election( google_civic_election_id, return_list_of_objects) if candidates_results['candidate_list_found']: candidate_list = candidates_results['candidate_list_objects'] for candidate in candidate_list: # Extract twitter_handle from google_civic_election information if positive_value_exists(candidate.twitter_url) \ and not positive_value_exists(candidate.candidate_twitter_handle): # If we got a twitter_url from Google Civic, and we haven't already stored a twitter handle, move it candidate.candidate_twitter_handle = extract_twitter_handle_from_text_string( candidate.twitter_url) candidate.save() twitter_handles_added += 1 if positive_value_exists(candidate.candidate_twitter_handle): refresh_twitter_candidate_details(candidate) profiles_refreshed_with_twitter_data += 1 status = "CANDIDATE_SOCIAL_MEDIA_RETRIEVED" results = { 'success': True, 'status': status, 'twitter_handles_added': twitter_handles_added, 'profiles_refreshed_with_twitter_data': profiles_refreshed_with_twitter_data, } return results
def transfer_candidate_twitter_handles_from_google_civic( google_civic_election_id=0): twitter_handles_transferred = 0 status = "" google_civic_election_id = convert_to_int(google_civic_election_id) candidate_list_object = CandidateCampaignListManager() return_list_of_objects = True results = candidate_list_object.retrieve_all_candidates_for_upcoming_election( google_civic_election_id, return_list_of_objects) status += results['status'] if results['success']: candidate_list = results['candidate_list_objects'] else: candidate_list = [] for candidate in candidate_list: if not candidate.twitter_url: continue # Only proceed if we don't already have a twitter_handle if not positive_value_exists(candidate.candidate_twitter_handle): candidate.candidate_twitter_handle = candidate.twitter_url.replace( "https://twitter.com/", "") candidate.save() twitter_handles_transferred += 1 # ###################################### # We refresh the Twitter information in another function status += " CANDIDATE_TWITTER_HANDLES_TRANSFERRED" results = { 'success': True, 'status': status, 'twitter_handles_transferred': twitter_handles_transferred, } return results
def twitter_identity_retrieve_for_api(twitter_handle, voter_device_id=''): status = "TWITTER_HANDLE_DOES_NOT_EXIST" # Default to this success = True kind_of_owner = "TWITTER_HANDLE_DOES_NOT_EXIST" owner_we_vote_id = '' owner_id = 0 google_civic_election_id = 0 google_civic_election_id_voter_is_watching = 0 twitter_description = '' twitter_followers_count = '' twitter_photo_url = '' twitter_user_website = '' twitter_name = '' owner_found = False # Check Politician table for Twitter Handle # NOTE: It would be better to retrieve from the Politician, and then bring "up" information we need from the # CandidateCampaign table. 2016-05-11 We haven't implemented Politician's yet though. # Check Candidate table if not positive_value_exists(owner_found): candidate_list_manager = CandidateCampaignListManager() candidate_results = candidate_list_manager.retrieve_candidates_from_non_unique_identifiers(twitter_handle) if candidate_results['candidate_list_found']: candidate_list = candidate_results['candidate_list'] # Find out the election the voter is looking at results = figure_out_google_civic_election_id_voter_is_watching(voter_device_id) if positive_value_exists(results['google_civic_election_id']): google_civic_election_id_voter_is_watching = results['google_civic_election_id'] # ...and then find the candidate entry for that election most_recent_candidate = candidate_list[0] for one_candidate in candidate_list: if google_civic_election_id_voter_is_watching == convert_to_int(one_candidate.google_civic_election_id): kind_of_owner = "CANDIDATE" owner_we_vote_id = one_candidate.we_vote_id owner_id = one_candidate.id google_civic_election_id = one_candidate.google_civic_election_id owner_found = True status = "OWNER_OF_THIS_TWITTER_HANDLE_FOUND-CANDIDATE" # Now that we have candidate, break out of for-loop break if not owner_found: kind_of_owner = "CANDIDATE" owner_we_vote_id = most_recent_candidate.we_vote_id owner_id = most_recent_candidate.id google_civic_election_id = most_recent_candidate.google_civic_election_id owner_found = True status = "OWNER_OF_THIS_TWITTER_HANDLE_FOUND-CANDIDATE" # Check Organization table if not positive_value_exists(owner_found): organization_list_manager = OrganizationListManager() organization_results = organization_list_manager.retrieve_organizations_from_non_unique_identifiers( twitter_handle) if organization_results['organization_list_found']: organization_list = organization_results['organization_list'] one_organization = organization_list[0] kind_of_owner = "ORGANIZATION" owner_we_vote_id = one_organization.we_vote_id owner_id = one_organization.id google_civic_election_id = 0 owner_found = True status = "OWNER_OF_THIS_TWITTER_HANDLE_FOUND-ORGANIZATION" twitter_description = one_organization.twitter_description twitter_followers_count = one_organization.twitter_followers_count twitter_photo_url = one_organization.twitter_profile_image_url_https twitter_user_website = one_organization.organization_website twitter_name = one_organization.twitter_name # Reach out to Twitter (or our Twitter account cache) to retrieve some information we can display if not positive_value_exists(owner_found): twitter_user_manager = TwitterUserManager() twitter_results = twitter_user_manager.retrieve_twitter_user_locally_or_remotely(twitter_handle) if twitter_results['twitter_user_found']: twitter_user = twitter_results['twitter_user'] twitter_description = twitter_user.twitter_description twitter_followers_count = twitter_user.twitter_followers_count twitter_photo_url = twitter_user.twitter_profile_image_url_https twitter_user_website = twitter_user.twitter_url twitter_name = twitter_user.twitter_name kind_of_owner = "TWITTER_HANDLE_NOT_FOUND_IN_WE_VOTE" status = "TWITTER_HANDLE_NOT_FOUND_IN_WE_VOTE" results = { 'status': status, 'success': success, 'twitter_handle': twitter_handle, 'kind_of_owner': kind_of_owner, 'owner_found': owner_found, 'owner_we_vote_id': owner_we_vote_id, 'owner_id': owner_id, 'google_civic_election_id': google_civic_election_id, 'twitter_description': twitter_description, 'twitter_followers_count': twitter_followers_count, 'twitter_photo_url': twitter_photo_url, 'twitter_user_website': twitter_user_website, 'twitter_name': twitter_name, } return results
def ballot_item_options_retrieve_for_api(google_civic_election_id=0): """ This function returns a normalized list of candidates and measures so we can pre-populate form fields. Not specific to one voter. :param google_civic_election_id: :return: """ status = "" try: candidate_list_object = CandidateCampaignListManager() results = candidate_list_object.retrieve_all_candidates_for_upcoming_election( google_civic_election_id) candidate_success = results['success'] status += results['status'] candidate_list = results['candidate_list_light'] except Exception as e: status += 'FAILED ballot_item_options_retrieve_for_api, candidate_list. ' \ '{error} [type: {error_type}]'.format(error=e, error_type=type(e)) handle_exception(e, logger=logger, exception_message=status) candidate_list = [] candidate_success = False try: office_list_object = ContestOfficeListManager() results = office_list_object.retrieve_all_offices_for_upcoming_election( google_civic_election_id) office_success = results['success'] status += ' ' + results['status'] office_list = results['office_list_light'] except Exception as e: status += 'FAILED ballot_item_options_retrieve_for_api, office_list. ' \ '{error} [type: {error_type}]'.format(error=e, error_type=type(e)) handle_exception(e, logger=logger, exception_message=status) office_list = [] office_success = False try: measure_list_object = ContestMeasureList() results = measure_list_object.retrieve_all_measures_for_upcoming_election( google_civic_election_id) measure_success = results['success'] status += ' ' + results['status'] measure_list = results['measure_list_light'] except Exception as e: status += 'FAILED ballot_item_options_retrieve_for_api, measure_list. ' \ '{error} [type: {error_type}]'.format(error=e, error_type=type(e)) handle_exception(e, logger=logger, exception_message=status) measure_list = [] measure_success = False ballot_items_to_display = [] if candidate_success and len(candidate_list): for candidate in candidate_list: ballot_items_to_display.append(candidate.copy()) if office_success and len(office_list): for office in office_list: ballot_items_to_display.append(office.copy()) if measure_success and len(measure_list): for measure in measure_list: ballot_items_to_display.append(measure.copy()) json_data = { 'status': status, 'success': candidate_success or measure_success, 'ballot_item_list': ballot_items_to_display, 'google_civic_election_id': google_civic_election_id, } results = { 'status': status, 'success': candidate_success or measure_success, 'google_civic_election_id': google_civic_election_id, # We want to save google_civic_election_id in cookie 'json_data': json_data, } return results
def voter_ballot_items_retrieve_for_one_election_for_api( voter_device_id, voter_id, google_civic_election_id): """ :param voter_device_id: :param voter_id: :param google_civic_election_id: This variable was passed in explicitly so we can get the ballot items related to that election. :return: """ ballot_item_list_manager = BallotItemListManager() ballot_item_list = [] ballot_items_to_display = [] try: results = ballot_item_list_manager.retrieve_all_ballot_items_for_voter( voter_id, google_civic_election_id) success = results['success'] status = results['status'] ballot_item_list = results['ballot_item_list'] except Exception as e: status = 'FAILED voter_ballot_items_retrieve. ' \ '{error} [type: {error_type}]'.format(error=e, error_type=type(e)) handle_exception(e, logger=logger, exception_message=status) success = False if success: for ballot_item in ballot_item_list: if ballot_item.contest_office_we_vote_id: kind_of_ballot_item = OFFICE ballot_item_id = ballot_item.contest_office_id we_vote_id = ballot_item.contest_office_we_vote_id try: candidate_list_object = CandidateCampaignListManager() results = candidate_list_object.retrieve_all_candidates_for_office( ballot_item_id, we_vote_id) candidates_to_display = [] if results['candidate_list_found']: candidate_list = results['candidate_list'] for candidate in candidate_list: # This should match values returned in candidates_retrieve_for_api one_candidate = { 'id': candidate.id, 'we_vote_id': candidate.we_vote_id, 'ballot_item_display_name': candidate.display_candidate_name(), 'candidate_photo_url': candidate.candidate_photo_url(), 'party': candidate.political_party_display(), 'order_on_ballot': candidate.order_on_ballot, 'kind_of_ballot_item': CANDIDATE, 'twitter_handle': candidate.candidate_twitter_handle, 'twitter_description': candidate.twitter_description, 'twitter_followers_count': candidate.twitter_followers_count, } candidates_to_display.append(one_candidate.copy()) except Exception as e: # status = 'FAILED candidates_retrieve. ' \ # '{error} [type: {error_type}]'.format(error=e.message, error_type=type(e)) candidates_to_display = [] one_ballot_item = { 'ballot_item_display_name': ballot_item.ballot_item_display_name, 'google_civic_election_id': ballot_item.google_civic_election_id, 'google_ballot_placement': ballot_item.google_ballot_placement, 'local_ballot_order': ballot_item.local_ballot_order, 'kind_of_ballot_item': kind_of_ballot_item, 'id': ballot_item_id, 'we_vote_id': we_vote_id, 'candidate_list': candidates_to_display, } ballot_items_to_display.append(one_ballot_item.copy()) elif ballot_item.contest_measure_we_vote_id: kind_of_ballot_item = MEASURE ballot_item_id = ballot_item.contest_measure_id we_vote_id = ballot_item.contest_measure_we_vote_id one_ballot_item = { 'ballot_item_display_name': ballot_item.ballot_item_display_name, 'google_civic_election_id': ballot_item.google_civic_election_id, 'google_ballot_placement': ballot_item.google_ballot_placement, 'local_ballot_order': ballot_item.local_ballot_order, 'measure_subtitle': ballot_item.measure_subtitle, 'kind_of_ballot_item': kind_of_ballot_item, 'id': ballot_item_id, 'we_vote_id': we_vote_id, } ballot_items_to_display.append(one_ballot_item.copy()) results = { 'status': 'VOTER_BALLOT_ITEMS_RETRIEVED', 'success': True, 'voter_device_id': voter_device_id, 'ballot_item_list': ballot_items_to_display, 'google_civic_election_id': google_civic_election_id, } else: results = { 'status': status, 'success': False, 'voter_device_id': voter_device_id, 'ballot_item_list': [], 'google_civic_election_id': google_civic_election_id, } return results
def organization_position_new_view(request, organization_id): authority_required = {'verified_volunteer'} # admin, verified_volunteer authority_results = retrieve_voter_authority(request) if not voter_has_authority(request, authority_required, authority_results): return redirect_to_sign_in_page(request, authority_required) google_civic_election_id = request.GET.get('google_civic_election_id', 0) candidate_we_vote_id = request.GET.get('candidate_we_vote_id', False) measure_we_vote_id = request.GET.get('measure_we_vote_id', False) # Take in some incoming values candidate_and_measure_not_found = request.GET.get('candidate_and_measure_not_found', False) stance = request.GET.get('stance', SUPPORT) # Set a default if stance comes in empty statement_text = request.GET.get('statement_text', '') # Set a default if stance comes in empty more_info_url = request.GET.get('more_info_url', '') # We pass candidate_we_vote_id to this page to pre-populate the form candidate_campaign_id = 0 if 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_campaign_id = candidate_campaign.id # We pass candidate_we_vote_id to this page to pre-populate the form contest_measure_id = 0 if positive_value_exists(measure_we_vote_id): contest_measure_manager = ContestMeasureManager() results = contest_measure_manager.retrieve_contest_measure_from_we_vote_id(measure_we_vote_id) if results['contest_measure_found']: contest_measure = results['contest_measure'] contest_measure_id = contest_measure.id messages_on_stage = get_messages(request) organization_id = convert_to_int(organization_id) all_is_well = True organization_on_stage_found = False organization_on_stage = Organization() try: organization_on_stage = Organization.objects.get(id=organization_id) organization_on_stage_found = True except Organization.MultipleObjectsReturned as e: handle_record_found_more_than_one_exception(e, logger=logger) except Organization.DoesNotExist: # This is fine, create new pass if not organization_on_stage_found: messages.add_message(request, messages.INFO, 'Could not find organization when trying to create a new position.') return HttpResponseRedirect(reverse('organization:organization_position_list', args=([organization_id]))) # Prepare a drop down of candidates competing in this election candidate_campaign_list = CandidateCampaignListManager() candidate_campaigns_for_this_election_list = [] results = candidate_campaign_list.retrieve_all_candidates_for_upcoming_election(google_civic_election_id, True) if results['candidate_list_found']: candidate_campaigns_for_this_election_list = results['candidate_list_objects'] # Prepare a drop down of measures in this election contest_measure_list = ContestMeasureList() contest_measures_for_this_election_list = [] results = contest_measure_list.retrieve_all_measures_for_upcoming_election(google_civic_election_id, True) if results['measure_list_found']: contest_measures_for_this_election_list = results['measure_list_objects'] try: organization_position_list = PositionEntered.objects.order_by('stance') organization_position_list = organization_position_list.filter(organization_id=organization_id) if positive_value_exists(google_civic_election_id): organization_position_list = organization_position_list.filter( google_civic_election_id=google_civic_election_id) organization_position_list = organization_position_list.order_by( 'google_civic_election_id', '-vote_smart_time_span') if len(organization_position_list): organization_position_list_found = True except Exception as e: organization_position_list = [] if all_is_well: election_list = Election.objects.order_by('-election_day_text') template_values = { 'candidate_campaigns_for_this_election_list': candidate_campaigns_for_this_election_list, 'candidate_campaign_id': candidate_campaign_id, 'contest_measures_for_this_election_list': contest_measures_for_this_election_list, 'contest_measure_id': contest_measure_id, 'messages_on_stage': messages_on_stage, 'organization': organization_on_stage, 'organization_position_candidate_campaign_id': 0, 'possible_stances_list': ORGANIZATION_STANCE_CHOICES, 'stance_selected': stance, 'election_list': election_list, 'google_civic_election_id': google_civic_election_id, 'organization_position_list': organization_position_list, 'voter_authority': authority_results, # Incoming values from error state 'candidate_and_measure_not_found': candidate_and_measure_not_found, 'stance': stance, 'statement_text': statement_text, 'more_info_url': more_info_url, } return render(request, 'organization/organization_position_edit.html', template_values)
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)