예제 #1
0
def get_html_and_style(doc,
                       name=None,
                       print_format=None,
                       meta=None,
                       no_letterhead=None,
                       trigger_print=False,
                       style=None):
    """Returns `html` and `style` of print format, used in PDF etc"""

    if isinstance(doc, string_types) and isinstance(name, string_types):
        doc = frappe.get_doc(doc, name)

    if isinstance(doc, string_types):
        doc = frappe.get_doc(json.loads(doc))

    print_format = get_print_format_doc(print_format,
                                        meta=meta
                                        or frappe.get_meta(doc.doctype))

    try:
        html = get_rendered_template(doc,
                                     name=name,
                                     print_format=print_format,
                                     meta=meta,
                                     no_letterhead=no_letterhead,
                                     trigger_print=trigger_print)
    except frappe.TemplateNotFoundError:
        frappe.clear_last_message()
        html = None

    return {
        "html": html,
        "style": get_print_style(style=style, print_format=print_format)
    }
예제 #2
0
def validate_link(doctype: str, docname: str, fields=None):
    if not isinstance(doctype, str):
        frappe.throw(_("DocType must be a string"))

    if not isinstance(docname, str):
        frappe.throw(_("Document Name must be a string"))

    if doctype != "DocType" and not (frappe.has_permission(
            doctype, "select") or frappe.has_permission(doctype, "read")):
        frappe.throw(
            _("You do not have Read or Select Permissions for {}").format(
                frappe.bold(doctype)),
            frappe.PermissionError,
        )

    values = frappe._dict()
    values.name = frappe.db.get_value(doctype, docname, cache=True)

    fields = frappe.parse_json(fields)
    if not values.name or not fields:
        return values

    try:
        values.update(get_value(doctype, fields, docname))
    except frappe.PermissionError:
        frappe.clear_last_message()
        frappe.msgprint(
            _("You need {0} permission to fetch values from {1} {2}").format(
                frappe.bold(_("Read")), frappe.bold(doctype),
                frappe.bold(docname)),
            title=_("Cannot Fetch Values"),
            indicator="orange",
        )

    return values
예제 #3
0
def extract_messages_from_code(code):
	"""
		Extracts translatable strings from a code file
		:param code: code from which translatable files are to be extracted
		:param is_py: include messages in triple quotes e.g. `_('''message''')`
	"""
	from jinja2 import TemplateError

	try:
		code = frappe.as_unicode(render_include(code))

	# Exception will occur when it encounters John Resig's microtemplating code
	except (TemplateError, ImportError, InvalidIncludePath, IOError) as e:
		if isinstance(e, InvalidIncludePath):
			frappe.clear_last_message()

		pass

	messages = []
	pattern = r"_\(([\"']{,3})(?P<message>((?!\1).)*)\1(\s*,\s*context\s*=\s*([\"'])(?P<py_context>((?!\5).)*)\5)*(\s*,\s*(.)*?\s*(,\s*([\"'])(?P<js_context>((?!\11).)*)\11)*)*\)"

	for m in re.compile(pattern).finditer(code):
		message = m.group('message')
		context = m.group('py_context') or m.group('js_context')
		pos = m.start()

		if is_translatable(message):
			messages.append([pos, message, context])

	return add_line_number(messages, code)
예제 #4
0
def extract_messages_from_code(code):
    """
	Extracts translatable strings from a code file
	:param code: code from which translatable files are to be extracted
	:param is_py: include messages in triple quotes e.g. `_('''message''')`
	"""
    from jinja2 import TemplateError

    try:
        code = frappe.as_unicode(render_include(code))

    # Exception will occur when it encounters John Resig's microtemplating code
    except (TemplateError, ImportError, InvalidIncludePath, IOError) as e:
        if isinstance(e, InvalidIncludePath):
            frappe.clear_last_message()

        pass

    messages = []

    for m in TRANSLATE_PATTERN.finditer(code):
        message = m.group("message")
        context = m.group("py_context") or m.group("js_context")
        pos = m.start()

        if is_translatable(message):
            messages.append([pos, message, context])

    return add_line_number(messages, code)
예제 #5
0
 def get_doc_before_save(self):
     if not getattr(self, '_doc_before_save', None):
         try:
             self._doc_before_save = frappe.get_doc(self.doctype, self.name)
         except frappe.DoesNotExistError:
             self._doc_before_save = None
             frappe.clear_last_message()
     return self._doc_before_save
예제 #6
0
파일: document.py 프로젝트: frappe/frappe
	def get_doc_before_save(self):
		if not getattr(self, '_doc_before_save', None):
			try:
				self._doc_before_save = frappe.get_doc(self.doctype, self.name)
			except frappe.DoesNotExistError:
				self._doc_before_save = None
				frappe.clear_last_message()
		return self._doc_before_save
예제 #7
0
	def load_doc_before_save(self):
		"""Save load document from db before saving"""
		self._doc_before_save = None
		if not self.is_new():
			try:
				self._doc_before_save = frappe.get_doc(self.doctype, self.name)
			except frappe.DoesNotExistError:
				self._doc_before_save = None
				frappe.clear_last_message()