udata 9.1.2.dev30355__py2.py3-none-any.whl → 9.1.2.dev30382__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 +135 -124
- 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 +56 -54
- 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/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/static/chunks/{11.e9b9ca1f3e03d4020377.js → 11.52e531c19f8de80c00cf.js} +3 -3
- udata/static/chunks/{11.e9b9ca1f3e03d4020377.js.map → 11.52e531c19f8de80c00cf.js.map} +1 -1
- udata/static/chunks/{13.038c0d9aa0dfa0181c4b.js → 13.c3343a7f1070061c0e10.js} +2 -2
- udata/static/chunks/{13.038c0d9aa0dfa0181c4b.js.map → 13.c3343a7f1070061c0e10.js.map} +1 -1
- udata/static/chunks/{16.0baa2b64a74a2dcde25c.js → 16.8fa42440ad75ca172e6d.js} +2 -2
- udata/static/chunks/{16.0baa2b64a74a2dcde25c.js.map → 16.8fa42440ad75ca172e6d.js.map} +1 -1
- udata/static/chunks/{19.350a9f150b074b4ecefa.js → 19.9c6c8412729cd6d59cfa.js} +3 -3
- udata/static/chunks/{19.350a9f150b074b4ecefa.js.map → 19.9c6c8412729cd6d59cfa.js.map} +1 -1
- udata/static/chunks/{5.6ebbce2b9b3e696d3da5.js → 5.71d15c2e4f21feee2a9a.js} +3 -3
- udata/static/chunks/{5.6ebbce2b9b3e696d3da5.js.map → 5.71d15c2e4f21feee2a9a.js.map} +1 -1
- udata/static/chunks/{6.d8a5f7b017bcbd083641.js → 6.9139dc098b8ea640b890.js} +3 -3
- udata/static/chunks/{6.d8a5f7b017bcbd083641.js.map → 6.9139dc098b8ea640b890.js.map} +1 -1
- udata/static/common.js +1 -1
- udata/static/common.js.map +1 -1
- 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 +5 -6
- udata/tests/api/test_auth_api.py +395 -321
- udata/tests/api/test_base_api.py +31 -33
- 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 +76 -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_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.dev30382.dist-info}/METADATA +3 -2
- udata-9.1.2.dev30382.dist-info/RECORD +704 -0
- udata-9.1.2.dev30355.dist-info/RECORD +0 -704
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/LICENSE +0 -0
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/WHEEL +0 -0
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/entry_points.txt +0 -0
- {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/top_level.txt +0 -0
udata/tests/helpers.py
CHANGED
|
@@ -1,37 +1,32 @@
|
|
|
1
|
-
import mock
|
|
2
1
|
import os
|
|
3
|
-
|
|
2
|
+
from contextlib import contextmanager
|
|
3
|
+
from datetime import timedelta
|
|
4
4
|
from io import BytesIO
|
|
5
|
+
from urllib.parse import parse_qs, urljoin, urlparse
|
|
5
6
|
|
|
7
|
+
import mock
|
|
8
|
+
from flask import current_app, json, request, url_for
|
|
9
|
+
from flask_security.babel import FsDomain
|
|
6
10
|
from PIL import Image
|
|
7
11
|
|
|
8
12
|
from udata.mail import mail_sent
|
|
9
13
|
|
|
10
|
-
from contextlib import contextmanager
|
|
11
|
-
from datetime import timedelta
|
|
12
|
-
from urllib.parse import urljoin, urlparse, parse_qs
|
|
13
|
-
|
|
14
|
-
from flask import request, url_for, json, current_app
|
|
15
|
-
from flask_security.babel import FsDomain
|
|
16
|
-
|
|
17
14
|
|
|
18
15
|
def assert_equal_dates(datetime1, datetime2, limit=1): # Seconds.
|
|
19
16
|
"""Lax date comparison, avoid comparing milliseconds and seconds."""
|
|
20
17
|
__tracebackhide__ = True
|
|
21
|
-
delta =
|
|
18
|
+
delta = datetime1 - datetime2
|
|
22
19
|
assert timedelta(seconds=-limit) <= delta <= timedelta(seconds=limit)
|
|
23
20
|
|
|
24
21
|
|
|
25
22
|
def assert_starts_with(haystack, needle):
|
|
26
23
|
__tracebackhide__ = True
|
|
27
|
-
msg =
|
|
28
|
-
haystack=haystack, needle=needle
|
|
29
|
-
)
|
|
24
|
+
msg = "{haystack} does not start with {needle}".format(haystack=haystack, needle=needle)
|
|
30
25
|
assert haystack.startswith(needle), msg
|
|
31
26
|
|
|
32
27
|
|
|
33
28
|
def assert_json_equal(first, second):
|
|
34
|
-
|
|
29
|
+
"""Ensure two dict produce the same JSON"""
|
|
35
30
|
__tracebackhide__ = True
|
|
36
31
|
json1 = json.loads(json.dumps(first))
|
|
37
32
|
json2 = json.loads(json.dumps(second))
|
|
@@ -55,12 +50,12 @@ def mock_signals(callback, *signals):
|
|
|
55
50
|
|
|
56
51
|
for signal, mock_handler in specs:
|
|
57
52
|
signal.disconnect(mock_handler)
|
|
58
|
-
signal_name = getattr(signal,
|
|
53
|
+
signal_name = getattr(signal, "name", str(signal))
|
|
59
54
|
callback(signal_name, mock_handler)
|
|
60
55
|
|
|
61
56
|
|
|
62
57
|
@contextmanager
|
|
63
|
-
def assert_emit(*signals, assertions_callback
|
|
58
|
+
def assert_emit(*signals, assertions_callback=None):
|
|
64
59
|
__tracebackhide__ = True
|
|
65
60
|
msg = 'Signal "{0}" should have been emitted'
|
|
66
61
|
|
|
@@ -100,8 +95,8 @@ def capture_mails():
|
|
|
100
95
|
|
|
101
96
|
|
|
102
97
|
REDIRECT_CODES = (301, 302, 303, 305, 307, 308)
|
|
103
|
-
REDIRECT_MSG =
|
|
104
|
-
|
|
98
|
+
REDIRECT_MSG = "HTTP Status {} expected but got {{}}".format(
|
|
99
|
+
", ".join(str(code) for code in REDIRECT_CODES)
|
|
105
100
|
)
|
|
106
101
|
|
|
107
102
|
|
|
@@ -132,12 +127,11 @@ def assert_status(response, status_code, message=None):
|
|
|
132
127
|
"""
|
|
133
128
|
__tracebackhide__ = True
|
|
134
129
|
|
|
135
|
-
message = message or
|
|
136
|
-
|
|
137
|
-
if response.mimetype == 'application/json':
|
|
130
|
+
message = message or "HTTP Status %s expected but got %s" % (status_code, response.status_code)
|
|
131
|
+
if response.mimetype == "application/json":
|
|
138
132
|
try:
|
|
139
|
-
second_line =
|
|
140
|
-
message =
|
|
133
|
+
second_line = "Response content is {0}".format(response.json)
|
|
134
|
+
message = "\n".join((message, second_line))
|
|
141
135
|
except Exception:
|
|
142
136
|
pass
|
|
143
137
|
assert response.status_code == status_code, message
|
|
@@ -189,18 +183,18 @@ def assert500(response):
|
|
|
189
183
|
|
|
190
184
|
|
|
191
185
|
def full_url(*args, **kwargs):
|
|
192
|
-
|
|
186
|
+
"""Build a full URL"""
|
|
193
187
|
return urljoin(request.url_root, url_for(*args, **kwargs))
|
|
194
188
|
|
|
195
189
|
|
|
196
190
|
def data_path(filename):
|
|
197
|
-
|
|
198
|
-
return os.path.join(os.path.dirname(__file__),
|
|
191
|
+
"""Get a test data path"""
|
|
192
|
+
return os.path.join(os.path.dirname(__file__), "data", filename)
|
|
199
193
|
|
|
200
194
|
|
|
201
195
|
def assert_command_ok(result):
|
|
202
196
|
__tracebackhide__ = True
|
|
203
|
-
msg =
|
|
197
|
+
msg = "Command failed with exit code {0.exit_code} and output:\n{0.output}"
|
|
204
198
|
assert result.exit_code == 0, msg.format(result)
|
|
205
199
|
|
|
206
200
|
|
|
@@ -208,28 +202,29 @@ def assert_urls_equal(url1, url2):
|
|
|
208
202
|
__tracebackhide__ = True
|
|
209
203
|
p1 = urlparse(url1)
|
|
210
204
|
p2 = urlparse(url2)
|
|
211
|
-
assert p1.scheme == p2.scheme,
|
|
212
|
-
assert p1.netloc == p2.netloc,
|
|
213
|
-
assert p1.path == p2.path,
|
|
205
|
+
assert p1.scheme == p2.scheme, "Scheme does not match"
|
|
206
|
+
assert p1.netloc == p2.netloc, "Network location does not match"
|
|
207
|
+
assert p1.path == p2.path, "Path does not match"
|
|
214
208
|
q1 = parse_qs(p1.query)
|
|
215
209
|
q2 = parse_qs(p2.query)
|
|
216
|
-
assert q1 == q2,
|
|
217
|
-
assert p1.fragment == p2.fragment,
|
|
210
|
+
assert q1 == q2, "Query does not match"
|
|
211
|
+
assert p1.fragment == p2.fragment, "Fragment does not match"
|
|
218
212
|
|
|
219
213
|
|
|
220
214
|
def assert_cors(response):
|
|
221
|
-
|
|
215
|
+
"""CORS headers presence assertion"""
|
|
222
216
|
__tracebackhide__ = True
|
|
223
|
-
assert
|
|
217
|
+
assert "Access-Control-Allow-Origin" in response.headers
|
|
224
218
|
|
|
225
219
|
|
|
226
220
|
def create_test_image():
|
|
227
221
|
file = BytesIO()
|
|
228
|
-
image = Image.new(
|
|
229
|
-
image.save(file,
|
|
230
|
-
file.name =
|
|
222
|
+
image = Image.new("RGBA", size=(50, 50), color=(155, 0, 0))
|
|
223
|
+
image.save(file, "png")
|
|
224
|
+
file.name = "test.png"
|
|
231
225
|
file.seek(0)
|
|
232
226
|
return file
|
|
233
227
|
|
|
228
|
+
|
|
234
229
|
def security_gettext(string):
|
|
235
230
|
return FsDomain(current_app).gettext(string)
|
udata/tests/models.py
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
from __future__ import unicode_literals
|
|
3
3
|
|
|
4
|
-
from udata.models import
|
|
4
|
+
from udata.models import WithMetrics, db
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class FakeModel(WithMetrics, db.Document):
|
|
8
8
|
name = db.StringField()
|
|
9
9
|
|
|
10
10
|
def __unicode__(self):
|
|
11
|
-
return self.name or
|
|
11
|
+
return self.name or ""
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
|
|
2
1
|
import pytest
|
|
3
2
|
|
|
4
|
-
from udata.core.dataset.csv import
|
|
3
|
+
from udata.core.dataset.csv import DatasetCsvAdapter, ResourcesCsvAdapter
|
|
5
4
|
from udata.core.dataset.factories import DatasetFactory, ResourceFactory
|
|
6
5
|
from udata.core.dataset.models import Dataset
|
|
7
6
|
from udata.core.organization.csv import OrganizationCsvAdapter
|
|
@@ -10,22 +9,28 @@ from udata.core.organization.models import Organization
|
|
|
10
9
|
|
|
11
10
|
|
|
12
11
|
@pytest.mark.frontend
|
|
13
|
-
@pytest.mark.usefixtures(
|
|
12
|
+
@pytest.mark.usefixtures("clean_db")
|
|
14
13
|
class OrganizationCSVAdapterTest:
|
|
15
|
-
|
|
16
14
|
def test_organization_downloads_counts(self):
|
|
17
15
|
org_with_dataset = OrganizationFactory()
|
|
18
16
|
org_without_dataset = OrganizationFactory()
|
|
19
17
|
|
|
20
|
-
DatasetFactory(
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
18
|
+
DatasetFactory(
|
|
19
|
+
organization=org_with_dataset,
|
|
20
|
+
resources=[
|
|
21
|
+
ResourceFactory(
|
|
22
|
+
metrics={
|
|
23
|
+
"views": 42,
|
|
24
|
+
}
|
|
25
|
+
),
|
|
26
|
+
ResourceFactory(
|
|
27
|
+
metrics={
|
|
28
|
+
"views": 1337,
|
|
29
|
+
}
|
|
30
|
+
),
|
|
31
|
+
ResourceFactory(),
|
|
32
|
+
],
|
|
33
|
+
)
|
|
29
34
|
DatasetFactory(organization=org_with_dataset, resources=[])
|
|
30
35
|
adapter = OrganizationCsvAdapter(Organization.objects.all())
|
|
31
36
|
|
|
@@ -33,10 +38,10 @@ class OrganizationCSVAdapterTest:
|
|
|
33
38
|
csv = {}
|
|
34
39
|
for row in adapter.rows():
|
|
35
40
|
values = dict(zip(adapter.header(), row))
|
|
36
|
-
csv[values[
|
|
41
|
+
csv[values["id"]] = values
|
|
37
42
|
|
|
38
43
|
org_values = csv[str(org_with_dataset.id)]
|
|
39
|
-
assert org_values[
|
|
44
|
+
assert org_values["downloads"] == 1337 + 42
|
|
40
45
|
|
|
41
46
|
org_values = csv[str(org_without_dataset.id)]
|
|
42
|
-
assert org_values[
|
|
47
|
+
assert org_values["downloads"] == 0
|
|
@@ -1,27 +1,20 @@
|
|
|
1
1
|
import pytest
|
|
2
2
|
|
|
3
|
-
from udata.models import MembershipRequest, Member
|
|
4
|
-
|
|
5
|
-
from udata.core.user.factories import UserFactory
|
|
6
3
|
from udata.core.organization.factories import OrganizationFactory
|
|
7
|
-
from udata.core.organization.notifications import
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
from udata.core.organization.notifications import membership_request_notifications
|
|
5
|
+
from udata.core.user.factories import UserFactory
|
|
6
|
+
from udata.models import Member, MembershipRequest
|
|
11
7
|
from udata.tests.helpers import assert_equal_dates
|
|
12
8
|
|
|
13
9
|
|
|
14
|
-
@pytest.mark.usefixtures(
|
|
10
|
+
@pytest.mark.usefixtures("clean_db")
|
|
15
11
|
class OrganizationNotificationsTest:
|
|
16
12
|
def test_pending_membership_requests(self):
|
|
17
13
|
admin = UserFactory()
|
|
18
14
|
editor = UserFactory()
|
|
19
15
|
applicant = UserFactory()
|
|
20
|
-
request = MembershipRequest(user=applicant, comment=
|
|
21
|
-
members = [
|
|
22
|
-
Member(user=editor, role='editor'),
|
|
23
|
-
Member(user=admin, role='admin')
|
|
24
|
-
]
|
|
16
|
+
request = MembershipRequest(user=applicant, comment="test")
|
|
17
|
+
members = [Member(user=editor, role="editor"), Member(user=admin, role="admin")]
|
|
25
18
|
org = OrganizationFactory(members=members, requests=[request])
|
|
26
19
|
|
|
27
20
|
assert len(membership_request_notifications(applicant)) is 0
|
|
@@ -31,8 +24,8 @@ class OrganizationNotificationsTest:
|
|
|
31
24
|
assert len(notifications) is 1
|
|
32
25
|
dt, details = notifications[0]
|
|
33
26
|
assert_equal_dates(dt, request.created)
|
|
34
|
-
assert details[
|
|
35
|
-
assert details[
|
|
36
|
-
assert details[
|
|
37
|
-
assert details[
|
|
38
|
-
assert details[
|
|
27
|
+
assert details["id"] == request.id
|
|
28
|
+
assert details["organization"] == org.id
|
|
29
|
+
assert details["user"]["id"] == applicant.id
|
|
30
|
+
assert details["user"]["fullname"] == applicant.fullname
|
|
31
|
+
assert details["user"]["avatar"] == str(applicant.avatar)
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
from datetime import datetime
|
|
2
2
|
|
|
3
3
|
from udata.core.dataset.factories import DatasetFactory, HiddenDatasetFactory
|
|
4
|
-
from udata.core.organization.factories import OrganizationFactory
|
|
5
4
|
from udata.core.followers.signals import on_follow, on_unfollow
|
|
5
|
+
from udata.core.organization.factories import OrganizationFactory
|
|
6
6
|
from udata.core.reuse.factories import ReuseFactory, VisibleReuseFactory
|
|
7
7
|
from udata.core.user.factories import UserFactory
|
|
8
|
-
from udata.models import Dataset,
|
|
8
|
+
from udata.models import Dataset, Follow, Member, Reuse
|
|
9
9
|
from udata.tests.helpers import assert_emit
|
|
10
10
|
|
|
11
|
-
from .. import
|
|
11
|
+
from .. import DBTestMixin, TestCase
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class OrganizationModelTest(TestCase, DBTestMixin):
|
|
15
|
-
|
|
16
15
|
# Load metrics
|
|
17
16
|
import udata.core.organization.metrics # noqa
|
|
18
17
|
import udata.core.followers.metrics # noqa
|
|
@@ -20,7 +19,7 @@ class OrganizationModelTest(TestCase, DBTestMixin):
|
|
|
20
19
|
def test_organization_metrics(self):
|
|
21
20
|
# Members count update are in API calls, thus being tested in API dedicated tests
|
|
22
21
|
|
|
23
|
-
member = Member(user=UserFactory(), role=
|
|
22
|
+
member = Member(user=UserFactory(), role="admin")
|
|
24
23
|
org = OrganizationFactory(members=[member])
|
|
25
24
|
|
|
26
25
|
with assert_emit(Reuse.on_create):
|
|
@@ -30,12 +29,13 @@ class OrganizationModelTest(TestCase, DBTestMixin):
|
|
|
30
29
|
dataset = DatasetFactory(organization=org)
|
|
31
30
|
HiddenDatasetFactory(organization=org)
|
|
32
31
|
with assert_emit(on_follow):
|
|
33
|
-
follow = Follow.objects.create(
|
|
34
|
-
|
|
32
|
+
follow = Follow.objects.create(
|
|
33
|
+
following=org, follower=UserFactory(), since=datetime.utcnow()
|
|
34
|
+
)
|
|
35
35
|
|
|
36
|
-
assert org.get_metrics()[
|
|
37
|
-
assert org.get_metrics()[
|
|
38
|
-
assert org.get_metrics()[
|
|
36
|
+
assert org.get_metrics()["datasets"] == 1
|
|
37
|
+
assert org.get_metrics()["reuses"] == 1
|
|
38
|
+
assert org.get_metrics()["followers"] == 1
|
|
39
39
|
|
|
40
40
|
with assert_emit(Reuse.on_delete):
|
|
41
41
|
reuse.deleted = datetime.utcnow()
|
|
@@ -47,6 +47,6 @@ class OrganizationModelTest(TestCase, DBTestMixin):
|
|
|
47
47
|
follow.until = datetime.utcnow()
|
|
48
48
|
follow.save()
|
|
49
49
|
|
|
50
|
-
assert org.get_metrics()[
|
|
51
|
-
assert org.get_metrics()[
|
|
52
|
-
assert org.get_metrics()[
|
|
50
|
+
assert org.get_metrics()["datasets"] == 0
|
|
51
|
+
assert org.get_metrics()["reuses"] == 0
|
|
52
|
+
assert org.get_metrics()["followers"] == 0
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
from flask import url_for
|
|
2
|
-
|
|
3
|
-
from rdflib import
|
|
4
|
-
from rdflib.namespace import RDF, FOAF, RDFS
|
|
2
|
+
from rdflib import BNode, Literal, URIRef
|
|
3
|
+
from rdflib.namespace import FOAF, RDF, RDFS
|
|
5
4
|
from rdflib.resource import Resource as RdfResource
|
|
6
5
|
|
|
7
6
|
from udata import api
|
|
8
|
-
from udata.rdf import DCAT, DCT, HYDRA
|
|
9
|
-
from udata.tests import TestCase, DBTestMixin
|
|
10
|
-
from udata.core.organization.factories import OrganizationFactory
|
|
11
|
-
from udata.core.organization.rdf import organization_to_rdf, build_org_catalog
|
|
12
7
|
from udata.core.dataset.factories import DatasetFactory
|
|
13
8
|
from udata.core.dataset.models import Dataset
|
|
9
|
+
from udata.core.organization.factories import OrganizationFactory
|
|
10
|
+
from udata.core.organization.rdf import build_org_catalog, organization_to_rdf
|
|
11
|
+
from udata.rdf import DCAT, DCT, HYDRA
|
|
12
|
+
from udata.tests import DBTestMixin, TestCase
|
|
14
13
|
from udata.utils import faker
|
|
15
14
|
|
|
16
15
|
|
|
@@ -36,9 +35,7 @@ class OrganizationToRdfTest(DBTestMixin, TestCase):
|
|
|
36
35
|
|
|
37
36
|
def test_all_fields(self):
|
|
38
37
|
org = OrganizationFactory(url=faker.uri())
|
|
39
|
-
org_url = url_for(
|
|
40
|
-
org=org.id,
|
|
41
|
-
_external=True)
|
|
38
|
+
org_url = url_for("api.organization", org=org.id, _external=True)
|
|
42
39
|
o = organization_to_rdf(org)
|
|
43
40
|
g = o.graph
|
|
44
41
|
|
|
@@ -55,7 +52,7 @@ class OrganizationToRdfTest(DBTestMixin, TestCase):
|
|
|
55
52
|
|
|
56
53
|
def test_catalog(self):
|
|
57
54
|
origin_org = OrganizationFactory()
|
|
58
|
-
uri = url_for(
|
|
55
|
+
uri = url_for("api.organization_rdf", org=origin_org.id, _external=True)
|
|
59
56
|
|
|
60
57
|
datasets = DatasetFactory.create_batch(3, organization=origin_org)
|
|
61
58
|
catalog = build_org_catalog(origin_org, datasets)
|
|
@@ -88,16 +85,28 @@ class OrganizationToRdfTest(DBTestMixin, TestCase):
|
|
|
88
85
|
origin_org = OrganizationFactory()
|
|
89
86
|
page_size = 3
|
|
90
87
|
total = 4
|
|
91
|
-
uri = url_for(
|
|
92
|
-
uri_first = url_for(
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
88
|
+
uri = url_for("api.organization_rdf", org=origin_org.id, _external=True)
|
|
89
|
+
uri_first = url_for(
|
|
90
|
+
"api.organization_rdf_format",
|
|
91
|
+
org=origin_org.id,
|
|
92
|
+
format="json",
|
|
93
|
+
page=1,
|
|
94
|
+
page_size=page_size,
|
|
95
|
+
_external=True,
|
|
96
|
+
)
|
|
97
|
+
uri_last = url_for(
|
|
98
|
+
"api.organization_rdf_format",
|
|
99
|
+
org=origin_org.id,
|
|
100
|
+
format="json",
|
|
101
|
+
page=2,
|
|
102
|
+
page_size=page_size,
|
|
103
|
+
_external=True,
|
|
104
|
+
)
|
|
96
105
|
DatasetFactory.create_batch(total, organization=origin_org)
|
|
97
106
|
|
|
98
107
|
# First page
|
|
99
108
|
datasets = Dataset.objects.paginate(1, page_size)
|
|
100
|
-
catalog = build_org_catalog(origin_org, datasets, format=
|
|
109
|
+
catalog = build_org_catalog(origin_org, datasets, format="json")
|
|
101
110
|
graph = catalog.graph
|
|
102
111
|
|
|
103
112
|
self.assertIsInstance(catalog, RdfResource)
|
|
@@ -110,8 +119,7 @@ class OrganizationToRdfTest(DBTestMixin, TestCase):
|
|
|
110
119
|
|
|
111
120
|
self.assertEqual(len(list(catalog.objects(DCAT.dataset))), page_size)
|
|
112
121
|
|
|
113
|
-
paginations = list(graph.subjects(RDF.type,
|
|
114
|
-
HYDRA.PartialCollectionView))
|
|
122
|
+
paginations = list(graph.subjects(RDF.type, HYDRA.PartialCollectionView))
|
|
115
123
|
self.assertEqual(len(paginations), 1)
|
|
116
124
|
pagination = graph.resource(paginations[0])
|
|
117
125
|
self.assertEqual(pagination.identifier, URIRef(uri_first))
|
|
@@ -122,7 +130,7 @@ class OrganizationToRdfTest(DBTestMixin, TestCase):
|
|
|
122
130
|
|
|
123
131
|
# Second page
|
|
124
132
|
datasets = Dataset.objects.paginate(2, page_size)
|
|
125
|
-
catalog = build_org_catalog(origin_org, datasets, format=
|
|
133
|
+
catalog = build_org_catalog(origin_org, datasets, format="json")
|
|
126
134
|
graph = catalog.graph
|
|
127
135
|
|
|
128
136
|
self.assertIsInstance(catalog, RdfResource)
|
|
@@ -135,8 +143,7 @@ class OrganizationToRdfTest(DBTestMixin, TestCase):
|
|
|
135
143
|
|
|
136
144
|
self.assertEqual(len(list(catalog.objects(DCAT.dataset))), 1)
|
|
137
145
|
|
|
138
|
-
paginations = list(graph.subjects(RDF.type,
|
|
139
|
-
HYDRA.PartialCollectionView))
|
|
146
|
+
paginations = list(graph.subjects(RDF.type, HYDRA.PartialCollectionView))
|
|
140
147
|
self.assertEqual(len(paginations), 1)
|
|
141
148
|
pagination = graph.resource(paginations[0])
|
|
142
149
|
self.assertEqual(pagination.identifier, URIRef(uri_last))
|
|
@@ -3,9 +3,9 @@ from flask import url_for
|
|
|
3
3
|
from udata.api.oauth2 import OAuth2Client
|
|
4
4
|
from udata.core import storages
|
|
5
5
|
from udata.core.dataset.factories import DatasetFactory, ResourceFactory
|
|
6
|
-
from udata.core.user.factories import AdminFactory
|
|
7
6
|
from udata.core.organization import tasks
|
|
8
|
-
from udata.
|
|
7
|
+
from udata.core.user.factories import AdminFactory
|
|
8
|
+
from udata.models import ContactPoint, Dataset, Member, Organization, Transfer
|
|
9
9
|
from udata.tests.api import APITestCase
|
|
10
10
|
from udata.tests.helpers import create_test_image
|
|
11
11
|
|
|
@@ -13,14 +13,14 @@ from udata.tests.helpers import create_test_image
|
|
|
13
13
|
class OrganizationTasksTest(APITestCase):
|
|
14
14
|
def test_purge_organizations(self):
|
|
15
15
|
self.login()
|
|
16
|
-
member = Member(user=self.user, role=
|
|
17
|
-
org = Organization.objects.create(name=
|
|
16
|
+
member = Member(user=self.user, role="admin")
|
|
17
|
+
org = Organization.objects.create(name="delete me", description="XXX", members=[member])
|
|
18
18
|
data = {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
"email": "mooneywayne@cobb-cochran.com",
|
|
20
|
+
"name": "Martin Schultz",
|
|
21
|
+
"organization": str(org.id),
|
|
22
22
|
}
|
|
23
|
-
response = self.post(url_for(
|
|
23
|
+
response = self.post(url_for("api.contact_points"), data)
|
|
24
24
|
self.assert201(response)
|
|
25
25
|
|
|
26
26
|
self.assertEqual(ContactPoint.objects().count(), 1)
|
|
@@ -33,33 +33,32 @@ class OrganizationTasksTest(APITestCase):
|
|
|
33
33
|
user = AdminFactory()
|
|
34
34
|
self.login(user)
|
|
35
35
|
response = self.post(
|
|
36
|
-
url_for(
|
|
37
|
-
|
|
38
|
-
json=False)
|
|
36
|
+
url_for("api.organization_logo", org=org), {"file": (file, "test.png")}, json=False
|
|
37
|
+
)
|
|
39
38
|
self.assert200(response)
|
|
40
39
|
|
|
41
40
|
transfer_to_org = Transfer.objects.create(
|
|
42
41
|
owner=user,
|
|
43
42
|
recipient=org,
|
|
44
43
|
subject=dataset,
|
|
45
|
-
comment=
|
|
44
|
+
comment="comment",
|
|
46
45
|
)
|
|
47
46
|
transfer_from_org = Transfer.objects.create(
|
|
48
47
|
owner=org,
|
|
49
48
|
recipient=user,
|
|
50
49
|
subject=dataset,
|
|
51
|
-
comment=
|
|
50
|
+
comment="comment",
|
|
52
51
|
)
|
|
53
52
|
|
|
54
53
|
oauth_client = OAuth2Client.objects.create(
|
|
55
|
-
name=
|
|
54
|
+
name="test-client",
|
|
56
55
|
owner=user,
|
|
57
56
|
organization=org,
|
|
58
|
-
redirect_uris=[
|
|
57
|
+
redirect_uris=["https://test.org/callback"],
|
|
59
58
|
)
|
|
60
59
|
|
|
61
60
|
# Delete organization
|
|
62
|
-
response = self.delete(url_for(
|
|
61
|
+
response = self.delete(url_for("api.organization", org=org))
|
|
63
62
|
self.assert204(response)
|
|
64
63
|
|
|
65
64
|
tasks.purge_organizations()
|
|
@@ -79,5 +78,5 @@ class OrganizationTasksTest(APITestCase):
|
|
|
79
78
|
dataset = Dataset.objects(id=dataset.id).first()
|
|
80
79
|
self.assertIsNone(dataset.organization)
|
|
81
80
|
|
|
82
|
-
organization = Organization.objects(name=
|
|
81
|
+
organization = Organization.objects(name="delete me").first()
|
|
83
82
|
self.assertIsNone(organization)
|