diff --git a/CHANGELOG.md b/CHANGELOG.md index 3be890ef..cfe9bde7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ ml). ## testing [1.0.9-beta] - [addend] #159 external document as proof of erase of disk +- [addend] #162 adding lot for devices unassigned ## [1.0.8-beta] diff --git a/ereuse_devicehub/resources/device/views.py b/ereuse_devicehub/resources/device/views.py index 20982430..b046b49d 100644 --- a/ereuse_devicehub/resources/device/views.py +++ b/ereuse_devicehub/resources/device/views.py @@ -86,6 +86,7 @@ class DeviceView(View): filter = f.Nested(Filters, missing=[]) sort = f.Nested(Sorting, missing=[Device.id.asc()]) page = f.Integer(validate=v.Range(min=1), missing=1) + unassign = f.Integer(validate=v.Range(min=0, max=1), missing=0) def get(self, id): """Devices view @@ -161,6 +162,7 @@ class DeviceView(View): (Device.owner_id == g.user.id) | (Device.id.in_(trades_dev_ids)) ).distinct() + unassign = args.get('unassign', None) search_p = args.get('search', None) if search_p: properties = DeviceSearch.properties @@ -175,6 +177,11 @@ class DeviceView(View): search.Search.rank(tags, search_p) + search.Search.rank(devicehub_ids, search_p) ) + if unassign: + subquery = LotDeviceDescendants.query.with_entities( + LotDeviceDescendants.device_id + ) + query = query.filter(Device.id.notin_(subquery)) return query.filter(*args['filter']).order_by(*args['sort']) diff --git a/tests/test_device.py b/tests/test_device.py index c428229e..9dcfd53f 100644 --- a/tests/test_device.py +++ b/tests/test_device.py @@ -500,6 +500,46 @@ def test_get_devices_permissions(app: Devicehub, user: UserClient, user2: UserCl assert len(devices['items']) == 1 assert len(devices2['items']) == 0 + +@pytest.mark.mvp +def test_get_devices_unassigned(app: Devicehub, user: UserClient): + """Checks GETting multiple devices.""" + + user.post(file('asus-eee-1000h.snapshot.11'), res=m.Snapshot) + url = '/devices/?filter={"type":["Computer"]}&unassign=0' + + devices, res = user.get(url, None) + assert res.status_code == 200 + assert len(devices['items']) == 1 + + url = '/devices/?filter={"type":["Computer"]}&unassign=1' + + devices, res = user.get(url, None) + assert res.status_code == 200 + assert len(devices['items']) == 1 + + from ereuse_devicehub.resources.lot.models import Lot + device_id = devices['items'][0]['id'] + my_lot, _ = user.post(({'name': 'My_lot'}), res=Lot) + lot, _ = user.post({}, + res=Lot, + item='{}/devices'.format(my_lot['id']), + query=[('id', device_id)]) + assert lot['devices'][0]['id'] == device_id, 'Lot contains device' + + url = '/devices/?filter={"type":["Computer"]}&unassign=0' + + devices, res = user.get(url, None) + assert res.status_code == 200 + assert len(devices['items']) == 1 + + url = '/devices/?filter={"type":["Computer"]}&unassign=1' + + devices, res = user.get(url, None) + assert res.status_code == 200 + assert len(devices['items']) == 0 + + @pytest.mark.mvp @pytest.mark.usefixtures(conftest.auth_app_context.__name__) def test_computer_monitor():