def run_report(self, data, docdata=None): doctype = data.get('doctype') rdoc = frappe.get_doc(doctype, data.get('report_name')) #call hook before run the report utils.call_hook_for_param(rdoc, "jasper_before_run_report", data) rtype = rdoc.get("jasper_report_type") if data.get("fortype").lower() == "doctype" and rtype in ("List", "Form"): for docname in data.get('name_ids', []) or []: if not utils.check_frappe_permission(rdoc.jasper_doctype, docname, ptypes=("read", "print")): raise frappe.PermissionError( _("No {0} permission for document {1} in doctype {3}." ).format("read or print", docname, rdoc.jasper_doctype)) #if user can read doc it is possible that can't print it! Just uncheck Read permission in doctype Jasper Reports if not utils.check_frappe_permission( "Jasper Reports", data.get('report_name', ""), ptypes="read"): raise frappe.PermissionError(_("You don't have print permission.")) params = rdoc.jasper_parameters origin = rdoc.jasper_report_origin.lower() pformat = data.get('pformat') ncopies = get_copies(rdoc, pformat) if origin == "localserver": path = rdoc.jrxml_root_path self.get_server("local") if not path: frappe.throw(_("%s: Import first a jrxml file." % rdoc.name)) for_all_sites = rdoc.jasper_all_sites_report result = self.jpl.run_local_report_async( path, rdoc, data=data, params=params, pformat=pformat, ncopies=ncopies, for_all_sites=for_all_sites) else: path = rdoc.jasper_report_path self.get_server("server") if not self.jps.is_login: frappe.msgprint(_("Jasper Server, login error.")) return result = self.jps.run_remote_report_async(path, rdoc, data=data, params=params, pformat=pformat, ncopies=ncopies) result[0]["pformat"] = pformat return result
def get_param_hook(self, doc, data, pram_server): pram = [] res = utils.call_hook_for_param(doc, "on_jasper_params", data, pram_server) if pram_server else [] if res is None: frappe.throw(_("Error in report %s, there is no value for parameter in server hook: on_jasper_params." % (doc.jasper_report_name))) for param in res: param.pop("attrs", None) param_type = param.pop("param_type", None) if param_type and param_type.lower() == "is for where clause": param.setdefault("param_expression", "In") value = self.get_where_clause_value(param.get("value", None), frappe._dict(param)) if not value: frappe.throw(_("Error in report %s, there is no value for parameter %s in server hook: on_jasper_params." % (doc.jasper_report_name, param.get("name", "")))) param["value"] = [value] param.pop("param_expression", None) value = param.get("value",None) if value is not None and not isinstance(value, list): value = [value] try: """ If number returned then convert number to string. """ number = value[0] int(number) param["value"] = [str(value[0])] except ValueError: """ If not number returned. """ param["value"] = value pram.append(param) return pram
def get_param_hook(self, doc, data, pram_server): """ HOOK: Must return a list of objects. Some examples are: def on_jasper_params(self, data=None, params=None): a = [] for param in params: if param.get("name") == "idade": a.append({"name": param.get("name"), "value": 35.6}) else: #a.append({"name": param.get("name"), "value":['*****@*****.**'], "param_type": "is for where clause"}) a.append({"name": param.get("name"), "value":['*****@*****.**']}) #a.append({"name":param.get("name"), "value": ["Administrator", "*****@*****.**"], "param_type": "Is for where clause"}) #a.append({"name": params[0].get("name"), "value":'select name, email from tabUser where name in ("*****@*****.**")'}) #a.append({"name": params[0].get("name"), "value":['Administrator', 'Guest'], "param_type": "is for where clause"}) #a.append({"name": params[0].get("name"), "value":['Guest', 'Administrator']}) #a.append({"name": params[0].get("name"), "value":345}) return a """ pram = [] res = utils.call_hook_for_param(doc, "on_jasper_params", data, pram_server) if pram_server else [] if res is None: frappe.throw(_("Error in report %s, there is no value for parameter in server hook: on_jasper_params." % (doc.jasper_report_name))) for param in res: param.pop("attrs", None) param_type = param.pop("param_type", None) if param_type and param_type.lower() == "is for where clause": param.setdefault("param_expression", "In") value = self.get_where_clause_value(param.get("value", None), frappe._dict(param)) if not value: frappe.throw(_("Error in report %s, there is no value for parameter %s in server hook: on_jasper_params." % (doc.jasper_report_name, param.get("name", "")))) param["value"] = [value] param.pop("param_expression", None) value = param.get("value",None) if value is not None and not isinstance(value, list): value = [value] try: """ If number returned then convert number to string. """ number = value[0] int(number) param["value"] = [str(value[0])] except ValueError: """ If not number returned. """ param["value"] = value pram.append(param) return pram
def run_report(self, data, docdata=None): doctype = data.get('doctype') rdoc = frappe.get_doc(doctype, data.get('report_name')) #call hook before run the report utils.call_hook_for_param(rdoc, "jasper_before_run_report", data) rtype = rdoc.get("jasper_report_type") if data.get("fortype").lower() == "doctype" and rtype in ("List", "Form"): for docname in data.get('name_ids', []) or []: if not utils.check_frappe_permission(rdoc.jasper_doctype, docname, ptypes=("read", "print")): raise frappe.PermissionError(_("No {0} permission for document {1} in doctype {3}.").format("read or print", docname, rdoc.jasper_doctype)) #if user can read doc it is possible that can't print it! Just uncheck Read permission in doctype Jasper Reports if not utils.check_frappe_permission("Jasper Reports", data.get('report_name', ""), ptypes="read"): raise frappe.PermissionError(_("You don't have print permission.")) params = rdoc.jasper_parameters origin = rdoc.jasper_report_origin.lower() pformat = data.get('pformat') ncopies = get_copies(rdoc, pformat) if origin == "localserver": path = rdoc.jrxml_root_path self.get_server("local") if not path: frappe.throw(_("%s: Import first a jrxml file." % rdoc.name)) for_all_sites = rdoc.jasper_all_sites_report result = self.jpl.run_local_report_async(path, rdoc, data=data, params=params, pformat=pformat, ncopies=ncopies, for_all_sites=for_all_sites) else: path = rdoc.jasper_report_path self.get_server("server") if not self.jps.is_login: frappe.msgprint(_("Jasper Server, login error.")) return result = self.jps.run_remote_report_async(path, rdoc, data=data, params=params, pformat=pformat, ncopies=ncopies) #result[0]["pformat"] = pformat return result
def check_ids_in_hooks(self, doc, data, params): method = "on_jasper_params_ids" res = utils.call_hook_for_param(doc, method, data, params) """ Hook must return a dict with this fields: {"ids": ["name_id1", "name_id2"], "report_type": "List"} """ if res: data['name_ids'] = res.get('ids', []) """ The hooks method is responsible for change to the appropriate report type: Form or List default is Form """ data['jasper_report_type'] = res.get('report_type', "Form") return res
def check_ids_in_hooks(self, doc, data, params): method = "on_jasper_params_ids" res = utils.call_hook_for_param(doc, method, data, params) """ Hook must return a dict with this fields: {"ids": ["name_id1", "name_id2"], "report_type": "List"} """ if res: data['name_ids'] = res.get('ids', []) """ The hooks method is responsible for change to the appropriate report type: Form or List default is Form """ data['jasper_report_type'] = res.get('report_type', "Form") return res
def get_param_hook(self, doc, data, pram_server): """ HOOK: Must return a list of objects. Some examples are: def on_jasper_params(self, data=None, params=None): a = [] for param in params: if param.get("name") == "idade": a.append({"name": param.get("name"), "value": 35.6}) else: #a.append({"name": param.get("name"), "value":['*****@*****.**'], "param_type": "is for where clause"}) a.append({"name": param.get("name"), "value":['*****@*****.**']}) #a.append({"name":param.get("name"), "value": ["Administrator", "*****@*****.**"], "param_type": "Is for where clause"}) #a.append({"name": params[0].get("name"), "value":'select name, email from tabUser where name in ("*****@*****.**")'}) #a.append({"name": params[0].get("name"), "value":['Administrator', 'Guest'], "param_type": "is for where clause"}) #a.append({"name": params[0].get("name"), "value":['Guest', 'Administrator']}) #a.append({"name": params[0].get("name"), "value":345}) return a """ pram = [] res = utils.call_hook_for_param(doc, "on_jasper_params", data, pram_server) if pram_server else [] if res is None: frappe.throw( _( "Error in report %s, there is no value for parameter in server hook: on_jasper_params." % (doc.jasper_report_name) ) ) for param in res: param.pop("attrs", None) param_type = param.pop("param_type", None) if param_type and param_type.lower() == "is for where clause": param.setdefault("param_expression", "In") value = self.get_where_clause_value(param.get("value", None), frappe._dict(param)) if not value: frappe.throw( _( "Error in report %s, there is no value for parameter %s in server hook: on_jasper_params." % (doc.jasper_report_name, param.get("name", "")) ) ) param["value"] = [value] param.pop("param_expression", None) value = param.get("value", None) if value is not None and not isinstance(value, list): value = [value] try: """ If number returned then convert number to string. """ number = value[0] int(number) param["value"] = [str(value[0])] except ValueError: """ If not number returned. """ param["value"] = value pram.append(param) return pram