planitech: filter place referential with custom attributes (#29666)

This commit is contained in:
Emmanuel Cazenave 2019-01-11 15:50:17 +01:00
parent 324cba80fa
commit 1955efda7e
2 changed files with 42 additions and 19 deletions

View File

@ -271,6 +271,7 @@ class PlanitechConnector(BaseResource):
ref[place_id]['city'] = place.get('city')
ref[place_id]['zipcode'] = place.get('zipCode')
# Custom attributes
for attr_name, attr_def in extensionAttributes.items():
attr_value = place.get(attr_name)
if attr_value is not None and attr_def['type'] == 'int':
@ -280,6 +281,29 @@ class PlanitechConnector(BaseResource):
cache.set(cache_key, ref)
return ref
def _filter_places_referential(self, places_ref, ref_filters):
# Strip filter name from their prefix
filters = {}
for p_name, p_value in ref_filters.items():
if p_name.startswith('referential_'):
p_name = p_name.replace('referential_', '')
filters[p_name] = p_value
# Filter on custom attributes
if filters:
res = {}
for place_id, place in places_ref.items():
for filter_name, filter_value in filters.items():
for field in self.custom_fields:
if filter_name == field['name']:
if field['type'] == 'int':
filter_value = int(filter_value)
if place.get(filter_name) == filter_value:
res[place_id] = place
places_ref = res
return places_ref
def _login(self):
try:
auth_url = urlparse.urljoin(self.url, 'auth')
@ -501,22 +525,8 @@ class PlanitechConnector(BaseResource):
if place_id is not None:
places_id = [int(place_id)]
elif kwargs:
places_filter = {}
for p_name, p_value in kwargs.items():
if p_name.startswith('referential_'):
p_name = p_name.replace('referential_', '')
places_filter[p_name] = p_value
places = self._get_places_referential()
places_id = []
for place in places.values():
for filter_name, filter_value in places_filter.items():
for field in self.custom_fields:
if filter_name == field['name']:
if field['type'] == 'int':
filter_value = int(filter_value)
if place.get(filter_name) == filter_value:
places_id.append(place['identifier'])
places_id = self._filter_places_referential(
self._get_places_referential(), kwargs).keys()
else:
places_id = self._get_places_by_capacity(int(min_capacity), int(max_capacity))
@ -558,14 +568,16 @@ class PlanitechConnector(BaseResource):
return {'data': self.generic_call('getActivityTypes', 'types')}
@endpoint(description_get=_('Get places referential'), methods=['get'], perm='can_access')
def getplacesreferential(self, request):
return {'data': self._get_places_referential()}
def getplacesreferential(self, request, **kwargs):
return {
'data': self._filter_places_referential(
self._get_places_referential(), kwargs)
}
@endpoint(description_get=_('Get reservation types'), methods=['get'], perm='can_access')
def getreservationtypes(self, request):
return {'data': self.generic_call('getReservationTypes', 'types')}
@endpoint(description_get=_('Get users'), methods=['get'], perm='can_access')
def getusers(self, request):
return {'data': self.generic_call('getUsersList', 'usersList')}

View File

@ -271,6 +271,17 @@ def test_getplaces_referential(app, connector, monkeypatch):
}
assert response.json['data'] == expected_res
mock_planitech(monkeypatch, side_effect=side_effect)
response = app.get(
'/planitech/slug-planitech/getplacesreferential?referential_some_custom_field=Yes')
assert response.json['data'] == {
'2': {
u'capacity': 20, u'label': u'salle 2', u'identifier': 2,
'street_number': None, 'address': None,
'city': None, 'zipcode': None, 'some_custom_field': 'Yes'
}
}
def test_getplaces_referential_use_cache(app, connector):
cache_key = 'planitech-%s-places' % connector.id