Esempio n. 1
0
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)
Esempio n. 3
0
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_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)
Esempio n. 5
0
	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()
Esempio n. 8
0
	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 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))
Esempio n. 10
0
    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
Esempio n. 11
0
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_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 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
Esempio n. 18
0
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)