diff --git a/AIPscan/Reporter/templates/aips.html b/AIPscan/Reporter/templates/aips.html index f7f03aa8..2bba7e6b 100644 --- a/AIPscan/Reporter/templates/aips.html +++ b/AIPscan/Reporter/templates/aips.html @@ -10,6 +10,12 @@ {% if storage_services %} +
+
+ Search +
+
+
diff --git a/AIPscan/Reporter/tests/test_views.py b/AIPscan/Reporter/tests/test_views.py index 548b7a58..78e0bb7d 100644 --- a/AIPscan/Reporter/tests/test_views.py +++ b/AIPscan/Reporter/tests/test_views.py @@ -38,26 +38,73 @@ class MockResponse(object): assert response.status_code == return_response.status_code -@pytest.mark.parametrize("page,pager_page", [(1, 1), ("bad", 1)]) -def test_get_aip_pager(app_instance, mocker, page, pager_page): - paginate_mock = mocker.Mock() - filter_by_mock = mocker.Mock() - filter_by_mock.paginate.return_value = paginate_mock +@pytest.mark.parametrize( + "query,page,pages,total,prev_num,next_num,set_location", + [ + (None, 1, 2, 3, None, 2, False), # No search query + ("Another Test AIP", 1, 1, 1, None, None, False), # Search matches one AIP + (None, 1, 1, 1, None, None, True), # Use non-default storage location + ("Does Not Exist", 1, 0, 0, None, None, False), # Search doesn't match any AIP + ("Test AIP", 1, 2, 3, None, 2, False), # Search matches all AIPs, page 1 + ("Test AIP", 2, 2, 3, 1, None, False), # Search matches all AIPs, page 2 + ], +) +def test_get_aip_pager( + app_instance, + mocker, + query, + page, + pages, + total, + prev_num, + next_num, + set_location, +): + storage_service = test_helpers.create_test_storage_service() + default_storage_location = test_helpers.create_test_storage_location( + default_storage_service_id=storage_service.id + ) + other_storage_location = test_helpers.create_test_storage_location( + storage_service_id=storage_service.id, + current_location="/other/location", + ) - query_mock = mocker.Mock() - query_mock.filter_by.return_value = filter_by_mock + test_helpers.create_test_aip( + transfer_name="Test AIP", + storage_service_id=storage_service.id, + storage_location_id=default_storage_location.id, + ) + test_helpers.create_test_aip( + transfer_name="Another Test AIP", + storage_service_id=storage_service.id, + storage_location_id=default_storage_location.id, + ) + test_helpers.create_test_aip( + transfer_name="This Is Also A Test AIP", + storage_service_id=storage_service.id, + storage_location_id=other_storage_location.id, + ) - storage_service = test_helpers.create_test_storage_service() - storage_location = test_helpers.create_test_storage_location( - storage_service_id=storage_service.id + location = None + if set_location: + location = other_storage_location + + pager = views.get_aip_pager( + page, 2, storage_service, storage_location=location, query=query ) - pager = views.get_aip_pager(page, 2, storage_service, storage_location) - assert pager.page == pager_page - assert pager.pages == 0 - assert pager.per_page == 2 - assert pager.prev_num is None - assert pager.next_num is None + assert pager.pages == pages + assert pager.total == total + + if prev_num is None: + assert pager.prev_num is None + else: + assert pager.prev_num == prev_num + + if next_num is None: + assert pager.next_num is None + else: + assert pager.next_num == next_num @pytest.mark.parametrize("page,pager_page", [(1, 1), ("bad", 1)]) diff --git a/AIPscan/Reporter/views.py b/AIPscan/Reporter/views.py index a618026d..128e1054 100644 --- a/AIPscan/Reporter/views.py +++ b/AIPscan/Reporter/views.py @@ -86,25 +86,36 @@ def storage_locations_with_aips(storage_locations): return [loc for loc in storage_locations if loc.aips] -def get_aip_pager(page, per_page, storage_service, storage_location): - try: - page = int(page) - except ValueError: - page = 1 - +def get_aip_pager(page, per_page, storage_service, **kwargs): storage_service_id = None if storage_service is not None: storage_service_id = storage_service.id - pager = AIP.query.filter_by(storage_service_id=storage_service_id).paginate( - page=page, per_page=per_page, error_out=False - ) + storage_location_id = None + if kwargs.get("storage_location", None): + storage_location_id = kwargs["storage_location"].id - if storage_location: - pager = pager.query.filter_by(storage_location_id=storage_location.id).paginate( - page=page, per_page=per_page, error_out=False + query = kwargs.get("query", None) + + aips = AIP.query + + # Filter by storage service + aips = aips.filter_by(storage_service_id=storage_service_id) + + # Optionally filter by storage location + if storage_location_id: + aips = aips.filter_by(storage_location_id=storage_location_id) + + # Optionally filter by text search + if query is not None: + aips = aips.filter( + AIP.uuid.like(f"%{query}%") + | AIP.transfer_name.like(f"%{query}%") + | AIP.create_date.like(f"%{query}%") ) + pager = aips.paginate(page=page, per_page=per_page, error_out=False) + return pager @@ -131,8 +142,16 @@ def view_aips(): except Exception as e: print(e) - page = request.args.get(request_params.PAGE, default="1") - pager = get_aip_pager(page, 10, storage_service, storage_location) + query = request.args.get("query", "") + + try: + page = int(request.args.get(request_params.PAGE, default=1)) + except ValueError: + page = 1 + + pager = get_aip_pager( + page, 10, storage_service, storage_location=storage_location, query=query + ) first_item, last_item = calculate_paging_window(pager) diff --git a/AIPscan/static/js/reporter/aips.js b/AIPscan/static/js/reporter/aips.js index fa46e552..9ff54b51 100644 --- a/AIPscan/static/js/reporter/aips.js +++ b/AIPscan/static/js/reporter/aips.js @@ -5,6 +5,7 @@ $(document).ready(function () { function reloadPage(ignoreLocation) { var storageServiceId = $("#ss").val(); var storageLocationId = $("#sl").val(); + var query = $("#query").val(); var url = new URL("reporter/aips", $("body").data("url-root")); var params = { @@ -15,6 +16,10 @@ $(document).ready(function () { params["storage_location"] = storageLocationId; } + if (query !== "") { + params["query"] = query; + } + url.search = new URLSearchParams(params).toString(); window.location.href = url.href; } @@ -26,4 +31,10 @@ $(document).ready(function () { $("#sl").on("change", function () { reloadPage(false); }); + + $("#queryform").on("submit", function () { + reloadPage(false); + + return false; + }); });