feat: Add display_name filtering in GET assets/:course

This allows clients to check if a file already exist before
overwriting the asset with new data. See openedx/studio-frontend#384
This commit is contained in:
Sid Verma
2023-10-15 21:03:51 +00:00
committed by David Ormsbee
parent 808390ace8
commit 3bda3bed4a
2 changed files with 33 additions and 1 deletions

View File

@@ -43,6 +43,7 @@ REQUEST_DEFAULTS = {
'direction': '',
'asset_type': '',
'text_search': '',
'display_name': '',
}
@@ -61,7 +62,9 @@ def handle_assets(request, course_key_string=None, asset_key_string=None):
sort: the asset field to sort by (defaults to 'date_added')
direction: the sort direction (defaults to 'descending')
asset_type: the file type to filter items to (defaults to All)
text_search: string to filter results by file name (defaults to '')
text_search: string to perform a search on filenames (defaults to '')
display_name: string to filter results by exact display name (defaults to '').
Use the display_name parameter multiple times to filter by multiple filenames.
POST
json: create or update an asset. The only updating that can be done is changing the lock state.
PUT
@@ -172,6 +175,9 @@ def _assets_json(request, course_key):
filter_parameters.update(_get_content_type_filter_for_mongo(request_options['requested_asset_type']))
if request_options['requested_display_names']:
filter_parameters.update(_get_displayname_filter_for_mongo(request_options['requested_display_names']))
if request_options['requested_text_search']:
filter_parameters.update(_get_displayname_search_filter_for_mongo(request_options['requested_text_search']))
@@ -223,6 +229,7 @@ def _parse_request_to_dictionary(request):
'requested_sort_direction': _get_requested_attribute(request, 'direction'),
'requested_asset_type': _get_requested_attribute(request, 'asset_type'),
'requested_text_search': _get_requested_attribute(request, 'text_search'),
'requested_display_names': _get_requested_attribute_list(request, 'display_name'),
}
@@ -230,6 +237,10 @@ def _get_requested_attribute(request, attribute):
return request.GET.get(attribute, REQUEST_DEFAULTS.get(attribute))
def _get_requested_attribute_list(request, attribute):
return request.GET.getlist(attribute, REQUEST_DEFAULTS.get(attribute))
def _get_error_if_invalid_parameters(requested_filter):
"""Function for returning error messages on filters"""
requested_file_types = _get_requested_file_types_from_requested_filter(requested_filter)
@@ -303,6 +314,24 @@ def _get_mongo_expression_for_type_filter(requested_file_types):
}
def _get_displayname_filter_for_mongo(displaynames):
"""
Construct and return pymongo query dict, filtering for the given list of displaynames.
"""
filters = []
for displayname in displaynames:
filters.append({
'displayname': {
'$eq': displayname,
},
})
return {
'$or': filters,
}
def _get_displayname_search_filter_for_mongo(text_search):
"""
Return a pymongo query dict for the given search string, using case insensitivity.

View File

@@ -175,6 +175,9 @@ class PaginationTestCase(AssetsTestCase):
self.assert_correct_asset_response(self.url + "?page_size=2", 0, 2, 4)
self.assert_correct_asset_response(
self.url + "?page_size=2&page=1", 2, 2, 4)
self.assert_correct_asset_response(self.url + '?display_name=asset-1.txt', 0, 1, 1)
self.assert_correct_asset_response(self.url + '?display_name=asset-1.txt&display_name=asset-2.txt', 0, 2, 2)
self.assert_correct_asset_response(self.url + '?display_name=asset-1.txt&display_name=asset-0.txt', 0, 1, 1)
self.assert_correct_sort_response(self.url, 'date_added', 'asc')
self.assert_correct_sort_response(self.url, 'date_added', 'desc')
self.assert_correct_sort_response(self.url, 'display_name', 'asc')