From 9f02881d069e9be180da36f5b5ab935724a63ed2 Mon Sep 17 00:00:00 2001 From: Jesse Vickery Date: Tue, 23 Dec 2025 20:20:14 +0000 Subject: [PATCH 1/2] feat(dev): package list; - Sysadmin args. --- ckan/logic/action/get.py | 41 ++++++++++++++++++++++++++++++++++++---- ckan/logic/schema.py | 21 +++++++++++++++++--- 2 files changed, 55 insertions(+), 7 deletions(-) diff --git a/ckan/logic/action/get.py b/ckan/logic/action/get.py index 2ab4f9dee1d..43d95c6b504 100644 --- a/ckan/logic/action/get.py +++ b/ckan/logic/action/get.py @@ -70,10 +70,27 @@ def site_read(context: Context, data_dict: Optional[DataDict]=None) -> bool: return True -@logic.validate(ckan.logic.schema.default_pagination_schema) +# (canada fork only): align package_list with package_search +# TODO: upstream contrib!! +@logic.validate(ckan.logic.schema.default_package_list_schema) def package_list(context: Context, data_dict: DataDict) -> ActionResult.PackageList: '''Return a list of the names of the site's datasets (packages). + # (canada fork only): align package_list with package_search + # TODO: upstream contrib!! + :param include_drafts: if ``True``, draft datasets will be included in the + results. This option is only availale to sysadmins. Optional, the default is + ``False``. + :type include_drafts: bool + :param include_deleted: if ``True``, deleted datasets will be included in the + results (site configuration "ckan.search.remove_deleted_packages" must + be set to False). This option is only availale to sysadmins. + Optional, the default is ``False``. + :type include_deleted: bool + :param include_private: if ``True``, private datasets will be included in + the results. This option is only availale to sysadmins. + Optional, the default is ``False``. + :type include_private: bool :param limit: if given, the list of datasets will be broken into pages of at most ``limit`` datasets per page and only one page will be returned at a time (optional) @@ -94,9 +111,23 @@ def package_list(context: Context, data_dict: DataDict) -> ActionResult.PackageL col = (package_table.c["id"] if api == 2 else package_table.c["name"]) query = _select([col]) + + # (canada fork only): align package_list with package_search + # TODO: upstream contrib!! + include_private = asbool(data_dict.pop('include_private', False)) + include_drafts = asbool(data_dict.pop('include_drafts', False)) + include_deleted = asbool(data_dict.pop('include_deleted', False)) + + states = ['active'] + if include_drafts: + states.append('draft') + if include_deleted: + states.append('deleted') + query = query.where(_and_( - package_table.c["state"] == 'active', - package_table.c["private"] == False, + package_table.c["state"].in_(states), + package_table.c["private"] == False if not include_private + else package_table.c["private"].in_([True, False]), )) query = query.order_by(col) @@ -112,7 +143,9 @@ def package_list(context: Context, data_dict: DataDict) -> ActionResult.PackageL return [r[0] for r in query.execute() or []] -@logic.validate(ckan.logic.schema.default_package_list_schema) +# (canada fork only): align package_list with package_search +# TODO: upstream contrib!! +@logic.validate(ckan.logic.schema.default_package_list_with_resources_schema) def current_package_list_with_resources( context: Context, data_dict: DataDict) -> ActionResult.CurrentPackageListWithResources: '''Return a list of the site's datasets (packages) and their resources. diff --git a/ckan/logic/schema.py b/ckan/logic/schema.py index f770d2b6638..6f8d8d3fa7c 100644 --- a/ckan/logic/schema.py +++ b/ckan/logic/schema.py @@ -614,15 +614,30 @@ def default_follow_group_schema( @validator_args -def default_package_list_schema(ignore_missing: Validator, - natural_number_validator: Validator, - is_positive_integer: Validator): +def default_package_list_with_resources_schema(ignore_missing: Validator, + natural_number_validator: Validator, + is_positive_integer: Validator): return cast(Schema, { 'limit': [ignore_missing, natural_number_validator], 'offset': [ignore_missing, natural_number_validator], 'page': [ignore_missing, is_positive_integer] }) +# (canada fork only): align package_list with package_search +# TODO: upstream contrib!! +@validator_args +def default_package_list_schema(ignore_missing: Validator, + natural_number_validator: Validator, + boolean_validator: Validator, + ignore_not_sysadmin: Validator): + return cast(Schema, { + 'include_drafts': [ignore_missing, boolean_validator, ignore_not_sysadmin], + 'include_deleted': [ignore_missing, boolean_validator, ignore_not_sysadmin], + 'include_private': [ignore_missing, boolean_validator, ignore_not_sysadmin], + 'limit': [ignore_missing, natural_number_validator], + 'offset': [ignore_missing, natural_number_validator] + }) + @validator_args def default_pagination_schema(ignore_missing: Validator, From 86e69bfdf83cb808c45af99fb80ab5261cc9d928 Mon Sep 17 00:00:00 2001 From: Jesse Vickery Date: Tue, 23 Dec 2025 20:27:39 +0000 Subject: [PATCH 2/2] feat(misc): changelog; - Added change log file. --- changes/217.canada.changes | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 changes/217.canada.changes diff --git a/changes/217.canada.changes b/changes/217.canada.changes new file mode 100644 index 00000000000..013e1eeb806 --- /dev/null +++ b/changes/217.canada.changes @@ -0,0 +1,5 @@ +Added sysadmin arguments to the `package_list` action: + +- `include_private` +- `include_drafts` +- `include_deleted` \ No newline at end of file