feat: dependency syncing in update type operation of mapped doctypes

This commit is contained in:
Rucha Mahabal 2020-03-18 14:40:23 +05:30
parent 45cc2eb26d
commit d19326f5df
3 changed files with 34 additions and 24 deletions

View file

@ -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 = []

View file

@ -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

View file

@ -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)