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 { + $("
") + .appendTo($(this.wrapper).empty()) } } diff --git a/public/js/wn/views/communication.js b/public/js/wn/views/communication.js index 1fadb3c13a..7392589601 100644 --- a/public/js/wn/views/communication.js +++ b/public/js/wn/views/communication.js @@ -10,7 +10,7 @@ wn.views.CommunicationList = Class.extend({ return; } - var sortfn = function (a, b) { return (b > a) ? 1 : -1; } + var sortfn = function (a, b) { return (b.creation > a.creation) ? 1 : -1; } this.list = this.list.sort(sortfn); this.make(); @@ -61,6 +61,7 @@ wn.views.CommunicationList = Class.extend({ prepare: function(doc) { //doc.when = comment_when(this.doc.modified); doc.when = doc.modified; + if(!doc.content) doc.content = "[no content]"; if(doc.content.indexOf("
")== -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')