From d19326f5dfdbcefe1ca56b48038dff1f4d769fba Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Wed, 18 Mar 2020 14:40:23 +0530 Subject: [PATCH] feat: dependency syncing in update type operation of mapped doctypes --- .../document_type_mapping.py | 21 +++++++---- .../doctype/event_producer/event_producer.py | 36 ++++++++++--------- frappe/frappeclient.py | 1 - 3 files changed, 34 insertions(+), 24 deletions(-) diff --git a/frappe/event_streaming/doctype/document_type_mapping/document_type_mapping.py b/frappe/event_streaming/doctype/document_type_mapping/document_type_mapping.py index ea2b8af673..d684cdc514 100644 --- a/frappe/event_streaming/doctype/document_type_mapping/document_type_mapping.py +++ b/frappe/event_streaming/doctype/document_type_mapping/document_type_mapping.py @@ -33,7 +33,8 @@ class DocumentTypeMapping(Document): if doc.get(mapping.remote_fieldname): if mapping.mapping_type == 'Document': dependency = self.get_mapped_dependency(mapping, producer_site, doc.get(mapping.remote_fieldname), mapping.remote_fieldname) - dependencies.append((mapping.local_fieldname, dependency)) + if dependency: + dependencies.append((mapping.local_fieldname, dependency)) if mapping.mapping_type == 'Child Table' and update_type != 'Update': doc[mapping.local_fieldname] = get_mapped_child_table_docs(mapping.mapping, doc[mapping.remote_fieldname]) @@ -63,9 +64,13 @@ class DocumentTypeMapping(Document): def get_mapped_update(self, update, producer_site): update_diff = frappe._dict(json.loads(update.data)) mapping = update_diff + dependencies = [] if update_diff.changed: - mapped_doc = self.get_mapping(update_diff.changed, producer_site, 'Update').get('doc') + doc_map = self.get_mapping(update_diff.changed, producer_site, 'Update') + mapped_doc = doc_map.get('doc') mapping.changed = json.loads(mapped_doc) + if doc_map.get('dependencies'): + dependencies += doc_map.get('dependencies') if update_diff.removed: mapping = self.map_row_removed(update_diff, mapping) @@ -74,7 +79,10 @@ class DocumentTypeMapping(Document): if update_diff.row_changed: mapping = self.map_rows(update_diff, mapping, producer_site, operation='row_changed') - return frappe.as_json(mapping) + update = {'doc': frappe.as_json(mapping)} + if len(dependencies): + update['dependencies'] = dependencies + return update def get_mapped_dependency(self, mapping, producer_site, dependent_field_val, dependent_field): inner_mapping = frappe.get_doc('Document Type Mapping', mapping.mapping) @@ -87,9 +95,10 @@ class DocumentTypeMapping(Document): matching_docs = producer_site.get_doc(inner_mapping.remote_doctype, filters=filters) if len(matching_docs): remote_docname = matching_docs[0].get('name') - remote_doc = producer_site.get_doc(inner_mapping.remote_doctype, remote_docname) - doc = inner_mapping.get_mapping(remote_doc, producer_site, 'Insert').get('doc') - return doc + remote_doc = producer_site.get_doc(inner_mapping.remote_doctype, remote_docname) + doc = inner_mapping.get_mapping(remote_doc, producer_site, 'Insert').get('doc') + return doc + return def map_row_removed(self, update_diff, mapping): removed = [] diff --git a/frappe/event_streaming/doctype/event_producer/event_producer.py b/frappe/event_streaming/doctype/event_producer/event_producer.py index 6255f3dace..2cd32458b5 100644 --- a/frappe/event_streaming/doctype/event_producer/event_producer.py +++ b/frappe/event_streaming/doctype/event_producer/event_producer.py @@ -245,28 +245,28 @@ def set_insert(update, producer_site, event_producer): def set_update(update, producer_site): """Sync update type update""" local_doc = get_local_doc(update) - try: - if local_doc: - data = frappe._dict(update.data) + if local_doc: + data = frappe._dict(update.data) - if data.changed: - local_doc.update(data.changed) - if data.removed: - update_row_removed(local_doc, data.removed) - if data.row_changed: - update_row_changed(local_doc, data.row_changed) - if data.added: - local_doc = update_row_added(local_doc, data.added) + if data.changed: + local_doc.update(data.changed) + if data.removed: + update_row_removed(local_doc, data.removed) + if data.row_changed: + update_row_changed(local_doc, data.row_changed) + if data.added: + local_doc = update_row_added(local_doc, data.added) - local_doc.save() - local_doc.db_update_all() - - except frappe.DoesNotExistError: if update.mapping: - pass + dependencies_created = sync_mapped_dependencies(update.dependencies, producer_site) + for fieldname, value in iteritems(dependencies_created): + local_doc.update({ fieldname : value }) else: sync_dependencies(local_doc, producer_site) + local_doc.save() + local_doc.db_update_all() + def update_row_removed(local_doc, removed): """Sync child table row deletion type update""" @@ -444,7 +444,9 @@ def get_mapped_update(update, producer_site): update.data = mapped_update.get('doc') update.dependencies = mapped_update.get('dependencies', None) elif update.update_type == 'Update': - update.data = mapping.get_mapped_update(update, producer_site) + mapped_update = mapping.get_mapped_update(update, producer_site) + update.data = mapped_update.get('doc') + update.dependencies = mapped_update.get('dependencies', None) update['ref_doctype'] = mapping.local_doctype return update diff --git a/frappe/frappeclient.py b/frappe/frappeclient.py index 92ec8edf14..8611c21720 100644 --- a/frappe/frappeclient.py +++ b/frappe/frappeclient.py @@ -199,7 +199,6 @@ class FrappeClient(object): res = self.session.get(self.url + "/api/resource/" + doctype + "/" + name, params=params, verify=self.verify, headers=self.headers) - print('==================res', res.text, filters) return self.post_process(res)