seitime-frappe/frappe/model/utils/__init__.py
Gavin D'souza 3446026555 chore: Update header: license.txt => LICENSE
The license.txt file has been replaced with LICENSE for quite a while
now. INAL but it didn't seem accurate to say "hey, checkout license.txt
although there's no such file". Apart from this, there were
inconsistencies in the headers altogether...this change brings
consistency.
2021-09-03 12:02:59 +05:30

92 lines
2.5 KiB
Python

# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: MIT. See LICENSE
import frappe
from frappe import _
from frappe.utils import cstr
from frappe.build import html_to_js_template
import re
import io
STANDARD_FIELD_CONVERSION_MAP = {
'name': 'Link',
'owner': 'Data',
'idx': 'Int',
'creation': 'Data',
'modified': 'Data',
'modified_by': 'Data',
'_user_tags': 'Data',
'_liked_by': 'Data',
'_comments': 'Text',
'_assign': 'Text',
'docstatus': 'Int'
}
"""
Model utilities, unclassified functions
"""
def set_default(doc, key):
"""Set is_default property of given doc and unset all others filtered by given key."""
if not doc.is_default:
frappe.db.set(doc, "is_default", 1)
frappe.db.sql("""update `tab%s` set `is_default`=0
where `%s`=%s and name!=%s""" % (doc.doctype, key, "%s", "%s"),
(doc.get(key), doc.name))
def set_field_property(filters, key, value):
'''utility set a property in all fields of a particular type'''
docs = [frappe.get_doc('DocType', d.parent) for d in \
frappe.get_all("DocField", fields=['parent'], filters=filters)]
for d in docs:
d.get('fields', filters)[0].set(key, value)
d.save()
print('Updated {0}'.format(d.name))
frappe.db.commit()
class InvalidIncludePath(frappe.ValidationError): pass
def render_include(content):
'''render {% raw %}{% include "app/path/filename" %}{% endraw %} in js file'''
content = cstr(content)
# try 5 levels of includes
for i in range(5):
if "{% include" in content:
paths = re.findall(r'''{% include\s['"](.*)['"]\s%}''', content)
if not paths:
frappe.throw(_('Invalid include path'), InvalidIncludePath)
for path in paths:
app, app_path = path.split('/', 1)
with io.open(frappe.get_app_path(app, app_path), 'r', encoding = 'utf-8') as f:
include = f.read()
if path.endswith('.html'):
include = html_to_js_template(path, include)
content = re.sub(r'''{{% include\s['"]{0}['"]\s%}}'''.format(path), include, content)
else:
break
return content
def get_fetch_values(doctype, fieldname, value):
'''Returns fetch value dict for the given object
:param doctype: Target doctype
:param fieldname: Link fieldname selected
:param value: Value selected
'''
out = {}
meta = frappe.get_meta(doctype)
link_df = meta.get_field(fieldname)
for df in meta.get_fields_to_fetch(fieldname):
# example shipping_address.gistin
link_field, source_fieldname = df.fetch_from.split('.', 1)
out[df.fieldname] = frappe.db.get_value(link_df.options, value, source_fieldname)
return out