Beispiel #1
0
def get_yelp_api_client():
    """
    Get the Yelp API client

    :return: Yelp API client
    :rtype: Yelp Client
    """
    FUNC_NAME = inspect.currentframe().f_code.co_name

    try:
        if 'OPENSHIFT_REPO_DIR' in os.environ or 'TRAVIS' in os.environ:
            auth = Oauth1Authenticator(
                consumer_key=os.environ['YELP_CONSUMER_KEY'],
                consumer_secret=os.environ['YELP_CONSUMER_SECRET'],
                token=os.environ['YELP_TOKEN'],
                token_secret=os.environ['YELP_TOKEN_SECRET']
            )
        else:
            file_path = get_yelp_api_keys_filepath()

            with io.open(file_path, 'r') as cred:
                creds = json.load(cred)
                auth = Oauth1Authenticator(**creds)

        client = Client(auth)
    except Exception as ex:
        log_exception(MODULE_NAME, FUNC_NAME, ex)

    return client
Beispiel #2
0
def run_query(query, location):
    """
    Execute search query to Yelp.

    :param: query: Search terms
    :param: location: Geographical location to search for
    :return: A list of Businesses
    """
    FUNC_NAME = inspect.currentframe().f_code.co_name

    if location == "":
        log_error(MODULE_NAME, FUNC_NAME, 'No location input provided.')
        return []

    client = get_yelp_api_client()
    if not client:
        return []

    # Yelp takes search term query in params kwargs,
    # and location directly as a param in search fxn.
    params = {
        'term': query,
    }

    try:
        search = Search(client)
        response = search.search(location, **params)
    except Exception as ex:
        log_exception(MODULE_NAME, FUNC_NAME, ex)

    businesses = response.businesses
    if not businesses:
        businesses = []
    return businesses
Beispiel #3
0
def get_yelp_api_client():
    """
    Get the Yelp API client

    :return: Yelp API client
    :rtype: Yelp Client
    """
    FUNC_NAME = inspect.currentframe().f_code.co_name

    try:
        if 'OPENSHIFT_REPO_DIR' in os.environ or 'TRAVIS' in os.environ:
            auth = Oauth1Authenticator(
                consumer_key=os.environ['YELP_CONSUMER_KEY'],
                consumer_secret=os.environ['YELP_CONSUMER_SECRET'],
                token=os.environ['YELP_TOKEN'],
                token_secret=os.environ['YELP_TOKEN_SECRET'])
        else:
            file_path = get_yelp_api_keys_filepath()

            with io.open(file_path, 'r') as cred:
                creds = json.load(cred)
                auth = Oauth1Authenticator(**creds)

        client = Client(auth)
    except Exception as ex:
        log_exception(MODULE_NAME, FUNC_NAME, ex)

    return client
Beispiel #4
0
def run_query(query, location):
    """
    Execute search query to Yelp.

    :param: query: Search terms
    :param: location: Geographical location to search for
    :return: A list of Businesses
    """
    FUNC_NAME = inspect.currentframe().f_code.co_name

    if location == "":
        log_error(MODULE_NAME, FUNC_NAME, 'No location input provided.')
        return []

    client = get_yelp_api_client()
    if not client:
        return []

    # Yelp takes search term query in params kwargs,
    # and location directly as a param in search fxn.
    params = {
        'term': query,
    }

    try:
        search = Search(client)
        response = search.search(location, **params)
    except Exception as ex:
        log_exception(MODULE_NAME, FUNC_NAME, ex)

    businesses = response.businesses
    if not businesses:
        businesses = []
    return businesses
Beispiel #5
0
def enqueue_fetch_reviews_with_ajax(request):
    """Handles ajax request to enqueue task to fetch reviews from Yelp"""
    try:
        if 'business_id' in request.GET:
            business_id = request.GET.get('business_id')
            task_result = tasks.enqueue_fetch_reviews.delay(business_id)
            task_id = task_result.id
            context = {
                'task_id': task_id,
            }
        return render_to_response("main/task_id_snippet.html", context)
    except Exception as ex:
        log_exception(MODULE_NAME, inspect.currentframe().f_code.co_name, ex)
Beispiel #6
0
def enqueue_fetch_reviews_with_ajax(request):
    """Handles ajax request to enqueue task to fetch reviews from Yelp"""
    try:
        if 'business_id' in request.GET:
            business_id = request.GET.get('business_id')
            task_result = tasks.enqueue_fetch_reviews.delay(business_id)
            task_id = task_result.id
            context = {
                'task_id': task_id,
            }
        return render_to_response("main/task_id_snippet.html",
                                  context)
    except Exception as ex:
        log_exception(MODULE_NAME, inspect.currentframe().f_code.co_name, ex)
Beispiel #7
0
def search_for_businesses(query="", location="", debug=False):
    """
    Search for businesses that match against search terms and return
    a list of businesses.

    :param: query: Search terms
    :param: location: Geographical location to search in or near
    :return: A list of Businesses
    """
    FUNC_NAME = inspect.currentframe().f_code.co_name

    if debug:
        location = 'San Francisco'
    elif location == "":
        log_error(MODULE_NAME, FUNC_NAME,
                  'No location input in search')
        return []

    businesses = []
    log(MODULE_NAME,
        FUNC_NAME,
        'query: "%s", location: "%s"' % (query, location))

    try:
        businesses = run_query(query, location)
    except Exception as ex:
        log_exception(MODULE_NAME, FUNC_NAME, ex)

    # First 10 entries. No pagination yet so KISS.
    businesses = businesses[:10]
    for cur_business in businesses:
        has_reviews = Review.objects.filter(
            business_id=cur_business.id
        ).exists()
        cur_business.has_reviews = has_reviews

        save_business(cur_business.id,
                      cur_business.name,
                      cur_business.image_url,
                      cur_business.url,
                      cur_business.review_count,
                      cur_business.rating)
    return businesses
Beispiel #8
0
def check_fetch_state_with_ajax(request):
    """Handles ajax request to poll server on the status of a task"""
    try:
        if 'task_id' in request.GET:
            task_id = request.GET.get('task_id').rstrip()
            task_result = tasks.enqueue_fetch_reviews.AsyncResult(task_id)
            task_state = task_result.state
            task_progress = 0
            if type(task_result.info) == dict and 'current' in task_result.info:
                task_progress = task_result.info['current']
            elif task_state == 'SUCCESS':
                task_progress = 100
            print("TASK PROGRESS: " + str(task_progress))
            print("TASK STATE: " + task_state)
            context = {
                'task_state': '%s^%s' % (str(task_state), str(task_progress)),
            }
        return render_to_response("main/task_state_snippet.html", context)
    except Exception as ex:
        log_exception(MODULE_NAME, inspect.currentframe().f_code.co_name, ex)
Beispiel #9
0
def search_with_ajax(request):
    """Handles ajax request when user searches"""
    try:
        if 'query' in request.GET and 'location' in request.GET:
            form = FrontSearchForm(request.GET)
            if form.is_valid():
                query = form.cleaned_data['query']
                location = form.cleaned_data['location']
                businesses = search_for_businesses(query, location)
                context = {
                    'businesses': businesses,
                    'form': form,
                }
                return render_to_response("main/search_results_snippet.html",
                                          context)
            else:
                form = FrontSearchForm()
                return render_to_response("main/search_results_snippet.html", {'form': form})
        return render_to_response("main/search_results_snippet.html")
    except Exception as ex:
        log_exception(MODULE_NAME, inspect.currentframe().f_code.co_name, ex)
Beispiel #10
0
def index(request):
    """Renders front page of website"""
    try:
        if 'query' in request.GET:
            form = FrontSearchForm(request.GET)
            if form.is_valid():
                query = form.cleaned_data['query']
                location = form.cleaned_data['location']
                businesses = search_for_businesses(query, location)
                context = {
                    'businesses': businesses,
                    'form': form,
                }
                return render(request, 'main/index.html', context)
            else:
                form = FrontSearchForm()
        else:
            form = FrontSearchForm()
        return render(request, 'main/index.html', {'form': form})
    except Exception as ex:
        log_exception(MODULE_NAME, inspect.currentframe().f_code.co_name, ex)
Beispiel #11
0
def index(request):
    """Renders front page of website"""
    try:
        if 'query' in request.GET:
            form = FrontSearchForm(request.GET)
            if form.is_valid():
                query = form.cleaned_data['query']
                location = form.cleaned_data['location']
                businesses = search_for_businesses(query, location)
                context = {
                    'businesses': businesses,
                    'form': form,
                }
                return render(request, 'main/index.html', context)
            else:
                form = FrontSearchForm()
        else:
            form = FrontSearchForm()
        return render(request, 'main/index.html', {'form': form})
    except Exception as ex:
        log_exception(MODULE_NAME, inspect.currentframe().f_code.co_name, ex)
Beispiel #12
0
def check_fetch_state_with_ajax(request):
    """Handles ajax request to poll server on the status of a task"""
    try:
        if 'task_id' in request.GET:
            task_id = request.GET.get('task_id').rstrip()
            task_result = tasks.enqueue_fetch_reviews.AsyncResult(task_id)
            task_state = task_result.state
            task_progress = 0
            if type(task_result.info
                    ) == dict and 'current' in task_result.info:
                task_progress = task_result.info['current']
            elif task_state == 'SUCCESS':
                task_progress = 100
            print("TASK PROGRESS: " + str(task_progress))
            print("TASK STATE: " + task_state)
            context = {
                'task_state': '%s^%s' % (str(task_state), str(task_progress)),
            }
        return render_to_response("main/task_state_snippet.html", context)
    except Exception as ex:
        log_exception(MODULE_NAME, inspect.currentframe().f_code.co_name, ex)
Beispiel #13
0
def save_business(id, name, image_url, url, review_count, rating):
    """
    Save or update a business to database

    :param: id: Business ID
    :param: name: Business name
    :param: image_url: URL to a business image
    :param: url: URL to the business on Yelp
    :param: review_count: Number of reviews for the business on Yelp
    :param: rating: Yelp review rating of business
    """
    FUNC_NAME = inspect.currentframe().f_code.co_name

    q_delim_index = url.find('?')
    url = url[:q_delim_index]  # Strip GET parameters

    # Update existing business in database
    try:
        if Business.objects.filter(id=id).exists():
            business = Business.objects.get(id=id)
            business.name = name
            business.image_url = image_url
            business.url = url
            business.review_count = review_count
            business.rating = rating
            log(MODULE_NAME, FUNC_NAME,
                'Updating business to db: %s' % business.id)
        # Save new business
        else:
            business = Business(id=id,
                                name=name,
                                image_url=image_url,
                                url=url,
                                review_count=review_count,
                                rating=rating)
            log(MODULE_NAME, FUNC_NAME,
                'Creating new business to db: %s' % (business.id))
        business.save()
    except Exception as ex:
        log_exception(MODULE_NAME, FUNC_NAME, ex)
Beispiel #14
0
def save_business(id, name, image_url, url, review_count, rating):
    """
    Save or update a business to database

    :param: id: Business ID
    :param: name: Business name
    :param: image_url: URL to a business image
    :param: url: URL to the business on Yelp
    :param: review_count: Number of reviews for the business on Yelp
    :param: rating: Yelp review rating of business
    """
    FUNC_NAME = inspect.currentframe().f_code.co_name

    q_delim_index = url.find('?')
    url = url[:q_delim_index]  # Strip GET parameters

    # Update existing business in database
    try:
        if Business.objects.filter(id=id).exists():
            business = Business.objects.get(id=id)
            business.name = name
            business.image_url = image_url
            business.url = url
            business.review_count = review_count
            business.rating = rating
            log(MODULE_NAME, FUNC_NAME, 'Updating business to db: %s' %
                business.id)
        # Save new business
        else:
            business = Business(id=id,
                                name=name,
                                image_url=image_url,
                                url=url,
                                review_count=review_count,
                                rating=rating)
            log(MODULE_NAME, FUNC_NAME, 'Creating new business to db: %s' % (
                business.id))
        business.save()
    except Exception as ex:
        log_exception(MODULE_NAME, FUNC_NAME, ex)
Beispiel #15
0
def retrieve_ylp_with_ajax(request):
    """Handles ajax request to fetch reviews for a business from the db"""
    try:
        if 'business_id' in request.GET:
            business_id = request.GET.get('business_id')
            business = Business.objects.get(id=business_id)

            update_business_reviews(business)

            ylpline_ratings, review_ratings, smooth_rating, sparkline, sparkline_6mo, sparkline_12mo, sparkline_24mo = get_review_graph_data(business)
            context = {
                'sparkline': sparkline,
                'sparkline_6mo': sparkline_6mo,
                'sparkline_12mo': sparkline_12mo,
                'sparkline_24mo': sparkline_24mo,
                'smooth_rating': smooth_rating,
                'ylpline_ratings': ylpline_ratings,
                'review_ratings': review_ratings,
            }
        return render_to_response("main/retrieve_ylp_snippet.html", context)
    except Exception as ex:
        log_exception(MODULE_NAME, inspect.currentframe().f_code.co_name, ex)
Beispiel #16
0
def save_reviews(response, business, latest_review_date):
    """
    Save reviews to database.

    :param response: Holds review data
    :param business: The business the reviews are for
    :param latest_review_date: The most recent date we fetched for reviews
    for the business
    :return: Nothing. Reviews are saved to database.
    """
    ids = response.data[0]
    ratings = response.data[1]
    publish_dates = response.data[2]
    #texts = response.data[3]

    try:
        for id, rating, publish_date in zip(ids, ratings, publish_dates):
            # Don't bother to save if the review already exists in db.
            if not Review.objects.filter(id=id).exists():
                # Quit out if the publish date is older than the last fetch date
                # since everything in the loop now will be older than the last
                # fetch date.
                if latest_review_date is not None and publish_date < latest_review_date:
                    continue
                review = Review(id=id,
                                business=business,
                                rating=rating,
                                publish_date=publish_date)
                review.save()

        # Save for in case we want to store text
        # for id, rating, publish_date, text in zip(ids, ratings, publish_dates, texts):
        #     if not Review.objects.filter(id=id).exists():
        #         if latest_review_date is not None and publish_date < latest_review_date:
        #             continue
        #         review = Review(id=id, business=business, rating=rating, publish_date=publish_date, text=text)
        #         review.save()
    except Exception as ex:
        log_exception(MODULE_NAME, inspect.currentframe().f_code.co_name, ex)
Beispiel #17
0
def search_with_ajax(request):
    """Handles ajax request when user searches"""
    try:
        if 'query' in request.GET and 'location' in request.GET:
            form = FrontSearchForm(request.GET)
            if form.is_valid():
                query = form.cleaned_data['query']
                location = form.cleaned_data['location']
                businesses = search_for_businesses(query, location)
                context = {
                    'businesses': businesses,
                    'form': form,
                }
                return render_to_response("main/search_results_snippet.html",
                                          context)
            else:
                form = FrontSearchForm()
                return render_to_response("main/search_results_snippet.html",
                                          {'form': form})
        return render_to_response("main/search_results_snippet.html")
    except Exception as ex:
        log_exception(MODULE_NAME, inspect.currentframe().f_code.co_name, ex)
Beispiel #18
0
def retrieve_ylp_with_ajax(request):
    """Handles ajax request to fetch reviews for a business from the db"""
    try:
        if 'business_id' in request.GET:
            business_id = request.GET.get('business_id')
            business = Business.objects.get(id=business_id)

            update_business_reviews(business)

            ylpline_ratings, review_ratings, smooth_rating, sparkline, sparkline_6mo, sparkline_12mo, sparkline_24mo = get_review_graph_data(
                business)
            context = {
                'sparkline': sparkline,
                'sparkline_6mo': sparkline_6mo,
                'sparkline_12mo': sparkline_12mo,
                'sparkline_24mo': sparkline_24mo,
                'smooth_rating': smooth_rating,
                'ylpline_ratings': ylpline_ratings,
                'review_ratings': review_ratings,
            }
        return render_to_response("main/retrieve_ylp_snippet.html", context)
    except Exception as ex:
        log_exception(MODULE_NAME, inspect.currentframe().f_code.co_name, ex)
Beispiel #19
0
def search_for_businesses(query="", location="", debug=False):
    """
    Search for businesses that match against search terms and return
    a list of businesses.

    :param: query: Search terms
    :param: location: Geographical location to search in or near
    :return: A list of Businesses
    """
    FUNC_NAME = inspect.currentframe().f_code.co_name

    if debug:
        location = 'San Francisco'
    elif location == "":
        log_error(MODULE_NAME, FUNC_NAME, 'No location input in search')
        return []

    businesses = []
    log(MODULE_NAME, FUNC_NAME,
        'query: "%s", location: "%s"' % (query, location))

    try:
        businesses = run_query(query, location)
    except Exception as ex:
        log_exception(MODULE_NAME, FUNC_NAME, ex)

    # First 10 entries. No pagination yet so KISS.
    businesses = businesses[:10]
    for cur_business in businesses:
        has_reviews = Review.objects.filter(
            business_id=cur_business.id).exists()
        cur_business.has_reviews = has_reviews

        save_business(cur_business.id, cur_business.name,
                      cur_business.image_url, cur_business.url,
                      cur_business.review_count, cur_business.rating)
    return businesses
Beispiel #20
0
def save_reviews(response, business, latest_review_date):
    """
    Save reviews to database.

    :param response: Holds review data
    :param business: The business the reviews are for
    :param latest_review_date: The most recent date we fetched for reviews
    for the business
    :return: Nothing. Reviews are saved to database.
    """
    ids = response.data[0]
    ratings = response.data[1]
    publish_dates = response.data[2]
    #texts = response.data[3]

    try:
        for id, rating, publish_date in zip(ids, ratings, publish_dates):
            # Don't bother to save if the review already exists in db.
            if not Review.objects.filter(id=id).exists():
                # Quit out if the publish date is older than the last fetch date
                # since everything in the loop now will be older than the last
                # fetch date.
                if latest_review_date is not None and publish_date < latest_review_date:
                    continue
                review = Review(id=id, business=business, rating=rating, publish_date=publish_date)
                review.save()

        # Save for in case we want to store text
        # for id, rating, publish_date, text in zip(ids, ratings, publish_dates, texts):
        #     if not Review.objects.filter(id=id).exists():
        #         if latest_review_date is not None and publish_date < latest_review_date:
        #             continue
        #         review = Review(id=id, business=business, rating=rating, publish_date=publish_date, text=text)
        #         review.save()
    except Exception as ex:
        log_exception(MODULE_NAME, inspect.currentframe().f_code.co_name, ex)