planitech: filter place referential with custom attributes (#29666)
This commit is contained in:
parent
324cba80fa
commit
1955efda7e
|
@ -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')}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue