Projet

Général

Profil

0001-planitec-change-price-code-dynamically-32472.patch

Emmanuel Cazenave, 12 juin 2019 14:57

Télécharger (5,78 ko)

Voir les différences:

Subject: [PATCH] planitec: change price code dynamically (#32472)

 passerelle/contrib/planitech/models.py | 37 ++++++++++++++++++++++----
 tests/test_planitech.py                | 29 ++++++++++++++++++++
 2 files changed, 61 insertions(+), 5 deletions(-)
passerelle/contrib/planitech/models.py
105 105
            "description": "VAT rate",
106 106
            "type": "number",
107 107
            "required": True
108
        },
109
        "price_code": {
110
            "description": "User price code",
111
            "type": "string",
112
            "required": False
108 113
        }
109 114
    }
110 115
}
......
165 170
            "description": "Rerservation type identifier",
166 171
            "type": "number",
167 172
            "required": True
173
        },
174
        "price_code": {
175
            "description": "User price code",
176
            "type": "string",
177
            "required": False
168 178
        }
169 179
    }
170 180
}
......
384 394
        except RequestException as e:
385 395
            raise APIError("Authentication to Planitec failed: %s" % str(e))
386 396

  
387
    def get_or_create_pairing(self, post_data):
397
    def updateorcreate_user(self, post_data):
398
        dyn_price_code = post_data.get('price_code')
399
        price_code = dyn_price_code or self.price_code
400

  
388 401
        with transaction.atomic():
389 402
            pairing, created = Pairing.objects.get_or_create(
390 403
                resource=self, name_id=post_data['name_id'],
391
                defaults={'external_id': uuid.uuid4().get_hex(), 'price_code': self.price_code})
404
                defaults={'external_id': uuid.uuid4().get_hex(), 'price_code': price_code})
392 405
            if created:
406
                # Create planitec user
393 407
                params = {
394 408
                    "externalUserIdentifier": pairing.external_id,
395 409
                    "name": post_data['last_name'],
396 410
                    "firstName": post_data['first_name'],
397 411
                    "mail": post_data['email'],
398
                    "pricingCode": self.price_code
412
                    "pricingCode": price_code
399 413
                }
400 414
                data = self._call_planitech(self.requests.post, 'createPerson', params)
401 415
                if data.get('creationStatus') != 'OK':
402 416
                    raise APIError("Person creation failed: %s" % data.get('creationStatus'))
417

  
418
            elif dyn_price_code and pairing.price_code != dyn_price_code:
419
                # Update planitec user
420
                pairing.price_code = dyn_price_code
421
                pairing.save()
422
                params = {
423
                    'externalUserIdentifier': pairing.external_id,
424
                    'pricingCode': dyn_price_code
425
                }
426
                data = self._call_planitech(self.requests.post, 'updatePerson', params)
427
                if data.get('modificationStatus') != 'OK':
428
                    raise APIError("Person update failed: %s" % data.get('modificationStatus'))
429

  
403 430
        return pairing
404 431

  
405 432
    @endpoint(
......
417 444
        start_datetime = combine_date_time(post_data['date'], post_data['start_time'])
418 445
        end_datetime = combine_date_time(post_data['date'], post_data['end_time'])
419 446

  
420
        pairing = self.get_or_create_pairing(post_data)
447
        pairing = self.updateorcreate_user(post_data)
421 448

  
422 449
        params = {
423 450
            "activityID": mste.Uint32(post_data['activity_id']),
......
457 484
        end_datetime = combine_date_time(post_data['date'], post_data['end_time'])
458 485
        request_date = datetime.now()
459 486

  
460
        pairing = self.get_or_create_pairing(post_data)
487
        pairing = self.updateorcreate_user(post_data)
461 488

  
462 489
        params = {
463 490
            "activityID": mste.Uint32(post_data['activity_id']),
tests/test_planitech.py
213 213
    assert reservation_args[1] == 'createReservation'
214 214
    assert Pairing.objects.count() == 1
215 215

  
216
    # Changing price code update pairing and planitec user
217
    new_params = params.copy()
218
    new_params['price_code'] = 'T2'
219
    new_side_effect = side_effect[:]
220
    new_side_effect[0] = {
221
        'modificationStatus': 'OK',
222
        'externalUserIdentifier': '22b9c0d91fdc4f379d1356a4aaa9d38b',
223
        'requestDate': datetime(2019, 1, 9, 15, 41),
224
        'requestName': 'updatePerson',
225
        'responseDate': datetime(2019, 1, 9, 15, 41)
226
    }
227
    mock_call_planitech = mock_planitech(monkeypatch, side_effect=new_side_effect)
228
    response = app.post_json('/planitech/slug-planitech/createreservation', params=new_params)
229
    json_resp = response.json
230
    assert json_resp['err'] == 0
231
    assert json_resp['data']['reservation_id'] == 1
232

  
233
    person_args = mock_call_planitech.call_args_list[0][0]
234
    assert person_args[1] == 'updatePerson'
235
    person_args = person_args[2]
236
    assert person_args['pricingCode'] == 'T2'
237
    external_id = person_args['externalUserIdentifier']
238
    assert Pairing.objects.count() == 1
239
    pairing = Pairing.objects.get(external_id=external_id)
240
    assert pairing.price_code == 'T2'
241

  
242
    reservation_args = mock_call_planitech.call_args_list[1][0]
243
    assert reservation_args[1] == 'createReservation'
244

  
216 245
    # Create reservation failed
217 246
    mock_call_planitech = mock_planitech(
218 247
        monkeypatch, return_value={
219
-