diff --git a/core/doctype/customize_form/customize_form.js b/core/doctype/customize_form/customize_form.js
index 032b6ca4dd..11a6e42fd1 100644
--- a/core/doctype/customize_form/customize_form.js
+++ b/core/doctype/customize_form/customize_form.js
@@ -49,8 +49,10 @@ cur_frm.cscript.refresh = function(doc, dt, dn) {
if(r.exc) {
//msgprint(r.exc);
} else {
- if(r.server_messages) { cur_frm.cscript.doc_type(doc, doc.doctype, doc.name); }
- cur_frm.frm_head.set_label(['Updated', 'label-success']);
+ if(r.server_messages) {
+ cur_frm.cscript.doc_type(doc, doc.doctype, doc.name);
+ cur_frm.frm_head.set_label(['Updated', 'label-success']);
+ }
}
});
}
diff --git a/public/css/ui/common.css b/public/css/ui/common.css
index cdf0c16721..f7919b5713 100644
--- a/public/css/ui/common.css
+++ b/public/css/ui/common.css
@@ -105,3 +105,11 @@ a {
-moz-box-sizing: border-box;
box-sizing: border-box;
}
+
+.missing-image {
+ background-color: #eee;
+ padding: 40px;
+ width: 32px;
+ font-size: 32px;
+ color: #888;
+}
diff --git a/public/js/legacy/widgets/form/fields.js b/public/js/legacy/widgets/form/fields.js
index 34beed01b9..265d216b06 100644
--- a/public/js/legacy/widgets/form/fields.js
+++ b/public/js/legacy/widgets/form/fields.js
@@ -62,7 +62,9 @@ Field.prototype.make_body = function() {
// label
if(this.with_label) {
this.label_span = $a(label_wrapper, 'span', 'small')
-
+ if(wn.boot && wn.boot.developer_mode)
+ $(this.label_span).attr("title", this.df.fieldname);
+
// error icon
this.label_icon = $('').toggle(false)
.appendTo(label_wrapper).css('margin-left','7px')
diff --git a/public/js/legacy/widgets/form/form_fields.js b/public/js/legacy/widgets/form/form_fields.js
index 73ebd2f8f4..75e7e5adae 100644
--- a/public/js/legacy/widgets/form/form_fields.js
+++ b/public/js/legacy/widgets/form/form_fields.js
@@ -166,7 +166,10 @@ _f.ImageField.prototype.onrefresh = function() {
$(this.wrapper).find("img").remove();
if(this.df.options && this.frm.doc[this.df.options]) {
$("")
- .appendTo(this.wrapper);
+ .appendTo($(this.wrapper).empty());
+ } else {
+ $("
")== -1 && doc.content.indexOf("
")== -1) {
doc.content = doc.content.replace(/\n/g, "
");
}
diff --git a/public/js/wn/views/listview.js b/public/js/wn/views/listview.js
index 156ccea0fc..5960af680b 100644
--- a/public/js/wn/views/listview.js
+++ b/public/js/wn/views/listview.js
@@ -29,7 +29,7 @@ wn.views.ListView = Class.extend({
// multiple content
if(opts.content.indexOf && opts.content.indexOf('+')!=-1) {
$.map(opts.content.split('+'), function(v) {
- me.render_column(data, parent, {content:v});
+ me.render_column(data, parent, {content:v, title: opts.title});
});
return;
}
@@ -39,7 +39,8 @@ wn.views.ListView = Class.extend({
opts.content(parent, data, me);
}
else if(opts.content=='name') {
- $(parent).append(repl('%(name)s', data));
+ $(parent).append(repl('%(name)s', data));
}
else if(opts.content=='avatar') {
$(parent).append(wn.avatar(data.owner, false, "Created by: "
@@ -54,14 +55,16 @@ wn.views.ListView = Class.extend({
$(parent).find('input').data('name', data.name);
}
else if(opts.content=='docstatus') {
- $(parent).append(repl(' \
+ ', data));
}
else if(opts.content=='tags') {
this.add_user_tags(parent, data);
}
else if(opts.content=='modified') {
- $(parent).append(data.when);
+ $(parent).append(data.when)
+ .attr("title", "Last Modified On: " + data.when);
}
else if(opts.type=='bar-graph') {
this.render_bar_graph(parent, data, opts.content, opts.label);
@@ -77,8 +80,14 @@ wn.views.ListView = Class.extend({
if(opts.type=="date") {
data[opts.content] = wn.datetime.str_to_user(data[opts.content])
}
+
$(parent).append(repl(' %(content)s', {
- "title": opts.title || opts.content, "content": data[opts.content]}));
+ "title": (opts.title || opts.content)
+ + (data[opts.content].indexOf("<")===-1
+ ? ": " + data[opts.content].replace(/\"/g, '"')
+ : ""),
+ "content": data[opts.content]
+ }));
}
},
diff --git a/webnotes/__init__.py b/webnotes/__init__.py
index 52020e06df..4b369b38c6 100644
--- a/webnotes/__init__.py
+++ b/webnotes/__init__.py
@@ -319,7 +319,16 @@ def rename_doc(doctype, old, new, is_doctype=0, debug=0):
def insert(doclist):
import webnotes.model
return webnotes.model.insert(doclist)
-
+
+def get_method(method_string):
+ modulename = '.'.join(method_string.split('.')[:-1])
+ methodname = method_string.split('.')[-1]
+
+ __import__(modulename)
+ import sys
+ moduleobj = sys.modules[modulename]
+ return getattr(moduleobj, methodname)
+
def get_application_home_page(user='Guest'):
"""get home page for user"""
hpl = conn.sql("""select home_page
diff --git a/webnotes/handler.py b/webnotes/handler.py
index 22c0d5f04b..bb71e72b14 100755
--- a/webnotes/handler.py
+++ b/webnotes/handler.py
@@ -114,13 +114,7 @@ def uploadfile():
else:
if webnotes.form_dict.get('method'):
m = webnotes.form_dict['method']
- modulename = '.'.join(m.split('.')[:-1])
- methodname = m.split('.')[-1]
-
- __import__(modulename)
- import sys
- moduleobj = sys.modules[modulename]
- ret = getattr(moduleobj, methodname)()
+ ret = webnotes.get_method(m)()
except Exception, e:
webnotes.msgprint(e)
webnotes.errprint(webnotes.utils.getTraceback())
@@ -219,11 +213,7 @@ def call(fn, args):
def get_method(cmd):
"""get method object from cmd"""
if '.' in cmd:
- cmd_parts = cmd.split('.')
- module_string = ".".join(cmd_parts[:-1])
- fn_string = cmd_parts[-1]
- module = __import__(module_string, fromlist=[module_string.split('.')[-1].encode('utf-8')])
- method = getattr(module, fn_string)
+ method = webnotes.get_method(cmd)
else:
method = globals()[cmd]
return method
diff --git a/webnotes/model/wrapper.py b/webnotes/model/wrapper.py
index 81a6374050..414e733002 100644
--- a/webnotes/model/wrapper.py
+++ b/webnotes/model/wrapper.py
@@ -40,9 +40,11 @@ class ModelWrapper:
self.docs = []
self.obj = None
self.to_docstatus = 0
+ if isinstance(dt, basestring) and not dn:
+ dn = dt
if dt and dn:
self.load_from_db(dt, dn)
- if isinstance(dt, list):
+ elif isinstance(dt, list):
self.set_doclist(dt)
def load_from_db(self, dt=None, dn=None, prefix='tab'):
@@ -65,6 +67,7 @@ class ModelWrapper:
doclist += getchildren(doc.name, t[0], t[1], dt, prefix=prefix)
self.set_doclist(doclist)
+ self.run_method("onload")
def __iter__(self):
"""
@@ -200,7 +203,7 @@ class ModelWrapper:
if hasattr(self.obj, 'custom_' + method):
getattr(self.obj, 'custom_' + method)()
- trigger(method, self.obj.doc)
+ notify(self.obj, method)
self.set_doclist(self.obj.doclist)
@@ -315,18 +318,26 @@ def clone(source_wrapper):
return new_wrapper
-def trigger(method, doc):
- """trigger doctype events"""
+def notify(controller, caller_method):
try:
- import startup.event_handlers
+ from startup.observers import observer_map
except ImportError:
return
- if hasattr(startup.event_handlers, method):
- getattr(startup.event_handlers, method)(doc)
-
- if hasattr(startup.event_handlers, 'doclist_all'):
- startup.event_handlers.doclist_all(doc, method)
+ doctype = controller.doc.doctype
+
+ def call_observers(key):
+ if key in observer_map:
+ observer_list = observer_map[key]
+ if isinstance(observer_list, basestring):
+ observer_list = [observer_list]
+ for observer_method in observer_list:
+ webnotes.get_method(observer_method)(controller, caller_method)
+
+ call_observers("*:*")
+ call_observers(doctype + ":*")
+ call_observers("*:" + caller_method)
+ call_observers(doctype + ":" + caller_method)
# for bc
def getlist(doclist, parentfield):
diff --git a/webnotes/modules/patch_handler.py b/webnotes/modules/patch_handler.py
index bbfc0341b0..4d0debc663 100644
--- a/webnotes/modules/patch_handler.py
+++ b/webnotes/modules/patch_handler.py
@@ -68,8 +68,7 @@ def execute_patch(patchmodule, method=None, methodargs=None):
try:
log('Executing %s in %s' % (patchmodule or str(methodargs), webnotes.conn.cur_db_name))
if patchmodule:
- patch = __import__(patchmodule, fromlist=True)
- getattr(patch, 'execute')()
+ webnotes.get_method(patchmodule + ".execute")()
update_patch_log(patchmodule)
elif method:
method(**methodargs)
diff --git a/webnotes/widgets/form/load.py b/webnotes/widgets/form/load.py
index b22f56f140..d537b5a9e2 100644
--- a/webnotes/widgets/form/load.py
+++ b/webnotes/widgets/form/load.py
@@ -84,21 +84,12 @@ def getdoctype():
def load_single_doc(dt, dn, user):
"""load doc and call onload methods"""
- import webnotes.model.code
if not dn: dn = dt
dl = webnotes.model.doc.get(dt, dn)
try:
- so, r = webnotes.model.code.get_server_obj(dl[0], dl), None
- if hasattr(so, 'onload'):
- r = webnotes.model.code.run_server_obj(so, 'onload')
- dl = so.doclist
- if hasattr(so, 'custom_onload'):
- r = webnotes.model.code.run_server_obj(so, 'custom_onload')
- dl = so.doclist
- if r:
- webnotes.msgprint(r)
+ doclist = webnotes.model_wrapper(dt, dn)
except Exception, e:
webnotes.errprint(webnotes.utils.getTraceback())
webnotes.msgprint('Error in script while loading')