blob: d158167042894f7e6db4ba4e72c8357854fdd2bd [file] [log] [blame]
Chillar Anand915b3432021-09-02 16:44:59 +05301import frappe
2import requests
Prateeksha Singhb44ea4c2018-05-22 11:57:21 +05303from frappe import _
Suraj Shetty32fd7532022-07-06 15:09:44 +05304from frappe.core.utils import html2text
Prateeksha Singhb44ea4c2018-05-22 11:57:21 +05305from frappe.utils import sanitize_html
6from frappe.utils.global_search import search
Chillar Anand915b3432021-09-02 16:44:59 +05307from jinja2 import utils
Chillar Anand915b3432021-09-02 16:44:59 +05308
Prateeksha Singhb44ea4c2018-05-22 11:57:21 +05309
10def get_context(context):
11 context.no_cache = 1
12 if frappe.form_dict.q:
13 query = str(utils.escape(sanitize_html(frappe.form_dict.q)))
Ankush Menat494bd9e2022-03-28 18:52:46 +053014 context.title = _("Help Results for")
Prateeksha Singh0c796222018-08-06 12:33:34 +053015 context.query = query
Aditya Hase691c1662019-02-07 20:35:52 +053016
Ankush Menat494bd9e2022-03-28 18:52:46 +053017 context.route = "/search_help"
Prateeksha Singhb44ea4c2018-05-22 11:57:21 +053018 d = frappe._dict()
19 d.results_sections = get_help_results_sections(query)
20 context.update(d)
21 else:
Ankush Menat494bd9e2022-03-28 18:52:46 +053022 context.title = _("Docs Search")
Prateeksha Singhb44ea4c2018-05-22 11:57:21 +053023
Ankush Menat494bd9e2022-03-28 18:52:46 +053024
25@frappe.whitelist(allow_guest=True)
Prateeksha Singhb44ea4c2018-05-22 11:57:21 +053026def get_help_results_sections(text):
27 out = []
28 settings = frappe.get_doc("Support Settings", "Support Settings")
29
30 for api in settings.search_apis:
31 results = []
32 if api.source_type == "API":
33 response_json = get_response(api, text)
34 topics_data = get_topics_data(api, response_json)
35 results = prepare_api_results(api, topics_data)
36 else:
37 # Source type is Doctype
38 doctype = api.source_doctype
39 raw = search(text, 0, 20, doctype)
40 results = prepare_doctype_results(api, raw)
41
42 if results:
43 # Add section
Ankush Menat494bd9e2022-03-28 18:52:46 +053044 out.append({"title": api.source_name, "results": results})
Prateeksha Singhb44ea4c2018-05-22 11:57:21 +053045
46 return out
47
Ankush Menat494bd9e2022-03-28 18:52:46 +053048
Prateeksha Singhb44ea4c2018-05-22 11:57:21 +053049def get_response(api, text):
Ankush Menat494bd9e2022-03-28 18:52:46 +053050 response = requests.get(
51 api.base_url + "/" + api.query_route, data={api.search_term_param_name: text}
52 )
Prateeksha Singhb44ea4c2018-05-22 11:57:21 +053053
54 response.raise_for_status()
55 return response.json()
56
Ankush Menat494bd9e2022-03-28 18:52:46 +053057
Prateeksha Singhb44ea4c2018-05-22 11:57:21 +053058def get_topics_data(api, response_json):
59 if not response_json:
60 response_json = {}
Ankush Menat494bd9e2022-03-28 18:52:46 +053061 topics_data = {} # it will actually be an array
62 key_list = api.response_result_key_path.split(",")
Prateeksha Singhb44ea4c2018-05-22 11:57:21 +053063
64 for key in key_list:
65 topics_data = response_json.get(key) if not topics_data else topics_data.get(key)
66
67 return topics_data or []
68
Ankush Menat494bd9e2022-03-28 18:52:46 +053069
Prateeksha Singhb44ea4c2018-05-22 11:57:21 +053070def prepare_api_results(api, topics_data):
71 if not topics_data:
72 topics_data = []
73
74 results = []
75 for topic in topics_data:
Ankush Menat494bd9e2022-03-28 18:52:46 +053076 route = api.base_url + "/" + (api.post_route + "/" if api.post_route else "")
77 for key in api.post_route_key_list.split(","):
Ankush Menat8fe5feb2021-11-04 19:48:32 +053078 route += str(topic[key])
Prateeksha Singhb44ea4c2018-05-22 11:57:21 +053079
Ankush Menat494bd9e2022-03-28 18:52:46 +053080 results.append(
81 frappe._dict(
82 {
83 "title": topic[api.post_title_key],
84 "preview": html2text(topic[api.post_description_key]),
85 "route": route,
86 }
87 )
88 )
Prateeksha Singhb44ea4c2018-05-22 11:57:21 +053089 return results[:5]
90
Ankush Menat494bd9e2022-03-28 18:52:46 +053091
Prateeksha Singhb44ea4c2018-05-22 11:57:21 +053092def prepare_doctype_results(api, raw):
93 results = []
94 for r in raw:
95 prepared_result = {}
Ankush Menat494bd9e2022-03-28 18:52:46 +053096 parts = r["content"].split(" ||| ")
Prateeksha Singhb44ea4c2018-05-22 11:57:21 +053097
98 for part in parts:
Ankush Menat494bd9e2022-03-28 18:52:46 +053099 pair = part.split(" : ", 1)
Prateeksha Singhb44ea4c2018-05-22 11:57:21 +0530100 prepared_result[pair[0]] = pair[1]
101
Ankush Menat494bd9e2022-03-28 18:52:46 +0530102 results.append(
103 frappe._dict(
104 {
105 "title": prepared_result[api.result_title_field],
106 "preview": prepared_result[api.result_preview_field],
107 "route": prepared_result[api.result_route_field],
108 }
109 )
110 )
Prateeksha Singhb44ea4c2018-05-22 11:57:21 +0530111
112 return results