|
- # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
- # MIT License. See license.txt
-
- from __future__ import unicode_literals
- import webnotes
-
- def get_code_and_execute(module, doctype, docname, plugin=None, namespace=None):
- code = get_code(module, doctype, docname, plugin)
- return exec_code(code, namespace)
-
- def exec_code(code, namespace=None):
- if namespace is None: namespace = {}
-
- if code:
- exec code in namespace
-
- return namespace
-
- def get_code(module, doctype, docname, plugin=None):
- try:
- code = read_file(module, doctype, docname, plugin, cache=True)
- except webnotes.SQLError:
- return None
-
- return code
-
- def get_cache_key(doctype, docname, extn="py"):
- from webnotes.modules import scrub
- return "plugin_file:{doctype}:{docname}:{extn}".format(doctype=scrub(doctype),
- docname=scrub(docname), extn=scrub(extn))
-
- def get_plugin_name(doctype=None, docname=None):
- import os
- from webnotes.utils import get_site_base_path
- plugin = None
-
- if doctype:
- meta = webnotes.get_doctype(doctype)
- if meta.get_field("plugin"):
- plugin = webnotes.conn.get_value(doctype, docname, "plugin")
-
- if not plugin:
- plugin = os.path.basename(get_site_base_path())
-
- return plugin
-
- def read_file(module, doctype, docname, plugin=None, extn="py", cache=False):
- import os
- content = None
-
- if cache:
- content = webnotes.cache().get_value(get_cache_key(doctype, docname, extn))
-
- if not content:
- path = get_path(module, doctype, docname, plugin, extn)
- if os.path.exists(path):
- with open(path, 'r') as f:
- content = f.read() or "Does Not Exist"
-
- if cache:
- webnotes.cache().set_value(get_cache_key(doctype, docname, extn), content)
-
- return None if (content == "Does Not Exist") else content
-
- def get_path(module, doctype, docname, plugin=None, extn="py"):
- from webnotes.modules import scrub
- import os
-
- if not module: module = webnotes.conn.get_value(doctype, docname, "module")
- if not plugin: plugin = get_plugin_name(doctype, docname)
-
- # site_abs_path/plugins/module/doctype/docname/docname.py
- return os.path.join(get_plugin_path(scrub(plugin)), scrub(module),
- scrub(doctype), scrub(docname), scrub(docname) + "." + extn)
-
- def get_plugin_path(plugin=None):
- from webnotes.modules import scrub
- from webnotes.utils import get_site_path
- if not plugin: plugin = get_plugin_name(None, None)
-
- return get_site_path(webnotes.conf.get("plugins_path"), scrub(plugin))
-
- def remove_init_files():
- import os
- from webnotes.utils import get_site_path, cstr
- for path, folders, files in os.walk(get_site_path(webnotes.conf.get("plugins_path"))):
- for f in files:
- # cstr(f) is required when filenames are non-ascii
- if cstr(f) in ("__init__.py", "__init__.pyc"):
- os.remove(os.path.join(path, f))
-
- def clear_cache(doctype=None, docname=None):
- import os
- from webnotes.utils import get_site_path
-
- def clear_single(dt, dn):
- webnotes.cache().delete_value(get_cache_key(dt, dn, "py"))
- webnotes.cache().delete_value(get_cache_key(dt, dn, "js"))
-
- if not (doctype and docname):
- for path, folders, files in os.walk(get_site_path(webnotes.conf.get("plugins_path"))):
- if files:
- dt = os.path.basename(os.path.dirname(path))
- dn = os.path.basename(path)
- clear_single(dt, dn)
- else:
- clear_single(doctype, docname)
-
|