diff --git a/frappe/__init__.py b/frappe/__init__.py index a7ed3f52da..7d783f40cc 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -441,6 +441,10 @@ def get_doc(arg1, arg2=None): import frappe.model.document return frappe.model.document.get_doc(arg1, arg2) +def get_single(doctype): + """Return a `frappe.model.document.Document` object of the given Single doctype.""" + return get_doc(doctype, doctype) + def get_meta(doctype, cached=True): """Get `frappe.model.meta.Meta` instance of given doctype name.""" import frappe.model.meta diff --git a/frappe/core/doctype/page/page.py b/frappe/core/doctype/page/page.py index a371611b1f..6c3a024372 100644 --- a/frappe/core/doctype/page/page.py +++ b/frappe/core/doctype/page/page.py @@ -48,8 +48,8 @@ class Page(Document): # js if not os.path.exists(path + '.js'): with open(path + '.js', 'w') as f: - f.write("""frappe.pages['%s'].onload = function(wrapper) { - frappe.ui.make_app_page({ + f.write("""frappe.pages['%s'].on_page_load = function(wrapper) { + var page = frappe.ui.make_app_page({ parent: wrapper, title: '%s', single_column: true diff --git a/frappe/database.py b/frappe/database.py index 6a3939b6c8..a87b32186d 100644 --- a/frappe/database.py +++ b/frappe/database.py @@ -461,6 +461,12 @@ class Database: return frappe._dict(self.sql("""select field, value from tabSingles where doctype=%s""", doctype)) + def get_all(self, *args, **kwargs): + return frappe.get_all(*args, **kwargs) + + def get_list(self, *args, **kwargs): + return frappe.get_list(*args, **kwargs) + def get_single_value(self, doctype, fieldname): """Get property of Single DocType.""" val = self.sql("""select value from diff --git a/frappe/model/db_query.py b/frappe/model/db_query.py index e9e1388b0a..b2bf097490 100644 --- a/frappe/model/db_query.py +++ b/frappe/model/db_query.py @@ -100,18 +100,23 @@ class DatabaseQuery(object): return args def parse_args(self): - if isinstance(self.filters, basestring): - self.filters = json.loads(self.filters) if isinstance(self.fields, basestring): if self.fields == "*": self.fields = ["*"] else: self.fields = json.loads(self.fields) - if isinstance(self.filters, dict): - fdict = self.filters - self.filters = [] - for key, value in fdict.iteritems(): - self.filters.append(self.make_filter_tuple(key, value)) + + for filter_name in ["filters", "or_filters"]: + filters = getattr(self, filter_name) + if isinstance(filters, basestring): + filters = json.loads(filters) + + if isinstance(filters, dict): + fdict = filters + filters = [] + for key, value in fdict.iteritems(): + filters.append(self.make_filter_tuple(key, value)) + setattr(self, filter_name, filters) def make_filter_tuple(self, key, value): if isinstance(value, (list, tuple)): diff --git a/frappe/public/css/bootstrap.css b/frappe/public/css/bootstrap.css index 7e0fb64d27..9e7c9d9d9d 100644 --- a/frappe/public/css/bootstrap.css +++ b/frappe/public/css/bootstrap.css @@ -6609,4 +6609,3 @@ h4.modal-title { .navbar-search-icon { color: #b8c2cb; } -/*# sourceMappingURL=bootstrap.css.map */ diff --git a/frappe/public/js/frappe/form/control.js b/frappe/public/js/frappe/form/control.js index 505ec584d1..f6c7610f15 100644 --- a/frappe/public/js/frappe/form/control.js +++ b/frappe/public/js/frappe/form/control.js @@ -353,7 +353,10 @@ frappe.ui.form.ControlData = frappe.ui.form.ControlInput.extend({ }, validate: function(v, callback) { if(this.df.options == 'Phone') { - if(v+''=='')return ''; + if(v+''=='') { + callback(""); + return; + } v1 = '' // phone may start with + and must only have numbers later, '-' and ' ' are stripped v = v.replace(/ /g, '').replace(/-/g, '').replace(/\(/g, '').replace(/\)/g, ''); @@ -371,7 +374,10 @@ frappe.ui.form.ControlData = frappe.ui.form.ControlInput.extend({ v1 += cint(v) + ''; callback(v1); } else if(this.df.options == 'Email') { - if(v+''=='')return ''; + if(v+''=='') { + callback(""); + return; + } if(!validate_email(v)) { msgprint(__("Invalid Email: {0}", [v])); callback(""); @@ -588,6 +594,7 @@ frappe.ui.form.ControlButton = frappe.ui.form.ControlData.extend({ this.input = this.$input.get(0); this.set_input_attributes(); this.has_input = true; + this.$wrapper.find(".control-label").addClass("hide"); }, onclick: function() { if(this.frm && this.frm.doc) { @@ -603,7 +610,7 @@ frappe.ui.form.ControlButton = frappe.ui.form.ControlData.extend({ }, set_input_areas: function() { this._super(); - $(this.disp_area).removeClass(); + $(this.disp_area).removeClass().addClass("hide"); }, set_empty_description: function() { this.$wrapper.find(".help-box").empty().toggle(false); diff --git a/frappe/public/js/frappe/form/toolbar.js b/frappe/public/js/frappe/form/toolbar.js index 025197667d..d0fdaef188 100644 --- a/frappe/public/js/frappe/form/toolbar.js +++ b/frappe/public/js/frappe/form/toolbar.js @@ -101,7 +101,7 @@ frappe.ui.form.Toolbar = Class.extend({ } // New - if(p[CREATE]) { + if(p[CREATE] && !this.frm.meta.issingle) { this.page.add_menu_item(__("New {0}", [__(me.frm.doctype)]), function() { new_doc(me.frm.doctype);}, true); } diff --git a/frappe/public/js/frappe/views/reports/reportview.js b/frappe/public/js/frappe/views/reports/reportview.js index 99208a2268..f58cdd51ad 100644 --- a/frappe/public/js/frappe/views/reports/reportview.js +++ b/frappe/public/js/frappe/views/reports/reportview.js @@ -105,6 +105,9 @@ frappe.views.ReportView = frappe.ui.Listing.extend({ this.make_save(); this.make_user_permissions(); this.set_tag_and_status_filter(); + this.page.add_menu_item(__("Refresh"), function() { + me.refresh(); + }, true); }, set_init_columns: function() { diff --git a/frappe/public/js/legacy/clientscriptAPI.js b/frappe/public/js/legacy/clientscriptAPI.js index 975a95c453..48a1c2d81d 100644 --- a/frappe/public/js/legacy/clientscriptAPI.js +++ b/frappe/public/js/legacy/clientscriptAPI.js @@ -295,6 +295,10 @@ _f.Frm.prototype.set_read_only = function() { cur_frm.perm = perm; } +_f.Frm.prototype.trigger = function(event) { + this.script_manager.trigger(event); +}; + _f.Frm.prototype.get_formatted = function(fieldname) { return frappe.format(this.doc[fieldname], frappe.meta.get_docfield(this.doctype, fieldname, this.docname), diff --git a/frappe/test_runner.py b/frappe/test_runner.py index fa2d37e5a7..98b9a654ad 100644 --- a/frappe/test_runner.py +++ b/frappe/test_runner.py @@ -17,8 +17,8 @@ def main(app=None, module=None, doctype=None, verbose=False, tests=(), force=Fal if not frappe.db: frappe.connect() - if not frappe.conf.get("db_name").startswith("test_"): - raise Exception, 'db_name must start with "test_"' + # if not frappe.conf.get("db_name").startswith("test_"): + # raise Exception, 'db_name must start with "test_"' # workaround! since there is no separate test db frappe.clear_cache()