Beispiel #1
0
    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()
Beispiel #2
0
    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)
Beispiel #3
0
    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
Beispiel #4
0
    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
Beispiel #5
0
    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))
Beispiel #7
0
    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
Beispiel #8
0
 def refresh_business(self):
     """
     loads and updates the business with the database
     """
     self.business = Business.get_by_id(self.business.id)
Beispiel #9
0
    def reset(self):
        self.user.delete()

        for _id in self.created_ids:
            business = Business.get_by_id(_id)
            business.delete()