diff --git a/frappe/__init__.py b/frappe/__init__.py index 7e2b826430..b71fdfe3b8 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -658,10 +658,10 @@ def reload_doc(module, dt=None, dn=None, force=False, reset_permissions=False): import frappe.modules return frappe.modules.reload_doc(module, dt, dn, force=force, reset_permissions=reset_permissions) -def rename_doc(doctype, old, new, debug=0, force=False, merge=False, ignore_permissions=False): +def rename_doc(*args, **kwargs): """Rename a document. Calls `frappe.model.rename_doc.rename_doc`""" from frappe.model.rename_doc import rename_doc - return rename_doc(doctype, old, new, force=force, merge=merge, ignore_permissions=ignore_permissions) + return rename_doc(*args, **kwargs) def get_module(modulename): """Returns a module object for given Python module name using `importlib.import_module`.""" diff --git a/frappe/core/doctype/doctype/doctype.js b/frappe/core/doctype/doctype/doctype.js index 18217a85e5..2b0c53abf2 100644 --- a/frappe/core/doctype/doctype/doctype.js +++ b/frappe/core/doctype/doctype/doctype.js @@ -13,7 +13,7 @@ frappe.ui.form.on('DocType', { refresh: function(frm) { - if(frm.doc.__islocal && (user !== "Administrator" || !frappe.boot.developer_mode)) { + if(frm.is_new() && (user !== "Administrator" || !frappe.boot.developer_mode)) { frm.set_value("custom", 1); frm.toggle_enable("custom", 0); } @@ -23,7 +23,11 @@ frappe.ui.form.on('DocType', { frm.set_read_only(); } - if(!frm.doc.__islocal) { + if(frm.is_new()) { + if (!(frm.doc.permissions && frm.doc.permissions.length)) { + frm.add_child('permissions', {role: 'System Manager'}); + } + } else { frm.toggle_enable("engine", 0); } diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index a85da072c1..09c883b502 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -45,6 +45,7 @@ class DocType(Document): elif self.istable: self.allow_import = 0 + self.permissions = [] self.scrub_field_names() self.validate_series() @@ -60,10 +61,8 @@ class DocType(Document): self.make_amendable() self.validate_website() - try: + if not self.is_new(): self.before_update = frappe.get_doc('DocType', self.name) - except frappe.DoesNotExistError: - pass if not self.is_new(): self.setup_fields_to_fetch() @@ -224,8 +223,9 @@ class DocType(Document): global_search_fields_after_update.append('name') if set(global_search_fields_before_update) != set(global_search_fields_after_update): + now = (not frappe.request) or frappe.flags.in_test or frappe.flags.in_install frappe.enqueue('frappe.utils.global_search.rebuild_for_doctype', - now=frappe.flags.in_test or frappe.flags.in_install, doctype=self.name) + now=now, doctype=self.name) def run_module_method(self, method): from frappe.modules import load_doctype_module diff --git a/frappe/geo/country_info.json b/frappe/geo/country_info.json index 6a6dced8d9..eda1d7fd11 100644 --- a/frappe/geo/country_info.json +++ b/frappe/geo/country_info.json @@ -1432,7 +1432,7 @@ "currency_name": "Pataca", "number_format": "#,###.##" }, - "Macedonia, Republic of": { + "Macedonia": { "code": "mk", "currency": "MKD", "currency_fraction": "Deni", diff --git a/frappe/model/__init__.py b/frappe/model/__init__.py index 4a59c16940..441a20733a 100644 --- a/frappe/model/__init__.py +++ b/frappe/model/__init__.py @@ -14,10 +14,6 @@ default_fields = ('doctype','name','owner','creation','modified','modified_by', 'parent','parentfield','parenttype','idx','docstatus') optional_fields = ("_user_tags", "_comments", "_assign", "_liked_by", "_seen") -def rename(doctype, old, new, debug=False): - import frappe.model.rename_doc - frappe.model.rename_doc.rename_doc(doctype, old, new, debug) - def copytables(srctype, src, srcfield, tartype, tar, tarfield, srcfields, tarfields=[]): if not tarfields: tarfields = srcfields diff --git a/frappe/model/document.py b/frappe/model/document.py index 72b55dc261..aaee69a892 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -160,7 +160,7 @@ class Document(BaseDocument): frappe.msgprint(msg) raise frappe.PermissionError(msg) - def insert(self, ignore_permissions=None): + def insert(self, ignore_permissions=None, ignore_if_duplicate=False, ignore_mandatory=None): """Insert the document in the database (as a new document). This will check for user permissions and execute `before_insert`, `validate`, `on_update`, `after_insert` methods if they are written. @@ -174,6 +174,9 @@ class Document(BaseDocument): if ignore_permissions!=None: self.flags.ignore_permissions = ignore_permissions + if ignore_mandatory!=None: + self.flags.ignore_mandatory = ignore_mandatory + self.set("__islocal", True) self.check_permission("create") @@ -198,7 +201,11 @@ class Document(BaseDocument): if getattr(self.meta, "issingle", 0): self.update_single(self.get_valid_dict()) else: - self.db_insert() + try: + self.db_insert() + except frappe.DuplicateEntryError, e: + if not ignore_if_duplicate: + raise e # children for d in self.get_all_children(): diff --git a/frappe/model/rename_doc.py b/frappe/model/rename_doc.py index 66461f32da..a560aa2284 100644 --- a/frappe/model/rename_doc.py +++ b/frappe/model/rename_doc.py @@ -10,7 +10,7 @@ from frappe.model.dynamic_links import get_dynamic_link_map from frappe.utils.password import rename_password @frappe.whitelist() -def rename_doc(doctype, old, new, force=False, merge=False, ignore_permissions=False): +def rename_doc(doctype, old, new, force=False, merge=False, ignore_permissions=False, ignore_if_exists=False): """ Renames a doc(dt, old) to doc(dt, new) and updates all linked fields of type "Link" @@ -18,6 +18,9 @@ def rename_doc(doctype, old, new, force=False, merge=False, ignore_permissions=F if not frappe.db.exists(doctype, old): return + if ignore_if_exists and frappe.db.exists(doctype, new): + return + force = cint(force) merge = cint(merge) diff --git a/frappe/patches.txt b/frappe/patches.txt index 1d8421fffe..7c0c83ce93 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -159,3 +159,4 @@ frappe.patches.v7_2.set_in_standard_filter_property #1 execute:frappe.db.sql("update tabCommunication set communication_date = creation where time(communication_date) = 0") frappe.patches.v7_2.fix_email_queue_recipient frappe.patches.v7_2.update_feedback_request +execute:frappe.rename_doc('Country', 'Macedonia, Republic of', 'Macedonia', ignore_if_exists=True) diff --git a/frappe/public/js/frappe/socketio_client.js b/frappe/public/js/frappe/socketio_client.js index a4db335b7a..cd3010bcbe 100644 --- a/frappe/public/js/frappe/socketio_client.js +++ b/frappe/public/js/frappe/socketio_client.js @@ -1,6 +1,7 @@ frappe.socket = { open_tasks: {}, open_docs: [], + emit_queue: [], init: function() { if (frappe.boot.disable_async) { return; @@ -135,8 +136,11 @@ frappe.socket = { }) }, doc_open: function(doctype, docname) { - // notify that the user has opened this doc - frappe.socket.socket.emit('doc_open', doctype, docname); + // notify that the user has opened this doc, if not already notified + if(frappe.socket.last_doc[0]!=doctype && frappe.socket.last_doc[0]!=docname) { + frappe.socket.socket.emit('doc_open', doctype, docname); + } + frappe.socket.last_doc = [doctype, docname]; }, doc_close: function(doctype, docname) { // notify that the user has closed this doc