|
- # Copyright (c) 2012 Web Notes Technologies Pvt Ltd (http://erpnext.com)
- #
- # MIT License (MIT)
- #
- # Permission is hereby granted, free of charge, to any person obtaining a
- # copy of this software and associated documentation files (the "Software"),
- # to deal in the Software without restriction, including without limitation
- # the rights to use, copy, modify, merge, publish, distribute, sublicense,
- # and/or sell copies of the Software, and to permit persons to whom the
- # Software is furnished to do so, subject to the following conditions:
- #
- # The above copyright notice and this permission notice shall be included in
- # all copies or substantial portions of the Software.
- #
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
- # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- # PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- # CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
- # OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- #
-
- from __future__ import unicode_literals
- """
- This is where all the plug-in code is executed. The standard method for DocTypes is declaration of a
- standardized `DocType` class that has the methods of any DocType. When an object is instantiated using the
- `get_obj` method, it creates an instance of the `DocType` class of that particular DocType and sets the
- `doc` and `doclist` attributes that represent the fields (properties) of that record.
-
- methods in following modules are imported for backward compatibility
-
- * webnotes.*
- * webnotes.utils.*
- * webnotes.model.doc.*
- * webnotes.model.bean.*
- """
- custom_class = '''
- import webnotes
-
- from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, now, nowdate, set_default, user_format, validate_email_add
- from webnotes.model import db_exists
- from webnotes.model.doc import Document, addchild, getchildren
- from webnotes.model.utils import getlist
- from webnotes.utils.email_lib import sendmail
- from webnotes.model.code import get_obj, get_server_obj, run_server_obj
- from webnotes import session, form, msgprint, errprint
-
- sql = webnotes.conn.sql
-
-
- class CustomDocType(DocType):
- def __init__(self, doc, doclist):
- DocType.__init__(self, doc, doclist)
- '''
-
-
- def execute(code, doc=None, doclist=[]):
- # functions used in server script of DocTypes
- # --------------------------------------------------
- from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, now, nowdate, set_default, user_format, validate_email_add
- from webnotes.utils.email_lib import sendmail
- from webnotes.model import db_exists
- from webnotes.model.doc import Document, addchild, getchildren
- from webnotes.model.utils import getlist
- from webnotes import session, form, msgprint, errprint
-
- import webnotes
-
- sql = webnotes.conn.sql
- get_value = webnotes.conn.get_value
- convert_to_lists = webnotes.conn.convert_to_lists
-
- if webnotes.user:
- get_roles = webnotes.user.get_roles
- locals().update({'get_obj':get_obj, 'get_server_obj':get_server_obj, 'run_server_obj':run_server_obj})
-
- exec code in locals()
-
- if doc:
- d = DocType(doc, doclist)
- return d
-
- if locals().get('page_html'):
- return page_html
-
- if locals().get('out'):
- return out
-
- def get_server_obj(doc, doclist = [], basedoctype = ''):
- # for test
- import webnotes
- from webnotes.modules import scrub, get_doctype_module
- from core.doctype.custom_script.custom_script import get_custom_server_script
-
- # get doctype details
- module = get_doctype_module(doc.doctype) or "core"
-
- if not module:
- return
-
- DocType = get_doctype_class(doc.doctype, module)
-
- # custom?
- custom_script = get_custom_server_script(doc.doctype)
- if custom_script:
- global custom_class
-
- exec custom_class + custom_script.replace('\t',' ') in locals()
-
- return CustomDocType(doc, doclist)
- else:
- return DocType(doc, doclist)
-
- def get_doctype_class(doctype, module):
- from webnotes.utils import cint
- import webnotes
-
- module = load_doctype_module(doctype, module)
- if module:
- DocType = getattr(module, 'DocType')
- else:
- if not cint(webnotes.conn.get_value("DocType", doctype, "custom")):
- raise ImportError, "Unable to load module for: " + doctype
-
- class DocType:
- def __init__(self, d, dl):
- self.doc, self.doclist = d, dl
-
- return DocType
-
- def get_module_name(doctype, module, prefix):
- from webnotes.modules import scrub
- _doctype, _module = scrub(doctype), scrub(module)
- return '%s.doctype.%s.%s%s' % (_module, _doctype, prefix, _doctype)
-
- def load_doctype_module(doctype, module, prefix=""):
- import webnotes
- from webnotes.modules import scrub
- _doctype, _module = scrub(doctype), scrub(module)
- try:
- module = __import__(get_module_name(doctype, module, prefix), fromlist=[''])
- return module
- except ImportError, e:
- # webnotes.errprint(webnotes.getTraceback())
- return None
-
- def get_obj(dt = None, dn = None, doc=None, doclist=[], with_children = 0):
- if dt:
- import webnotes.model.doc
- if not dn:
- dn = dt
- if with_children:
- doclist = webnotes.model.doc.get(dt, dn, from_controller=1)
- else:
- doclist = webnotes.model.doc.get(dt, dn, with_children = 0, from_controller=1)
- return get_server_obj(doclist[0], doclist)
- else:
- return get_server_obj(doc, doclist)
-
- def run_server_obj(server_obj, method_name, arg=None):
- """
- Executes a method (`method_name`) from the given object (`server_obj`)
- """
- if server_obj and hasattr(server_obj, method_name):
- if arg:
- return getattr(server_obj, method_name)(arg)
- else:
- return getattr(server_obj, method_name)()
- else:
- raise Exception, 'No method %s' % method_name
-
- def get_code(module, dt, dn, extn, fieldname=None):
- from webnotes.modules import scrub, get_module_path
- import os, webnotes
-
- # get module (if required)
- if not module:
- module = webnotes.conn.get_value(dt, dn, 'module')
-
- # no module, quit
- if not module:
- return ''
-
- # file names
- if dt in ('Page','Doctype'):
- dt, dn = scrub(dt), scrub(dn)
-
- # get file name
- fname = dn + '.' + extn
-
- # code
- code = ''
- try:
- file = open(os.path.join(get_module_path(scrub(module)), dt, dn, fname), 'r')
- code = file.read()
- file.close()
- except IOError, e:
- # no file, try from db
- if fieldname:
- code = webnotes.conn.get_value(dt, dn, fieldname)
-
- return code
|