def redis_transation(data, watch): from jasper_erpnext_report.utils.utils import getFrappeVersion version = getFrappeVersion().major if version < 5: return True ret = False r = frappe.cache() try: with r.pipeline() as pipe: end_time = time.time() + redis_cache_retry while time.time() < end_time: try: key = r.make_key(watch) pipe.watch(key) frappe.local.cache[key] = data pipe.multi() pipe.set(key, pickle.dumps(data)) pipe.execute() ret = True break except WatchError: continue except: #no redis started. bench serve was enter? pass return ret
def clear_expired_jasper_cache_local_reports(force=False): if force: clear_jasper_cache_local_report() return version = getFrappeVersion().major if version <= 4: keys = list_all_memcached_keys_v4(value="site.all:jasper:local_report_") else: keys = list_all_redis_keys("site.all:jasper:local_report_") if not keys: return print "keys {}".format(keys) if isinstance(keys, basestring): keys = [keys] import time for key in keys: val = frappe.cache().get(key) t = int(time.time()) if t - int(val.get("t")) >= 600: frappe.cache().delete(key)
def clear_jasper_cache_local_report(): key="site.all:jasper:local_report_" version = getFrappeVersion().major if version <= 4: clear_all_jasper_from_cache_v4(key=key) else: clear_all_jasper_from_redis_cache(key=key)
def _get_reports_list(self, filters_report=None, filters_param=None, force=False, cachename="report_list_all", update=False): ret = self.get_reports_list_from_db(filters_report=filters_report, filters_param=filters_param) #check to see if there is any report by now. If there are reports don't check the server #jasperserverlib sign if it was imported jasperserver, a library to connect to the jasperreport server if self.user == "Administrator" and ret is None and self.use_server() and jasperserverlib: #called from client. Don't let him change old reports attributes import_only_new = self.data['data'].get('import_only_new') self.data['data']['import_only_new'] = 1 self.get_server("server") self.jps.import_all_jasper_reports(self.data['data'], force=force) self.data['data']['import_only_new'] = import_only_new #could be recursive but there is no need for resume again because decorator ret = self.get_reports_list_from_db(filters_report=filters_report, filters_param=filters_param) in_transation = utils.getFrappeVersion().major > 4 if ret: ptime = self.data['data'].get('jasper_polling_time') ret['jasper_polling_time'] = ptime if ret and not update: data = utils.insert_list_all_memcache_db(ret, cachename=cachename, in_transation=in_transation) elif ret: data = utils.update_list_all_memcache_db(ret, cachename=cachename, in_transation=in_transation) else: data = {"data":{"origin": self.get_report_origin()}} return data
def clear_cache(): """hook: called from terminal bench frappe --clear_cache, only clear session if past 24 hours""" local_session_data = frappe.local.session if local_session_data.sid == "Administrator": clear_all_jasper_reports() clear_all_jasper_cache() clear_expired_jasper_error(force=True) clear_jasper_cache_local_report() version = getFrappeVersion().major if version > 4: clear_all_jasper_from_redis_cache() else: clear_all_jasper_from_cache_v4()
def clear_cache(): """hook: called from terminal bench frappe --clear_cache, only clear session if past 24 hours""" local_session_data = frappe.local.session if local_session_data.sid == "Administrator": clear_all_jasper_reports() clear_all_jasper_cache() clear_expired_jasper_error(force=True) #clear_jasper_cache_local_report() version = getFrappeVersion().major if version > 4: clear_all_jasper_from_redis_cache() else: clear_all_jasper_from_cache_v4()
def send_email(self, body, subject, user="******"): from jasper_erpnext_report.utils.utils import getFrappeVersion version = getFrappeVersion().major if version < 5: import frappe.utils.email_lib try: frappe.utils.email_lib.sendmail_to_system_managers(subject, body) except Exception as e: _logger.info(_("Jasper Server, email error: {}").format(e)) _logger.error(_("Jasper Server, email error: {}").format(e)) else: import frappe.email try: frappe.email.sendmail_to_system_managers(subject, body) except Exception as e: _logger.info(_("Jasper Server, email error: {}").format(e)) _logger.error(_("Jasper Server, email error: {}").format(e))
def get_reports_list_for_all(self): if self.sid == 'Guest': return None data = {} dirt = utils.jaspersession_get_value("report_list_dirt_all") or False #dirt if redis not cache if not dirt: data = utils.get_jasper_session_data_from_cache("report_list_all") #if for some reason there is no cache get it from db if not data: r_filters = [ "`tabJasper Reports`.jasper_doctype is NULL", "`tabJasper Reports`.report is NULL" ] ldata = self._get_reports_list(filters_report=r_filters) cached = redis_transation(ldata, "report_list_all") if ldata: data = ldata.get("data", None) if cached and data: utils.jaspersession_set_value("report_list_dirt_all", False) if data: data.pop('session_expiry', None) data.pop('last_updated', None) self.filter_perm_roles(data) if not self.check_server_status(): self.remove_server_docs(data) try: version = utils.getFrappeVersion().major if version >= 5: from jasper_erpnext_report.utils.jasper_email import is_email_enabled acc = cint(is_email_enabled()) else: acc = cint( frappe.db.get_single_value("Outgoing Email Settings", "enabled")) data['mail_enabled'] = acc except: data['mail_enabled'] = "disabled" return data
def get_sender(sender): from jasper_erpnext_report.utils.utils import getFrappeVersion version = getFrappeVersion().major if version >= 5: if not sender and frappe.session.user != "Administrator": sender = frappe.utils.get_formatted_email(frappe.session.user) return sender try: sender = json.loads(sender) except ValueError: pass if isinstance(sender, (tuple, list)) and len(sender) == 2: sender = formataddr(sender) return sender
def get_sender(sender): from jasper_erpnext_report.utils.utils import getFrappeVersion version = getFrappeVersion().major if version >= 5: if not sender and frappe.session.user != "Administrator": sender = frappe.utils.get_formatted_email(frappe.session.user) return sender try: sender = json.loads(sender) except ValueError: pass if isinstance(sender, (tuple, list)) and len(sender)==2: sender = formataddr(sender) return sender
def get_reports_list_for_all(self): if self.sid == 'Guest': return None data = {} dirt = utils.jaspersession_get_value("report_list_dirt_all") or False #dirt if redis not cache if not dirt: data = utils.get_jasper_session_data_from_cache("report_list_all") #if for some reason there is no cache get it from db if not data: r_filters=["`tabJasper Reports`.jasper_doctype is NULL", "`tabJasper Reports`.report is NULL"] ldata = self._get_reports_list(filters_report=r_filters) cached = redis_transation(ldata, "report_list_all") if ldata: data = ldata.get("data", None) if cached and data: utils.jaspersession_set_value("report_list_dirt_all", False) if data: data.pop('session_expiry', None) data.pop('last_updated', None) self.filter_perm_roles(data) if not self.check_server_status(): self.remove_server_docs(data) try: version = utils.getFrappeVersion().major if version >= 5: from jasper_erpnext_report.utils.jasper_email import is_email_enabled acc = cint(is_email_enabled()) else: acc = cint(frappe.db.get_single_value("Outgoing Email Settings", "enabled")) data['mail_enabled'] = acc except: data['mail_enabled'] = "disabled" return data
def clear_all_jasper_cache(force=True): """This function is meant to be called from scheduler""" removed = 0 version = getFrappeVersion().major if version > 4: r = clear_all_jasper_user_redis_cache(force=force) removed += r else: r = clear_all_jasper_user_cache_v4(force=force) removed += r clear_jasper_list(force=force) removed += clear_jasper_sessions(force=force) frappe.db.commit() if removed == 0: print _("No goblal jasper cache was removed.") else: print _("Was removed {0} global jasper cache(s)".format(removed)) return removed
def clear_jasper_sessions(force=True): removed = 0 sid = "jaspersession" deleted = force data = get_jasper_data(sid) if not data: return removed if not force: deleted = _f(data) if deleted: frappe.cache().delete_value("jasper:" + sid) removed += 1 frappe.db.sql("""delete from `tabJasperSessions` """) if force: version = getFrappeVersion().major if version > 4: clear_all_jasper_from_redis_cache() else: clear_all_jasper_from_cache_v4() print _("was removed {0} jaspersession(s)".format(removed)) return removed
def jasper_make_email(doctype=None, name=None, content=None, subject=None, sent_or_received="Sent", sender=None, recipients=None, communication_medium="Email", send_email=False, print_html=None, print_format=None, attachments='[]', send_me_a_copy=False, set_lead=True, date=None, jasper_doc=None, docdata=None): custom_print_html = print_html custom_print_format = print_format jasper_polling_time = frappe.db.get_value('JasperServerConfig', fieldname="jasper_polling_time") data = json.loads(jasper_doc) result = run_report(data, docdata) if result[0].get("status", "not ready") != "ready": poll_data = prepare_polling(result) result = report_polling(poll_data) limit = 0 while limit <= 10 and result[0].get("status", "not ready") != "ready": time.sleep(cint(jasper_polling_time) / 1000) result = report_polling(poll_data) limit += 1 pformat = data.get("pformat") #we have to remove the original and send only duplicate if result[0].get("status", "not ready") == "ready": rdoc = frappe.get_doc(data.get("doctype"), data.get('report_name')) ncopies = get_copies(rdoc, pformat) fileName, jasper_content, report_name = _get_report(result[0]) merge_all = True pages = None if pformat == "pdf" and ncopies > 1: merge_all = False pages = get_pages(ncopies, len(jasper_content)) sender = get_sender(sender) if pformat == "html": custom_print_html = True url, filepath = make_pdf(fileName, jasper_content, pformat, report_name, merge_all=merge_all, pages=pages, email=True) output = filepath file_name = output.rsplit("/", 1) if len(file_name) > 1: file_name = file_name[1] else: file_name = file_name[0] elif pformat == "pdf": custom_print_format = "pdf" file_name, filepath, output, url = make_pdf( fileName, jasper_content, pformat, report_name, reqId=result[0].get("requestId"), merge_all=merge_all, pages=pages, email=True) output = output.getvalue() else: file_name, output = make_pdf(fileName, jasper_content, pformat, report_name, merge_all=merge_all, pages=pages, email=True) filepath = url = get_email_other_path(data, file_name, result[0].get("requestId"), sender) output = output.getvalue() #remove name from filepath filepath = filepath.rsplit("/", 1)[0] else: frappe.throw( _("Error generating %s format, try again later.") % (pformat, )) frappe.errprint(frappe.get_traceback()) return if not check_frappe_permission( data.get("doctype"), data.get('report_name'), ptypes=("read", )): raise frappe.PermissionError( (_("You are not allowed to send emails related to") + ": {doctype} {name}").format(doctype=data.get("doctype"), name=data.get('report_name'))) jasper_run_method("jasper_before_sendmail", data, file_name, output, url, doctype=doctype, name=name, content=content, subject=subject, sent_or_received=sent_or_received, sender=sender, recipients=recipients, print_html=print_html, print_format=print_format, attachments=attachments, send_me_a_copy=send_me_a_copy) version = getFrappeVersion().major if version >= 5: file_path = None if isinstance(attachments, basestring): attachments = json.loads(attachments) if pformat != "html": file_path = os.path.join(filepath, file_name) jasper_save_email(file_path, output) attachments.append(file_path) comm_name = sendmail_v5(url, doctype=doctype, name=name, content=content, subject=subject, sent_or_received=sent_or_received, sender=sender, recipients=recipients, send_email=send_email, print_html=print_html, print_format=print_format, attachments=attachments) set_jasper_email_doctype(data.get('report_name'), recipients, sender, frappe.utils.now(), url, file_name) jasper_run_method("jasper_after_sendmail", data, url, file_name, file_path) return comm_name print_format = custom_print_format print_html = custom_print_html sendmail(file_name, output, url, doctype=doctype, name=name, content=content, subject=subject, sent_or_received=sent_or_received, sender=sender, recipients=recipients, print_html=print_html, print_format=print_format, attachments=attachments, send_me_a_copy=send_me_a_copy) file_path = None if pformat != "html": file_path = os.path.join(filepath, file_name) jasper_save_email(file_path, output) set_jasper_email_doctype(data.get('report_name'), recipients, sender, frappe.utils.now(), url, file_name) jasper_run_method("jasper_after_sendmail", data, url, file_name, file_path)
def jasper_make_email(doctype=None, name=None, content=None, subject=None, sent_or_received = "Sent", sender=None, recipients=None, communication_medium="Email", send_email=False, print_html=None, print_format=None, attachments='[]', send_me_a_copy=False, set_lead=True, date=None, jasper_doc=None, docdata=None): custom_print_html = print_html custom_print_format = print_format jasper_polling_time = frappe.db.get_value('JasperServerConfig', fieldname="jasper_polling_time") data = json.loads(jasper_doc) result = run_report(data, docdata) if result[0].get("status", "not ready") != "ready": poll_data = prepare_polling(result) result = report_polling(poll_data) limit = 0 while limit <= 10 and result[0].get("status", "not ready") != "ready": time.sleep(cint(jasper_polling_time)/1000) result = report_polling(poll_data) limit += 1 pformat = data.get("pformat") #we have to remove the original and send only duplicate if result[0].get("status", "not ready") == "ready": rdoc = frappe.get_doc(data.get("doctype"), data.get('report_name')) ncopies = get_copies(rdoc, pformat) fileName, jasper_content, report_name = _get_report(result[0]) merge_all = True pages = None if pformat == "pdf" and ncopies > 1: merge_all = False pages = get_pages(ncopies, len(jasper_content)) sender = get_sender(sender) if pformat == "html": custom_print_html = True url, filepath = make_pdf(fileName, jasper_content, pformat, report_name, merge_all=merge_all, pages=pages, email=True) output = filepath file_name = output.rsplit("/",1) if len(file_name) > 1: file_name = file_name[1] else: file_name = file_name[0] elif pformat == "pdf": custom_print_format = "pdf" file_name, filepath, output, url = make_pdf(fileName, jasper_content, pformat, report_name, reqId=result[0].get("requestId"), merge_all=merge_all, pages=pages, email=True) output = output.getvalue() else: file_name, output = make_pdf(fileName, jasper_content, pformat, report_name, merge_all=merge_all, pages=pages, email=True) filepath = url = get_email_other_path(data, file_name, result[0].get("requestId"), sender) output = output.getvalue() #remove name from filepath filepath = filepath.rsplit("/",1)[0] else: frappe.throw(_("Error generating %s format, try again later.") % (pformat,)) frappe.errprint(frappe.get_traceback()) return if not check_frappe_permission(data.get("doctype"), data.get('report_name'), ptypes=("read", )): raise frappe.PermissionError((_("You are not allowed to send emails related to") + ": {doctype} {name}").format( doctype=data.get("doctype"), name=data.get('report_name'))) jasper_run_method("jasper_before_sendmail", data, file_name, output, url, doctype=doctype, name=name, content=content, subject=subject, sent_or_received=sent_or_received, sender=sender, recipients=recipients, print_html=print_html, print_format=print_format, attachments=attachments, send_me_a_copy=send_me_a_copy) version = getFrappeVersion().major if version >= 5: file_path = None if isinstance(attachments, basestring): attachments = json.loads(attachments) if pformat != "html": file_path = os.path.join(filepath, file_name) jasper_save_email(file_path, output) attachments.append(file_path) comm_name = sendmail_v5(url, doctype=doctype, name=name, content=content, subject=subject, sent_or_received=sent_or_received, sender=sender, recipients=recipients, send_email=send_email, print_html=print_html, print_format=print_format, attachments=attachments) set_jasper_email_doctype(data.get('report_name'), recipients, sender, frappe.utils.now(), url, file_name) jasper_run_method("jasper_after_sendmail", data, url, file_name, file_path) return comm_name print_format = custom_print_format print_html = custom_print_html sendmail(file_name, output, url, doctype=doctype, name=name, content=content, subject=subject, sent_or_received=sent_or_received, sender=sender, recipients=recipients, print_html=print_html, print_format=print_format, attachments=attachments, send_me_a_copy=send_me_a_copy) file_path = None if pformat != "html": file_path = os.path.join(filepath, file_name) jasper_save_email(file_path, output) set_jasper_email_doctype(data.get('report_name'), recipients, sender, frappe.utils.now(), url, file_name) jasper_run_method("jasper_after_sendmail", data, url, file_name, file_path)