Compare commits
5 Commits
main
...
hotfix/v4.
Author | SHA1 | Date |
---|---|---|
Serghei Mihai | 7a2cf3cb48 | |
Serghei Mihai | 10aac44184 | |
Serghei Mihai | b6e2a9fa8d | |
Serghei Mihai | 3806181b70 | |
Serghei Mihai | 46d0246fb9 |
|
@ -260,6 +260,28 @@ INDANA_SCHEMA = {
|
|||
}
|
||||
}
|
||||
|
||||
INDANA_DELETION_SCHEMA = {
|
||||
"$schema": "http://json-schema.org/draft-03/schema#",
|
||||
"title": "AstreGS INDANA indicator",
|
||||
"description": "",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"CodeDossier": {
|
||||
"type": "string",
|
||||
"required": True
|
||||
},
|
||||
"CodeInd_1": {
|
||||
"type": "string",
|
||||
"required": True
|
||||
},
|
||||
"AnneeInd_1": {
|
||||
"type": "string",
|
||||
"required": True
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
class AstreGS(BaseResource):
|
||||
wsdl_base_url = models.URLField(_('Webservices base URL'))
|
||||
|
@ -377,11 +399,14 @@ class AstreGS(BaseResource):
|
|||
'value': r.AdresseMail,
|
||||
'type': 'email'})
|
||||
if r.TelephoneMobile:
|
||||
data.append({'id': 'mobile',
|
||||
'text': 'par SMS vers %s****%s' % (r.TelephoneMobile[:2], r.TelephoneMobile[-3:]),
|
||||
'value': r.TelephoneMobile,
|
||||
'type': 'mobile'})
|
||||
mobile = ''.join((n for n in r.TelephoneMobile if n.isdigit()))
|
||||
if mobile and len(mobile) == 10 and mobile[:2] in ('06', '07'):
|
||||
data.append({'id': 'mobile',
|
||||
'text': 'par SMS vers %s*****%s' % (mobile[:2], mobile[-3:]),
|
||||
'value': mobile,
|
||||
'type': 'mobile'})
|
||||
response['data'] = data
|
||||
response['raw_data'] = serialize_object(r)
|
||||
return response
|
||||
|
||||
@endpoint(description=_('Create link between user and association'),
|
||||
|
@ -585,6 +610,38 @@ class AstreGS(BaseResource):
|
|||
return {'data': serialize_object(r)}
|
||||
|
||||
|
||||
@endpoint(name='update-indana-indicator', perm='can_access',
|
||||
post={'description': _('Update indana indicator'),
|
||||
'request_body': {
|
||||
'schema': {
|
||||
'application/json': INDANA_SCHEMA
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
def update_indana_indicator(self, request, post_data):
|
||||
r = self.call('DossierIndicateur', 'Modification',
|
||||
DossierIndicateur=post_data
|
||||
)
|
||||
return {'data': serialize_object(r)}
|
||||
|
||||
|
||||
@endpoint(name='delete-indana-indicator', perm='can_access',
|
||||
post={'description': _('Delete indana indicator'),
|
||||
'request_body': {
|
||||
'schema': {
|
||||
'application/json': INDANA_DELETION_SCHEMA
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
def delete_indana_indicator(self, request, post_data):
|
||||
r = self.call('DossierIndicateur', 'Suppression',
|
||||
DossierIndicateurCle=post_data
|
||||
)
|
||||
return {'data': serialize_object(r)}
|
||||
|
||||
|
||||
class Link(models.Model):
|
||||
resource = models.ForeignKey(AstreGS)
|
||||
name_id = models.CharField(max_length=32)
|
||||
|
|
|
@ -123,8 +123,13 @@ EVENTBOOK_SCHEMA = {
|
|||
"type": "integer",
|
||||
"required": True
|
||||
},
|
||||
"comment": {
|
||||
"description": "comment",
|
||||
"booking_comment": {
|
||||
"description": "booking comment",
|
||||
"type": "string",
|
||||
"required": False,
|
||||
},
|
||||
"room_comment": {
|
||||
"description": "room comment",
|
||||
"type": "string",
|
||||
"required": False,
|
||||
},
|
||||
|
@ -276,8 +281,7 @@ class VivaTicket(BaseResource):
|
|||
'externalCode': post_data['id'],
|
||||
'startDateTime': post_data['start_datetime'],
|
||||
'endDateTime': post_data['end_datetime'],
|
||||
'comment': post_data.get('comment', ''),
|
||||
'schoolLevelCode': post_data.get('school_level', ''),
|
||||
'comment': post_data.get('booking_comment', ''),
|
||||
'contact': self.get_or_create_contact(post_data, nameid),
|
||||
'roomList': [{
|
||||
'eventCategoryCode': post_data['event'],
|
||||
|
@ -285,10 +289,14 @@ class VivaTicket(BaseResource):
|
|||
'themeCode': post_data['theme'],
|
||||
'quantity': post_data['quantity'],
|
||||
'startDateTime': post_data['start_datetime'],
|
||||
'endDateTime': post_data['end_datetime']
|
||||
'endDateTime': post_data['end_datetime'],
|
||||
'comment': post_data.get('room_comment', ''),
|
||||
'schoolLevelCode': post_data.get('school_level', '')
|
||||
}]
|
||||
}
|
||||
headers = {'X-Vivaticket-Form-URL': post_data['form_url']}
|
||||
r = self.post('Booking/Post', {'Booking': booking}, headers=headers)
|
||||
self.logger.debug('Book response: %r' % r.text)
|
||||
if not r.ok:
|
||||
raise APIError(r.text)
|
||||
return {'data': r.json()}
|
||||
|
|
|
@ -1 +1 @@
|
|||
<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><ns1:chargementResponse xmlns:ns1="http://gfi.astre.webservices/rf/gf/contact"><ns1:response><ns1:ContactReturn><ns1:idContact>13012</ns1:idContact><ns1:CodeContact>AS173957</ns1:CodeContact><ns1:CodeTitreCivilite>035</ns1:CodeTitreCivilite><ns1:Nom>MARTIN</ns1:Nom><ns1:Prenom>Jean-Marc</ns1:Prenom><ns1:NomDeJeuneFille></ns1:NomDeJeuneFille><ns1:DateDeNaissance></ns1:DateDeNaissance><ns1:FormuleCivilite></ns1:FormuleCivilite><ns1:IntituleTitre2></ns1:IntituleTitre2><ns1:IntituleTitre3></ns1:IntituleTitre3><ns1:IntituleTitre4>Président de l&#39;</ns1:IntituleTitre4><ns1:SituationDeFamille></ns1:SituationDeFamille><ns1:CodeFonction></ns1:CodeFonction><ns1:LibelleFonction></ns1:LibelleFonction><ns1:TelephoneBureau></ns1:TelephoneBureau><ns1:TelephoneMobile>0660909980</ns1:TelephoneMobile><ns1:NumeroDeFax></ns1:NumeroDeFax><ns1:AdresseMail>jeanmarcallan@neuf.fr</ns1:AdresseMail><ns1:PageWeb></ns1:PageWeb><ns1:AdresseDestinataire>Jean-Marc MARTIN</ns1:AdresseDestinataire><ns1:AdresseComplementaire></ns1:AdresseComplementaire><ns1:ComplementGeographique></ns1:ComplementGeographique><ns1:RueVoie>271 chemin de Curnier</ns1:RueVoie><ns1:ComplementVoie></ns1:ComplementVoie><ns1:CodePostal>06750</ns1:CodePostal><ns1:Ville>SERANON</ns1:Ville><ns1:CodePays>FR</ns1:CodePays><ns1:LibellePays>France</ns1:LibellePays><ns1:LibelleAdresse>SIEGE SOCIAL</ns1:LibelleAdresse><ns1:Commentaire></ns1:Commentaire></ns1:ContactReturn></ns1:response></ns1:chargementResponse></soapenv:Body></soapenv:Envelope>
|
||||
<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><ns1:chargementResponse xmlns:ns1="http://gfi.astre.webservices/rf/gf/contact"><ns1:response><ns1:ContactReturn><ns1:idContact>13012</ns1:idContact><ns1:CodeContact>AS173957</ns1:CodeContact><ns1:CodeTitreCivilite>035</ns1:CodeTitreCivilite><ns1:Nom>FOO</ns1:Nom><ns1:Prenom>Foo-Marc</ns1:Prenom><ns1:NomDeJeuneFille></ns1:NomDeJeuneFille><ns1:DateDeNaissance></ns1:DateDeNaissance><ns1:FormuleCivilite></ns1:FormuleCivilite><ns1:IntituleTitre2></ns1:IntituleTitre2><ns1:IntituleTitre3></ns1:IntituleTitre3><ns1:IntituleTitre4>Président de l&#39;</ns1:IntituleTitre4><ns1:SituationDeFamille></ns1:SituationDeFamille><ns1:CodeFonction></ns1:CodeFonction><ns1:LibelleFonction></ns1:LibelleFonction><ns1:TelephoneBureau></ns1:TelephoneBureau><ns1:TelephoneMobile>06 67 78 89 90</ns1:TelephoneMobile><ns1:NumeroDeFax></ns1:NumeroDeFax><ns1:AdresseMail>foo@example.com</ns1:AdresseMail><ns1:PageWeb></ns1:PageWeb><ns1:AdresseDestinataire>Foo FOO</ns1:AdresseDestinataire><ns1:AdresseComplementaire></ns1:AdresseComplementaire><ns1:ComplementGeographique></ns1:ComplementGeographique><ns1:RueVoie>271 chemin de Curnier</ns1:RueVoie><ns1:ComplementVoie></ns1:ComplementVoie><ns1:CodePostal>06750</ns1:CodePostal><ns1:Ville>SERANON</ns1:Ville><ns1:CodePays>FR</ns1:CodePays><ns1:LibellePays>France</ns1:LibellePays><ns1:LibelleAdresse>SIEGE SOCIAL</ns1:LibelleAdresse><ns1:Commentaire></ns1:Commentaire></ns1:ContactReturn></ns1:response></ns1:chargementResponse></soapenv:Body></soapenv:Envelope>
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><ns1:modificationResponse xmlns:ns1="http://gfi.astre.webservices/gad/dossierindicateur"><ns1:response><ns1:DossierIndicateurReturn><ns1:CodeDossier>2019_06407</ns1:CodeDossier><ns1:CodeInd_1>501</ns1:CodeInd_1><ns1:AnneeInd_1>2019</ns1:AnneeInd_1><ns1:ValInd_1>N</ns1:ValInd_1><ns1:IndAide>Non</ns1:IndAide></ns1:DossierIndicateurReturn></ns1:response></ns1:modificationResponse></soapenv:Body></soapenv:Envelope>
|
|
@ -0,0 +1 @@
|
|||
<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><ns1:suppressionResponse xmlns:ns1="http://gfi.astre.webservices/gad/dossierindicateur"><ns1:response><ns1:DossierIndicateurReturn><ns1:CodeDossier>2019_06407</ns1:CodeDossier><ns1:CodeInd_1>501</ns1:CodeInd_1><ns1:AnneeInd_1>2019</ns1:AnneeInd_1><ns1:ValInd_1>N</ns1:ValInd_1><ns1:IndAide>Non</ns1:IndAide></ns1:DossierIndicateurReturn></ns1:response></ns1:suppressionResponse></soapenv:Body></soapenv:Envelope>
|
|
@ -128,19 +128,37 @@ def test_check_association_presence(mocked_post, mocked_get, connector, app):
|
|||
@mock.patch('passerelle.utils.Request.post', side_effect=contact_search_side_effect)
|
||||
def test_association_linking_means(mocked_post, mocked_get, client, connector, app):
|
||||
resp = app.get('/astregs/test/get-association-link-means', params={'association_id': '42'})
|
||||
assert len(resp.json['data']) == 2
|
||||
assert resp.json['already_paired'] == False
|
||||
for result in resp.json['data']:
|
||||
assert 'id' in result
|
||||
assert 'text' in result
|
||||
assert 'type' in result
|
||||
assert 'value' in result
|
||||
assert resp.json['data'] == [
|
||||
{'id': 'email', 'text': 'par courriel vers fo***@***com',
|
||||
'value': 'foo@example.com', 'type': 'email'},
|
||||
{'id': 'mobile', 'text': 'par SMS vers 06*****990',
|
||||
'value': '0667788990', 'type': 'mobile'}
|
||||
]
|
||||
assert resp.json['raw_data']['AdresseMail'] == 'foo@example.com'
|
||||
assert resp.json['raw_data']['TelephoneMobile'] == '06 67 78 89 90'
|
||||
|
||||
Link.objects.create(name_id='user_name_id', association_id='42', resource=connector)
|
||||
resp = app.get('/astregs/test/get-association-link-means',
|
||||
params={'association_id': '42', 'NameID': 'user_name_id'})
|
||||
assert resp.json['already_paired'] == True
|
||||
|
||||
for bad_mobile_number in ('', '01 43 35 01 35', '00 33 7 01 02 03 04', 'letters', '06 01 02'):
|
||||
mocked_post.side_effect = [
|
||||
mock.Mock(content=get_xml_file('Tiers.xml'), status_code=200,
|
||||
headers={'Content-Type': 'text/xml'}),
|
||||
mock.Mock(content=get_xml_file('Contact.xml').replace(
|
||||
'<ns1:TelephoneMobile>06 67 78 89 90<',
|
||||
'<ns1:TelephoneMobile>%s<' % bad_mobile_number),
|
||||
status_code=200, headers={'Content-Type': 'text/xml'})
|
||||
]
|
||||
resp = app.get('/astregs/test/get-association-link-means', params={'association_id': '42'})
|
||||
assert resp.json['data'] == [
|
||||
{'id': 'email', 'text': 'par courriel vers fo***@***com',
|
||||
'value': 'foo@example.com', 'type': 'email'}
|
||||
]
|
||||
assert resp.json['raw_data']['AdresseMail'] == 'foo@example.com'
|
||||
assert resp.json['raw_data']['TelephoneMobile'] == (bad_mobile_number or None)
|
||||
|
||||
|
||||
@mock.patch('passerelle.utils.Request.get', side_effect=search_wsdl_side_effect)
|
||||
|
@ -452,3 +470,50 @@ def test_create_indana_indicator(mocked_post, mocked_get, connector, app):
|
|||
assert data['AnneeInd_1'] == '2019'
|
||||
assert data['ValInd_1'] == 'O'
|
||||
assert data['IndAide'] == 'Non'
|
||||
|
||||
|
||||
@mock.patch('passerelle.utils.Request.get')
|
||||
@mock.patch('passerelle.utils.Request.post')
|
||||
def test_update_indana_indicator(mocked_post, mocked_get, connector, app):
|
||||
mocked_get.return_value = mock.Mock(content=get_xml_file('DossierIndicateur.wsdl'))
|
||||
mocked_post.return_value = mock.Mock(content=get_xml_file('DossierIndicateurModificationResponse.xml'),
|
||||
headers={'Content-Type': 'text/xml'},
|
||||
status_code=200)
|
||||
payload = {
|
||||
'CodeDossier': '2019_06407',
|
||||
'CodeInd_1': '501',
|
||||
'AnneeInd_1': '2019',
|
||||
'ValInd_1': 'N'
|
||||
}
|
||||
resp = app.post_json('/astregs/test/update-indana-indicator', params=payload)
|
||||
assert resp.json['err'] == 0
|
||||
assert resp.json['data']
|
||||
data = resp.json['data']
|
||||
assert data['CodeDossier'] == '2019_06407'
|
||||
assert data['CodeInd_1'] == '501'
|
||||
assert data['AnneeInd_1'] == '2019'
|
||||
assert data['ValInd_1'] == 'N'
|
||||
assert data['IndAide'] == 'Non'
|
||||
|
||||
|
||||
@mock.patch('passerelle.utils.Request.get')
|
||||
@mock.patch('passerelle.utils.Request.post')
|
||||
def test_delete_indana_indicator(mocked_post, mocked_get, connector, app):
|
||||
mocked_get.return_value = mock.Mock(content=get_xml_file('DossierIndicateur.wsdl'))
|
||||
mocked_post.return_value = mock.Mock(content=get_xml_file('DossierIndicateurSuppressionResponse.xml'),
|
||||
headers={'Content-Type': 'text/xml'},
|
||||
status_code=200)
|
||||
payload = {
|
||||
'CodeDossier': '2019_06407',
|
||||
'CodeInd_1': '501',
|
||||
'AnneeInd_1': '2019'
|
||||
}
|
||||
resp = app.post_json('/astregs/test/delete-indana-indicator', params=payload)
|
||||
assert resp.json['err'] == 0
|
||||
assert resp.json['data']
|
||||
data = resp.json['data']
|
||||
assert data['CodeDossier'] == '2019_06407'
|
||||
assert data['CodeInd_1'] == '501'
|
||||
assert data['AnneeInd_1'] == '2019'
|
||||
assert data['ValInd_1'] == 'N'
|
||||
assert data['IndAide'] == 'Non'
|
||||
|
|
|
@ -350,7 +350,8 @@ def test_book(mocked_get, mocked_put, mocked_post, app, connector):
|
|||
payload['room'] = 'v001'
|
||||
payload['school_level'] = '01'
|
||||
payload['quantity'] = 1
|
||||
payload['comment'] = 'My comment'
|
||||
payload['booking_comment'] = 'Booking comment'
|
||||
payload['room_comment'] = 'Room comment'
|
||||
payload['form_url'] = "http://mysite.com/form/id/"
|
||||
response = app.post_json(url, params=payload, status=400)
|
||||
assert "does not match '^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}$" in response.json['err_desc']
|
||||
|
@ -367,8 +368,16 @@ def test_book(mocked_get, mocked_put, mocked_post, app, connector):
|
|||
assert mocked_post.call_args[1]['json']['Booking']['externalCode'] == 'formid'
|
||||
assert mocked_post.call_args[1]['json']['Booking']['startDateTime'] == '2019-01-15T10:00'
|
||||
assert mocked_post.call_args[1]['json']['Booking']['endDateTime'] == '2019-01-15T11:00'
|
||||
assert mocked_post.call_args[1]['json']['Booking']['comment'] == 'My comment'
|
||||
assert mocked_post.call_args[1]['json']['Booking']['schoolLevelCode'] == '01'
|
||||
assert mocked_post.call_args[1]['json']['Booking']['comment'] == 'Booking comment'
|
||||
assert mocked_post.call_args[1]['json']['Booking']['roomList'][0]['comment'] == 'Room comment'
|
||||
assert mocked_post.call_args[1]['json']['Booking']['roomList'][0]['schoolLevelCode'] == '01'
|
||||
assert mocked_post.call_args[1]['json']['Booking']['contact'] == {'InternalCode': '0000000273'}
|
||||
assert mocked_post.call_args[1]['headers'] == {'X-Vivaticket-Form-URL': 'http://mysite.com/form/id/'}
|
||||
assert response.json['data']['bookingCode'] == 'II0000013'
|
||||
|
||||
# no more need to fake key response because the key is in cache
|
||||
mocked_post.side_effect = [utils.FakedResponse(text='This external booking code already exists.', ok=False)]
|
||||
response = app.post_json(url, params=payload)
|
||||
assert response.json['err'] == 1
|
||||
assert response.json['err_desc'] == 'This external booking code already exists.'
|
||||
assert response.json['err_class'] == 'passerelle.utils.jsonresponse.APIError'
|
||||
|
|
Loading…
Reference in New Issue