vivaticket: send booking's contact informations (#31853)

This commit is contained in:
Serghei Mihai 2019-03-31 17:16:42 +02:00
parent 1d798fb874
commit 4f491a22e4
2 changed files with 97 additions and 36 deletions

View File

@ -36,6 +36,56 @@ EVENTBOOK_SCHEMA = {
"type": "string",
"required": True
},
"title": {
"description": "user title",
"type": "string",
"required": False
},
"last_name": {
"description": "user last name",
"type": "string",
"required": False
},
"first_name": {
"description": "user first name",
"type": "string",
"required": False
},
"social_reason": {
"description": "user social reason",
"type": "string",
"required": False
},
"address": {
"description": "user address",
"type": "string",
"required": False
},
"zipcode": {
"description": "user zipcode",
"type": "string",
"required": False
},
"city": {
"description": "user city",
"type": "string",
"required": False
},
"country": {
"description": "user country",
"type": "string",
"required": False
},
"phone": {
"description": "user phone",
"type": "string",
"required": False
},
"mobile": {
"description": "user mobile",
"type": "string",
"required": False
},
"email": {
"description": "user email",
"type": "string",
@ -151,25 +201,40 @@ class VivaTicket(BaseResource):
query['room'] = room
return self.get_setting('Settings/GetThemes', **query)
def get_or_create_contact(self, email, name_id=None):
def get_or_create_contact(self, data, name_id=None):
contact_payload = {'Civility': data.get('title', ''),
'LastName': data.get('last_name', ''),
'FirstName': data.get('first_name', ''),
'SocialReason': data.get('social_reason', ''),
'Address1': data.get('address', ''),
'ZipCode': data.get('zipcode', ''),
'City': data.get('city', ''),
'Country': data.get('country', ''),
'Email': data['email'],
'Phone': data.get('phone', ''),
'Mobile': data.get('mobile', '')
}
if name_id is not None:
unhashed_external_code = name_id
else:
unhashed_external_code = email
unhashed_external_code = data['email']
external_code = hashlib.md5(unhashed_external_code.encode('utf-8')).hexdigest()[:20]
contact_payload['ExternalCode'] = external_code
response = self.get('Contact/Get', externalCode=external_code)
self.logger.debug('Got contact response: %r', response.text)
if not response.ok:
response = self.post('Contact/Post', {'Contact': {'Email': email, 'ExternalCode': external_code}})
response = self.post('Contact/Post', {'Contact': contact_payload})
self.logger.debug('Contact creation response: %r', response.text)
response.raise_for_status()
internal_code = response.json()['InternalCode']
else:
# update email if changed
internal_code = response.json()['InternalCode']
# update contact data
contact_data = response.json()
if contact_data['Email'] != email:
contact_data['Email'] = email
url = urlparse.urljoin(self.url, 'Contact/Put')
response = self.requests.put(url, params={'id': response.json()['InternalCode']},
json={'Key': self.get_apikey(), 'Contact': contact_data})
return {'InternalCode': response.json()['InternalCode']}
url = urlparse.urljoin(self.url, 'Contact/Put')
response = self.requests.put(url, params={'id': response.json()['InternalCode']},
json={'Key': self.get_apikey(), 'Contact': contact_payload})
return {'InternalCode': internal_code}
@endpoint(perm='can_access', description=_('Book an event'),
post={
@ -185,7 +250,7 @@ class VivaTicket(BaseResource):
'externalCode': post_data['id'],
'startDateTime': post_data['datetime'],
'endDateTime': post_data['datetime'],
'contact': self.get_or_create_contact(post_data['email'], nameid),
'contact': self.get_or_create_contact(post_data, nameid),
'roomList': [{
'eventCategoryCode': post_data['event'],
'roomCode': post_data['room'],

View File

@ -273,40 +273,36 @@ def test_get_themes(mocked_get, mocked_post, app, connector):
@mock.patch('passerelle.utils.Request.post')
@mock.patch('passerelle.utils.Request.put')
@mock.patch('passerelle.utils.Request.get')
def test_get_or_create_contact(mocked_get, mocked_post, app, connector):
mocked_get.return_value = utils.FakedResponse(content=CONTACT_RESPONSE, ok=True)
mocked_post.return_value = utils.FakedResponse(content=KEY_RESPONSE, status_code=200)
assert connector.get_or_create_contact('foo@example.com') == {'InternalCode': '0000000273'}
mocked_get.return_value = utils.FakedResponse(content=CONTACT_RESPONSE, ok=False)
mocked_post.return_value = utils.FakedResponse(
content='{"InternalCode": "0000000277", "ReturnCode": 0, "Error": null}',
status_code=200)
connector.get_or_create_contact('foo@example.com')
def test_get_or_create_contact(mocked_get, mocked_put, mocked_post, app, connector):
mocked_get.return_value = utils.FakedResponse(content='', ok=False)
mocked_post.side_effect = [
utils.FakedResponse(content=KEY_RESPONSE, status_code=200),
utils.FakedResponse(content='{"InternalCode": "0000000273", "ReturnCode": 0, "Error": null}',
status_code=200),
]
assert connector.get_or_create_contact({'email': 'foo@example.com'}) == {'InternalCode': '0000000273'}
mocked_put.assert_not_called()
assert mocked_post.call_args[1]['json']['Key'] == '86569D0CA1B1CBEF8D77DD5BDC9F5CBAE5C99074'
assert mocked_post.call_args[1]['json']['Contact']['Email'] == 'foo@example.com'
assert mocked_post.call_args[1]['json']['Contact']['ExternalCode'] == 'b48def645758b95537d4'
mocked_post.return_value = utils.FakedResponse(
content='{"InternalCode": "0000000273", "ReturnCode": 0, "Error": null}',
status_code=200)
mocked_get.return_value = utils.FakedResponse(content=CONTACT_RESPONSE, ok=True)
mocked_put.return_value = utils.FakedResponse(content='', status_code=204)
connector.get_or_create_contact({'email': 'foo@example.com'})
mocked_put.assert_called()
assert mocked_put.call_args[1]['params']['id'] == '0000000273'
assert mocked_put.call_args[1]['json']['Key'] == '86569D0CA1B1CBEF8D77DD5BDC9F5CBAE5C99074'
assert mocked_put.call_args[1]['json']['Contact']['Email'] == 'foo@example.com'
@mock.patch('passerelle.utils.Request.post')
@mock.patch('passerelle.utils.Request.put')
@mock.patch('passerelle.utils.Request.get')
def test_get_and_update_contact(mocked_get, mocked_put, mocked_post, app, connector):
mocked_get.return_value = utils.FakedResponse(content=CONTACT_RESPONSE, ok=True)
mocked_post.return_value = utils.FakedResponse(content=KEY_RESPONSE, status_code=200)
assert connector.get_or_create_contact('foo@example.com') == {'InternalCode': '0000000273'}
mocked_put.return_value = utils.FakedResponse(
content='{"InternalCode": "0000000277", "ReturnCode": 0, "Error": null}',
status_code=200)
connector.get_or_create_contact('bar@example.com', 'bar')
assert mocked_put.call_args[1]['params']['id'] == '0000000273'
assert mocked_put.call_args[1]['json']['Key'] == '86569D0CA1B1CBEF8D77DD5BDC9F5CBAE5C99074'
assert mocked_put.call_args[1]['json']['Contact']['Email'] == 'bar@example.com'
@mock.patch('passerelle.utils.Request.post')
@mock.patch('passerelle.utils.Request.get')
def test_book(mocked_get, mocked_post, app, connector):
def test_book(mocked_get, mocked_put, mocked_post, app, connector):
mocked_get.return_value = utils.FakedResponse(content=CONTACT_RESPONSE, status_code=200)
url = utils.generic_endpoint_url('vivaticket', 'book')
payload = {'id': 'formid', 'email': 'foo@example.com'}