Beispiel #1
0
 def test_searchReviewed(self, activeClient, baseProviderSearch):
     baseProviderSearch['reviewed_filter'] = True
     filters, sort = self.generateSearchFilters(baseProviderSearch)
     providers = Provider.search(filters, sort=sort)
     assert len(providers) == 2
     assert providers[0].name == 'Douthit Electrical'
     assert providers[1].name == 'Preferred Electric Co'
Beispiel #2
0
def searchJSON():
    form = ProviderSearchForm(request.args).populate_choices()
    del form.location
    page = request.args.get('page', 1, int)
    if form.validate() or request.args.get('page') is not None:
        location = session['location']
        searchLocation = Location(location['source'], location['address'],
                                  location['coordinates'])
        searchLocation.setRangeCoordinates()
        reviewFilters = {
            "friends": form.friends_filter.data,
            "groups": form.groups_filter.data,
            "reviewed": form.reviewed_filter.data
        }
        filters = {
            "name": form.name.data,
            "category": Category.query.get(form.category.data),
            "location": searchLocation
        }
        sortCriteria = form.sort.data
        providers = Provider.search(filters, sortCriteria, reviewFilters)
        if sortCriteria == "distance":
            providers = sortByDistance(searchLocation.coordinates, providers)
        pagination = Pagination(providers, page,
                                current_app.config.get('PER_PAGE'))
        providers = pagination.paginatedData
        providersDict = [provider._asdict() for provider in providers]
        return jsonify(providersDict, location)
Beispiel #3
0
def providerAutocomplete():
    """Pulls list of providers matching input text."""
    form = ProviderSearchForm(request.args)
    form.populate_choices()
    print(form.data)
    del form.sort
    if form.validate():
        try:
            searchLocation = Location(form.location.data,
                                      form.manual_location.data,
                                      (form.gpsLat.data, form.gpsLong.data))
        except AddressError:
            msg = {"status": "failed", "reason": "invalid address"}
            return jsonify(msg), 422
        searchLocation.setRangeCoordinates()
        filters = {
            "name": form.name.data,
            "category": Category.query.get(form.category.data),
            "location": searchLocation
        }
        sortCriteria = "name"
        providers = Provider.search(filters, sortCriteria, limit=10)
        providers = [{
            "id": provider.id,
            "name": provider.name,
            "line1": provider.line1,
            "city": provider.city,
            "state": provider.state_short
        } for provider in providers]
        return jsonify(providers)
    msg = {"status": "failed", "reason": "invalid form data"}
    return jsonify(msg), 422
Beispiel #4
0
 def test_searchShortDistance(self, activeClient, baseProviderSearch):
     baseProviderSearch.update({"searchRange": 7})
     filters, sort = self.generateSearchFilters(baseProviderSearch)
     providers = Provider.search(filters, sort)
     assert len(providers) == 2
     assert providers[0].name == 'Douthit Electrical'
     assert providers[1].name == 'Preferred Electric Co'
Beispiel #5
0
 def test_searchLimit(self, activeClient, baseProviderSearch):
     filters, sort = self.generateSearchFilters(baseProviderSearch)
     limit = 1
     providers = Provider.search(filters, sort=sort, limit=limit)
     assert len(providers) == 1
     assert providers[0].name == 'Douthit Electrical'
     assert providers[0].reviewAverage == (10 / 4)
     assert providers[0].reviewCount == 4
     assert providers[0].reviewCost == (18 / 4)
Beispiel #6
0
 def test_searchRatingSort(self, activeClient, baseProviderSearch):
     baseProviderSearch['sort'] = 'rating'
     filters, sort = self.generateSearchFilters(baseProviderSearch)
     providers = Provider.search(filters, sort)
     assert len(providers) == 3
     assert providers[0].name == 'Preferred Electric Co'
     assert providers[1].name == 'Douthit Electrical'
     assert providers[2].name == 'Evers Electric'
     assert providers[1].categories == "Electrician,Plumber"
Beispiel #7
0
 def test_searchName(self, activeClient, baseProviderSearch):
     baseProviderSearch['name'] = 'Evers Electric'
     filters, sort = self.generateSearchFilters(baseProviderSearch)
     providers = Provider.search(filters, sort)
     assert providers[0].name == 'Evers Electric'
     assert providers[0].website == 'www.everselectric.com/'
     assert providers[0].reviewAverage is None
     assert providers[0].reviewCount == 0
     assert providers[0].reviewCost is None
Beispiel #8
0
 def test_searchGroups(self, activeClient, baseProviderSearch):
     baseProviderSearch['groups_filter'] = True
     filters, sort = self.generateSearchFilters(baseProviderSearch)
     providers = Provider.search(filters, sort=sort)
     assert len(providers) == 1
     assert providers[0].name == 'Douthit Electrical'
     assert providers[0].reviewAverage == 5
     assert providers[0].reviewCount == 1
     assert providers[0].reviewCost == 5
     assert providers[0].categories == "Electrician,Plumber"
Beispiel #9
0
 def test_searchFriendsOrGroups(self, activeClient, baseProviderSearch):
     baseProviderSearch.update({
         "friends_filter": True,
         "groups_filter": True
     })
     filters, sort = self.generateSearchFilters(baseProviderSearch)
     providers = Provider.search(filters, sort=sort)
     assert len(providers) == 1
     assert providers[0].name == 'Douthit Electrical'
     assertEqualsTolerance(providers[0].reviewAverage, (7 / 3), 3)
     assert providers[0].reviewCount == 3
     assert providers[0].reviewCost == 5
     assert providers[0].categories == "Electrician,Plumber"
Beispiel #10
0
    def test_searchNoName(self, activeClient, baseProviderSearch):
        # create filters, location, category

        filters, sort = self.generateSearchFilters(baseProviderSearch)
        providers = Provider.search(filters, sort)
        assert len(providers) == 3
        assert providers[0].name == 'Douthit Electrical'
        assert providers[1].name == 'Evers Electric'
        assert providers[2].name == 'Preferred Electric Co'
        assert providers[0].reviewAverage == (10 / 4)
        assert providers[0].reviewCount == 4
        assert providers[0].reviewCost == (18 / 4)
        assert providers[0].categories == "Electrician,Plumber"
Beispiel #11
0
def provider(name, id):
    """Generate provider profile page."""
    form = ProviderFilterForm(request.args)
    filters = {"id": id, "name": name}
    try:
        provider = Provider.search(filters)[0]
    except IndexError:
        flash("Provider not found.  Please try a different search.")
        return render_template('errors/404.html'), 404
    if form.validate():
        reviewFilter = {
            "friends_filter": form.friends_filter.data,
            "groups_filter": form.groups_filter.data
        }
        page = request.args.get('page', 1, int)
        return_code = 200
    else:
        last = dict(parse.parse_qsl(parse.urlsplit(request.referrer).query))
        filter_keys = ['friends_filter', 'groups_filter']
        reviewFilter = {k: last.get(k) == 'y' for k in filter_keys}
        page = last.get('page', 1)
        return_code = 422
    if provider.reviewCount > 0:
        reviews = Review.search(provider_id=provider.id, filter=reviewFilter)
        pagination = Pagination(reviews, page,
                                current_app.config.get('PER_PAGE'))
        pag_args = {"name": name, "id": id}
        pag_urls = pagination.get_urls('main.provider', pag_args)
        reviews = pagination.paginatedData
    else:
        reviews = None
        pag_urls = None

    provider_json = simplejson.dumps(provider._asdict(), sort_keys=True)

    return render_template("provider_profile.html",
                           title="Provider Profile",
                           provider=provider,
                           pag_urls=pag_urls,
                           reviews=reviews,
                           form=form,
                           reviewFilter=reviewFilter,
                           provider_json=provider_json), return_code
Beispiel #12
0
def search():
    form = ProviderSearchForm(request.args)
    form.populate_choices()
    page = request.args.get('page', 1, int)
    form_dict = json.dumps(form.data)
    if form.validate() or request.args.get('page') is not None:
        try:
            searchLocation = Location(form.location.data,
                                      form.manual_location.data,
                                      (form.gpsLat.data, form.gpsLong.data))
        except AddressError:
            flash("Invalid address submitted. Please re-enter and try again.")
            if form.manual_location.data not in [None, ""]:
                msg = "Invalid Address. Please updated."
                form.manual_location.errors.append(msg)
            return render_template("index.html",
                                   form_dict=form_dict,
                                   form=form,
                                   title="Search"), 422

        searchLocation.setRangeCoordinates(form.searchRange.data)
        filters = {
            "name": form.name.data,
            "category": Category.query.get(form.category.data),
            "location": searchLocation,
            "friends": form.friends_filter.data,
            "groups": form.groups_filter.data,
            "reviewed": form.reviewed_filter.data
        }
        sortCriteria = form.sort.data
        providers = Provider.search(filters, sortCriteria)

        if providers == []:
            flash("No results found. Please try a different search.")
            providersDict = simplejson.dumps([], sort_keys=True)
            summary = None
            pag_urls = None
            locationDict = None

        else:
            summary = Review.summaryStatSearch(filters)
            if sortCriteria == "distance":
                providers = sortByDistance(searchLocation.coordinates,
                                           providers)
            pagination = Pagination(providers, page,
                                    current_app.config.get('PER_PAGE'))
            pag_urls = pagination.get_urls('main.search', request.args)
            providers = pagination.paginatedData
            providersDict = [provider._asdict() for provider in providers]
            providersDict = simplejson.dumps(providersDict, sort_keys=True)
            if session.get('location'):
                locationDict = session['location']
                locationDict = simplejson.dumps(locationDict, sort_keys=True)
            else:
                locationDict = None

        filter_fields = [
            form.reviewed_filter, form.friends_filter, form.groups_filter
        ]
        reviewFilter = {}
        for field in filter_fields:
            if field.data is True:
                reviewFilter[field.name] = 'y'
        form.initialize()

        return render_template("index.html",
                               form=form,
                               title="Search",
                               providers=providers,
                               pag_urls=pag_urls,
                               form_dict=form_dict,
                               reviewFilter=reviewFilter,
                               locationDict=locationDict,
                               providersDict=providersDict,
                               summary=summary)
    return render_template("index.html",
                           form=form,
                           form_dict=form_dict,
                           title="Search"), 422