udata 9.1.2.dev30355__py2.py3-none-any.whl → 9.1.2.dev30454__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of udata might be problematic. Click here for more details.
- tasks/__init__.py +109 -107
- tasks/helpers.py +18 -18
- udata/__init__.py +4 -4
- udata/admin/views.py +5 -5
- udata/api/__init__.py +111 -134
- udata/api/commands.py +45 -37
- udata/api/errors.py +5 -4
- udata/api/fields.py +23 -21
- udata/api/oauth2.py +55 -74
- udata/api/parsers.py +15 -15
- udata/api/signals.py +1 -1
- udata/api_fields.py +137 -89
- udata/app.py +58 -55
- udata/assets.py +5 -5
- udata/auth/__init__.py +37 -26
- udata/auth/forms.py +23 -15
- udata/auth/helpers.py +1 -1
- udata/auth/mails.py +3 -3
- udata/auth/password_validation.py +19 -15
- udata/auth/views.py +94 -68
- udata/commands/__init__.py +71 -69
- udata/commands/cache.py +7 -7
- udata/commands/db.py +201 -140
- udata/commands/dcat.py +36 -30
- udata/commands/fixtures.py +100 -84
- udata/commands/images.py +21 -20
- udata/commands/info.py +17 -20
- udata/commands/init.py +10 -10
- udata/commands/purge.py +12 -13
- udata/commands/serve.py +41 -29
- udata/commands/static.py +16 -18
- udata/commands/test.py +20 -20
- udata/commands/tests/fixtures.py +26 -24
- udata/commands/worker.py +31 -33
- udata/core/__init__.py +12 -12
- udata/core/activity/__init__.py +0 -1
- udata/core/activity/api.py +59 -49
- udata/core/activity/models.py +28 -26
- udata/core/activity/signals.py +1 -1
- udata/core/activity/tasks.py +16 -10
- udata/core/badges/api.py +6 -6
- udata/core/badges/commands.py +14 -13
- udata/core/badges/fields.py +8 -5
- udata/core/badges/forms.py +7 -4
- udata/core/badges/models.py +16 -31
- udata/core/badges/permissions.py +1 -3
- udata/core/badges/signals.py +2 -2
- udata/core/badges/tasks.py +3 -2
- udata/core/badges/tests/test_commands.py +10 -10
- udata/core/badges/tests/test_model.py +24 -31
- udata/core/contact_point/api.py +19 -18
- udata/core/contact_point/api_fields.py +21 -14
- udata/core/contact_point/factories.py +2 -2
- udata/core/contact_point/forms.py +7 -6
- udata/core/contact_point/models.py +3 -5
- udata/core/dataservices/api.py +26 -21
- udata/core/dataservices/factories.py +13 -11
- udata/core/dataservices/models.py +35 -40
- udata/core/dataservices/permissions.py +4 -4
- udata/core/dataservices/rdf.py +40 -17
- udata/core/dataservices/tasks.py +4 -3
- udata/core/dataset/actions.py +10 -10
- udata/core/dataset/activities.py +21 -23
- udata/core/dataset/api.py +321 -298
- udata/core/dataset/api_fields.py +443 -271
- udata/core/dataset/apiv2.py +305 -229
- udata/core/dataset/commands.py +38 -36
- udata/core/dataset/constants.py +61 -54
- udata/core/dataset/csv.py +70 -74
- udata/core/dataset/events.py +39 -32
- udata/core/dataset/exceptions.py +8 -4
- udata/core/dataset/factories.py +57 -65
- udata/core/dataset/forms.py +87 -63
- udata/core/dataset/models.py +336 -280
- udata/core/dataset/permissions.py +9 -6
- udata/core/dataset/preview.py +15 -17
- udata/core/dataset/rdf.py +156 -122
- udata/core/dataset/search.py +92 -77
- udata/core/dataset/signals.py +1 -1
- udata/core/dataset/tasks.py +63 -54
- udata/core/discussions/actions.py +5 -5
- udata/core/discussions/api.py +124 -120
- udata/core/discussions/factories.py +2 -2
- udata/core/discussions/forms.py +9 -7
- udata/core/discussions/metrics.py +1 -3
- udata/core/discussions/models.py +25 -24
- udata/core/discussions/notifications.py +18 -14
- udata/core/discussions/permissions.py +3 -3
- udata/core/discussions/signals.py +4 -4
- udata/core/discussions/tasks.py +24 -28
- udata/core/followers/api.py +32 -33
- udata/core/followers/models.py +9 -9
- udata/core/followers/signals.py +3 -3
- udata/core/jobs/actions.py +7 -7
- udata/core/jobs/api.py +99 -92
- udata/core/jobs/commands.py +48 -49
- udata/core/jobs/forms.py +11 -11
- udata/core/jobs/models.py +6 -6
- udata/core/metrics/__init__.py +2 -2
- udata/core/metrics/commands.py +34 -30
- udata/core/metrics/models.py +2 -4
- udata/core/metrics/signals.py +1 -1
- udata/core/metrics/tasks.py +3 -3
- udata/core/organization/activities.py +12 -15
- udata/core/organization/api.py +167 -174
- udata/core/organization/api_fields.py +183 -124
- udata/core/organization/apiv2.py +32 -32
- udata/core/organization/commands.py +20 -22
- udata/core/organization/constants.py +11 -11
- udata/core/organization/csv.py +17 -15
- udata/core/organization/factories.py +8 -11
- udata/core/organization/forms.py +32 -26
- udata/core/organization/metrics.py +2 -1
- udata/core/organization/models.py +87 -67
- udata/core/organization/notifications.py +18 -14
- udata/core/organization/permissions.py +10 -11
- udata/core/organization/rdf.py +14 -14
- udata/core/organization/search.py +30 -28
- udata/core/organization/signals.py +7 -7
- udata/core/organization/tasks.py +42 -61
- udata/core/owned.py +38 -27
- udata/core/post/api.py +82 -81
- udata/core/post/constants.py +8 -5
- udata/core/post/factories.py +4 -4
- udata/core/post/forms.py +13 -14
- udata/core/post/models.py +20 -22
- udata/core/post/tests/test_api.py +30 -32
- udata/core/reports/api.py +8 -7
- udata/core/reports/constants.py +1 -3
- udata/core/reports/models.py +10 -10
- udata/core/reuse/activities.py +15 -19
- udata/core/reuse/api.py +123 -126
- udata/core/reuse/api_fields.py +120 -85
- udata/core/reuse/apiv2.py +11 -10
- udata/core/reuse/constants.py +23 -23
- udata/core/reuse/csv.py +18 -18
- udata/core/reuse/factories.py +5 -9
- udata/core/reuse/forms.py +24 -21
- udata/core/reuse/models.py +55 -51
- udata/core/reuse/permissions.py +2 -2
- udata/core/reuse/search.py +49 -46
- udata/core/reuse/signals.py +1 -1
- udata/core/reuse/tasks.py +4 -5
- udata/core/site/api.py +47 -50
- udata/core/site/factories.py +2 -2
- udata/core/site/forms.py +4 -5
- udata/core/site/models.py +94 -63
- udata/core/site/rdf.py +14 -14
- udata/core/spam/api.py +16 -9
- udata/core/spam/constants.py +4 -4
- udata/core/spam/fields.py +13 -7
- udata/core/spam/models.py +27 -20
- udata/core/spam/signals.py +1 -1
- udata/core/spam/tests/test_spam.py +6 -5
- udata/core/spatial/api.py +72 -80
- udata/core/spatial/api_fields.py +73 -58
- udata/core/spatial/commands.py +67 -64
- udata/core/spatial/constants.py +3 -3
- udata/core/spatial/factories.py +37 -54
- udata/core/spatial/forms.py +27 -26
- udata/core/spatial/geoids.py +17 -17
- udata/core/spatial/models.py +43 -47
- udata/core/spatial/tasks.py +2 -1
- udata/core/spatial/tests/test_api.py +115 -130
- udata/core/spatial/tests/test_fields.py +74 -77
- udata/core/spatial/tests/test_geoid.py +22 -22
- udata/core/spatial/tests/test_models.py +5 -7
- udata/core/spatial/translations.py +16 -16
- udata/core/storages/__init__.py +16 -18
- udata/core/storages/api.py +66 -64
- udata/core/storages/tasks.py +7 -7
- udata/core/storages/utils.py +15 -15
- udata/core/storages/views.py +5 -6
- udata/core/tags/api.py +17 -14
- udata/core/tags/csv.py +4 -4
- udata/core/tags/models.py +8 -5
- udata/core/tags/tasks.py +11 -13
- udata/core/tags/views.py +4 -4
- udata/core/topic/api.py +84 -73
- udata/core/topic/apiv2.py +157 -127
- udata/core/topic/factories.py +3 -4
- udata/core/topic/forms.py +12 -14
- udata/core/topic/models.py +14 -19
- udata/core/topic/parsers.py +26 -26
- udata/core/user/activities.py +30 -29
- udata/core/user/api.py +151 -152
- udata/core/user/api_fields.py +132 -100
- udata/core/user/apiv2.py +7 -7
- udata/core/user/commands.py +38 -38
- udata/core/user/factories.py +8 -9
- udata/core/user/forms.py +14 -11
- udata/core/user/metrics.py +2 -2
- udata/core/user/models.py +68 -69
- udata/core/user/permissions.py +4 -5
- udata/core/user/rdf.py +7 -8
- udata/core/user/tasks.py +2 -2
- udata/core/user/tests/test_user_model.py +24 -16
- udata/cors.py +99 -0
- udata/db/tasks.py +2 -1
- udata/entrypoints.py +35 -31
- udata/errors.py +2 -1
- udata/event/values.py +6 -6
- udata/factories.py +2 -2
- udata/features/identicon/api.py +5 -6
- udata/features/identicon/backends.py +48 -55
- udata/features/identicon/tests/test_backends.py +4 -5
- udata/features/notifications/__init__.py +0 -1
- udata/features/notifications/actions.py +9 -9
- udata/features/notifications/api.py +17 -13
- udata/features/territories/__init__.py +12 -10
- udata/features/territories/api.py +14 -15
- udata/features/territories/models.py +23 -28
- udata/features/transfer/actions.py +8 -11
- udata/features/transfer/api.py +84 -77
- udata/features/transfer/factories.py +2 -1
- udata/features/transfer/models.py +11 -12
- udata/features/transfer/notifications.py +19 -15
- udata/features/transfer/permissions.py +5 -5
- udata/forms/__init__.py +5 -2
- udata/forms/fields.py +164 -172
- udata/forms/validators.py +19 -22
- udata/forms/widgets.py +9 -13
- udata/frontend/__init__.py +31 -26
- udata/frontend/csv.py +68 -58
- udata/frontend/markdown.py +40 -44
- udata/harvest/actions.py +89 -77
- udata/harvest/api.py +294 -238
- udata/harvest/backends/__init__.py +4 -4
- udata/harvest/backends/base.py +128 -111
- udata/harvest/backends/dcat.py +80 -66
- udata/harvest/commands.py +56 -60
- udata/harvest/csv.py +8 -8
- udata/harvest/exceptions.py +6 -3
- udata/harvest/filters.py +24 -23
- udata/harvest/forms.py +27 -28
- udata/harvest/models.py +88 -80
- udata/harvest/notifications.py +15 -10
- udata/harvest/signals.py +13 -13
- udata/harvest/tasks.py +11 -10
- udata/harvest/tests/factories.py +23 -24
- udata/harvest/tests/test_actions.py +136 -166
- udata/harvest/tests/test_api.py +220 -214
- udata/harvest/tests/test_base_backend.py +117 -112
- udata/harvest/tests/test_dcat_backend.py +380 -308
- udata/harvest/tests/test_filters.py +33 -22
- udata/harvest/tests/test_models.py +11 -14
- udata/harvest/tests/test_notifications.py +6 -7
- udata/harvest/tests/test_tasks.py +7 -6
- udata/i18n.py +237 -78
- udata/linkchecker/backends.py +5 -11
- udata/linkchecker/checker.py +23 -22
- udata/linkchecker/commands.py +4 -6
- udata/linkchecker/models.py +6 -6
- udata/linkchecker/tasks.py +18 -20
- udata/mail.py +21 -21
- udata/migrations/2020-07-24-remove-s-from-scope-oauth.py +9 -8
- udata/migrations/2020-08-24-add-fs-filename.py +9 -8
- udata/migrations/2020-09-28-update-reuses-datasets-metrics.py +5 -4
- udata/migrations/2020-10-16-migrate-ods-resources.py +9 -10
- udata/migrations/2021-04-08-update-schema-with-new-structure.py +8 -7
- udata/migrations/2021-05-27-fix-default-schema-name.py +7 -6
- udata/migrations/2021-07-05-remove-unused-badges.py +17 -15
- udata/migrations/2021-07-07-update-schema-for-community-resources.py +7 -6
- udata/migrations/2021-08-17-follow-integrity.py +5 -4
- udata/migrations/2021-08-17-harvest-integrity.py +13 -12
- udata/migrations/2021-08-17-oauth2client-integrity.py +5 -4
- udata/migrations/2021-08-17-transfer-integrity.py +5 -4
- udata/migrations/2021-08-17-users-integrity.py +9 -8
- udata/migrations/2021-12-14-reuse-topics.py +7 -6
- udata/migrations/2022-04-21-improve-extension-detection.py +8 -7
- udata/migrations/2022-09-22-clean-inactive-harvest-datasets.py +16 -14
- udata/migrations/2022-10-10-add-fs_uniquifier-to-user-model.py +6 -6
- udata/migrations/2022-10-10-migrate-harvest-extras.py +36 -26
- udata/migrations/2023-02-08-rename-internal-dates.py +46 -28
- udata/migrations/2024-01-29-fix-reuse-and-dataset-with-private-None.py +10 -8
- udata/migrations/2024-03-22-migrate-activity-kwargs-to-extras.py +6 -4
- udata/migrations/2024-06-11-fix-reuse-datasets-references.py +7 -6
- udata/migrations/__init__.py +123 -105
- udata/models/__init__.py +4 -4
- udata/mongo/__init__.py +13 -11
- udata/mongo/badges_field.py +3 -2
- udata/mongo/datetime_fields.py +13 -12
- udata/mongo/document.py +17 -16
- udata/mongo/engine.py +15 -16
- udata/mongo/errors.py +2 -1
- udata/mongo/extras_fields.py +30 -20
- udata/mongo/queryset.py +12 -12
- udata/mongo/slug_fields.py +38 -28
- udata/mongo/taglist_field.py +1 -2
- udata/mongo/url_field.py +5 -5
- udata/mongo/uuid_fields.py +4 -3
- udata/notifications/__init__.py +1 -1
- udata/notifications/mattermost.py +10 -9
- udata/rdf.py +167 -188
- udata/routing.py +40 -45
- udata/search/__init__.py +18 -19
- udata/search/adapter.py +17 -16
- udata/search/commands.py +44 -51
- udata/search/fields.py +13 -20
- udata/search/query.py +23 -18
- udata/search/result.py +9 -10
- udata/sentry.py +21 -19
- udata/settings.py +262 -198
- udata/sitemap.py +8 -6
- udata/storage/s3.py +20 -13
- udata/tags.py +4 -5
- udata/tasks.py +43 -42
- udata/tests/__init__.py +9 -6
- udata/tests/api/__init__.py +8 -6
- udata/tests/api/test_auth_api.py +395 -321
- udata/tests/api/test_base_api.py +33 -35
- udata/tests/api/test_contact_points.py +7 -9
- udata/tests/api/test_dataservices_api.py +211 -158
- udata/tests/api/test_datasets_api.py +823 -812
- udata/tests/api/test_follow_api.py +13 -15
- udata/tests/api/test_me_api.py +95 -112
- udata/tests/api/test_organizations_api.py +301 -339
- udata/tests/api/test_reports_api.py +35 -25
- udata/tests/api/test_reuses_api.py +134 -139
- udata/tests/api/test_swagger.py +5 -5
- udata/tests/api/test_tags_api.py +18 -25
- udata/tests/api/test_topics_api.py +94 -94
- udata/tests/api/test_transfer_api.py +53 -48
- udata/tests/api/test_user_api.py +128 -141
- udata/tests/apiv2/test_datasets.py +290 -198
- udata/tests/apiv2/test_me_api.py +10 -11
- udata/tests/apiv2/test_organizations.py +56 -74
- udata/tests/apiv2/test_swagger.py +5 -5
- udata/tests/apiv2/test_topics.py +69 -87
- udata/tests/cli/test_cli_base.py +8 -8
- udata/tests/cli/test_db_cli.py +21 -19
- udata/tests/dataservice/test_dataservice_tasks.py +8 -12
- udata/tests/dataset/test_csv_adapter.py +44 -35
- udata/tests/dataset/test_dataset_actions.py +2 -3
- udata/tests/dataset/test_dataset_commands.py +7 -8
- udata/tests/dataset/test_dataset_events.py +36 -29
- udata/tests/dataset/test_dataset_model.py +224 -217
- udata/tests/dataset/test_dataset_rdf.py +142 -131
- udata/tests/dataset/test_dataset_tasks.py +15 -15
- udata/tests/dataset/test_resource_preview.py +10 -13
- udata/tests/features/territories/__init__.py +9 -13
- udata/tests/features/territories/test_territories_api.py +71 -91
- udata/tests/forms/test_basic_fields.py +7 -7
- udata/tests/forms/test_current_user_field.py +39 -66
- udata/tests/forms/test_daterange_field.py +31 -39
- udata/tests/forms/test_dict_field.py +28 -26
- udata/tests/forms/test_extras_fields.py +102 -76
- udata/tests/forms/test_form_field.py +8 -8
- udata/tests/forms/test_image_field.py +33 -26
- udata/tests/forms/test_model_field.py +134 -123
- udata/tests/forms/test_model_list_field.py +7 -7
- udata/tests/forms/test_nested_model_list_field.py +117 -79
- udata/tests/forms/test_publish_as_field.py +36 -65
- udata/tests/forms/test_reference_field.py +34 -53
- udata/tests/forms/test_user_forms.py +23 -21
- udata/tests/forms/test_uuid_field.py +6 -10
- udata/tests/frontend/__init__.py +9 -6
- udata/tests/frontend/test_auth.py +7 -6
- udata/tests/frontend/test_csv.py +81 -96
- udata/tests/frontend/test_hooks.py +43 -43
- udata/tests/frontend/test_markdown.py +211 -191
- udata/tests/helpers.py +32 -37
- udata/tests/models.py +2 -2
- udata/tests/organization/test_csv_adapter.py +21 -16
- udata/tests/organization/test_notifications.py +11 -18
- udata/tests/organization/test_organization_model.py +13 -13
- udata/tests/organization/test_organization_rdf.py +29 -22
- udata/tests/organization/test_organization_tasks.py +16 -17
- udata/tests/plugin.py +79 -73
- udata/tests/reuse/test_reuse_model.py +21 -21
- udata/tests/reuse/test_reuse_task.py +11 -13
- udata/tests/search/__init__.py +11 -12
- udata/tests/search/test_adapter.py +60 -70
- udata/tests/search/test_query.py +16 -16
- udata/tests/search/test_results.py +10 -7
- udata/tests/site/test_site_api.py +11 -16
- udata/tests/site/test_site_metrics.py +20 -30
- udata/tests/site/test_site_model.py +4 -5
- udata/tests/site/test_site_rdf.py +94 -78
- udata/tests/test_activity.py +17 -17
- udata/tests/test_cors.py +62 -0
- udata/tests/test_discussions.py +292 -299
- udata/tests/test_i18n.py +37 -40
- udata/tests/test_linkchecker.py +91 -85
- udata/tests/test_mail.py +13 -17
- udata/tests/test_migrations.py +219 -180
- udata/tests/test_model.py +164 -157
- udata/tests/test_notifications.py +17 -17
- udata/tests/test_owned.py +14 -14
- udata/tests/test_rdf.py +25 -23
- udata/tests/test_routing.py +89 -93
- udata/tests/test_storages.py +137 -128
- udata/tests/test_tags.py +44 -46
- udata/tests/test_topics.py +7 -7
- udata/tests/test_transfer.py +42 -49
- udata/tests/test_uris.py +160 -161
- udata/tests/test_utils.py +79 -71
- udata/tests/user/test_user_rdf.py +5 -9
- udata/tests/workers/test_jobs_commands.py +57 -58
- udata/tests/workers/test_tasks_routing.py +23 -29
- udata/tests/workers/test_workers_api.py +125 -131
- udata/tests/workers/test_workers_helpers.py +6 -6
- udata/tracking.py +4 -6
- udata/uris.py +45 -46
- udata/utils.py +68 -66
- udata/wsgi.py +1 -1
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/METADATA +7 -3
- udata-9.1.2.dev30454.dist-info/RECORD +706 -0
- udata-9.1.2.dev30355.dist-info/RECORD +0 -704
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/LICENSE +0 -0
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/WHEEL +0 -0
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/entry_points.txt +0 -0
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/top_level.txt +0 -0
udata/tests/cli/test_cli_base.py
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
def test_cli_help(cli):
|
|
2
|
-
|
|
2
|
+
"""Should display help without errors"""
|
|
3
3
|
cli()
|
|
4
|
-
cli(
|
|
5
|
-
cli(
|
|
6
|
-
cli(
|
|
4
|
+
cli("-?")
|
|
5
|
+
cli("-h")
|
|
6
|
+
cli("--help")
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
def test_cli_log_and_printing(cli):
|
|
10
|
-
|
|
11
|
-
cli(
|
|
10
|
+
"""Should properly log and print"""
|
|
11
|
+
cli("test log")
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
def test_cli_version(cli):
|
|
15
|
-
|
|
16
|
-
cli(
|
|
15
|
+
"""Should display version without errors"""
|
|
16
|
+
cli("--version")
|
udata/tests/cli/test_db_cli.py
CHANGED
|
@@ -5,53 +5,55 @@ import pytest
|
|
|
5
5
|
|
|
6
6
|
@pytest.fixture
|
|
7
7
|
def migrations(db):
|
|
8
|
-
db.migrations.insert_one(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
8
|
+
db.migrations.insert_one(
|
|
9
|
+
{
|
|
10
|
+
"plugin": "udata",
|
|
11
|
+
"filename": "test.py",
|
|
12
|
+
"date": datetime.utcnow(),
|
|
13
|
+
"script": 'print("ok")',
|
|
14
|
+
"output": "ok",
|
|
15
|
+
}
|
|
16
|
+
)
|
|
15
17
|
return db.migrations
|
|
16
18
|
|
|
17
19
|
|
|
18
20
|
def test_unrecord_with_complete_filename(cli, migrations):
|
|
19
|
-
|
|
20
|
-
result = cli(
|
|
21
|
+
"""Should display help without errors"""
|
|
22
|
+
result = cli("db unrecord udata test.py")
|
|
21
23
|
assert result.exit_code == 0
|
|
22
24
|
assert migrations.count_documents({}) == 0
|
|
23
25
|
|
|
24
26
|
|
|
25
27
|
def test_unrecord_with_filename_without_extension(cli, migrations):
|
|
26
|
-
|
|
27
|
-
result = cli(
|
|
28
|
+
"""Should display help without errors"""
|
|
29
|
+
result = cli("db unrecord udata test")
|
|
28
30
|
assert result.exit_code == 0
|
|
29
31
|
assert migrations.count_documents({}) == 0
|
|
30
32
|
|
|
31
33
|
|
|
32
34
|
def test_unrecord_with_single_parameter(cli, migrations):
|
|
33
|
-
|
|
34
|
-
result = cli(
|
|
35
|
+
"""Should display help without errors"""
|
|
36
|
+
result = cli("db unrecord udata:test.py")
|
|
35
37
|
assert result.exit_code == 0
|
|
36
38
|
assert migrations.count_documents({}) == 0
|
|
37
39
|
|
|
38
40
|
|
|
39
41
|
def test_unrecord_with_single_parameter_without_extension(cli, migrations):
|
|
40
|
-
|
|
41
|
-
result = cli(
|
|
42
|
+
"""Should display help without errors"""
|
|
43
|
+
result = cli("db unrecord udata:test")
|
|
42
44
|
assert result.exit_code == 0
|
|
43
45
|
assert migrations.count_documents({}) == 0
|
|
44
46
|
|
|
45
47
|
|
|
46
48
|
def test_unrecord_without_parameters(cli, migrations):
|
|
47
|
-
|
|
48
|
-
result = cli(
|
|
49
|
+
"""Should display help without errors"""
|
|
50
|
+
result = cli("db unrecord", check=False)
|
|
49
51
|
assert result.exit_code != 0
|
|
50
52
|
assert migrations.count_documents({}) == 1
|
|
51
53
|
|
|
52
54
|
|
|
53
55
|
def test_unrecord_with_too_many_parameters(cli, migrations):
|
|
54
|
-
|
|
55
|
-
result = cli(
|
|
56
|
+
"""Should display help without errors"""
|
|
57
|
+
result = cli("db unrecord udata test.py too many", check=False)
|
|
56
58
|
assert result.exit_code != 0
|
|
57
59
|
assert migrations.count_documents({}) == 1
|
|
@@ -1,24 +1,20 @@
|
|
|
1
1
|
import pytest
|
|
2
2
|
|
|
3
|
+
from udata.core.dataservices import tasks
|
|
3
4
|
from udata.core.dataservices.models import Dataservice
|
|
4
5
|
from udata.core.user.factories import UserFactory
|
|
5
|
-
from udata.core.dataservices import tasks
|
|
6
6
|
from udata.models import Discussion, Follow, Message, Transfer
|
|
7
7
|
from udata.utils import faker
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
pytestmark = pytest.mark.usefixtures('clean_db')
|
|
9
|
+
pytestmark = pytest.mark.usefixtures("clean_db")
|
|
11
10
|
|
|
12
11
|
|
|
13
12
|
def test_purge_dataservices():
|
|
14
13
|
dataservices = [
|
|
15
14
|
Dataservice.objects.create(
|
|
16
|
-
title=
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
Dataservice.objects.create(
|
|
20
|
-
title='keep me',
|
|
21
|
-
base_api_url='https://example.com/api'),
|
|
15
|
+
title="delete me", base_api_url="https://example.com/api", deleted_at="2016-01-01"
|
|
16
|
+
),
|
|
17
|
+
Dataservice.objects.create(title="keep me", base_api_url="https://example.com/api"),
|
|
22
18
|
]
|
|
23
19
|
|
|
24
20
|
user = UserFactory()
|
|
@@ -26,14 +22,14 @@ def test_purge_dataservices():
|
|
|
26
22
|
owner=user,
|
|
27
23
|
recipient=user,
|
|
28
24
|
subject=dataservices[0],
|
|
29
|
-
comment=
|
|
25
|
+
comment="comment",
|
|
30
26
|
)
|
|
31
27
|
|
|
32
28
|
discussion = Discussion.objects.create(
|
|
33
29
|
subject=dataservices[0],
|
|
34
30
|
user=user,
|
|
35
|
-
title=
|
|
36
|
-
discussion=[Message(content=faker.sentence(), posted_by=user)]
|
|
31
|
+
title="test discussion",
|
|
32
|
+
discussion=[Message(content=faker.sentence(), posted_by=user)],
|
|
37
33
|
)
|
|
38
34
|
|
|
39
35
|
follower = Follow.objects.create(follower=user, following=dataservices[0])
|
|
@@ -2,30 +2,33 @@ from datetime import datetime, timedelta
|
|
|
2
2
|
|
|
3
3
|
import pytest
|
|
4
4
|
|
|
5
|
-
from udata.core.dataset.csv import
|
|
5
|
+
from udata.core.dataset.csv import DatasetCsvAdapter, ResourcesCsvAdapter
|
|
6
6
|
from udata.core.dataset.factories import DatasetFactory, ResourceFactory
|
|
7
7
|
from udata.core.dataset.models import Dataset
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
@pytest.mark.frontend
|
|
11
|
-
@pytest.mark.usefixtures(
|
|
11
|
+
@pytest.mark.usefixtures("clean_db")
|
|
12
12
|
class DatasetCSVAdapterTest:
|
|
13
|
-
|
|
14
13
|
def test_resources_csv_adapter(self):
|
|
15
14
|
date_created = datetime(2022, 12, 31)
|
|
16
15
|
date_modified = date_created + timedelta(days=1)
|
|
17
16
|
another_date = date_created + timedelta(days=42)
|
|
18
17
|
dataset = DatasetFactory(
|
|
19
|
-
resources=[
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
resources=[
|
|
19
|
+
ResourceFactory(
|
|
20
|
+
harvest={
|
|
21
|
+
"created_at": date_created,
|
|
22
|
+
"modified_at": date_modified,
|
|
23
|
+
"uri": "http://domain.gouv.fr/dataset/uri",
|
|
24
|
+
}
|
|
25
|
+
)
|
|
26
|
+
],
|
|
24
27
|
harvest={
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
"domain": "example.com",
|
|
29
|
+
"backend": "dummy_backend",
|
|
30
|
+
"modified_at": another_date,
|
|
31
|
+
"created_at": another_date,
|
|
29
32
|
},
|
|
30
33
|
)
|
|
31
34
|
DatasetFactory(resources=[ResourceFactory()])
|
|
@@ -44,37 +47,43 @@ class DatasetCSVAdapterTest:
|
|
|
44
47
|
date_modified = date_created + timedelta(days=1)
|
|
45
48
|
harvest_dataset = DatasetFactory(
|
|
46
49
|
harvest={
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
50
|
+
"domain": "example.com",
|
|
51
|
+
"backend": "dummy_backend",
|
|
52
|
+
"modified_at": date_modified,
|
|
53
|
+
"created_at": date_created,
|
|
51
54
|
},
|
|
52
55
|
)
|
|
53
|
-
resources_dataset = DatasetFactory(
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
56
|
+
resources_dataset = DatasetFactory(
|
|
57
|
+
resources=[
|
|
58
|
+
ResourceFactory(
|
|
59
|
+
metrics={
|
|
60
|
+
"views": 42,
|
|
61
|
+
}
|
|
62
|
+
),
|
|
63
|
+
ResourceFactory(
|
|
64
|
+
metrics={
|
|
65
|
+
"views": 1337,
|
|
66
|
+
}
|
|
67
|
+
),
|
|
68
|
+
ResourceFactory(),
|
|
69
|
+
]
|
|
70
|
+
)
|
|
62
71
|
adapter = DatasetCsvAdapter(Dataset.objects.all())
|
|
63
72
|
|
|
64
73
|
# Build a dict (Dataset ID to dict of header name to value) from the CSV values and headers to simplify testing below.
|
|
65
74
|
csv = {}
|
|
66
75
|
for row in adapter.rows():
|
|
67
76
|
values = dict(zip(adapter.header(), row))
|
|
68
|
-
csv[values[
|
|
77
|
+
csv[values["id"]] = values
|
|
69
78
|
|
|
70
79
|
harvest_dataset_values = csv[str(harvest_dataset.id)]
|
|
71
|
-
assert harvest_dataset_values[
|
|
72
|
-
assert harvest_dataset_values[
|
|
73
|
-
assert harvest_dataset_values[
|
|
74
|
-
assert harvest_dataset_values[
|
|
75
|
-
assert harvest_dataset_values[
|
|
76
|
-
assert harvest_dataset_values[
|
|
77
|
-
|
|
80
|
+
assert harvest_dataset_values["harvest.created_at"] == date_created.isoformat()
|
|
81
|
+
assert harvest_dataset_values["harvest.modified_at"] == date_modified.isoformat()
|
|
82
|
+
assert harvest_dataset_values["harvest.backend"] == "dummy_backend"
|
|
83
|
+
assert harvest_dataset_values["harvest.domain"] == "example.com"
|
|
84
|
+
assert harvest_dataset_values["resources_count"] == 0
|
|
85
|
+
assert harvest_dataset_values["downloads"] == 0
|
|
86
|
+
|
|
78
87
|
resources_dataset_values = csv[str(resources_dataset.id)]
|
|
79
|
-
assert resources_dataset_values[
|
|
80
|
-
assert resources_dataset_values[
|
|
88
|
+
assert resources_dataset_values["resources_count"] == 3
|
|
89
|
+
assert resources_dataset_values["downloads"] == 1337 + 42
|
|
@@ -6,12 +6,11 @@ from udata.core.discussions.models import Discussion
|
|
|
6
6
|
from udata.core.user.factories import UserFactory
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
@pytest.mark.usefixtures(
|
|
9
|
+
@pytest.mark.usefixtures("clean_db")
|
|
10
10
|
class DatasetActionsTest:
|
|
11
|
-
|
|
12
11
|
def test_dataset_archive(self, app):
|
|
13
12
|
user = UserFactory()
|
|
14
|
-
app.config[
|
|
13
|
+
app.config["ARCHIVE_COMMENT_USER_ID"] = user.id
|
|
15
14
|
|
|
16
15
|
dataset = DatasetFactory()
|
|
17
16
|
|
|
@@ -1,17 +1,16 @@
|
|
|
1
|
-
import pytest
|
|
2
|
-
|
|
3
1
|
from tempfile import NamedTemporaryFile
|
|
4
2
|
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
5
|
from udata.core.dataset.factories import DatasetFactory
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
@pytest.mark.usefixtures(
|
|
8
|
+
@pytest.mark.usefixtures("clean_db")
|
|
9
9
|
class DatasetCommandTest:
|
|
10
|
-
|
|
11
10
|
def test_dataset_archive_one(self, cli):
|
|
12
11
|
dataset = DatasetFactory()
|
|
13
12
|
|
|
14
|
-
cli(
|
|
13
|
+
cli("dataset", "archive-one", str(dataset.id))
|
|
15
14
|
|
|
16
15
|
dataset.reload()
|
|
17
16
|
assert dataset.archived is not None
|
|
@@ -19,11 +18,11 @@ class DatasetCommandTest:
|
|
|
19
18
|
def test_dataset_archive(self, cli):
|
|
20
19
|
datasets = [DatasetFactory() for _ in range(2)]
|
|
21
20
|
|
|
22
|
-
with NamedTemporaryFile(mode=
|
|
23
|
-
temp.write(
|
|
21
|
+
with NamedTemporaryFile(mode="w", encoding="utf8") as temp:
|
|
22
|
+
temp.write("\n".join((str(d.id) for d in datasets)))
|
|
24
23
|
temp.flush()
|
|
25
24
|
|
|
26
|
-
cli(
|
|
25
|
+
cli("dataset", "archive", temp.name)
|
|
27
26
|
|
|
28
27
|
for dataset in datasets:
|
|
29
28
|
dataset.reload()
|
|
@@ -1,75 +1,82 @@
|
|
|
1
|
-
from flask import current_app
|
|
2
|
-
import pytest
|
|
3
1
|
from unittest.mock import patch
|
|
4
|
-
from udata.core.dataset.models import Schema
|
|
5
2
|
|
|
3
|
+
import pytest
|
|
4
|
+
from flask import current_app
|
|
5
|
+
from requests.compat import json as complexjson
|
|
6
|
+
|
|
7
|
+
from udata.core.dataset.events import serialize_resource_for_event
|
|
8
|
+
from udata.core.dataset.factories import DatasetFactory, ResourceFactory
|
|
9
|
+
from udata.core.dataset.models import Schema
|
|
6
10
|
from udata.models import Dataset
|
|
7
11
|
from udata.tests.helpers import assert_emit
|
|
8
|
-
from udata.core.dataset.events import serialize_resource_for_event
|
|
9
|
-
from udata.core.dataset.factories import ResourceFactory, DatasetFactory
|
|
10
|
-
from requests.compat import json as complexjson
|
|
11
12
|
|
|
12
|
-
@pytest.mark.usefixtures('clean_db')
|
|
13
|
-
@pytest.mark.usefixtures('enable_resource_event')
|
|
14
|
-
class DatasetEventsTest:
|
|
15
13
|
|
|
16
|
-
|
|
14
|
+
@pytest.mark.usefixtures("clean_db")
|
|
15
|
+
@pytest.mark.usefixtures("enable_resource_event")
|
|
16
|
+
class DatasetEventsTest:
|
|
17
|
+
@patch("requests.post")
|
|
17
18
|
def test_publish_message_resource_created(self, mock_req):
|
|
18
19
|
dataset = DatasetFactory()
|
|
19
20
|
resource = ResourceFactory()
|
|
20
21
|
expected_signals = (Dataset.on_resource_added,)
|
|
21
22
|
|
|
22
23
|
expected_value = {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
"resource_id": str(resource.id),
|
|
25
|
+
"dataset_id": str(dataset.id),
|
|
26
|
+
"document": serialize_resource_for_event(resource),
|
|
26
27
|
}
|
|
27
28
|
|
|
28
29
|
with assert_emit(*expected_signals):
|
|
29
30
|
dataset.add_resource(resource)
|
|
30
31
|
|
|
31
|
-
mock_req.assert_called_with(
|
|
32
|
-
|
|
32
|
+
mock_req.assert_called_with(
|
|
33
|
+
f"{current_app.config['RESOURCES_ANALYSER_URI']}/api/resource/created/",
|
|
34
|
+
json=expected_value,
|
|
35
|
+
)
|
|
33
36
|
|
|
34
|
-
@patch(
|
|
37
|
+
@patch("requests.post")
|
|
35
38
|
def test_publish_message_resource_modified(self, mock_req):
|
|
36
39
|
resource = ResourceFactory(schema=Schema(url="http://localhost/my-schema"))
|
|
37
40
|
dataset = DatasetFactory(resources=[resource])
|
|
38
41
|
expected_signals = (Dataset.on_resource_updated,)
|
|
39
42
|
|
|
40
|
-
resource.description =
|
|
43
|
+
resource.description = "New description"
|
|
41
44
|
|
|
42
45
|
expected_value = {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
"resource_id": str(resource.id),
|
|
47
|
+
"dataset_id": str(dataset.id),
|
|
48
|
+
"document": serialize_resource_for_event(resource),
|
|
46
49
|
}
|
|
47
50
|
|
|
48
51
|
with assert_emit(*expected_signals):
|
|
49
52
|
dataset.update_resource(resource)
|
|
50
53
|
|
|
51
|
-
mock_req.assert_called_with(
|
|
52
|
-
|
|
53
|
-
|
|
54
|
+
mock_req.assert_called_with(
|
|
55
|
+
f"{current_app.config['RESOURCES_ANALYSER_URI']}/api/resource/updated/",
|
|
56
|
+
json=expected_value,
|
|
57
|
+
)
|
|
58
|
+
|
|
54
59
|
# Mocking requests call doesn't call the JSON encoder
|
|
55
60
|
# so calling it manually here to prevent encoding errors.
|
|
56
61
|
# (for example, encoding Embeds fails)
|
|
57
62
|
complexjson.dumps(expected_value)
|
|
58
63
|
|
|
59
|
-
@patch(
|
|
64
|
+
@patch("requests.post")
|
|
60
65
|
def test_publish_message_resource_removed(self, mock_req):
|
|
61
66
|
resource = ResourceFactory()
|
|
62
67
|
dataset = DatasetFactory(resources=[resource])
|
|
63
68
|
expected_signals = (Dataset.on_resource_removed,)
|
|
64
69
|
|
|
65
70
|
expected_value = {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
71
|
+
"resource_id": str(resource.id),
|
|
72
|
+
"dataset_id": str(dataset.id),
|
|
73
|
+
"document": None,
|
|
69
74
|
}
|
|
70
75
|
|
|
71
76
|
with assert_emit(*expected_signals):
|
|
72
77
|
dataset.remove_resource(resource)
|
|
73
78
|
|
|
74
|
-
mock_req.assert_called_with(
|
|
75
|
-
|
|
79
|
+
mock_req.assert_called_with(
|
|
80
|
+
f"{current_app.config['RESOURCES_ANALYSER_URI']}/api/resource/deleted/",
|
|
81
|
+
json=expected_value,
|
|
82
|
+
)
|