diff --git a/frappe/events_streaming/doctype/event_producer/event_producer.py b/frappe/events_streaming/doctype/event_producer/event_producer.py index 1cf5345e27..5de6694289 100644 --- a/frappe/events_streaming/doctype/event_producer/event_producer.py +++ b/frappe/events_streaming/doctype/event_producer/event_producer.py @@ -198,44 +198,48 @@ def set_insert(update, producer_site, event_producer): doc = frappe.get_doc(update.data) check_doc_has_dependencies(doc, producer_site) if update.use_same_name: - doc.insert(set_name=update.docname) + doc.insert(set_name=update.docname, set_child_names=False) else: #if event consumer is not saving documents with the same name as the producer #store the remote docname in a custom field for future updates - local_doc = doc.insert() + local_doc = doc.insert(set_child_names=False) set_custom_fields(local_doc, update.docname, event_producer) def set_update(update, producer_site): local_doc = get_local_doc(update) - if local_doc: - data = frappe._dict(update.data) + try: + if local_doc: + data = frappe._dict(update.data) - try: if data.changed: local_doc.update(data.changed) - local_doc.db_update_all() if data.removed: for tablename, rownames in iteritems(data.removed): + table = local_doc.get_table_field_doctype(tablename) for row in rownames: - table = local_doc.get_table_field_doctype(tablename) frappe.db.delete(table, row) - if data.added: - for tablename, rows in iteritems(data.added): - for row in rows: - local_doc.append(tablename, data.added) - local_doc.db_update() - if data.row_changed: for tablename, rows in iteritems(data.row_changed): - for row in rows: - table = local_doc.get_table_field_doctype(tablename) - child_doc = frappe.get_doc(table, row.get('name')) - child_doc.update(row) + old = local_doc.get(tablename) + for doc in old: + for row in rows: + if row['name'] == doc.get('name'): + doc.update(row) - except Exception as e: - check_doc_has_dependencies(local_doc, producer_site) + if data.added: + for tablename, rows in iteritems(data.added): + local_doc.extend(tablename, rows) + for child in rows: + child_doc = frappe.get_doc(child) + child_doc.insert(set_name=child_doc.name, set_child_names=False) + + local_doc.save() + local_doc.db_update_all() + + except frappe.DoesNotExistError: + check_doc_has_dependencies(local_doc, producer_site) def set_delete(update): local_doc = get_local_doc(update) diff --git a/frappe/model/document.py b/frappe/model/document.py index c392c38aac..9c8b63cbbf 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -191,7 +191,7 @@ class Document(BaseDocument): frappe.flags.error_message = _('Insufficient Permission for {0}').format(self.doctype) raise frappe.PermissionError - def insert(self, ignore_permissions=None, ignore_links=None, ignore_if_duplicate=False, ignore_mandatory=None, set_name=None): + def insert(self, ignore_permissions=None, ignore_links=None, ignore_if_duplicate=False, ignore_mandatory=None, set_name=None, set_child_names=True): """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. @@ -220,7 +220,7 @@ class Document(BaseDocument): self.check_if_latest() self.run_method("before_insert") self._validate_links() - self.set_new_name(set_name=set_name) + self.set_new_name(set_name=set_name, set_child_names=set_child_names) self.set_parent_in_children() self.validate_higher_perm_levels() @@ -385,7 +385,7 @@ class Document(BaseDocument): def get_doc_before_save(self): return getattr(self, '_doc_before_save', None) - def set_new_name(self, force=False, set_name=None): + def set_new_name(self, force=False, set_name=None, set_child_names=True): """Calls `frappe.naming.se_new_name` for parent and child docs.""" if self.flags.name_set and not force: return @@ -395,9 +395,10 @@ class Document(BaseDocument): else: set_new_name(self) - # set name for children - for d in self.get_all_children(): - set_new_name(d) + if set_child_names: + # set name for children + for d in self.get_all_children(): + set_new_name(d) self.flags.name_set = True