Exemplo n.º 1
0
    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
Exemplo n.º 3
0
	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
Exemplo n.º 4
0
	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
Exemplo n.º 6
0
	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