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)
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
def test_newSearchRangeInvalid(self, baseProviderSearch): baseProviderSearch.update({"searchRange": -5}) formdata = ImmutableMultiDict(baseProviderSearch) form = ProviderSearchForm(formdata=formdata) form.populate_choices() assert not form.validate() msg = "Search range must be a positive number." assert msg in form.errors['searchRange']
def test_populateChoices(self, baseProviderSearch): formdata = ImmutableMultiDict(baseProviderSearch) form = ProviderSearchForm(formdata=formdata) form.populate_choices() assert form.category.choices == [(1, 'Electrician'), (2, 'Plumber')] assert form.location.choices[0] == ( "home", "Home - 7708 Covey Chase Dr, Charlotte, NC") assert form.location.choices[1] == ("gps", "New - Use GPS") assert form.location.choices[2] == ("manual", "New - Manually Enter") assert len(form.location.choices) == 3
def test_newGPS(self, baseProviderSearch): baseProviderSearch.update({ "location": "gps", "gpsLat": 42.00, "gpsLong": -81.000 }) formdata = ImmutableMultiDict(baseProviderSearch) form = ProviderSearchForm(formdata=formdata) form.populate_choices() assert form.validate()
def test_populateChoicesLocationSession(self, baseProviderSearch, mockGeoResponse): searchLocation = Location("manual", "8012 Covey Chase Dr, Charlotte, NC", ("", "")) baseProviderSearch['location'] = "manualExisting" formdata = ImmutableMultiDict(baseProviderSearch) form = ProviderSearchForm(formdata=formdata) form.populate_choices() assert form.location.choices[0] == ( "manualExisting", "8012 Covey Chase Dr, Charlotte, NC")
def test_newManual(self, baseProviderSearch): baseProviderSearch.update({ "location": "manual", "manual_location": "7708 Covey Chase Dr, Charlotte NC 28210" }) formdata = ImmutableMultiDict(baseProviderSearch) form = ProviderSearchForm(formdata=formdata) form.populate_choices() assert form.validate()
def test_newGPSInvalid(self, baseProviderSearch): baseProviderSearch.update({ "location": "gps", "gpsLat": "not_lat", "gpsLong": "not_long" }) formdata = ImmutableMultiDict(baseProviderSearch) form = ProviderSearchForm(formdata=formdata) form.populate_choices() assert not form.validate() msg = "GPS location data must be numeric type." assert msg in form.errors['gpsLat']
def test_initialize(self, baseProviderSearch, mockGeoResponse): searchLocation = Location("manual", "8012 Covey Chase Dr, Charlotte, NC", ("", "")) baseProviderSearch.update({ "location": "manual", "manual_location": "8012 Covey Chase Dr, Charlotte, NC" }) formdata = ImmutableMultiDict(baseProviderSearch) form = ProviderSearchForm(formdata=formdata) form.initialize() assert form.location.choices[0] == ( "manualExisting", "8012 Covey Chase Dr, Charlotte, NC") assert form.manual_location.data == ""
def search_form(app, dbSession): with app.app_context(): from app.main.forms import ProviderSearchForm form = ProviderSearchForm() c = Category.query.filter_by(name="Electrician").first().id s = State.query.filter_by(name="North Carolina").first().id form.category.data = c form.state.data = s form.city.data = "Charlotte" yield form
def test_newGPSNoLatLong(self, baseProviderSearch): baseProviderSearch.update({"location": "gps"}) formdata = ImmutableMultiDict(baseProviderSearch) form = ProviderSearchForm(formdata=formdata) form.populate_choices() form.validate() assert not form.validate() msg = 'Must allow access to device location if gps selected as location source.' assert msg in form.errors['gpsLat']
def test_newMissingRequired(self, baseProviderSearch, key, errorMsg): baseProviderSearch.pop(key) formdata = ImmutableMultiDict(baseProviderSearch) form = ProviderSearchForm(formdata=formdata) form.populate_choices() form.validate() assert errorMsg in form.errors[key]
def index(): form = ProviderSearchForm() form.populate_choices() form.set_default_values() form_dict = json.dumps(form.data) return render_template("index.html", form=form, form_dict=form_dict, title="Search")
def test_new(self, baseProviderSearch, activeClient): formdata = ImmutableMultiDict(baseProviderSearch) form = ProviderSearchForm(formdata=formdata) form.populate_choices() form.validate() assert form.validate()
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