From a1bd2176fbdf219025c183398f3cc49fadf29f24 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 23 Apr 2014 13:39:12 +0530 Subject: [PATCH] NameError handling, fixed copy doc used in amend, handle tabs --- frappe/app.py | 54 ++++++++++----------- frappe/exceptions.py | 3 +- frappe/model/base_document.py | 2 +- frappe/model/naming.py | 2 +- frappe/public/js/frappe/form/layout.js | 4 +- frappe/public/js/frappe/model/create_new.js | 11 ++--- frappe/utils/install.py | 2 +- frappe/website/statics.py | 2 +- frappe/widgets/form/save.py | 5 +- 9 files changed, 43 insertions(+), 42 deletions(-) diff --git a/frappe/app.py b/frappe/app.py index 9860a924cc..3fbca54857 100644 --- a/frappe/app.py +++ b/frappe/app.py @@ -1,5 +1,5 @@ # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors -# MIT License. See license.txt +# MIT License. See license.txt import sys, os import json @@ -30,10 +30,10 @@ def application(request): frappe.local.request = request frappe.local.is_ajax = frappe.get_request_header("X-Requested-With")=="XMLHttpRequest" response = None - + try: rollback = True - + init_site(request) if frappe.local.conf.get('maintainance_mode'): @@ -41,81 +41,81 @@ def application(request): make_form_dict(request) frappe.local.http_request = frappe.auth.HTTPRequest() - + if frappe.local.form_dict.cmd: response = frappe.handler.handle() - + elif frappe.request.path.startswith("/api/"): response = frappe.api.handle() - + elif frappe.request.path.startswith('/backups'): response = frappe.utils.response.download_backup(request.path) - + elif frappe.local.request.method in ('GET', 'HEAD'): response = frappe.website.render.render(request.path) - + else: raise NotFound except HTTPException, e: return e - + except frappe.SessionStopped, e: response = frappe.utils.response.handle_session_stopped() - + except (frappe.AuthenticationError, frappe.PermissionError, frappe.DoesNotExistError, - frappe.DuplicateEntryError, + frappe.NameError, frappe.OutgoingEmailError, frappe.ValidationError, frappe.UnsupportedMediaType), e: - + if frappe.local.is_ajax: response = frappe.utils.response.report_error(e.http_status_code) else: response = frappe.website.render.render("error", e.http_status_code) - + if e.__class__ == frappe.AuthenticationError: if hasattr(frappe.local, "login_manager"): frappe.local.login_manager.clear_cookies() - + else: if frappe.local.request.method in ("POST", "PUT") and frappe.db: frappe.db.commit() rollback = False - + finally: if frappe.local.request.method in ("POST", "PUT") and frappe.db and rollback: frappe.db.rollback() - + # set cookies if response and hasattr(frappe.local, 'cookie_manager'): frappe.local.cookie_manager.flush_cookies(response=response) - + frappe.destroy() - + return response - + def init_site(request): site = _site or request.headers.get('X-Frappe-Site-Name') or get_site_name(request.host) frappe.init(site=site, sites_path=_sites_path) - + if not (frappe.local.conf and frappe.local.conf.db_name): # site does not exist raise NotFound - + def make_form_dict(request): frappe.local.form_dict = frappe._dict({ k:v[0] if isinstance(v, (list, tuple)) else v \ for k, v in (request.form or request.args).iteritems() }) - + application = local_manager.make_middleware(application) - + def serve(port=8000, profile=False, site=None, sites_path='.'): global application, _site, _sites_path _site = site _sites_path = sites_path - + from werkzeug.serving import run_simple if profile: @@ -125,10 +125,10 @@ def serve(port=8000, profile=False, site=None, sites_path='.'): application = SharedDataMiddleware(application, { '/assets': os.path.join(sites_path, 'assets'), }) - + application = StaticDataMiddleware(application, { '/files': os.path.abspath(sites_path) }) - - run_simple('0.0.0.0', int(port), application, use_reloader=True, + + run_simple('0.0.0.0', int(port), application, use_reloader=True, use_debugger=True, use_evalex=True) diff --git a/frappe/exceptions.py b/frappe/exceptions.py index 7e8874b1bb..805d68315b 100644 --- a/frappe/exceptions.py +++ b/frappe/exceptions.py @@ -17,7 +17,7 @@ class PermissionError(Exception): class DoesNotExistError(ValidationError): http_status_code = 404 -class DuplicateEntryError(Exception): +class NameError(Exception): http_status_code = 409 class OutgoingEmailError(Exception): @@ -29,6 +29,7 @@ class SessionStopped(Exception): class UnsupportedMediaType(Exception): http_status_code = 415 +class DuplicateEntryError(NameError):pass class DataError(ValidationError): pass class UnknownDomainError(Exception): pass class MappingMismatchError(ValidationError): pass diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index 2e9d807ebb..93d4acd9f1 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -182,7 +182,7 @@ class BaseDocument(object): ), d.values()) except Exception, e: if e.args[0]==1062: - raise NameError, e + raise frappe.NameError((d.get("doctype"), d.get("name"), e)) else: raise diff --git a/frappe/model/naming.py b/frappe/model/naming.py index f7f4b69b3f..631eca4e46 100644 --- a/frappe/model/naming.py +++ b/frappe/model/naming.py @@ -133,7 +133,7 @@ def get_default_naming_series(doctype): def validate_name(doctype, name, case=None, merge=False): if not name: return 'No Name Specified for %s' % doctype if name.startswith('New '+doctype): - raise NameError, 'There were some errors setting the name, please contact the administrator' + raise frappe.NameError, 'There were some errors setting the name, please contact the administrator' if case=='Title Case': name = name.title() if case=='UPPER CASE': name = name.upper() name = name.strip() diff --git a/frappe/public/js/frappe/form/layout.js b/frappe/public/js/frappe/form/layout.js index 107568fe5a..472fd57ea5 100644 --- a/frappe/public/js/frappe/form/layout.js +++ b/frappe/public/js/frappe/form/layout.js @@ -179,13 +179,13 @@ frappe.ui.form.Layout = Class.extend({ var me = this, grid_row = null; prev = null, - fields = me.fields, + fields = me.fields_list, in_grid = false; // in grid if(doctype != me.doctype) { grid_row =me.get_open_grid_row() - fields = grid_row.fields; + fields = grid_row.layout.fields_list; } for(var i=0, len=fields.length; i < len; i++) { diff --git a/frappe/public/js/frappe/model/create_new.js b/frappe/public/js/frappe/model/create_new.js index 229fb1f08a..7ba823a12e 100644 --- a/frappe/public/js/frappe/model/create_new.js +++ b/frappe/public/js/frappe/model/create_new.js @@ -26,6 +26,7 @@ $.extend(frappe.model, { parenttype: parent_doc.doctype, }); if(!parent_doc[parentfield]) parent_doc[parentfield] = []; + doc.idx = parent_doc[parentfield].length + 1; parent_doc[parentfield].push(doc); } else { frappe.provide("frappe.model.docinfo." + doctype + "." + doc.name); @@ -132,9 +133,9 @@ $.extend(frappe.model, { return d; }, - copy_doc: function(doc, from_amend) { + copy_doc: function(doc, from_amend, parent_doc, parentfield) { var no_copy_list = ['name','amended_from','amendment_date','cancel_reason']; - var newdoc = frappe.model.get_new_doc(doc.doctype); + var newdoc = frappe.model.get_new_doc(doc.doctype, parent_doc, parentfield); for(var key in doc) { // dont copy name and blank fields @@ -145,11 +146,9 @@ $.extend(frappe.model, { && !(df && (!from_amend && cint(df.no_copy)==1))) { value = doc[key]; if(df.fieldtype==="Table") { - newdoc[key] = []; $.each(value || [], function(i, d) { - newdoc[key].push(frappe.model.copy_doc(d, from_amend)) - newdoc[key][newdoc[key].length-1].idx = newdoc[key].length; - }) + frappe.model.copy_doc(d, from_amend, newdoc, df.fieldname); + }); } else { newdoc[key] = doc[key]; } diff --git a/frappe/utils/install.py b/frappe/utils/install.py index 380de62328..98893d4780 100644 --- a/frappe/utils/install.py +++ b/frappe/utils/install.py @@ -30,7 +30,7 @@ def after_install(): for d in install_docs: try: frappe.get_doc(d).insert() - except NameError: + except frappe.NameError: pass # all roles to admin diff --git a/frappe/website/statics.py b/frappe/website/statics.py index cb9e89c085..aeb55f76e0 100644 --- a/frappe/website/statics.py +++ b/frappe/website/statics.py @@ -124,7 +124,7 @@ class sync(object): try: page.insert() - except NameError: + except frappe.NameError: # page exists, if deleted static, delete it and try again old_route = frappe.get_doc("Website Route", {"ref_doctype":"Web Page", "docname": page.name}) diff --git a/frappe/widgets/form/save.py b/frappe/widgets/form/save.py index 0a802c9322..af6890ed96 100644 --- a/frappe/widgets/form/save.py +++ b/frappe/widgets/form/save.py @@ -14,8 +14,9 @@ def savedocs(): doc.docstatus = {"Save":0, "Submit": 1, "Update": 1, "Cancel": 2}[frappe.form_dict.action] try: doc.save() - except NameError: - frappe.msgprint(frappe._("Name exists")) + except frappe.NameError, e: + doctype, name, original_exception = e if isinstance(e, tuple) else (doc.doctype or "", doc.name or "", None) + frappe.msgprint(frappe._("{0} {1} already exists").format(doctype, name)) raise # update recent documents