def get_alerts(request_data): if request_data: request_data = json.loads(request_data) email = putil.validate_for_user_id_exists(request_data.get("user_id")) alert = frappe.db.sql("select * from `tabAlerts` where user_id='{0}' order by creation desc limit 1".format(request_data.get("user_id")),as_dict=1) try: if alert: property_search_query = putil.generate_search_query(alert[0]) new_query = property_search_query.get("query").get("bool").get("must") new_query.append({ "range" : { "posted_datetime" : { "gte": alert[0].get("creation").strftime("%Y-%m-%d %H:%M:%S"), } } }) property_search_query["query"]["bool"]["must"] = new_query else: search_query = { "sort": [{ "posted_datetime": { "order": "desc" }}], "query":{ "bool":{ "must":[ {"match":{ "user_id":request_data.get("user_id") } } ] } } } es = ElasticSearchController() response_data, total_records = es.search_document(["request"], search_query, 1, 1) if response_data: last_month_date = add_months(datetime.datetime.now() ,-1).strftime("%Y-%m-%d %H:%M:%S") property_search_query = response_data[0].get("search_query") property_search_query = ast.literal_eval(property_search_query.encode("utf8")) new_query = property_search_query.get("query").get("bool").get("must") new_query.append({ "range" : { "posted_datetime" : { "gte":last_month_date, } } }) property_search_query["query"]["bool"]["must"] = new_query else: raise OperationFailed("No Alerts and Request Id found against User {0}".format(email)) es = ElasticSearchController() response_data, total_records = es.search_document(["property"], property_search_query, request_data.get("page_number",1), request_data.get("records_per_page",40)) from_record = ((request_data.get("page_number",1) - 1) * cint(request_data.get("records_per_page",40)) + 1 ) response_msg = "Property Found" if response_data else "Property not found" no_of_pages = math.ceil(flt(total_records)/request_data.get("records_per_page",40)) return {"operation":"Search", "message":response_msg ,"total_records":total_records,"records_per_page":request_data.get("records_per_page",40),"from_record":from_record ,"to_record": from_record + len(response_data) - 1 if response_data else from_record + request_data.get("records_per_page",40) - 1 ,"data":response_data, "user_id":request_data.get("user_id"), "no_of_pages":no_of_pages} except elasticsearch.ElasticsearchException,e: raise ElasticSearchException(e.error) except Exception,e: raise e
def get_alerts_based_on_alert_doctype(alert): """ Generate search query from alert set by user & check for properties which are posted after creation date of alert only. """ uom = alert[0].get("unit_of_area") alert[0]["unit_of_area"] = "Sq.Ft." if uom not in ["Sq.Ft.", "Acres", "Hectares"] else uom putil.convert_area_to_sqft_for_search(alert[0]) property_search_query = putil.generate_search_query(alert[0]) new_query = property_search_query.get("query").get("bool").get("must") new_query.append({ "range" : { "modified_datetime" : { "gte": alert[0].get("creation").strftime("%Y-%m-%d %H:%M:%S"), } } }) property_search_query["query"]["bool"]["must"] = new_query return property_search_query, alert[0].get("unit_of_area")
def search_property(data): if data: old_property_data = json.loads(data) property_data = putil.validate_property_posting_data(old_property_data,"property_json/property_search.json") putil.isolate_city_from_location(property_data) try: search_query = putil.generate_search_query(property_data) es = ElasticSearchController() response_data, total_records = es.search_document(["property"], search_query, old_property_data.get("page_number",1), old_property_data.get("records_per_page",40)) request_id = store_request_in_elastic_search(property_data, search_query, "Property Search") if old_property_data.get("user_id") != "Guest": response_data = check_for_shortlisted_property(response_data,old_property_data.get("user_id")) response_data = putil.get_date_diff_from_posting(response_data) response_msg = "Property found for specfied criteria" if len(response_data) else "Property not found" from_record = (old_property_data.get("page_number",1) - 1) * cint(old_property_data.get("records_per_page",40)) + 1 no_of_pages = math.ceil(flt(total_records)/old_property_data.get("records_per_page",40)) return {"operation":"Search", "message":response_msg ,"total_records":total_records, "request_id":request_id, "records_per_page":old_property_data.get("records_per_page",40),"from_record":from_record ,"to_record":from_record + len(response_data) - 1 if response_data else from_record + old_property_data.get("records_per_page",40) - 1,"data":response_data, "user_id":old_property_data.get("user_id"), "no_of_pages":no_of_pages} except elasticsearch.RequestError,e: raise ElasticInvalidInputFormatError(e.error) except elasticsearch.ElasticsearchException,e: raise ElasticSearchException(e.error)
def search_property(data): property_data = json.loads(data) property_data = putil.validate_property_posting_data(property_data, "property_json/property_search.json") putil.init_for_location_or_city_creation(property_data) putil.convert_area_to_sqft_for_search(property_data) try: # generate search query & result generation & list of fields which should be excluded. exclude_list = putil.get_exclude_list_for_search(property_data.get("request_source", "")) search_query = putil.generate_search_query(property_data) adv_search_query = search_query search_query = cstr(search_query) putil.generate_advance_search_query(adv_search_query, property_data) es = ElasticSearchController() response_data, total_records = es.search_document(["property"], adv_search_query, property_data.get("page_number",1), property_data.get("records_per_page",40), exclude_list) # post property-search operation if not property_data.get("request_id"): request_id = store_request_in_elastic_search(property_data, search_query, "Property Search", adv_search_query) if property_data.get("user_id") != "Guest": response_data = check_for_shortlisted_property(response_data,property_data.get("user_id")) response_data = putil.get_date_diff_and_count_from_posting(response_data) putil.convert_area_according_to_uom(response_data, property_data.get("unit_of_area", "Sq.Ft.")) putil.show_amenities_with_yes_status(response_data) # response data & pagination logic msg = "Property found for specfied criteria" if len(response_data) else "Property not found" response_dict = putil.init_pagination_and_response_generatrion(property_data, response_data, msg, total_records) response_dict["request_id"] = property_data.get("request_id") if property_data.get("request_id") else request_id return response_dict except elasticsearch.RequestError,e: raise ElasticInvalidInputFormatError(e.error)