def vote_smart_rating_list_view(request):
    messages_on_stage = get_messages(request)
    rating_list_found = False
    try:
        rating_list = VoteSmartRating.objects.order_by('-timeSpan')[:1000]  # Descending order, and limited to 1000
        if len(rating_list):
            rating_list_found = True
    except VotesmartApiError as error_instance:
        # Catch the error message coming back from Vote Smart and pass it in the status
        error_message = error_instance.args
        status = "EXCEPTION_RAISED: {error_message}".format(error_message=error_message)
        print_to_log(logger=logger, exception_message_optional=status)

    # election_list = Election.objects.order_by('-election_day_text')

    if rating_list_found:
        template_values = {
            'messages_on_stage': messages_on_stage,
            'rating_list': rating_list,
            # 'election_list': election_list,
            # 'google_civic_election_id': google_civic_election_id,
        }
    else:
        template_values = {
            'messages_on_stage': messages_on_stage,
            # 'election_list': election_list,
            # 'google_civic_election_id': google_civic_election_id,
        }
    return render(request, 'import_export_vote_smart/rating_list.html', template_values)
def vote_smart_candidate_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)
    candidate_list = []
    candidate_list_found = False
    try:
        candidate_list = VoteSmartCandidate.objects.order_by('lastName')[:1000]  # Descending order, and limited to 1000
        if len(candidate_list):
            candidate_list_found = True
    except VotesmartApiError as error_instance:
        # Catch the error message coming back from Vote Smart and pass it in the status
        error_message = error_instance.args
        status = "EXCEPTION_RAISED: {error_message}".format(error_message=error_message)
        print_to_log(logger=logger, exception_message_optional=status)

    # election_list = Election.objects.order_by('-election_day_text')

    if candidate_list_found:
        template_values = {
            'messages_on_stage': messages_on_stage,
            'candidate_list': candidate_list,
        }
    else:
        template_values = {
            'messages_on_stage': messages_on_stage,
        }
    return render(request, 'import_export_vote_smart/candidate_list.html', template_values)
def import_group_ratings_view(request):
    # state_code = request.GET.get('state_code', 'NA')  # Default to national
    # category_id = request.GET.get('category_id', 0)

    # Retrieve each group so we can request the ratings for each group
    get_sig_group_count = 0
    get_sig_error_message_count = 0
    special_interest_group_list = VoteSmartSpecialInterestGroup.objects.order_by('name')
    for one_group in special_interest_group_list:
        special_interest_group_id = one_group.sigId
        one_group_results = retrieve_vote_smart_ratings_by_group_into_local_db(special_interest_group_id)

        if not one_group_results['success']:
            print_to_log(logger=logger, exception_message_optional=one_group_results['status'])
            get_sig_error_message_count += 1
        else:
            get_sig_group_count += 1

    messages.add_message(request, messages.INFO, "Ratings from {get_sig_group_count} "
                                                 "Special Interest Groups retrieved. "
                                                 "(errors: {get_sig_error_message_count})"
                                                 "".format(get_sig_group_count=get_sig_group_count,
                                                           get_sig_error_message_count=get_sig_error_message_count))

    return HttpResponseRedirect(reverse('import_export_vote_smart:vote_smart_rating_list', args=()))
def vote_smart_candidate_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)
    candidate_list = []
    candidate_list_found = False
    try:
        candidate_list = VoteSmartCandidate.objects.order_by(
            'lastName')[:1000]  # Descending order, and limited to 1000
        if len(candidate_list):
            candidate_list_found = True
    except VotesmartApiError as error_instance:
        # Catch the error message coming back from Vote Smart and pass it in the status
        error_message = error_instance.args
        status = "EXCEPTION_RAISED: {error_message}".format(
            error_message=error_message)
        print_to_log(logger=logger, exception_message_optional=status)

    # election_list = Election.objects.order_by('-election_day_text')

    if candidate_list_found:
        template_values = {
            'messages_on_stage': messages_on_stage,
            'candidate_list': candidate_list,
        }
    else:
        template_values = {
            'messages_on_stage': messages_on_stage,
        }
    return render(request, 'import_export_vote_smart/candidate_list.html',
                  template_values)
def import_group_ratings_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)

    # state_code = request.GET.get('state_code', 'NA')  # Default to national
    # category_id = request.GET.get('category_id', 0)

    # Retrieve each group so we can request the ratings for each group
    get_sig_group_count = 0
    get_sig_error_message_count = 0
    special_interest_group_list = VoteSmartSpecialInterestGroup.objects.order_by(
        'name')
    for one_group in special_interest_group_list:
        special_interest_group_id = one_group.sigId
        one_group_results = retrieve_vote_smart_ratings_by_group_into_local_db(
            special_interest_group_id)

        if not one_group_results['success']:
            print_to_log(
                logger=logger,
                exception_message_optional=one_group_results['status'])
            get_sig_error_message_count += 1
        else:
            get_sig_group_count += 1

    messages.add_message(
        request, messages.INFO, "Ratings from {get_sig_group_count} "
        "Special Interest Groups retrieved. "
        "(errors: {get_sig_error_message_count})"
        "".format(get_sig_group_count=get_sig_group_count,
                  get_sig_error_message_count=get_sig_error_message_count))

    return HttpResponseRedirect(
        reverse('import_export_vote_smart:vote_smart_rating_list', args=()))
Beispiel #6
0
def candidate_edit_view(request, candidate_id):
    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)
    candidate_id = convert_to_int(candidate_id)
    candidate_on_stage_found = False
    candidate_on_stage = CandidateCampaign()
    try:
        candidate_on_stage = CandidateCampaign.objects.get(id=candidate_id)
        candidate_on_stage_found = True
    except CandidateCampaign.MultipleObjectsReturned as e:
        handle_record_found_more_than_one_exception(e, logger=logger)
    except CandidateCampaign.DoesNotExist:
        # This is fine, create new
        pass

    if candidate_on_stage_found:
        # Working with Vote Smart data
        try:
            vote_smart_candidate_id = candidate_on_stage.vote_smart_id
            rating_list_query = VoteSmartRatingOneCandidate.objects.order_by(
                '-timeSpan')  # Desc order
            rating_list = rating_list_query.filter(
                candidateId=vote_smart_candidate_id)
        except VotesmartApiError as error_instance:
            # Catch the error message coming back from Vote Smart and pass it in the status
            error_message = error_instance.args
            status = "EXCEPTION_RAISED: {error_message}".format(
                error_message=error_message)
            print_to_log(logger=logger, exception_message_optional=status)
            rating_list = []

        # Working with We Vote Positions
        try:
            candidate_position_list = PositionEntered.objects.order_by(
                'stance')
            candidate_position_list = candidate_position_list.filter(
                candidate_campaign_id=candidate_id)
            # if positive_value_exists(google_civic_election_id):
            #     organization_position_list = candidate_position_list.filter(
            #         google_civic_election_id=google_civic_election_id)
        except Exception as e:
            handle_record_not_found_exception(e, logger=logger)
            candidate_position_list = []

        template_values = {
            'messages_on_stage': messages_on_stage,
            'candidate': candidate_on_stage,
            'rating_list': rating_list,
            'candidate_position_list': candidate_position_list,
        }
    else:
        template_values = {
            'messages_on_stage': messages_on_stage,
        }
    return render(request, 'candidate/candidate_edit.html', template_values)
def special_interest_group_rating_list_view(request, special_interest_group_id):
    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)
    special_interest_group_id = convert_to_int(special_interest_group_id)
    # google_civic_election_id = request.GET.get('google_civic_election_id', 0)
    special_interest_group = VoteSmartSpecialInterestGroup()
    special_interest_group_found = False
    try:
        special_interest_group_query = VoteSmartSpecialInterestGroup.objects.filter(sigId=special_interest_group_id)
        if special_interest_group_query.count():
            special_interest_group = special_interest_group_query[0]
            special_interest_group_found = True
    except VotesmartApiError as error_instance:
        # Catch the error message coming back from Vote Smart and pass it in the status
        error_message = error_instance.args
        status = "EXCEPTION_RAISED: {error_message}".format(error_message=error_message)
        print_to_log(logger=logger, exception_message_optional=status)
        special_interest_group_found = False

    if not special_interest_group_found:
        messages.add_message(request, messages.ERROR,
                             'Could not find special_interest_group when trying to retrieve ratings.')
        return HttpResponseRedirect(reverse('import_export_vote_smart:vote_smart_special_interest_group_list', args=()))
    else:
        rating_list = []
        rating_list_found = False
        try:
            rating_list = VoteSmartRatingOneCandidate.objects.order_by('-timeSpan')
            rating_list = rating_list.filter(sigId=special_interest_group_id)
            if len(rating_list):
                rating_list_found = True
        except VotesmartApiError as error_instance:
            # Catch the error message coming back from Vote Smart and pass it in the status
            error_message = error_instance.args
            status = "EXCEPTION_RAISED: {error_message}".format(error_message=error_message)
            print_to_log(logger=logger, exception_message_optional=status)

        # election_list = Election.objects.order_by('-election_day_text')

        if rating_list_found:
            template_values = {
                'messages_on_stage': messages_on_stage,
                'special_interest_group': special_interest_group,
                'rating_list': rating_list,
                # 'election_list': election_list,
                # 'google_civic_election_id': google_civic_election_id,
            }
        else:
            template_values = {
                'messages_on_stage': messages_on_stage,
                'special_interest_group': special_interest_group,
                # 'election_list': election_list,
                # 'google_civic_election_id': google_civic_election_id,
            }
    return render(request, 'import_export_vote_smart/group_rating_list.html', template_values)
Beispiel #8
0
def special_interest_group_rating_list_view(request, special_interest_group_id):
    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)
    special_interest_group_id = convert_to_int(special_interest_group_id)
    # google_civic_election_id = request.GET.get('google_civic_election_id', 0)
    special_interest_group = VoteSmartSpecialInterestGroup()
    special_interest_group_found = False
    try:
        special_interest_group_query = VoteSmartSpecialInterestGroup.objects.filter(sigId=special_interest_group_id)
        if special_interest_group_query.count():
            special_interest_group = special_interest_group_query[0]
            special_interest_group_found = True
    except VotesmartApiError as error_instance:
        # Catch the error message coming back from Vote Smart and pass it in the status
        error_message = error_instance.args
        status = "EXCEPTION_RAISED: {error_message}".format(error_message=error_message)
        print_to_log(logger=logger, exception_message_optional=status)
        special_interest_group_found = False

    if not special_interest_group_found:
        messages.add_message(request, messages.ERROR,
                             'Could not find special_interest_group when trying to retrieve ratings.')
        return HttpResponseRedirect(reverse('import_export_vote_smart:vote_smart_special_interest_group_list', args=()))
    else:
        rating_list = []
        rating_list_found = False
        try:
            rating_list = VoteSmartRatingOneCandidate.objects.order_by('-timeSpan')
            rating_list = rating_list.filter(sigId=special_interest_group_id)
            if len(rating_list):
                rating_list_found = True
        except VotesmartApiError as error_instance:
            # Catch the error message coming back from Vote Smart and pass it in the status
            error_message = error_instance.args
            status = "EXCEPTION_RAISED: {error_message}".format(error_message=error_message)
            print_to_log(logger=logger, exception_message_optional=status)

        # election_list = Election.objects.order_by('-election_day_text')

        if rating_list_found:
            template_values = {
                'messages_on_stage': messages_on_stage,
                'special_interest_group': special_interest_group,
                'rating_list': rating_list,
                # 'election_list': election_list,
                # 'google_civic_election_id': google_civic_election_id,
            }
        else:
            template_values = {
                'messages_on_stage': messages_on_stage,
                'special_interest_group': special_interest_group,
                # 'election_list': election_list,
                # 'google_civic_election_id': google_civic_election_id,
            }
    return render(request, 'import_export_vote_smart/group_rating_list.html', template_values)
Beispiel #9
0
def candidate_edit_view(request, candidate_id):
    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)
    candidate_id = convert_to_int(candidate_id)
    candidate_on_stage_found = False
    candidate_on_stage = CandidateCampaign()
    try:
        candidate_on_stage = CandidateCampaign.objects.get(id=candidate_id)
        candidate_on_stage_found = True
    except CandidateCampaign.MultipleObjectsReturned as e:
        handle_record_found_more_than_one_exception(e, logger=logger)
    except CandidateCampaign.DoesNotExist:
        # This is fine, create new
        pass

    if candidate_on_stage_found:
        # Working with Vote Smart data
        try:
            vote_smart_candidate_id = candidate_on_stage.vote_smart_id
            rating_list_query = VoteSmartRatingOneCandidate.objects.order_by('-timeSpan')  # Desc order
            rating_list = rating_list_query.filter(candidateId=vote_smart_candidate_id)
        except VotesmartApiError as error_instance:
            # Catch the error message coming back from Vote Smart and pass it in the status
            error_message = error_instance.args
            status = "EXCEPTION_RAISED: {error_message}".format(error_message=error_message)
            print_to_log(logger=logger, exception_message_optional=status)
            rating_list = []

        # Working with We Vote Positions
        candidate_position_list_found = False
        try:
            candidate_position_list = PositionEntered.objects.order_by('stance')
            candidate_position_list = candidate_position_list.filter(candidate_campaign_id=candidate_id)
            # if positive_value_exists(google_civic_election_id):
            #     organization_position_list = candidate_position_list.filter(
            #         google_civic_election_id=google_civic_election_id)
        except Exception as e:
            handle_record_not_found_exception(e, logger=logger)
            candidate_position_list = []

        template_values = {
            'messages_on_stage':        messages_on_stage,
            'candidate':                candidate_on_stage,
            'rating_list':              rating_list,
            'candidate_position_list':  candidate_position_list,
        }
    else:
        template_values = {
            'messages_on_stage': messages_on_stage,
        }
    return render(request, 'candidate/candidate_edit.html', template_values)
Beispiel #10
0
def import_special_interest_groups_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)

    # state_code = request.GET.get('state_code', 'NA')  # Default to national
    # category_id = request.GET.get('category_id', 0)

    # First retrieve an index of all groups for each state and category
    group_count = 0
    error_message_count = 0
    position_category_list = VoteSmartCategory.objects.order_by('name')
    for position_category in position_category_list:
        category_id = position_category.categoryId

        for state_code, state_name in STATE_CODE_MAP.items():
            results = retrieve_vote_smart_special_interest_groups_into_local_db(category_id, state_code)

            if not results['success']:
                # messages.add_message(request, messages.INFO, results['status'])
                print_to_log(logger=logger, exception_message_optional=results['status'])
                error_message_count += 1
            else:
                group_count += 1

    messages.add_message(request, messages.INFO, "{group_count} Special Interest Groups retrieved. "
                                                 "(errors: {error_message_count})"
                                                 "".format(group_count=group_count,
                                                           error_message_count=error_message_count))

    # Then retrieve the details about each group
    get_sig_group_count = 0
    get_sig_error_message_count = 0
    special_interest_group_list = VoteSmartSpecialInterestGroup.objects.order_by('name')
    for one_group in special_interest_group_list:
        special_interest_group_id = one_group.sigId
        one_group_results = retrieve_vote_smart_special_interest_group_into_local_db(special_interest_group_id)

        if not one_group_results['success']:
            print_to_log(logger=logger, exception_message_optional=one_group_results['status'])
            get_sig_error_message_count += 1
        else:
            get_sig_group_count += 1

    messages.add_message(request, messages.INFO, "{get_sig_group_count} Special Interest Groups augmented. "
                                                 "(errors: {get_sig_error_message_count})"
                                                 "".format(get_sig_group_count=get_sig_group_count,
                                                           get_sig_error_message_count=get_sig_error_message_count))

    return HttpResponseRedirect(reverse('import_export_vote_smart:vote_smart_special_interest_group_list', args=()))
Beispiel #11
0
def import_special_interest_groups_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)

    # state_code = request.GET.get('state_code', 'NA')  # Default to national
    # category_id = request.GET.get('category_id', 0)

    # First retrieve an index of all groups for each state and category
    group_count = 0
    error_message_count = 0
    position_category_list = VoteSmartCategory.objects.order_by('name')
    for position_category in position_category_list:
        category_id = position_category.categoryId

        for state_code, state_name in STATE_CODE_MAP.items():
            results = retrieve_vote_smart_special_interest_groups_into_local_db(category_id, state_code)

            if not results['success']:
                # messages.add_message(request, messages.INFO, results['status'])
                print_to_log(logger=logger, exception_message_optional=results['status'])
                error_message_count += 1
            else:
                group_count += 1

    messages.add_message(request, messages.INFO, "{group_count} Special Interest Groups retrieved. "
                                                 "(errors: {error_message_count})"
                                                 "".format(group_count=group_count,
                                                           error_message_count=error_message_count))

    # Then retrieve the details about each group
    get_sig_group_count = 0
    get_sig_error_message_count = 0
    special_interest_group_list = VoteSmartSpecialInterestGroup.objects.order_by('name')
    for one_group in special_interest_group_list:
        special_interest_group_id = one_group.sigId
        one_group_results = retrieve_vote_smart_special_interest_group_into_local_db(special_interest_group_id)

        if not one_group_results['success']:
            print_to_log(logger=logger, exception_message_optional=one_group_results['status'])
            get_sig_error_message_count += 1
        else:
            get_sig_group_count += 1

    messages.add_message(request, messages.INFO, "{get_sig_group_count} Special Interest Groups augmented. "
                                                 "(errors: {get_sig_error_message_count})"
                                                 "".format(get_sig_group_count=get_sig_group_count,
                                                           get_sig_error_message_count=get_sig_error_message_count))

    return HttpResponseRedirect(reverse('import_export_vote_smart:vote_smart_special_interest_group_list', args=()))
Beispiel #12
0
def politician_edit_view(request, politician_id):
    authority_required = {'verified_volunteer'}  # admin, verified_volunteer
    if not voter_has_authority(request, authority_required):
        return redirect_to_sign_in_page(request, authority_required)

    # These variables are here because there was an error on the edit_process_view and the voter needs to try again
    politician_name = request.GET.get('politician_name', False)
    state_code = request.GET.get('state_code', False)
    google_civic_candidate_name = request.GET.get(
        'google_civic_candidate_name', False)
    politician_twitter_handle = request.GET.get('politician_twitter_handle',
                                                False)
    politician_url = request.GET.get('politician_url', False)
    political_party = request.GET.get('political_party', False)
    vote_smart_id = request.GET.get('vote_smart_id', False)
    maplight_id = request.GET.get('maplight_id', False)

    messages_on_stage = get_messages(request)
    politician_id = convert_to_int(politician_id)
    politician_on_stage_found = False
    politician_on_stage = Politician()

    try:
        politician_on_stage = Politician.objects.get(id=politician_id)
        politician_on_stage_found = True
    except Politician.MultipleObjectsReturned as e:
        handle_record_found_more_than_one_exception(e, logger=logger)
    except Politician.DoesNotExist:
        # This is fine, create new below
        pass

    if politician_on_stage_found:
        # Working with Vote Smart data
        try:
            vote_smart_politician_id = politician_on_stage.vote_smart_id
            rating_list_query = VoteSmartRatingOneCandidate.objects.order_by(
                '-timeSpan')  # Desc order
            rating_list = rating_list_query.filter(
                candidateId=vote_smart_politician_id)
        except VotesmartApiError as error_instance:
            # Catch the error message coming back from Vote Smart and pass it in the status
            error_message = error_instance.args
            status = "EXCEPTION_RAISED: {error_message}".format(
                error_message=error_message)
            print_to_log(logger=logger, exception_message_optional=status)
            rating_list = []

        # Working with We Vote Positions
        try:
            politician_position_list = PositionEntered.objects.order_by(
                'stance')
            politician_position_list = politician_position_list.filter(
                politician_id=politician_id)
        except Exception as e:
            politician_position_list = []

        # Working with Candidate "children" of this politician
        try:
            linked_candidate_list = CandidateCampaign.objects.all()
            linked_candidate_list = linked_candidate_list.filter(
                politician_id=politician_on_stage.id)
        except Exception as e:
            linked_candidate_list = []

        # Finding Candidates that *might* be "children" of this politician
        try:
            related_candidate_list = CandidateCampaign.objects.all()
            related_candidate_list = related_candidate_list.exclude(
                politician_id=politician_on_stage.id)

            filters = []
            new_filter = Q(candidate_name__icontains=politician_on_stage.first_name) & \
                Q(candidate_name__icontains=politician_on_stage.last_name)
            filters.append(new_filter)

            if positive_value_exists(
                    politician_on_stage.politician_twitter_handle):
                new_filter = Q(
                    candidate_twitter_handle__iexact=politician_on_stage.
                    politician_twitter_handle)
                filters.append(new_filter)

            if positive_value_exists(politician_on_stage.vote_smart_id):
                new_filter = Q(vote_smart_id=politician_on_stage.vote_smart_id)
                filters.append(new_filter)

            # Add the first query
            if len(filters):
                final_filters = filters.pop()

                # ...and "OR" the remaining items in the list
                for item in filters:
                    final_filters |= item

                related_candidate_list = related_candidate_list.filter(
                    final_filters)

            related_candidate_list = related_candidate_list.order_by(
                'candidate_name')[:20]
        except Exception as e:
            related_candidate_list = []

        # Find possible duplicate politicians
        try:
            duplicate_politician_list = Politician.objects.all()
            duplicate_politician_list = duplicate_politician_list.exclude(
                id=politician_on_stage.id)

            filters = []
            new_filter = Q(
                politician_name__icontains=politician_on_stage.politician_name)
            filters.append(new_filter)

            if positive_value_exists(politician_on_stage.first_name) or \
                    positive_value_exists(politician_on_stage.last_name):
                new_filter = Q(first_name__icontains=politician_on_stage.first_name) & \
                    Q(last_name__icontains=politician_on_stage.last_name)
                filters.append(new_filter)

            if positive_value_exists(
                    politician_on_stage.politician_twitter_handle):
                new_filter = Q(
                    politician_twitter_handle__icontains=politician_on_stage.
                    politician_twitter_handle)
                filters.append(new_filter)

            if positive_value_exists(politician_on_stage.vote_smart_id):
                new_filter = Q(vote_smart_id=politician_on_stage.vote_smart_id)
                filters.append(new_filter)

            # Add the first query
            if len(filters):
                final_filters = filters.pop()

                # ...and "OR" the remaining items in the list
                for item in filters:
                    final_filters |= item

                duplicate_politician_list = duplicate_politician_list.filter(
                    final_filters)

            duplicate_politician_list = duplicate_politician_list.order_by(
                'politician_name')[:20]
        except ObjectDoesNotExist:
            # This is fine, create new
            pass

        template_values = {
            'messages_on_stage': messages_on_stage,
            'politician': politician_on_stage,
            'rating_list': rating_list,
            'politician_position_list': politician_position_list,
            'linked_candidate_list': linked_candidate_list,
            'related_candidate_list': related_candidate_list,
            'duplicate_politician_list': duplicate_politician_list,
            # Incoming variables, not saved yet
            'politician_name': politician_name,
            'state_code': state_code,
            'google_civic_candidate_name': google_civic_candidate_name,
            'politician_twitter_handle': politician_twitter_handle,
            'politician_url': politician_url,
            'political_party': political_party,
            'vote_smart_id': vote_smart_id,
            'maplight_id': maplight_id,
        }
    else:
        template_values = {
            'messages_on_stage': messages_on_stage,
            # Incoming variables
            'vote_smart_id': vote_smart_id,
        }
    return render(request, 'politician/politician_edit.html', template_values)
Beispiel #13
0
def politician_edit_view(request, politician_id):
    authority_required = {'verified_volunteer'}  # admin, verified_volunteer
    if not voter_has_authority(request, authority_required):
        return redirect_to_sign_in_page(request, authority_required)

    # These variables are here because there was an error on the edit_process_view and the voter needs to try again
    politician_name = request.GET.get('politician_name', False)
    state_code = request.GET.get('state_code', False)
    google_civic_candidate_name = request.GET.get('google_civic_candidate_name', False)
    politician_twitter_handle = request.GET.get('politician_twitter_handle', False)
    politician_url = request.GET.get('politician_url', False)
    political_party = request.GET.get('political_party', False)
    vote_smart_id = request.GET.get('vote_smart_id', False)
    maplight_id = request.GET.get('maplight_id', False)

    messages_on_stage = get_messages(request)
    politician_id = convert_to_int(politician_id)
    politician_on_stage_found = False
    politician_on_stage = Politician()

    try:
        politician_on_stage = Politician.objects.get(id=politician_id)
        politician_on_stage_found = True
    except Politician.MultipleObjectsReturned as e:
        handle_record_found_more_than_one_exception(e, logger=logger)
    except Politician.DoesNotExist:
        # This is fine, create new below
        pass

    if politician_on_stage_found:
        # Working with Vote Smart data
        try:
            vote_smart_politician_id = politician_on_stage.vote_smart_id
            rating_list_query = VoteSmartRatingOneCandidate.objects.order_by('-timeSpan')  # Desc order
            rating_list = rating_list_query.filter(candidateId=vote_smart_politician_id)
        except VotesmartApiError as error_instance:
            # Catch the error message coming back from Vote Smart and pass it in the status
            error_message = error_instance.args
            status = "EXCEPTION_RAISED: {error_message}".format(error_message=error_message)
            print_to_log(logger=logger, exception_message_optional=status)
            rating_list = []

        # Working with We Vote Positions
        try:
            politician_position_list = PositionEntered.objects.order_by('stance')
            politician_position_list = politician_position_list.filter(politician_id=politician_id)
        except Exception as e:
            politician_position_list = []

        # Working with Candidate "children" of this politician
        try:
            linked_candidate_list = CandidateCampaign.objects.all()
            linked_candidate_list = linked_candidate_list.filter(politician_id=politician_on_stage.id)
        except Exception as e:
            linked_candidate_list = []

        # Finding Candidates that *might* be "children" of this politician
        try:
            related_candidate_list = CandidateCampaign.objects.all()
            related_candidate_list = related_candidate_list.exclude(politician_id=politician_on_stage.id)

            filters = []
            new_filter = Q(candidate_name__icontains=politician_on_stage.first_name) & \
                Q(candidate_name__icontains=politician_on_stage.last_name)
            filters.append(new_filter)

            if positive_value_exists(politician_on_stage.politician_twitter_handle):
                new_filter = Q(candidate_twitter_handle__iexact=politician_on_stage.politician_twitter_handle)
                filters.append(new_filter)

            if positive_value_exists(politician_on_stage.vote_smart_id):
                new_filter = Q(vote_smart_id=politician_on_stage.vote_smart_id)
                filters.append(new_filter)

            # Add the first query
            if len(filters):
                final_filters = filters.pop()

                # ...and "OR" the remaining items in the list
                for item in filters:
                    final_filters |= item

                related_candidate_list = related_candidate_list.filter(final_filters)

            related_candidate_list = related_candidate_list.order_by('candidate_name')[:20]
        except Exception as e:
            related_candidate_list = []

        # Find possible duplicate politicians
        try:
            duplicate_politician_list = Politician.objects.all()
            duplicate_politician_list = duplicate_politician_list.exclude(id=politician_on_stage.id)

            filters = []
            new_filter = Q(politician_name__icontains=politician_on_stage.politician_name)
            filters.append(new_filter)

            if positive_value_exists(politician_on_stage.first_name) or \
                    positive_value_exists(politician_on_stage.last_name):
                new_filter = Q(first_name__icontains=politician_on_stage.first_name) & \
                    Q(last_name__icontains=politician_on_stage.last_name)
                filters.append(new_filter)

            if positive_value_exists(politician_on_stage.politician_twitter_handle):
                new_filter = Q(politician_twitter_handle__icontains=politician_on_stage.politician_twitter_handle)
                filters.append(new_filter)

            if positive_value_exists(politician_on_stage.vote_smart_id):
                new_filter = Q(vote_smart_id=politician_on_stage.vote_smart_id)
                filters.append(new_filter)

            # Add the first query
            if len(filters):
                final_filters = filters.pop()

                # ...and "OR" the remaining items in the list
                for item in filters:
                    final_filters |= item

                duplicate_politician_list = duplicate_politician_list.filter(final_filters)

            duplicate_politician_list = duplicate_politician_list.order_by('politician_name')[:20]
        except ObjectDoesNotExist:
            # This is fine, create new
            pass

        template_values = {
            'messages_on_stage':            messages_on_stage,
            'politician':                   politician_on_stage,
            'rating_list':                  rating_list,
            'politician_position_list':     politician_position_list,
            'linked_candidate_list':        linked_candidate_list,
            'related_candidate_list':       related_candidate_list,
            'duplicate_politician_list':    duplicate_politician_list,
            # Incoming variables, not saved yet
            'politician_name':              politician_name,
            'state_code':                   state_code,
            'google_civic_candidate_name':  google_civic_candidate_name,
            'politician_twitter_handle':    politician_twitter_handle,
            'politician_url':               politician_url,
            'political_party':              political_party,
            'vote_smart_id':                vote_smart_id,
            'maplight_id':                  maplight_id,
        }
    else:
        template_values = {
            'messages_on_stage':    messages_on_stage,
            # Incoming variables
            'vote_smart_id':        vote_smart_id,
        }
    return render(request, 'politician/politician_edit.html', template_values)
Beispiel #14
0
def retrieve_positions_from_vote_smart_for_election_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)

    google_civic_election_id = convert_to_int(request.GET.get('google_civic_election_id', 0))

    try:
        candidate_list = CandidateCampaign.objects.all()
        if positive_value_exists(google_civic_election_id):
            candidate_list = candidate_list.filter(google_civic_election_id=google_civic_election_id)
        candidate_list = candidate_list.order_by('candidate_name')[:500]
    except CandidateCampaign.DoesNotExist:
        messages.add_message(request, messages.INFO, "Could not find any candidates for google_civic_election_id: "
                                                     "{google_civic_election_id}."
                                                     "".format(google_civic_election_id=google_civic_election_id))
        return HttpResponseRedirect(reverse('position:position_list', args=()))

    message = "Entering retrieve_positions_from_vote_smart_for_election."
    print_to_log(logger, exception_message_optional=message)

    vote_smart_candidates_that_exist = 0
    vote_smart_candidates_created = 0
    vote_smart_candidates_not_found = 0
    we_vote_organizations_created = 0
    organization_positions_that_exist = 0
    organization_positions_created = 0
    # Do a first pass through where we get positions for candidates for whom we already have an id
    for we_vote_candidate in candidate_list:
        if we_vote_candidate.vote_smart_id:
            retrieve_results = retrieve_vote_smart_ratings_for_candidate_into_local_db(we_vote_candidate.vote_smart_id)
            transfer_results = transfer_vote_smart_ratings_to_positions_for_candidate(we_vote_candidate.id)

            if retrieve_results['rating_one_candidate_exists']:
                vote_smart_candidates_that_exist += 1
            if retrieve_results['rating_one_candidate_created']:
                vote_smart_candidates_created += 1

            if transfer_results['we_vote_organizations_created']:
                we_vote_organizations_created += 1
            if transfer_results['organization_positions_that_exist']:
                organization_positions_that_exist += 1
            if transfer_results['organization_positions_created']:
                organization_positions_created += 1

    message = "About to cycle through candidates for whom we don't have Vote Smart IDs for."
    print_to_log(logger, exception_message_optional=message)

    # Then we cycle through again, reach out to Vote Smart to match the candidate if we did not have a vote_smart_id,
    # and if we find a new Vote Smart id, we get positions for that candidate
    for we_vote_candidate in candidate_list:
        if not we_vote_candidate.vote_smart_id:
            force_retrieve = False
            results = retrieve_and_match_candidate_from_vote_smart(we_vote_candidate, force_retrieve)
            if results['success'] and results['we_vote_candidate_id']:
                we_vote_candidate = results['we_vote_candidate']
                if we_vote_candidate.vote_smart_id:
                    retrieve_results = retrieve_vote_smart_ratings_for_candidate_into_local_db(
                        we_vote_candidate.vote_smart_id)
                    transfer_results = transfer_vote_smart_ratings_to_positions_for_candidate(we_vote_candidate.id)

                    if retrieve_results['rating_one_candidate_exists']:
                        vote_smart_candidates_that_exist += 1
                    if retrieve_results['rating_one_candidate_created']:
                        vote_smart_candidates_created += 1

                    if transfer_results['we_vote_organizations_created']:
                        we_vote_organizations_created += 1
                    if transfer_results['organization_positions_that_exist']:
                        organization_positions_that_exist += 1
                    if transfer_results['organization_positions_created']:
                        organization_positions_created += 1
            else:
                vote_smart_candidates_not_found += 1

    message = "Google Civic Election ID: {election_id}, " \
              "{vote_smart_candidates_that_exist} candidates from Vote Smart looked at, " \
              "{vote_smart_candidates_created} new candidates cached from Vote Smart, " \
              "{vote_smart_candidates_not_found} candidates not found in Vote Smart, " \
              "{we_vote_organizations_created} organizations created in We Vote, " \
              "{organization_positions_that_exist} positions from Vote Smart already exist locally, and " \
              "{organization_positions_created} positions from Vote Smart just created locally.".\
        format(election_id=google_civic_election_id,
               vote_smart_candidates_that_exist=vote_smart_candidates_that_exist,
               vote_smart_candidates_created=vote_smart_candidates_created,
               vote_smart_candidates_not_found=vote_smart_candidates_not_found,
               we_vote_organizations_created=we_vote_organizations_created,
               organization_positions_that_exist=organization_positions_that_exist,
               organization_positions_created=organization_positions_created)

    print_to_log(logger, exception_message_optional=message)
    messages.add_message(request, messages.INFO, message)

    return HttpResponseRedirect(reverse('position:position_list', args=()) +
                                "?google_civic_election_id=" + str(google_civic_election_id))
Beispiel #15
0
def politician_edit_view(
        request, politician_id):  # TODO DALE Transition fully to politician
    authority_required = {'verified_volunteer'}  # admin, verified_volunteer
    if not voter_has_authority(request, authority_required):
        return redirect_to_sign_in_page(request, authority_required)

    # These variables are here because there was an error on the edit_process_view and the voter needs to try again
    politician_name = request.GET.get('politician_name', False)
    state_code = request.GET.get('state_code', False)
    google_civic_candidate_name = request.GET.get(
        'google_civic_candidate_name', False)
    politician_twitter_handle = request.GET.get('politician_twitter_handle',
                                                False)
    politician_url = request.GET.get('politician_url', False)
    political_party = request.GET.get('political_party', False)
    vote_smart_id = request.GET.get('vote_smart_id', False)
    maplight_id = request.GET.get('maplight_id', False)

    messages_on_stage = get_messages(request)
    politician_id = convert_to_int(politician_id)
    politician_on_stage_found = False
    politician_on_stage = Politician()

    try:
        politician_on_stage = Politician.objects.get(id=politician_id)
        politician_on_stage_found = True
    except Politician.MultipleObjectsReturned as e:
        handle_record_found_more_than_one_exception(e, logger=logger)
    except Politician.DoesNotExist:
        # This is fine, create new below
        pass

    if politician_on_stage_found:
        # Working with Vote Smart data
        try:
            vote_smart_politician_id = politician_on_stage.vote_smart_id
            rating_list_query = VoteSmartRatingOneCandidate.objects.order_by(
                '-timeSpan')  # Desc order
            rating_list = rating_list_query.filter(
                candidateId=vote_smart_politician_id)
        except VotesmartApiError as error_instance:
            # Catch the error message coming back from Vote Smart and pass it in the status
            error_message = error_instance.args
            status = "EXCEPTION_RAISED: {error_message}".format(
                error_message=error_message)
            print_to_log(logger=logger, exception_message_optional=status)
            rating_list = []

        # Working with We Vote Positions
        try:
            politician_position_list = PositionEntered.objects.order_by(
                'stance')
            politician_position_list = politician_position_list.filter(
                politician_id=politician_id)
        except Exception as e:
            politician_position_list = []

        template_values = {
            'messages_on_stage': messages_on_stage,
            'politician': politician_on_stage,
            'rating_list': rating_list,
            'politician_position_list': politician_position_list,
            # Incoming variables, not saved yet
            'politician_name': politician_name,
            'state_code': state_code,
            'google_civic_candidate_name': google_civic_candidate_name,
            'politician_twitter_handle': politician_twitter_handle,
            'politician_url': politician_url,
            'political_party': political_party,
            'vote_smart_id': vote_smart_id,
            'maplight_id': maplight_id,
        }
    else:
        template_values = {
            'messages_on_stage': messages_on_stage,
            # Incoming variables
            'vote_smart_id': vote_smart_id,
        }
    return render(request, 'politician/politician_edit.html', template_values)
Beispiel #16
0
def retrieve_candidate_photos_for_election_view(request, election_id):
    authority_required = {'admin'}  # admin, verified_volunteer
    if not voter_has_authority(request, authority_required):
        return redirect_to_sign_in_page(request, authority_required)

    candidate_list = []
    google_civic_election_id = convert_to_int(election_id)

    # We only want to process if a google_civic_election_id comes in
    if not positive_value_exists(google_civic_election_id):
        messages.add_message(request, messages.ERROR, "Google Civic Election ID required.")
        return HttpResponseRedirect(reverse('candidate:candidate_list', args=()))

    try:
        candidate_list = CandidateCampaign.objects.order_by('candidate_name')
        if positive_value_exists(google_civic_election_id):
            candidate_list = candidate_list.filter(google_civic_election_id=google_civic_election_id)
    except CandidateCampaign.DoesNotExist:
        pass

    display_messages_per_candidate = False
    force_retrieve = False
    num_candidates_reviewed = 0
    num_with_vote_smart_ids = 0
    num_candidates_just_retrieved = 0

    num_with_vote_smart_photos = 0
    num_candidate_photos_just_retrieved = 0

    message = "About to loop through all of the candidates in this election and retrieve photos."
    print_to_log(logger, exception_message_optional=message)

    # Loop through all of the candidates in this election
    for we_vote_candidate in candidate_list:
        num_candidates_reviewed += 1
        retrieve_candidate_results = retrieve_candidate_photos(we_vote_candidate, force_retrieve)
        if retrieve_candidate_results['vote_smart_candidate_exists']:
            num_with_vote_smart_ids += 1
        if retrieve_candidate_results['vote_smart_candidate_just_retrieved']:
            num_candidates_just_retrieved += 1

        if retrieve_candidate_results['vote_smart_candidate_photo_exists']:
            num_with_vote_smart_photos += 1
        if retrieve_candidate_results['vote_smart_candidate_photo_just_retrieved']:
            num_candidate_photos_just_retrieved += 1

        if retrieve_candidate_results['status'] and display_messages_per_candidate:
            messages.add_message(request, messages.INFO, retrieve_candidate_results['status'])

    message = "Google Civic Election ID: {election_id}, " \
              "{num_candidates_reviewed} candidates reviewed, " \
              "{num_with_vote_smart_ids} with Vote Smart Ids, " \
              "{num_candidates_just_retrieved} candidates just retrieved, " \
              "{num_with_vote_smart_photos} with Vote Smart Photos, and " \
              "{num_candidate_photos_just_retrieved} photos just retrieved.".\
        format(election_id=google_civic_election_id,
               num_candidates_reviewed=num_candidates_reviewed,
               num_with_vote_smart_ids=num_with_vote_smart_ids,
               num_candidates_just_retrieved=num_candidates_just_retrieved,
               num_with_vote_smart_photos=num_with_vote_smart_photos,
               num_candidate_photos_just_retrieved=num_candidate_photos_just_retrieved)

    print_to_log(logger, exception_message_optional=message)
    messages.add_message(request, messages.INFO, message)

    return HttpResponseRedirect(reverse('candidate:candidate_list', args=()) + "?google_civic_election_id={var}".format(
        var=google_civic_election_id))
def retrieve_positions_from_vote_smart_for_election_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)

    google_civic_election_id = convert_to_int(
        request.GET.get('google_civic_election_id', 0))

    try:
        candidate_list = CandidateCampaign.objects.all()
        if positive_value_exists(google_civic_election_id):
            candidate_list = candidate_list.filter(
                google_civic_election_id=google_civic_election_id)
        candidate_list = candidate_list.order_by('candidate_name')[:500]
    except CandidateCampaign.DoesNotExist:
        messages.add_message(
            request, messages.INFO,
            "Could not find any candidates for google_civic_election_id: "
            "{google_civic_election_id}."
            "".format(google_civic_election_id=google_civic_election_id))
        return HttpResponseRedirect(reverse('position:position_list', args=()))

    message = "Entering retrieve_positions_from_vote_smart_for_election."
    print_to_log(logger, exception_message_optional=message)

    vote_smart_candidates_that_exist = 0
    vote_smart_candidates_created = 0
    vote_smart_candidates_not_found = 0
    we_vote_organizations_created = 0
    organization_positions_that_exist = 0
    organization_positions_created = 0
    # Do a first pass through where we get positions for candidates for whom we already have an id
    for we_vote_candidate in candidate_list:
        if we_vote_candidate.vote_smart_id:
            retrieve_results = retrieve_vote_smart_ratings_for_candidate_into_local_db(
                we_vote_candidate.vote_smart_id)
            transfer_results = transfer_vote_smart_ratings_to_positions_for_candidate(
                we_vote_candidate.id)

            if retrieve_results['rating_one_candidate_exists']:
                vote_smart_candidates_that_exist += 1
            if retrieve_results['rating_one_candidate_created']:
                vote_smart_candidates_created += 1

            if transfer_results['we_vote_organizations_created']:
                we_vote_organizations_created += 1
            if transfer_results['organization_positions_that_exist']:
                organization_positions_that_exist += 1
            if transfer_results['organization_positions_created']:
                organization_positions_created += 1

    message = "About to cycle through candidates for whom we don't have Vote Smart IDs for."
    print_to_log(logger, exception_message_optional=message)

    # Then we cycle through again, reach out to Vote Smart to match the candidate if we did not have a vote_smart_id,
    # and if we find a new Vote Smart id, we get positions for that candidate
    for we_vote_candidate in candidate_list:
        if not we_vote_candidate.vote_smart_id:
            force_retrieve = False
            results = retrieve_and_match_candidate_from_vote_smart(
                we_vote_candidate, force_retrieve)
            if results['success'] and results['we_vote_candidate_id']:
                we_vote_candidate = results['we_vote_candidate']
                if we_vote_candidate.vote_smart_id:
                    retrieve_results = retrieve_vote_smart_ratings_for_candidate_into_local_db(
                        we_vote_candidate.vote_smart_id)
                    transfer_results = transfer_vote_smart_ratings_to_positions_for_candidate(
                        we_vote_candidate.id)

                    if retrieve_results['rating_one_candidate_exists']:
                        vote_smart_candidates_that_exist += 1
                    if retrieve_results['rating_one_candidate_created']:
                        vote_smart_candidates_created += 1

                    if transfer_results['we_vote_organizations_created']:
                        we_vote_organizations_created += 1
                    if transfer_results['organization_positions_that_exist']:
                        organization_positions_that_exist += 1
                    if transfer_results['organization_positions_created']:
                        organization_positions_created += 1
            else:
                vote_smart_candidates_not_found += 1

    message = "Google Civic Election ID: {election_id}, " \
              "{vote_smart_candidates_that_exist} candidates from Vote Smart looked at, " \
              "{vote_smart_candidates_created} new candidates cached from Vote Smart, " \
              "{vote_smart_candidates_not_found} candidates not found in Vote Smart, " \
              "{we_vote_organizations_created} organizations created in We Vote, " \
              "{organization_positions_that_exist} positions from Vote Smart already exist locally, and " \
              "{organization_positions_created} positions from Vote Smart just created locally.".\
        format(election_id=google_civic_election_id,
               vote_smart_candidates_that_exist=vote_smart_candidates_that_exist,
               vote_smart_candidates_created=vote_smart_candidates_created,
               vote_smart_candidates_not_found=vote_smart_candidates_not_found,
               we_vote_organizations_created=we_vote_organizations_created,
               organization_positions_that_exist=organization_positions_that_exist,
               organization_positions_created=organization_positions_created)

    print_to_log(logger, exception_message_optional=message)
    messages.add_message(request, messages.INFO, message)

    return HttpResponseRedirect(
        reverse('position:position_list', args=()) +
        "?google_civic_election_id=" + str(google_civic_election_id))
Beispiel #18
0
def retrieve_candidate_photos_for_election_view(request, election_id):
    authority_required = {'admin'}  # admin, verified_volunteer
    if not voter_has_authority(request, authority_required):
        return redirect_to_sign_in_page(request, authority_required)

    candidate_list = []
    google_civic_election_id = convert_to_int(election_id)

    # We only want to process if a google_civic_election_id comes in
    if not positive_value_exists(google_civic_election_id):
        messages.add_message(request, messages.ERROR,
                             "Google Civic Election ID required.")
        return HttpResponseRedirect(
            reverse('candidate:candidate_list', args=()))

    try:
        candidate_list = CandidateCampaign.objects.order_by('candidate_name')
        if positive_value_exists(google_civic_election_id):
            candidate_list = candidate_list.filter(
                google_civic_election_id=google_civic_election_id)
    except CandidateCampaign.DoesNotExist:
        pass

    display_messages_per_candidate = False
    force_retrieve = False
    num_candidates_reviewed = 0
    num_with_vote_smart_ids = 0
    num_candidates_just_retrieved = 0

    num_with_vote_smart_photos = 0
    num_candidate_photos_just_retrieved = 0

    message = "About to loop through all of the candidates in this election and retrieve photos."
    print_to_log(logger, exception_message_optional=message)

    # Loop through all of the candidates in this election
    for we_vote_candidate in candidate_list:
        num_candidates_reviewed += 1
        retrieve_candidate_results = retrieve_candidate_photos(
            we_vote_candidate, force_retrieve)
        if retrieve_candidate_results['vote_smart_candidate_exists']:
            num_with_vote_smart_ids += 1
        if retrieve_candidate_results['vote_smart_candidate_just_retrieved']:
            num_candidates_just_retrieved += 1

        if retrieve_candidate_results['vote_smart_candidate_photo_exists']:
            num_with_vote_smart_photos += 1
        if retrieve_candidate_results[
                'vote_smart_candidate_photo_just_retrieved']:
            num_candidate_photos_just_retrieved += 1

        if retrieve_candidate_results[
                'status'] and display_messages_per_candidate:
            messages.add_message(request, messages.INFO,
                                 retrieve_candidate_results['status'])

    message = "Google Civic Election ID: {election_id}, " \
              "{num_candidates_reviewed} candidates reviewed, " \
              "{num_with_vote_smart_ids} with Vote Smart Ids, " \
              "{num_candidates_just_retrieved} candidates just retrieved, " \
              "{num_with_vote_smart_photos} with Vote Smart Photos, and " \
              "{num_candidate_photos_just_retrieved} photos just retrieved.".\
        format(election_id=google_civic_election_id,
               num_candidates_reviewed=num_candidates_reviewed,
               num_with_vote_smart_ids=num_with_vote_smart_ids,
               num_candidates_just_retrieved=num_candidates_just_retrieved,
               num_with_vote_smart_photos=num_with_vote_smart_photos,
               num_candidate_photos_just_retrieved=num_candidate_photos_just_retrieved)

    print_to_log(logger, exception_message_optional=message)
    messages.add_message(request, messages.INFO, message)

    return HttpResponseRedirect(
        reverse('candidate:candidate_list', args=()) +
        "?google_civic_election_id={var}".format(var=google_civic_election_id))
Beispiel #19
0
def candidate_politician_match_for_this_election_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)

    candidate_list = []
    google_civic_election_id = request.GET.get('google_civic_election_id', 0)
    google_civic_election_id = convert_to_int(google_civic_election_id)

    # We only want to process if a google_civic_election_id comes in
    if not positive_value_exists(google_civic_election_id):
        messages.add_message(request, messages.ERROR, "Google Civic Election ID required.")
        return HttpResponseRedirect(reverse('candidate:candidate_list', args=()))

    try:
        candidate_list = CandidateCampaign.objects.order_by('candidate_name')
        candidate_list = candidate_list.filter(google_civic_election_id=google_civic_election_id)
    except CandidateCampaign.DoesNotExist:
        messages.add_message(request, messages.INFO, "No candidates found for this election: {id}.".format(
            id=google_civic_election_id))
        return HttpResponseRedirect(reverse('candidate:candidate_list', args=()) + "?google_civic_election_id={var}"
                                                                                   "".format(
                                                                                   var=google_civic_election_id))

    num_candidates_reviewed = 0
    num_that_already_have_politician_we_vote_id = 0
    new_politician_created = 0
    existing_politician_found = 0
    multiple_politicians_found = 0
    other_results = 0

    message = "About to loop through all of the candidates in this election to make sure we have a politician record."
    print_to_log(logger, exception_message_optional=message)

    # Loop through all of the candidates in this election
    for we_vote_candidate in candidate_list:
        num_candidates_reviewed += 1
        if we_vote_candidate.politician_we_vote_id:
            num_that_already_have_politician_we_vote_id += 1
            continue
        match_results = candidate_politician_match(we_vote_candidate)
        if match_results['politician_created']:
            new_politician_created += 1
        elif match_results['politician_found']:
            existing_politician_found += 1
        elif match_results['politician_list_found']:
            multiple_politicians_found += 1
        else:
            other_results += 1

    message = "Google Civic Election ID: {election_id}, " \
              "{num_candidates_reviewed} candidates reviewed, " \
              "{num_that_already_have_politician_we_vote_id} Candidates that already have Politician Ids, " \
              "{new_politician_created} politicians just created, " \
              "{existing_politician_found} politicians found that already exist, " \
              "{multiple_politicians_found} times we found multiple politicians and could not link, " \
              "{other_results} other results". \
              format(election_id=google_civic_election_id,
                     num_candidates_reviewed=num_candidates_reviewed,
                     num_that_already_have_politician_we_vote_id=num_that_already_have_politician_we_vote_id,
                     new_politician_created=new_politician_created,
                     existing_politician_found=existing_politician_found,
                     multiple_politicians_found=multiple_politicians_found,
                     other_results=other_results)

    print_to_log(logger, exception_message_optional=message)
    messages.add_message(request, messages.INFO, message)

    return HttpResponseRedirect(reverse('candidate:candidate_list', args=()) + "?google_civic_election_id={var}".format(
        var=google_civic_election_id))