Merge branch 'develop' into dib-fixes-2020-05-18
This commit is contained in:
commit
6397af4e3c
3 changed files with 95 additions and 72 deletions
|
|
@ -35,7 +35,8 @@ class EventProducer(Document):
|
|||
self.create_custom_fields()
|
||||
else:
|
||||
# when producer doc is updated it updates the consumer doc, set flag to avoid deadlock
|
||||
frappe.db.set_value(self.doctype, self.name, 'incoming_change', 0)
|
||||
self.db_set('incoming_change', 0)
|
||||
self.reload()
|
||||
|
||||
def check_url(self):
|
||||
if not validate_url(self.producer_url):
|
||||
|
|
|
|||
|
|
@ -9,42 +9,20 @@ import json
|
|||
from frappe.frappeclient import FrappeClient
|
||||
from frappe.event_streaming.doctype.event_producer.event_producer import pull_from_node
|
||||
|
||||
def create_event_producer(producer_url):
|
||||
producer = frappe.db.exists('Event Producer', producer_url)
|
||||
if producer:
|
||||
event_producer = frappe.get_doc('Event Producer', producer)
|
||||
else:
|
||||
event_producer = frappe.new_doc('Event Producer')
|
||||
event_producer.producer_doctypes = []
|
||||
event_producer.producer_url = producer_url
|
||||
event_producer.append('producer_doctypes', {
|
||||
'ref_doctype': 'ToDo',
|
||||
'use_same_name': 1
|
||||
})
|
||||
event_producer.append('producer_doctypes', {
|
||||
'ref_doctype': 'Note',
|
||||
'use_same_name': 1
|
||||
})
|
||||
event_producer.user = 'Administrator'
|
||||
event_producer.save()
|
||||
event_producer.reload()
|
||||
|
||||
producer_url = 'http://test_site_producer:8000'
|
||||
|
||||
class TestEventProducer(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.producer_url = 'http://test_site_producer:8000'
|
||||
create_event_producer(self.producer_url)
|
||||
frappe.db.sql('delete from tabToDo')
|
||||
frappe.db.sql('delete from tabNote')
|
||||
create_event_producer(producer_url)
|
||||
|
||||
def test_insert(self):
|
||||
producer = self.get_remote_site()
|
||||
producer = get_remote_site()
|
||||
producer_doc = insert_into_producer(producer, 'test creation 1 sync')
|
||||
self.pull_producer_data()
|
||||
self.assertTrue(frappe.db.exists('ToDo', producer_doc.name))
|
||||
|
||||
def test_update(self):
|
||||
producer = self.get_remote_site()
|
||||
producer = get_remote_site()
|
||||
producer_doc = insert_into_producer(producer, 'test update 1')
|
||||
producer_doc['description'] = 'test update 2'
|
||||
producer_doc = producer.update(producer_doc)
|
||||
|
|
@ -53,7 +31,7 @@ class TestEventProducer(unittest.TestCase):
|
|||
self.assertEqual(local_doc.description, producer_doc.description)
|
||||
|
||||
def test_delete(self):
|
||||
producer = self.get_remote_site()
|
||||
producer = get_remote_site()
|
||||
producer_doc = insert_into_producer(producer, 'test delete sync')
|
||||
self.pull_producer_data()
|
||||
self.assertTrue(frappe.db.exists('ToDo', producer_doc.name))
|
||||
|
|
@ -62,17 +40,17 @@ class TestEventProducer(unittest.TestCase):
|
|||
self.assertFalse(frappe.db.exists('ToDo', producer_doc.name))
|
||||
|
||||
def test_multiple_doctypes_sync(self):
|
||||
producer = self.get_remote_site()
|
||||
producer = get_remote_site()
|
||||
|
||||
#insert todo and note in producer
|
||||
producer_todo = insert_into_producer(producer, 'test multiple doc sync')
|
||||
producer_note1 = frappe.get_doc(dict(doctype='Note', title='test multiple doc sync 1'))
|
||||
delete_on_remote_if_exists(producer, 'Note', {'title': producer_note1.title})
|
||||
frappe.db.delete('Note', {'title': producer_note1.title})
|
||||
producer_note1 = frappe._dict(doctype='Note', title='test multiple doc sync 1')
|
||||
delete_on_remote_if_exists(producer, 'Note', {'title': producer_note1['title']})
|
||||
frappe.db.delete('Note', {'title': producer_note1['title']})
|
||||
producer_note1 = producer.insert(producer_note1)
|
||||
producer_note2 = frappe.get_doc(dict(doctype='Note', title='test multiple doc sync 2'))
|
||||
delete_on_remote_if_exists(producer, 'Note', {'title': producer_note2.title})
|
||||
frappe.db.delete('Note', {'title': producer_note2.title})
|
||||
producer_note2 = frappe._dict(doctype='Note', title='test multiple doc sync 2')
|
||||
delete_on_remote_if_exists(producer, 'Note', {'title': producer_note2['title']})
|
||||
frappe.db.delete('Note', {'title': producer_note2['title']})
|
||||
producer_note2 = producer.insert(producer_note2)
|
||||
|
||||
#update in producer
|
||||
|
|
@ -98,22 +76,19 @@ class TestEventProducer(unittest.TestCase):
|
|||
self.assertFalse(frappe.db.exists('Note', producer_note2.name))
|
||||
|
||||
def test_child_table_sync_with_dependencies(self):
|
||||
producer = self.get_remote_site()
|
||||
producer_user = frappe.get_doc(dict(doctype='User', email='test_user@sync.com', first_name='Test Sync User'))
|
||||
producer = get_remote_site()
|
||||
producer_user = frappe._dict(doctype='User', email='test_user@sync.com', send_welcome_email=0,
|
||||
first_name='Test Sync User', enabled=1, roles=[{'role': 'System Manager'}])
|
||||
delete_on_remote_if_exists(producer, 'User', {'email': producer_user.email})
|
||||
frappe.db.delete('User', {'email':producer_user.email})
|
||||
producer_user.enabled = 1
|
||||
producer_user.append('roles', {
|
||||
'role': 'System Manager'
|
||||
})
|
||||
producer_user = producer.insert(producer_user)
|
||||
producer_note = frappe.get_doc(dict(doctype='Note', title='test child table dependency sync'))
|
||||
producer_note.append('seen_by', {
|
||||
'user': producer_user.name
|
||||
})
|
||||
|
||||
producer_note = frappe._dict(doctype='Note', title='test child table dependency sync',
|
||||
seen_by=[{'user': producer_user.name}])
|
||||
delete_on_remote_if_exists(producer, 'Note', {'title': producer_note.title})
|
||||
frappe.db.delete('Note', {'title': producer_note.title})
|
||||
producer_note = producer.insert(producer_note)
|
||||
|
||||
self.pull_producer_data()
|
||||
self.assertTrue(frappe.db.exists('User', producer_user.name))
|
||||
if self.assertTrue(frappe.db.exists('Note', producer_note.name)):
|
||||
|
|
@ -121,24 +96,23 @@ class TestEventProducer(unittest.TestCase):
|
|||
self.assertEqual(len(local_note.seen_by), 1)
|
||||
|
||||
def test_dynamic_link_dependencies_synced(self):
|
||||
producer = get_remote_site()
|
||||
#unsubscribe for Note to check whether dependency is fulfilled
|
||||
event_producer = frappe.get_doc('Event Producer', self.producer_url)
|
||||
event_producer = frappe.get_doc('Event Producer', producer_url)
|
||||
event_producer.producer_doctypes = []
|
||||
event_producer.append('producer_doctypes', {
|
||||
'ref_doctype': 'ToDo',
|
||||
'use_same_name': 1
|
||||
})
|
||||
event_producer.save()
|
||||
event_producer.reload()
|
||||
|
||||
producer = self.get_remote_site()
|
||||
producer_link_doc = frappe.get_doc(dict(doctype='Note', title='Test Dynamic Link 1'))
|
||||
producer_link_doc = frappe._dict(doctype='Note', title='Test Dynamic Link 1')
|
||||
|
||||
delete_on_remote_if_exists(producer, 'Note', {'title': producer_link_doc.title})
|
||||
frappe.db.delete('Note', {'title': producer_link_doc.title})
|
||||
producer_link_doc = producer.insert(producer_link_doc)
|
||||
producer_doc = frappe.get_doc(dict(doctype='ToDo', description='Test Dynamic Link 2', assigned_by='Administrator',
|
||||
reference_type='Note', reference_name=producer_link_doc.name))
|
||||
producer_doc = frappe._dict(doctype='ToDo', description='Test Dynamic Link 2', assigned_by='Administrator',
|
||||
reference_type='Note', reference_name=producer_link_doc.name)
|
||||
producer_doc = producer.insert(producer_doc)
|
||||
|
||||
self.pull_producer_data()
|
||||
|
|
@ -147,39 +121,42 @@ class TestEventProducer(unittest.TestCase):
|
|||
self.assertTrue(frappe.db.exists('Note', producer_link_doc.name))
|
||||
self.assertEqual(producer_link_doc.name, frappe.db.get_value('ToDo', producer_doc.name, 'reference_name'))
|
||||
|
||||
reset_configuration(producer_url)
|
||||
|
||||
def test_naming_configuration(self):
|
||||
#test with use_same_name = 0
|
||||
event_producer = frappe.get_doc('Event Producer', self.producer_url)
|
||||
producer = get_remote_site()
|
||||
event_producer = frappe.get_doc('Event Producer', producer_url)
|
||||
event_producer.producer_doctypes = []
|
||||
event_producer.append('producer_doctypes', {
|
||||
'ref_doctype': 'ToDo',
|
||||
'use_same_name': 0
|
||||
})
|
||||
event_producer.save()
|
||||
event_producer.reload()
|
||||
|
||||
producer = self.get_remote_site()
|
||||
producer_doc = insert_into_producer(producer, 'test different name sync')
|
||||
self.pull_producer_data()
|
||||
self.assertTrue(frappe.db.exists('ToDo', {'remote_docname': producer_doc.name, 'remote_site_name': self.producer_url}))
|
||||
self.assertTrue(frappe.db.exists('ToDo', {'remote_docname': producer_doc.name, 'remote_site_name': producer_url}))
|
||||
|
||||
reset_configuration(producer_url)
|
||||
|
||||
def test_update_log(self):
|
||||
producer = self.get_remote_site()
|
||||
producer = get_remote_site()
|
||||
producer_doc = insert_into_producer(producer, 'test update log')
|
||||
update_log_doc = producer.get_value('Event Update Log', 'docname', {'docname': producer_doc.get('name')})
|
||||
self.assertEqual(update_log_doc.get('docname'), producer_doc.get('name'))
|
||||
|
||||
def test_event_sync_log(self):
|
||||
producer = self.get_remote_site()
|
||||
producer = get_remote_site()
|
||||
producer_doc = insert_into_producer(producer, 'test event sync log')
|
||||
self.pull_producer_data()
|
||||
self.assertTrue(frappe.db.exists('Event Sync Log', {'docname': producer_doc.name}))
|
||||
|
||||
def pull_producer_data(self):
|
||||
pull_from_node(self.producer_url)
|
||||
pull_from_node(producer_url)
|
||||
|
||||
def get_remote_site(self):
|
||||
producer_doc = frappe.get_doc('Event Producer', self.producer_url)
|
||||
producer_doc = frappe.get_doc('Event Producer', producer_url)
|
||||
producer_site = FrappeClient(
|
||||
url=producer_doc.producer_url,
|
||||
api_key=producer_doc.api_key,
|
||||
|
|
@ -189,7 +166,8 @@ class TestEventProducer(unittest.TestCase):
|
|||
return producer_site
|
||||
|
||||
def test_mapping(self):
|
||||
event_producer = frappe.get_doc('Event Producer', self.producer_url)
|
||||
producer = get_remote_site()
|
||||
event_producer = frappe.get_doc('Event Producer', producer_url)
|
||||
event_producer.producer_doctypes = []
|
||||
mapping = [{
|
||||
'local_fieldname': 'description',
|
||||
|
|
@ -202,10 +180,8 @@ class TestEventProducer(unittest.TestCase):
|
|||
'mapping': get_mapping('ToDo to Note', 'ToDo', 'Note', mapping)
|
||||
})
|
||||
event_producer.save()
|
||||
event_producer.reload()
|
||||
|
||||
producer = self.get_remote_site()
|
||||
producer_note = frappe.get_doc(dict(doctype='Note', title='Test Mapping', content='Test Mapping'))
|
||||
producer_note = frappe._dict(doctype='Note', title='Test Mapping', content='Test Mapping')
|
||||
delete_on_remote_if_exists(producer, 'Note', {'title': producer_note.title})
|
||||
producer_note = producer.insert(producer_note)
|
||||
self.pull_producer_data()
|
||||
|
|
@ -225,8 +201,11 @@ class TestEventProducer(unittest.TestCase):
|
|||
#check delete
|
||||
self.assertFalse(frappe.db.exists('ToDo', {'description': producer_note.content}))
|
||||
|
||||
reset_configuration(producer_url)
|
||||
|
||||
def test_inner_mapping(self):
|
||||
event_producer = frappe.get_doc('Event Producer', self.producer_url)
|
||||
producer = get_remote_site()
|
||||
event_producer = frappe.get_doc('Event Producer', producer_url)
|
||||
event_producer.producer_doctypes = []
|
||||
inner_mapping = [
|
||||
{
|
||||
|
|
@ -255,10 +234,8 @@ class TestEventProducer(unittest.TestCase):
|
|||
'mapping': get_mapping('ToDo to Note Mapping', 'ToDo', 'Note', mapping)
|
||||
})
|
||||
event_producer.save()
|
||||
event_producer.reload()
|
||||
|
||||
producer = self.get_remote_site()
|
||||
producer_note = frappe.get_doc(dict(doctype='Note', title='Inner Mapping Tester', content='Test Inner Mapping'))
|
||||
producer_note = frappe._dict(doctype='Note', title='Inner Mapping Tester', content='Test Inner Mapping')
|
||||
delete_on_remote_if_exists(producer, 'Note', {'title': producer_note.title})
|
||||
producer_note = producer.insert(producer_note)
|
||||
self.pull_producer_data()
|
||||
|
|
@ -268,11 +245,13 @@ class TestEventProducer(unittest.TestCase):
|
|||
#check doc inserted
|
||||
self.assertTrue(frappe.db.exists('ToDo', {'description': producer_note.content}))
|
||||
|
||||
reset_configuration(producer_url)
|
||||
|
||||
|
||||
def insert_into_producer(producer, description):
|
||||
#create and insert todo on remote site
|
||||
todo = frappe.get_doc(dict(doctype='ToDo', description=description, assigned_by='Administrator'))
|
||||
return producer.insert(todo)
|
||||
#create and insert todo on remote site
|
||||
todo = dict(doctype='ToDo', description=description, assigned_by='Administrator')
|
||||
return producer.insert(todo)
|
||||
|
||||
def delete_on_remote_if_exists(producer, doctype, filters):
|
||||
remote_doc = producer.get_value(doctype, 'name', filters)
|
||||
|
|
@ -292,4 +271,47 @@ def get_mapping(mapping_name, local, remote, field_map):
|
|||
for entry in field_map:
|
||||
doc.append('field_mapping', entry)
|
||||
doc.save()
|
||||
return doc.name
|
||||
return doc.name
|
||||
|
||||
|
||||
def create_event_producer(producer_url):
|
||||
if frappe.db.exists('Event Producer', producer_url):
|
||||
return
|
||||
event_producer = frappe.new_doc('Event Producer')
|
||||
event_producer.producer_doctypes = []
|
||||
event_producer.producer_url = producer_url
|
||||
event_producer.append('producer_doctypes', {
|
||||
'ref_doctype': 'ToDo',
|
||||
'use_same_name': 1
|
||||
})
|
||||
event_producer.append('producer_doctypes', {
|
||||
'ref_doctype': 'Note',
|
||||
'use_same_name': 1
|
||||
})
|
||||
event_producer.user = 'Administrator'
|
||||
event_producer.save()
|
||||
|
||||
def reset_configuration(producer_url):
|
||||
event_producer = frappe.get_doc('Event Producer', producer_url)
|
||||
event_producer.producer_doctypes = []
|
||||
event_producer.producer_url = producer_url
|
||||
event_producer.append('producer_doctypes', {
|
||||
'ref_doctype': 'ToDo',
|
||||
'use_same_name': 1
|
||||
})
|
||||
event_producer.append('producer_doctypes', {
|
||||
'ref_doctype': 'Note',
|
||||
'use_same_name': 1
|
||||
})
|
||||
event_producer.user = 'Administrator'
|
||||
event_producer.save()
|
||||
|
||||
def get_remote_site():
|
||||
producer_doc = frappe.get_doc('Event Producer', producer_url)
|
||||
producer_site = FrappeClient(
|
||||
url=producer_doc.producer_url,
|
||||
api_key=producer_doc.api_key,
|
||||
api_secret=producer_doc.get_password('api_secret'),
|
||||
frappe_authorization_source='Event Consumer'
|
||||
)
|
||||
return producer_site
|
||||
|
|
|
|||
|
|
@ -172,7 +172,7 @@ def get_list_context(context, doctype, web_form_name=None):
|
|||
list_context.row_template = meta.get_row_template()
|
||||
|
||||
if not meta.custom and not list_context.list_template:
|
||||
list_context.template = meta.get_list_template()
|
||||
list_context.template = meta.get_list_template() or "www/list.html"
|
||||
|
||||
return list_context
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue