Skip to content

Commit

Permalink
Merge pull request #3102 from SEED-platform/3093-refactor/inventory-f…
Browse files Browse the repository at this point in the history
…ilter-ids-only

3093 refactor/inventory filter ids only
  • Loading branch information
Ryo committed Jan 20, 2022
2 parents 327b140 + fd6e678 commit 9db7705
Show file tree
Hide file tree
Showing 5 changed files with 133 additions and 6 deletions.
6 changes: 4 additions & 2 deletions seed/static/seed/js/services/inventory_service.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,15 @@ angular.module('BE.seed.service.inventory', []).factory('inventory_service', [
return {order_by: sorts};
}

inventory_service.get_properties = function (page, per_page, cycle, profile_id, property_view_ids, save_last_cycle = true, organization_id = null, include_related = true, column_filters = null, column_sorts = null) {
inventory_service.get_properties = function (page, per_page, cycle, profile_id, property_view_ids, save_last_cycle = true, organization_id = null, include_related = true, column_filters = null, column_sorts = null, ids_only = null) {
organization_id = organization_id == undefined ? user_service.get_organization().id : organization_id;

var params = {
organization_id: organization_id,
page: page,
per_page: per_page || 999999999,
include_related: include_related,
ids_only: ids_only,
...format_column_sorts(column_sorts),
...format_column_filters(column_filters),
};
Expand Down Expand Up @@ -289,14 +290,15 @@ angular.module('BE.seed.service.inventory', []).factory('inventory_service', [
};


inventory_service.get_taxlots = function (page, per_page, cycle, profile_id, inventory_ids, save_last_cycle = true, organization_id = null, include_related = true, column_filters = null, column_sorts = null) {
inventory_service.get_taxlots = function (page, per_page, cycle, profile_id, inventory_ids, save_last_cycle = true, organization_id = null, include_related = true, column_filters = null, column_sorts = null, ids_only = null) {
organization_id = organization_id == undefined ? user_service.get_organization().id : organization_id;

var params = {
organization_id: organization_id,
page: page,
per_page: per_page || 999999999,
include_related: include_related,
ids_only: ids_only,
...format_column_sorts(column_sorts),
...format_column_filters(column_filters),
};
Expand Down
99 changes: 99 additions & 0 deletions seed/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -626,6 +626,105 @@ def test_get_properties_property_extra_data(self):
self.assertNotIn(column_name_mappings['number of secret gadgets'], results)
self.assertNotIn(column_name_mappings['paint color'], results)

def test_get_properties_select_all(self):
state1 = self.property_state_factory.get_property_state()
prprty = self.property_factory.get_property()
PropertyView.objects.create(
property=prprty, cycle=self.cycle, state=state1, id=1001
)
state = self.property_state_factory.get_property_state()
prprty = self.property_factory.get_property()
PropertyView.objects.create(
property=prprty, cycle=self.cycle, state=state, id=1004
)
state = self.property_state_factory.get_property_state()
prprty = self.property_factory.get_property()
PropertyView.objects.create(
property=prprty, cycle=self.cycle, state=state, id=1003
)
state = self.property_state_factory.get_property_state()
prprty = self.property_factory.get_property()
PropertyView.objects.create(
property=prprty, cycle=self.cycle, state=state, id=1002
)

column_name_mappings = {}
for c in Column.retrieve_all(self.org.pk, 'property'):
if not c['related']:
column_name_mappings[c['column_name']] = c['name']

response = self.client.post('/api/v3/properties/filter/?{}={}&{}={}'.format(
'organization_id', self.org.pk,
'ids_only', 'true',
), data={}, content_type='application/json')
result = response.json()
results = result['results']
self.assertEqual(len(results), 4)
self.assertEqual(results, [1001, 1002, 1003, 1004])

response = self.client.post('/api/v3/properties/filter/?{}={}&{}={}'.format(
'organization_id', self.org.pk,
'ids_only', 'TrUE',
), data={}, content_type='application/json')
result = response.json()
results = result['results']
self.assertEqual(len(results), 4)
self.assertEqual(results, [1001, 1002, 1003, 1004])

response = self.client.post('/api/v3/properties/filter/?{}={}&{}={}&{}={}&{}={}'.format(
'organization_id', self.org.pk,
'page', 1,
'per_page', 999999999,
'ids_only', 'not_true'
), data={}, content_type='application/json')
result = response.json()
results = result['results'][0]
self.assertEqual(len(result['results']), 4)
self.assertEqual(results[column_name_mappings['address_line_1']], state1.address_line_1)

response = self.client.post('/api/v3/properties/filter/?{}={}&{}={}&{}={}'.format(
'organization_id', self.org.pk,
'page', 1,
'per_page', 999999999,
), data={}, content_type='application/json')
result = response.json()
results = result['results'][0]
self.assertEqual(len(result['results']), 4)
self.assertEqual(results[column_name_mappings['address_line_1']], state1.address_line_1)

def test_get_properties_wrong_query_params(self):
state1 = self.property_state_factory.get_property_state()
prprty = self.property_factory.get_property()
PropertyView.objects.create(
property=prprty, cycle=self.cycle, state=state1, id=1001
)

response = self.client.post('/api/v3/properties/filter/?{}={}&{}={}&{}={}&{}={}'.format(
'organization_id', self.org.pk,
'page', 1,
'per_page', 999999999,
'ids_only', 'true'
), data={}, content_type='application/json')
self.assertEqual(response.status_code, 400)
result = response.json()
self.assertEqual(result['success'], False)
self.assertEqual(result['message'], 'Cannot pass query parameter "ids_only" with "per_page" or "page"')

response = self.client.post('/api/v3/properties/filter/?{}={}&{}={}&{}={}&{}={}'.format(
'organization_id', self.org.pk,
'page', 9999,
'per_page', 1,
'ids_only', 'true'
), data={}, content_type='application/json')
self.assertEqual(response.status_code, 400)

response = self.client.post('/api/v3/properties/filter/?{}={}&{}={}&{}={}'.format(
'organization_id', self.org.pk,
'page', 'dog',
'ids_only', 'true'
), data={}, content_type='application/json')
self.assertEqual(response.status_code, 400)

def test_get_properties_pint_fields(self):
state = self.property_state_factory.get_property_state(
self.org,
Expand Down
20 changes: 18 additions & 2 deletions seed/utils/filter_state.py → seed/utils/inventory_filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,11 @@


def get_filtered_results(request: Request, inventory_type: Literal['property', 'taxlot'], profile_id: int) -> HttpResponse:
page = request.query_params.get('page', 1)
per_page = request.query_params.get('per_page', 1)
page = request.query_params.get('page')
per_page = request.query_params.get('per_page')
org_id = request.query_params.get('organization_id')
cycle_id = request.query_params.get('cycle')
ids_only = request.query_params.get('ids_only', 'false').lower() == 'true'
# check if there is a query paramater for the profile_id. If so, then use that one
profile_id = request.query_params.get('profile_id', profile_id)

Expand All @@ -49,6 +50,15 @@ def get_filtered_results(request: Request, inventory_type: Literal['property', '
'results': []
})

if ids_only and (per_page or page):
return JsonResponse({
'success': False,
'message': 'Cannot pass query parameter "ids_only" with "per_page" or "page"'
}, status=status.HTTP_400_BAD_REQUEST)

page = page or 1
per_page = per_page or 1

if inventory_type == 'property':
views_list = (
PropertyView.objects.select_related('property', 'state', 'cycle')
Expand Down Expand Up @@ -88,6 +98,12 @@ def get_filtered_results(request: Request, inventory_type: Literal['property', '
if f'{inventory_type}_view_ids' in request.data and request.data[f'{inventory_type}_view_ids']:
views_list = views_list.filter(id__in=request.data[f'{inventory_type}_view_ids'])

if ids_only:
id_list = list(views_list.values_list('id', flat=True))
return JsonResponse({
'results': id_list
})

paginator = Paginator(views_list, per_page)

try:
Expand Down
7 changes: 6 additions & 1 deletion seed/views/v3/properties.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
pair_unpair_property_taxlot,
properties_across_cycles,
update_result_with_master)
from seed.utils.filter_state import get_filtered_results
from seed.utils.inventory_filter import get_filtered_results

# Global toggle that controls whether or not to display the raw extra
# data fields in the columns returned for the view.
Expand Down Expand Up @@ -352,6 +352,11 @@ def filter_by_cycle(self, request):
required=False,
description='If False, related data (i.e. Tax Lot data) is not added to the response (default is True)'
),
AutoSchemaHelper.query_boolean_field(
'ids_only',
required=False,
description='Function will return a list of property ids instead of property objects'
)
],
request_body=AutoSchemaHelper.schema_factory(
{
Expand Down
7 changes: 6 additions & 1 deletion seed/views/v3/taxlots.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
pair_unpair_property_taxlot,
update_result_with_master)
from seed.utils.taxlots import taxlots_across_cycles
from seed.utils.filter_state import get_filtered_results
from seed.utils.inventory_filter import get_filtered_results

ErrorState = namedtuple('ErrorState', ['status_code', 'message'])

Expand Down Expand Up @@ -165,6 +165,11 @@ def filter_by_cycle(self, request):
required=False,
description='If False, related data (i.e. Property data) is not added to the response (default is True)'
),
AutoSchemaHelper.query_boolean_field(
'ids_only',
required=False,
description='Function will return a list of tax lot ids instead of tax lot objects'
)
],
request_body=AutoSchemaHelper.schema_factory(
{
Expand Down

0 comments on commit 9db7705

Please sign in to comment.