Projet

Général

Profil

0001-astregs-forward-json-payload-as-it-is-for-associatio.patch

Serghei Mihai, 10 juillet 2019 09:09

Télécharger (15,1 ko)

Voir les différences:

Subject: [PATCH] astregs: forward json payload as it is for association
 creation (#34664)

 passerelle/apps/astregs/models.py            | 150 +------------------
 tests/data/astregs/TiersCreationResponse.xml |   2 +-
 tests/test_astregs.py                        |  27 ++--
 3 files changed, 23 insertions(+), 156 deletions(-)
passerelle/apps/astregs/models.py
15 15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 16

  
17 17
from zeep.helpers import serialize_object
18
import json
18 19

  
19 20
from django.db import models
20 21
from django.utils.translation import ugettext_lazy as _
......
24 25
from passerelle.base.models import BaseResource
25 26
from passerelle.utils.api import endpoint
26 27

  
27
ASSOCIATION_SCHEMA = {
28
    "$schema": "http://json-schema.org/draft-03/schema#",
29
    "title": "AstreGS assocation",
30
    "description": "",
31
    "type": "object",
32
    "properties": {
33
        "family_code": {
34
            "description": "association family code",
35
            "type": "string",
36
            "required": True
37
        },
38
        "category": {
39
            "description": "association family code",
40
            "type": "string",
41
            "required": True
42
        },
43
        "name": {
44
            "description": "association name",
45
            "type": "string",
46
            "required": True
47
        },
48
        "siren": {
49
            "description": "SIREN number",
50
            "type": "string",
51
            "required": True
52
        },
53
        "nic": {
54
            "description": "NIC number",
55
            "type": "string",
56
            "required": True
57
        },
58
        "organism": {
59
            "description": "association organism",
60
            "type": "string",
61
            "required": False
62
        },
63
        "financial": {
64
            "description": "financial association",
65
            "type": "bool",
66
            "required": False,
67
        },
68
        "type": {
69
            "description": "association type",
70
            "type": "string",
71
            "required": False
72
        },
73
        "status": {
74
            "description": "association status",
75
            "type": "string",
76
            "required": False,
77
            "enum": ["PROPOSE", "VALIDE", "REFUSE", "BLOQUE", "A COMPLETER"]
78
        },
79
        "address": {
80
            "description": "association address",
81
            "type": "string",
82
            "required": True
83
        },
84
        "address_complement": {
85
            "description": "association address complement",
86
            "type": "string",
87
            "required": False
88
        },
89
        "zipcode": {
90
            "description": "association address zipcode",
91
            "type": "string",
92
            "required": False
93
        },
94
        "city": {
95
            "description": "association city",
96
            "type": "string",
97
            "required": False
98
        },
99
        "country": {
100
            "description": "association address zipcode",
101
            "type": "string",
102
            "required": False
103
        },
104
        "email": {
105
            "description": "association email",
106
            "type": "string",
107
            "required": False
108
        },
109
        "website": {
110
            "description": "association website",
111
            "type": "string",
112
            "required": False
113
        },
114
        "comment": {
115
            "description": "comment for association",
116
            "type": "string",
117
            "required": False
118
        },
119
        "contact_id": {
120
            "description": "association contact id",
121
            "type": "string",
122
            "required": False
123
        }
124
    }
125
}
126

  
127 28
CONTACT_SCHEMA = {
128 29
    "$schema": "http://json-schema.org/draft-03/schema#",
129 30
    "title": "AstreGS contact",
......
404 305
                             'text': '%s - %s' % (item.Numero_SIRET, item.Nom_enregistrement)})
405 306
        return {'data': data}
406 307

  
407
    @endpoint(perm='can_access', name='create-association',
408
              post={
409
                  'description': _('Creates an association'),
410
                  'request_body': {
411
                      'schema': {
412
                          'application/json': ASSOCIATION_SCHEMA
413
                      }
414
                  }
415
              }
308
    @endpoint(description=_('Creates an association'),
309
              perm='can_access', name='create-association',
310
              methods=['post']
416 311
    )
417
    def create_association(self, request, post_data):
418
        tiers = {'Financier': post_data.get('financial', False),
419
                 'CodeFamille': post_data['family_code'],
420
                 'CatTiers': post_data['category'],
421
                 'NomEnregistrement': post_data['name'],
422
                 'Organisme': post_data.get('organism', 'CG06'), # defaults to CG06
423
                 'NumeroSiret': post_data['siren'],
424
                 'NumeroSiretFin': post_data['nic'],
425
                 # can be D (débiteur), F (fournisseur) or * (both)
426
                 'Type': post_data.get('type', '*'),
427
                 'StatutTiers': post_data.get('status', 'PROPOSE'),
428
                 'AdresseIsAdresseDeFacturation': True,
429
                 'AdresseIsAdresseDeCommande': True,
430
                 'AdresseTitre': 'AdressePrincipale',
431
                 'AdresseDestinataire': post_data['name'],
432
                 'AdresseLibelleRue': post_data['address']
433

  
434
        }
435
        optional_attributes = {
436
            'address_complement': 'AdresseComplementVoie',
437
            'zipcode': 'AdresseCodePostal',
438
            'city': 'Libelle_Postale',
439
            'country': 'AdresseLibellePays',
440
            'email': 'Mail',
441
            'website': 'SiteWeb',
442
            'contact_id': 'EncodeKeyContact',
443
            'comment': 'Commentaire'
444
        }
445
        for param, attribute in optional_attributes.items():
446
            if post_data.get(param):
447
                tiers[attribute] = post_data[param]
448

  
312
    def create_association(self, request):
313
        payload = json.loads(request.body)
449 314
        client = self.get_client('Tiers')
450 315
        r = client.service.Creation({'Authentification': self.authentication,
451 316
                                     'Contexte': self.context,
452
                                     'Tiers': tiers})
453

  
317
                                     'Tiers': payload})
454 318
        return {'data': serialize_object(r)}
455 319

  
456 320
    @endpoint(description=_('Get association informations'),
tests/data/astregs/TiersCreationResponse.xml
1
<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><ns1:creationResponse xmlns:ns1="http://gfi.astre.webservices/gf/tiers"><ns1:response><ns1:TiersReturn><ns1:Financier>false</ns1:Financier><ns1:CodeTiers>487464</ns1:CodeTiers><ns1:CodeFamille>51</ns1:CodeFamille><ns1:CatTiers>42</ns1:CatTiers><ns1:CodeCivilite></ns1:CodeCivilite><ns1:NomEnregistrement>My association</ns1:NomEnregistrement><ns1:Nom></ns1:Nom><ns1:Prenom></ns1:Prenom><ns1:Sigle></ns1:Sigle><ns1:Organisme>CG06</ns1:Organisme><ns1:RaisonSociale3></ns1:RaisonSociale3><ns1:RaisonSociale4></ns1:RaisonSociale4><ns1:RaisonSociale5></ns1:RaisonSociale5><ns1:RaisonSociale6></ns1:RaisonSociale6><ns1:LibelleCourrier></ns1:LibelleCourrier><ns1:EncodeKeyNatjur></ns1:EncodeKeyNatjur><ns1:CodeAPE></ns1:CodeAPE><ns1:NumeroSiret>112233445</ns1:NumeroSiret><ns1:NumeroSiretFin>00024</ns1:NumeroSiretFin><ns1:Commentaire></ns1:Commentaire><ns1:AdresseDestinataire>My association</ns1:AdresseDestinataire><ns1:AdresseTitre>AdressePrincipale</ns1:AdresseTitre><ns1:IdentifiantAdresse>785772</ns1:IdentifiantAdresse><ns1:AdresseIsAdresseDeFacturation>false</ns1:AdresseIsAdresseDeFacturation><ns1:AdresseIsAdresseDeCommande>false</ns1:AdresseIsAdresseDeCommande><ns1:AdresseComplementDestinataire></ns1:AdresseComplementDestinataire><ns1:AdresseComplementaire></ns1:AdresseComplementaire><ns1:AdresseLibelleRue>169, rue du Château</ns1:AdresseLibelleRue><ns1:AdresseComplementVoie></ns1:AdresseComplementVoie><ns1:AdresseCodePostal>75014</ns1:AdresseCodePostal><ns1:AdresseBureauDistributeur></ns1:AdresseBureauDistributeur><ns1:AdresseCodePays></ns1:AdresseCodePays><ns1:AdresseLibellePays>France</ns1:AdresseLibellePays><ns1:NumeroTelephone></ns1:NumeroTelephone><ns1:NumeroFax></ns1:NumeroFax><ns1:Mail>foo@example.com</ns1:Mail><ns1:SiteWeb>http://example.com</ns1:SiteWeb><ns1:CodeTiersReprise></ns1:CodeTiersReprise><ns1:StatutTiers>PROPOSE</ns1:StatutTiers><ns1:Type>*</ns1:Type><ns1:Permanent>false</ns1:Permanent><ns1:IndSeuil>false</ns1:IndSeuil><ns1:DelaiSuiviFacture>0</ns1:DelaiSuiviFacture><ns1:Remise>0,00</ns1:Remise><ns1:DeclarationFiscale>false</ns1:DeclarationFiscale><ns1:IndicateurTiersSubrogatoire>false</ns1:IndicateurTiersSubrogatoire><ns1:ValeurIdentifiant0></ns1:ValeurIdentifiant0><ns1:ValeurIdentifiant1></ns1:ValeurIdentifiant1><ns1:ValeurIdentifiant2></ns1:ValeurIdentifiant2><ns1:ValeurIdentifiant3></ns1:ValeurIdentifiant3><ns1:ValeurIdentifiant4></ns1:ValeurIdentifiant4><ns1:ValeurIdentifiant5></ns1:ValeurIdentifiant5><ns1:ValeurIdentifiant6></ns1:ValeurIdentifiant6><ns1:ValeurIdentifiant7></ns1:ValeurIdentifiant7><ns1:ValeurIdentifiant8></ns1:ValeurIdentifiant8><ns1:ValeurIdentifiant9></ns1:ValeurIdentifiant9><ns1:NoDeclarationPref></ns1:NoDeclarationPref><ns1:TiersContactId></ns1:TiersContactId><ns1:EncodeKeyContact>4242</ns1:EncodeKeyContact><ns1:EncodeKeyFonction></ns1:EncodeKeyFonction><ns1:LibelleFonction></ns1:LibelleFonction><ns1:DateDebutFonction></ns1:DateDebutFonction><ns1:DateFinFonction></ns1:DateFinFonction></ns1:TiersReturn></ns1:response></ns1:creationResponse></soapenv:Body></soapenv:Envelope>
1
<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><ns1:creationResponse xmlns:ns1="http://gfi.astre.webservices/gf/tiers"><ns1:response><ns1:TiersReturn><ns1:Financier>false</ns1:Financier><ns1:CodeTiers>487464</ns1:CodeTiers><ns1:CodeFamille>51</ns1:CodeFamille><ns1:CatTiers>42</ns1:CatTiers><ns1:CodeCivilite></ns1:CodeCivilite><ns1:NomEnregistrement>My association</ns1:NomEnregistrement><ns1:Nom></ns1:Nom><ns1:Prenom></ns1:Prenom><ns1:Sigle>EO</ns1:Sigle><ns1:Organisme>CG06</ns1:Organisme><ns1:RaisonSociale3></ns1:RaisonSociale3><ns1:RaisonSociale4></ns1:RaisonSociale4><ns1:RaisonSociale5></ns1:RaisonSociale5><ns1:RaisonSociale6></ns1:RaisonSociale6><ns1:LibelleCourrier></ns1:LibelleCourrier><ns1:EncodeKeyNatjur></ns1:EncodeKeyNatjur><ns1:CodeAPE></ns1:CodeAPE><ns1:NumeroSiret>112233445</ns1:NumeroSiret><ns1:NumeroSiretFin>00024</ns1:NumeroSiretFin><ns1:Commentaire></ns1:Commentaire><ns1:AdresseDestinataire>My association</ns1:AdresseDestinataire><ns1:AdresseTitre>AdressePrincipale</ns1:AdresseTitre><ns1:IdentifiantAdresse>785772</ns1:IdentifiantAdresse><ns1:AdresseIsAdresseDeFacturation>false</ns1:AdresseIsAdresseDeFacturation><ns1:AdresseIsAdresseDeCommande>false</ns1:AdresseIsAdresseDeCommande><ns1:AdresseComplementDestinataire></ns1:AdresseComplementDestinataire><ns1:AdresseComplementaire></ns1:AdresseComplementaire><ns1:AdresseLibelleRue>169, rue du Château</ns1:AdresseLibelleRue><ns1:AdresseComplementVoie></ns1:AdresseComplementVoie><ns1:AdresseCodePostal>75014</ns1:AdresseCodePostal><ns1:AdresseBureauDistributeur></ns1:AdresseBureauDistributeur><ns1:AdresseCodePays></ns1:AdresseCodePays><ns1:AdresseLibellePays>France</ns1:AdresseLibellePays><ns1:NumeroTelephone></ns1:NumeroTelephone><ns1:NumeroFax></ns1:NumeroFax><ns1:Mail>foo@example.com</ns1:Mail><ns1:SiteWeb>http://example.com</ns1:SiteWeb><ns1:CodeTiersReprise></ns1:CodeTiersReprise><ns1:StatutTiers>PROPOSE</ns1:StatutTiers><ns1:Type>*</ns1:Type><ns1:Permanent>false</ns1:Permanent><ns1:IndSeuil>false</ns1:IndSeuil><ns1:DelaiSuiviFacture>0</ns1:DelaiSuiviFacture><ns1:Remise>0,00</ns1:Remise><ns1:DeclarationFiscale>false</ns1:DeclarationFiscale><ns1:IndicateurTiersSubrogatoire>false</ns1:IndicateurTiersSubrogatoire><ns1:ValeurIdentifiant0></ns1:ValeurIdentifiant0><ns1:ValeurIdentifiant1></ns1:ValeurIdentifiant1><ns1:ValeurIdentifiant2></ns1:ValeurIdentifiant2><ns1:ValeurIdentifiant3></ns1:ValeurIdentifiant3><ns1:ValeurIdentifiant4></ns1:ValeurIdentifiant4><ns1:ValeurIdentifiant5></ns1:ValeurIdentifiant5><ns1:ValeurIdentifiant6></ns1:ValeurIdentifiant6><ns1:ValeurIdentifiant7></ns1:ValeurIdentifiant7><ns1:ValeurIdentifiant8></ns1:ValeurIdentifiant8><ns1:ValeurIdentifiant9></ns1:ValeurIdentifiant9><ns1:NoDeclarationPref></ns1:NoDeclarationPref><ns1:TiersContactId></ns1:TiersContactId><ns1:EncodeKeyContact>4242</ns1:EncodeKeyContact><ns1:EncodeKeyFonction></ns1:EncodeKeyFonction><ns1:LibelleFonction></ns1:LibelleFonction><ns1:DateDebutFonction></ns1:DateDebutFonction><ns1:DateFinFonction></ns1:DateFinFonction></ns1:TiersReturn></ns1:response></ns1:creationResponse></soapenv:Body></soapenv:Envelope>
tests/test_astregs.py
184 184
@mock.patch('passerelle.utils.Request.post')
185 185
def test_association_creation(mocked_post, mocked_get, tiers_creation_response,
186 186
                              tiers_creation_error_response, connector, app):
187
    payload = {'family_code': '51',
188
               'category': '42',
189
               'name': 'My association',
190
               'siren': '112233445',
191
               'nic': '00024',
192
               'address': '169, rue du Château',
193
               'zipcode': '75014',
194
               'city': 'Paris',
195
               'country': 'France',
196
               'email': 'foo@example.com',
197
               'website': 'http://example.com',
198
               'contact_id': '4242'
187
    payload = {
188
        'CodeFamille': '51',
189
        'CatTiers': '42',
190
        'EncodeKeyContact': '4242',
191
        'Sigle': 'EO',
192
        'NomEnregistrement': 'My association',
193
        'Organisme': 'CG06',
194
        'NumeroSiret': '112233445',
195
        'NumeroSiretFin': '00024',
196
        'StatutTiers': 'PROPOSE',
197
        'Type': '*',
198
        'AdresseTitre': 'AdressePrincipale',
199
        'AdresseLibelleRue': '169, rue du Château',
200
        'Sigle': 'EO'
199 201
    }
200 202
    mocked_post.return_value = mock.Mock(content=tiers_creation_response, status_code=200,
201 203
                                         headers={'Content-Type': 'text/xml'})
......
214 216
    assert data['Type'] == '*'
215 217
    assert data['AdresseTitre'] == 'AdressePrincipale'
216 218
    assert data['AdresseLibelleRue'] == force_text('169, rue du Château')
219
    assert data['Sigle'] == 'EO'
217 220

  
218 221
    mocked_post.return_value = mock.Mock(content=tiers_creation_error_response,
219 222
                                         status_code=500, headers={'Content-Type': 'text/xml'})
220
-