Projet

Général

Profil

0001-planitech-filter-place-referential-with-custom-attri.patch

Emmanuel Cazenave, 11 janvier 2019 15:51

Télécharger (5,17 ko)

Voir les différences:

Subject: [PATCH] planitech: filter place referential with custom attributes
 (#29666)

 passerelle/contrib/planitech/models.py | 50 ++++++++++++++++----------
 tests/test_planitech.py                | 11 ++++++
 2 files changed, 42 insertions(+), 19 deletions(-)
passerelle/contrib/planitech/models.py
271 271
                ref[place_id]['city'] = place.get('city')
272 272
                ref[place_id]['zipcode'] = place.get('zipCode')
273 273

  
274
                # Custom attributes
274 275
                for attr_name, attr_def in extensionAttributes.items():
275 276
                    attr_value = place.get(attr_name)
276 277
                    if attr_value is not None and attr_def['type'] == 'int':
......
280 281
            cache.set(cache_key, ref)
281 282
        return ref
282 283

  
284
    def _filter_places_referential(self, places_ref, ref_filters):
285
        # Strip filter name from their prefix
286
        filters = {}
287
        for p_name, p_value in ref_filters.items():
288
            if p_name.startswith('referential_'):
289
                p_name = p_name.replace('referential_', '')
290
                filters[p_name] = p_value
291

  
292
        # Filter on custom attributes
293
        if filters:
294
            res = {}
295
            for place_id, place in places_ref.items():
296
                for filter_name, filter_value in filters.items():
297
                    for field in self.custom_fields:
298
                        if filter_name == field['name']:
299
                            if field['type'] == 'int':
300
                                filter_value = int(filter_value)
301
                            if place.get(filter_name) == filter_value:
302
                                res[place_id] = place
303
            places_ref = res
304

  
305
        return places_ref
306

  
283 307
    def _login(self):
284 308
        try:
285 309
            auth_url = urlparse.urljoin(self.url, 'auth')
......
501 525
        if place_id is not None:
502 526
            places_id = [int(place_id)]
503 527
        elif kwargs:
504
            places_filter = {}
505
            for p_name, p_value in kwargs.items():
506
                if p_name.startswith('referential_'):
507
                    p_name = p_name.replace('referential_', '')
508
                    places_filter[p_name] = p_value
509

  
510
            places = self._get_places_referential()
511
            places_id = []
512
            for place in places.values():
513
                for filter_name, filter_value in places_filter.items():
514
                    for field in self.custom_fields:
515
                        if filter_name == field['name']:
516
                            if field['type'] == 'int':
517
                                filter_value = int(filter_value)
518
                            if place.get(filter_name) == filter_value:
519
                                places_id.append(place['identifier'])
528
            places_id = self._filter_places_referential(
529
                self._get_places_referential(), kwargs).keys()
520 530
        else:
521 531
            places_id = self._get_places_by_capacity(int(min_capacity), int(max_capacity))
522 532

  
......
558 568
        return {'data': self.generic_call('getActivityTypes', 'types')}
559 569

  
560 570
    @endpoint(description_get=_('Get places referential'), methods=['get'], perm='can_access')
561
    def getplacesreferential(self, request):
562
        return {'data': self._get_places_referential()}
571
    def getplacesreferential(self, request, **kwargs):
572
        return {
573
            'data': self._filter_places_referential(
574
                self._get_places_referential(), kwargs)
575
        }
563 576

  
564 577
    @endpoint(description_get=_('Get reservation types'), methods=['get'], perm='can_access')
565 578
    def getreservationtypes(self, request):
566 579
        return {'data': self.generic_call('getReservationTypes', 'types')}
567 580

  
568

  
569 581
    @endpoint(description_get=_('Get users'), methods=['get'], perm='can_access')
570 582
    def getusers(self, request):
571 583
        return {'data': self.generic_call('getUsersList', 'usersList')}
tests/test_planitech.py
271 271
    }
272 272
    assert response.json['data'] == expected_res
273 273

  
274
    mock_planitech(monkeypatch, side_effect=side_effect)
275
    response = app.get(
276
        '/planitech/slug-planitech/getplacesreferential?referential_some_custom_field=Yes')
277
    assert response.json['data'] == {
278
        '2': {
279
            u'capacity': 20, u'label': u'salle 2', u'identifier': 2,
280
            'street_number': None, 'address': None,
281
            'city': None, 'zipcode': None, 'some_custom_field': 'Yes'
282
        }
283
    }
284

  
274 285

  
275 286
def test_getplaces_referential_use_cache(app, connector):
276 287
    cache_key = 'planitech-%s-places' % connector.id
277
-