def reset(self): """ clean up any remaining test users """ for business_id in self.created_ids: business = Business.get_by_id(business_id) if business: business.delete()
def test_reviews(self): review = Review.create(self.user.id, self.business, 1, 'This is a review', tags=['hello', 'world']) self.created_ids.append(review.id) review = Review.create(self.user.id, self.business, 5, 'This is a another review', tags=['hello', 'something']) self.created_ids.append(review.id) self.business = Business.get_by_id(self.business.id) self.assertTrue(self.business.rating == 3) self.assertTrue('hello' in self.business.tags) self.assertTrue('world' in self.business.tags) self.assertTrue('something' in self.business.tags) review.delete() self.business = Business.get_by_id(self.business.id) self.assertTrue(self.business.rating == 1) self.assertFalse('something' in self.business.tags) review = Review.create(self.user.id, self.business, 5, 'This is a another review', tags=['hello', 'something']) self.created_ids.append(review.id)
def reviews_post(request): """ creates new business review **authentication required with access_token** errors ====== * status 400 - if failed to create business returns ======= :: { "id": "" } """ business_id = request.matchdict['business_id'] business = Business.get_by_id(business_id) user = request.validated['user'] text = request.validated['text'] rating = request.validated['rating'] tags = request.validated['tags'] if tags: tags = tags.split(':') else: tags = [] if business and user: review = Review.create(user.id, business, rating, text, tags) response_body = { 'id': review.id, } # kill cache cache_key = 'business:{}*'.format(business.id) redis_cache.delete_pattern(cache_key) else: logger.debug('Failed to create review for business:{}'.format(business_id)) request.response.status_int = 400 response_body = { 'status': 'error', 'message': 'failed to create review for business' } request.response.body = json.dumps(response_body, cls=ComplexEncoder) request.response.content_type = 'application/json' return request.response
def reviews_get(request): """ Returns the business reviews errors ====== * status 404 - if the business can't be found returns ======= :: { "reviews": [ { "rating": 5, "modified": "2015-08-10T00:20:17.753000", "id": "55c7ee41fad9b43993d71919", "user_id": "55c7ee3dfad9b43993d7190e", "reviewed_id": "55c7ee3efad9b43993d7190f", "tags": [ "awesome" ], "text": "This is awesome.", "created": "2015-08-10T00:20:17.753000", "reviewed_collection": "businesses" } ] } """ business_id = request.matchdict['business_id'] business = Business.get_by_id(business_id) if business: response_body = { 'reviews': Review.reviews_for_reviewed(business.collection, business.id) } logger.debug('Retrieved business:{} reviews'.format(business.id)) else: logger.debug('Failed to retrieve business:{} reviews'.format(business_id)) request.response.status_int = 404 response_body = { 'status': 'error', 'message': 'failed to find business' } request.response.body = json.dumps(response_body, cls=ComplexEncoder) request.response.content_type = 'application/json' return request.response
def review_get(request): """ Returns the business review errors ====== * status 404 - if the review couldn't be found returns ======= :: { "rating": 5, "modified": "2015-08-10T00:20:17.753000", "id": "55c7ee41fad9b43993d71919", "user_id": "55c7ee3dfad9b43993d7190e", "reviewed_id": "55c7ee3efad9b43993d7190f", "tags": [ "awesome" ], "text": "This is awesome.", "created": "2015-08-10T00:20:17.753000", "reviewed_collection": "businesses" } """ business_id = request.matchdict['business_id'] review_id = request.matchdict['review_id'] business = Business.get_by_id(business_id) review = Review.get_by_id(review_id) if business and review and business.id == review.reviewed_id: response_body = review.json logger.debug('Retrieved business:{} review:{}'.format(business.id, review.id)) else: logger.debug('Failed to retrieve business:{} review:'.format(business_id, review_id)) request.response.status_int = 404 response_body = json.dumps({ 'status': 'error', 'message': 'failed to find business review' }) request.response.body = response_body request.response.content_type = 'application/json' return request.response
def update_business(event): """ compiles rating and tags for a business when a review is updated """ from reviews.models import Review review = event.review business = Business.get_by_id(review.reviewed_id) if business: business.rating = Review.rating_for_reviewed(review.reviewed_id) business.tags = Review.tags_for_reviewed(review.reviewed_id) business.save() logger.debug('updated business:{} reviews'.format(business.id)) else: logger.debug('failed to update business:{} reviews'.format(review.reviewd_id))
def business_get(request): """ Returns the business errors ====== * status 404 - if the business can't be found returns ======= /businesses/<id>?reviews=true :: { "rating": 5, "modified": "2015-08-10T00:20:14.370000", "address": { "street1": "Time Square", "postal_code": "", "street2": "", "city": "New York", "state": "NY" }, "id": "55c7ee3efad9b43993d7190f", "location": [ -73.985131, 40.758895 ], "reviews": [ { "rating": 5, "modified": "2015-08-10T00:20:17.753000", "id": "55c7ee41fad9b43993d71919", "user_id": "55c7ee3dfad9b43993d7190e", "reviewed_id": "55c7ee3efad9b43993d7190f", "tags": [ "awesome" ], "text": "This is awesome.", "created": "2015-08-10T00:20:17.753000", "reviewed_collection": "businesses" } ], "tags": [ "awesome" ], "name": "Time Square", "created": "2015-08-10T00:20:13.760000" } """ business_id = request.matchdict['business_id'] include_reviews = request.validated['reviews'] business = Business.get_by_id(business_id) # a light redis check is an example of how queries can be further optimized if include_reviews: cache_key = 'business:{}:reviews-true'.format(business_id) else: cache_key = 'business:{}:reviews-false'.format(business_id) cached = redis_cache.get(cache_key) if cached and business: response_body = cached elif business: response_body = business.toJSON() if include_reviews: response_body['reviews'] = Review.reviews_for_reviewed(business.collection, business.id) response_body = json.dumps(response_body, cls=ComplexEncoder) redis_cache.set(cache_key, response_body) logger.debug('Retrieved business:{}'.format(business.id)) else: logger.debug('Failed to retrieve business:{}'.format(business_id)) request.response.status_int = 404 response_body = json.dumps({ 'status': 'error', 'message': 'failed to find business' }) request.response.body = response_body request.response.content_type = 'application/json' return request.response
def refresh_business(self): """ loads and updates the business with the database """ self.business = Business.get_by_id(self.business.id)
def reset(self): self.user.delete() for _id in self.created_ids: business = Business.get_by_id(_id) business.delete()