Beispiel #1
0
    def create_business(self, name, address):
        # check business
        business = Business.create(name, address)
        self.created_ids.append(business.id)
        self.assertTrue(business)

        return business
Beispiel #2
0
    def setUp(self):
        from service import main
        from paste.deploy import appconfig
        from webtest import TestApp

        # set settings
        os.environ['PYRAMID_SETTINGS'] = 'development.ini#main'
        self.settings = appconfig('config:{}'.format(os.environ['PYRAMID_SETTINGS']), relative_to='.')
        app = main({}, **self.settings)
        self.testapp = TestApp(app)
        self.config = testing.setUp(settings=self.settings)

        self.created_ids = []

        # init user
        self.user = User.create('*****@*****.**', 'hello')
        payload = {
            'email': '*****@*****.**',
            'password': '******',
        }
        response = self.testapp.post_json('/api/v1/authenticate', payload, status=200)
        self.access_token = response.json['access_token']

        # init business
        address = {
            'street1': 'Central Park',
            'city': 'New York',
            'state': 'NY',
        }
        self.business = Business.create('Test Location', address)
Beispiel #3
0
 def create_business(self):
     address = {
         'street1': 'Central Park',
         'city': 'New York',
         'state': 'NY'
     }
     business = Business.create('Central Park', address)
     return business
Beispiel #4
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 #5
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 #6
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 #7
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 #8
0
    def businesses_post(request):
        """
        create a new business

        **requires authentication with an access_token**


        errors
        ======

        * status 500 - if the user can't be saved


        returns
        =======

        ::

            {
                "id": ""
            }
        """
        user = request.validated['user']
        name = request.validated['name']
        address = {
            'street1': request.validated['street1'],
            'street2': request.validated['street2'],
            'city': request.validated['city'],
            'state': request.validated['state'],
            'postal_code': request.validated['postal_code'],
        }

        business = Business.create(name, address)

        if business:
            logger.debug('Created new business:{}'.format(business.id))
            response_body = {
                'id': business.id
            }
        else:
            logger.debug('Failed to create new business.')
            requests.response.status_int = 500
            response_body = {
                'status': 'error',
                'message': 'failed to create new business',
            }

        request.response.body = json.dumps(response_body, cls=ComplexEncoder)
        request.response.content_type = 'application/json'
        return request.response
Beispiel #9
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 #11
0
def parse_csv(csv_filename):
    with open(csv_filename) as csv_file:
        reader = csv.reader(csv_file)
        next(reader)  # first line has the headers.
        for row in reader:
            yield Business(
                id=int(row[0]),
                uuid=row[1],
                name=row[2],
                address=row[3],
                address2=row[4],
                city=row[5],
                state=row[6],
                zip=row[7],
                country=row[8],
                phone=row[9],
                website=row[10],
                created_at=row[11],
            )
Beispiel #12
0
def BusinessListView(request):
    model = Business()
    businesses = Business.objects.filter(user=request.user)
    return render(request, 'businesses/business_list.html', {'businesses': businesses})
Beispiel #13
0
 def refresh_business(self):
     """
     loads and updates the business with the database
     """
     self.business = Business.get_by_id(self.business.id)
Beispiel #14
0
def create_businesses():
    businesses = []
    address = {
        'street1': 'Time Square',
        'city': 'New York',
        'state': 'NY'
    }
    business = Business.create('Time Square', address)
    businesses.append(business)

    address = {
        'street1': 'Battery Park',
        'city': 'New York',
        'state': 'NY'
    }
    business = Business.create('Battery Park', address)
    businesses.append(business)

    address = {
        'street1': 'Flushing Medows',
        'city': 'New York',
        'state': 'NY'
    }
    business = Business.create('Flushing Medows', address)
    businesses.append(business)

    address = {
        'street1': 'Central Park',
        'city': 'New York',
        'state': 'NY'
    }
    business = Business.create('Central Park', address)
    businesses.append(business)

    address = {
        'street1': '2200 Broadway',
        'city': 'New York',
        'state': 'NY'
    }
    business = Business.create('2200', address)
    businesses.append(business)

    address = {
        'street1': '1800 Broadway',
        'city': 'New York',
        'state': 'NY'
    }
    business = Business.create('1800', address)
    businesses.append(business)

    address = {
        'street1': '1500 Broadway',
        'city': 'New York',
        'state': 'NY'
    }
    business = Business.create('1500', address)
    businesses.append(business)

    address = {
        'street1': '1200 Broadway',
        'city': 'New York',
        'state': 'NY'
    }
    business = Business.create('1200', address)
    businesses.append(business)

    return businesses
Beispiel #15
0
    def businesses_get(request):
        """
        Returns the businesses

        location format = [lng, lat]

        use limit and offset to paginate::

            http://localhost:8000/api/v1/businesses?limit=100&offset=0

        to restrict results withing a distance from a location use lat, lng, distance, and units::

            http://localhost:8000/api/v1/businesses?lng=-73.988395&lat=40.7461666&distance=3


        returns
        =======

        ::

            {
                "businesses": [{
                    "rating": 2.25,
                    "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
                    ],
                    "tags": [
                        "hello",
                        "world",
                        "example",
                        "awesome"
                    ],
                    "name": "Time Square",
                    "created": "2015-08-10T00:20:13.760000"
                }],
                "count": 1
            }
        """
        location = []
        lat = request.validated['lat']
        lng = request.validated['lng']
        distance = request.validated['distance']
        units = request.validated['units']
        limit = request.validated['limit']
        offset = request.validated['offset']

        # set location only if both lat and lng
        if lat and lng:
            location = [lng, lat]

        businesses = Business.businesses(location=location, distance=distance, units=units, limit=limit, offset=offset)

        # get business count to help pagination
        if location:
            # TODO: this count is wrong when location limiting
            businesses_count = len(businesses)
        else:
            businesses_count = Business.count()

        businesses_jsonable = []

        for business in businesses:
            businesses_jsonable.append(business.toJSON())

        response_body = {
            'businesses': businesses_jsonable,
            'count': businesses_count,
        }
        logger.debug('Retrieved businesses')

        request.response.body = json.dumps(response_body, cls=ComplexEncoder)
        request.response.content_type = 'application/json'
        return request.response
Beispiel #16
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 #17
0
    def reset(self):
        self.user.delete()

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