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
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
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
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
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)
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)
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
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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
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)