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
|
@@ -51,7 +51,7 @@ class FormFieldTest(TestCase):
|
|
|
51
51
|
|
|
52
52
|
def test_with_one_valid_data(self):
|
|
53
53
|
fake = Fake()
|
|
54
|
-
form = self.factory(MultiDict({
|
|
54
|
+
form = self.factory(MultiDict({"nested-name": "John Doe"}))
|
|
55
55
|
|
|
56
56
|
form.validate()
|
|
57
57
|
self.assertEqual(form.errors, {})
|
|
@@ -59,11 +59,11 @@ class FormFieldTest(TestCase):
|
|
|
59
59
|
form.populate_obj(fake)
|
|
60
60
|
|
|
61
61
|
self.assertIsInstance(fake.nested, Nested)
|
|
62
|
-
self.assertEqual(fake.nested.name,
|
|
62
|
+
self.assertEqual(fake.nested.name, "John Doe")
|
|
63
63
|
|
|
64
64
|
def test_with_one_valid_json(self):
|
|
65
65
|
fake = Fake()
|
|
66
|
-
form = self.factory({
|
|
66
|
+
form = self.factory({"nested": {"name": "John Doe"}})
|
|
67
67
|
|
|
68
68
|
form.validate()
|
|
69
69
|
self.assertEqual(form.errors, {})
|
|
@@ -71,12 +71,12 @@ class FormFieldTest(TestCase):
|
|
|
71
71
|
form.populate_obj(fake)
|
|
72
72
|
|
|
73
73
|
self.assertIsInstance(fake.nested, Nested)
|
|
74
|
-
self.assertEqual(fake.nested.name,
|
|
74
|
+
self.assertEqual(fake.nested.name, "John Doe")
|
|
75
75
|
|
|
76
76
|
def test_with_initial_elements(self):
|
|
77
77
|
fake = Fake.objects.create(nested=Nested(name=faker.name()))
|
|
78
78
|
new_name = faker.name()
|
|
79
|
-
form = self.factory({
|
|
79
|
+
form = self.factory({"nested": {"name": new_name}}, fake)
|
|
80
80
|
|
|
81
81
|
form.validate()
|
|
82
82
|
self.assertEqual(form.errors, {})
|
|
@@ -90,7 +90,7 @@ class FormFieldTest(TestCase):
|
|
|
90
90
|
fake = Fake.objects.create(nested=Nested(name=faker.name()))
|
|
91
91
|
initial_id = fake.nested.id
|
|
92
92
|
initial_name = fake.nested.name
|
|
93
|
-
form = self.factory({
|
|
93
|
+
form = self.factory({"name": faker.word()}, fake)
|
|
94
94
|
|
|
95
95
|
form.validate()
|
|
96
96
|
self.assertEqual(form.errors, {})
|
|
@@ -104,7 +104,7 @@ class FormFieldTest(TestCase):
|
|
|
104
104
|
fake = Fake.objects.create(nested=Nested(name=faker.name()))
|
|
105
105
|
initial_id = fake.nested.id
|
|
106
106
|
new_name = faker.name()
|
|
107
|
-
form = self.factory({
|
|
107
|
+
form = self.factory({"nested": {"name": new_name}}, fake)
|
|
108
108
|
|
|
109
109
|
form.validate()
|
|
110
110
|
self.assertEqual(form.errors, {})
|
|
@@ -115,7 +115,7 @@ class FormFieldTest(TestCase):
|
|
|
115
115
|
self.assertEqual(fake.nested.name, new_name)
|
|
116
116
|
|
|
117
117
|
def test_create_with_non_submitted_elements(self):
|
|
118
|
-
form = self.factory({
|
|
118
|
+
form = self.factory({"name": faker.word()})
|
|
119
119
|
|
|
120
120
|
form.validate()
|
|
121
121
|
self.assertEqual(form.errors, {})
|
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
|
|
3
|
-
import pytest
|
|
4
|
-
|
|
5
3
|
import flask_storage as fs
|
|
4
|
+
import pytest
|
|
6
5
|
|
|
7
|
-
from udata.
|
|
6
|
+
from udata.core.storages import tmp
|
|
8
7
|
from udata.forms import Form
|
|
9
8
|
from udata.forms.fields import ImageField
|
|
9
|
+
from udata.mongo import db
|
|
10
10
|
from udata.tests.helpers import data_path
|
|
11
|
-
from udata.core.storages import tmp
|
|
12
11
|
|
|
13
12
|
log = logging.getLogger(__name__)
|
|
14
13
|
|
|
15
14
|
SIZES = [16, 32]
|
|
16
15
|
|
|
17
|
-
storage = fs.Storage(
|
|
16
|
+
storage = fs.Storage("test")
|
|
18
17
|
|
|
19
18
|
|
|
20
19
|
class PostData(dict):
|
|
@@ -25,7 +24,7 @@ class PostData(dict):
|
|
|
25
24
|
return value
|
|
26
25
|
|
|
27
26
|
|
|
28
|
-
@pytest.mark.usefixtures(
|
|
27
|
+
@pytest.mark.usefixtures("clean_db")
|
|
29
28
|
class ImageFieldTest:
|
|
30
29
|
class D(db.Document):
|
|
31
30
|
image = db.ImageField(fs=storage)
|
|
@@ -37,7 +36,7 @@ class ImageFieldTest:
|
|
|
37
36
|
|
|
38
37
|
@pytest.fixture(autouse=True)
|
|
39
38
|
def fs_root(self, instance_path, app):
|
|
40
|
-
app.config[
|
|
39
|
+
app.config["FS_ROOT"] = str(instance_path / "fs")
|
|
41
40
|
fs.init_app(app, storage, tmp)
|
|
42
41
|
|
|
43
42
|
def test_empty(self):
|
|
@@ -59,30 +58,34 @@ class ImageFieldTest:
|
|
|
59
58
|
|
|
60
59
|
def test_with_image(self):
|
|
61
60
|
doc = self.D()
|
|
62
|
-
with open(data_path(
|
|
63
|
-
doc.image.save(img,
|
|
61
|
+
with open(data_path("image.png"), "rb") as img:
|
|
62
|
+
doc.image.save(img, "image.jpg")
|
|
64
63
|
doc.save()
|
|
65
64
|
form = self.F(None, obj=doc)
|
|
66
|
-
assert form.image.filename.data ==
|
|
65
|
+
assert form.image.filename.data == "image.jpg"
|
|
67
66
|
assert form.image.bbox.data is None
|
|
68
67
|
|
|
69
68
|
def test_with_image_and_bbox(self):
|
|
70
69
|
doc = self.D()
|
|
71
|
-
with open(data_path(
|
|
72
|
-
doc.thumbnail.save(img,
|
|
70
|
+
with open(data_path("image.png"), "rb") as img:
|
|
71
|
+
doc.thumbnail.save(img, "image.jpg", bbox=[10, 10, 100, 100])
|
|
73
72
|
doc.save()
|
|
74
73
|
form = self.F(None, obj=doc)
|
|
75
|
-
assert form.thumbnail.filename.data ==
|
|
74
|
+
assert form.thumbnail.filename.data == "image.jpg"
|
|
76
75
|
assert form.thumbnail.bbox.data == [10, 10, 100, 100]
|
|
77
76
|
|
|
78
77
|
def test_post_new(self):
|
|
79
|
-
tmp_filename =
|
|
80
|
-
with open(data_path(
|
|
78
|
+
tmp_filename = "xyz/image.png"
|
|
79
|
+
with open(data_path("image.png"), "rb") as img:
|
|
81
80
|
tmp_filename = tmp.save(img, tmp_filename)
|
|
82
81
|
|
|
83
|
-
form = self.F(
|
|
84
|
-
|
|
85
|
-
|
|
82
|
+
form = self.F(
|
|
83
|
+
PostData(
|
|
84
|
+
{
|
|
85
|
+
"image-filename": tmp_filename,
|
|
86
|
+
}
|
|
87
|
+
)
|
|
88
|
+
)
|
|
86
89
|
|
|
87
90
|
assert form.image.filename.data == tmp_filename
|
|
88
91
|
assert form.image.bbox.data is None
|
|
@@ -91,19 +94,23 @@ class ImageFieldTest:
|
|
|
91
94
|
form.populate_obj(doc)
|
|
92
95
|
|
|
93
96
|
assert doc.image.bbox is None
|
|
94
|
-
assert doc.image.filename.endswith(
|
|
97
|
+
assert doc.image.filename.endswith(".png")
|
|
95
98
|
assert doc.image.filename in storage
|
|
96
99
|
assert tmp_filename not in tmp
|
|
97
100
|
|
|
98
101
|
def test_post_new_with_crop(self):
|
|
99
|
-
tmp_filename =
|
|
100
|
-
with open(data_path(
|
|
102
|
+
tmp_filename = "xyz/image.png"
|
|
103
|
+
with open(data_path("image.png"), "rb") as img:
|
|
101
104
|
tmp_filename = tmp.save(img, tmp_filename)
|
|
102
105
|
|
|
103
|
-
form = self.F(
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
106
|
+
form = self.F(
|
|
107
|
+
PostData(
|
|
108
|
+
{
|
|
109
|
+
"thumbnail-filename": tmp_filename,
|
|
110
|
+
"thumbnail-bbox": "10,10,100,100",
|
|
111
|
+
}
|
|
112
|
+
)
|
|
113
|
+
)
|
|
107
114
|
|
|
108
115
|
assert form.thumbnail.filename.data == tmp_filename
|
|
109
116
|
assert form.thumbnail.bbox.data == [10, 10, 100, 100]
|
|
@@ -112,6 +119,6 @@ class ImageFieldTest:
|
|
|
112
119
|
form.populate_obj(doc)
|
|
113
120
|
|
|
114
121
|
assert doc.thumbnail.bbox == [10, 10, 100, 100]
|
|
115
|
-
assert doc.thumbnail.filename.endswith(
|
|
122
|
+
assert doc.thumbnail.filename.endswith(".png")
|
|
116
123
|
assert doc.thumbnail.filename in storage
|
|
117
124
|
assert tmp_filename not in tmp
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
import pytest
|
|
2
|
-
|
|
3
2
|
from werkzeug.datastructures import MultiDict
|
|
4
3
|
|
|
5
4
|
from udata.forms import ModelForm, fields
|
|
6
5
|
from udata.i18n import gettext as _
|
|
7
6
|
from udata.mongo import db
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
pytestmark = [
|
|
11
|
-
pytest.mark.usefixtures('clean_db')
|
|
12
|
-
]
|
|
8
|
+
pytestmark = [pytest.mark.usefixtures("clean_db")]
|
|
13
9
|
|
|
14
10
|
|
|
15
11
|
class Target(db.Document):
|
|
@@ -31,44 +27,47 @@ class Generic:
|
|
|
31
27
|
|
|
32
28
|
def test_error_with_inline_identifier(self):
|
|
33
29
|
expected_target = Target.objects.create()
|
|
34
|
-
form = self.form.from_json(
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
30
|
+
form = self.form.from_json(
|
|
31
|
+
{
|
|
32
|
+
"name": "test",
|
|
33
|
+
"target": str(expected_target.pk),
|
|
34
|
+
}
|
|
35
|
+
)
|
|
38
36
|
|
|
39
37
|
form.validate()
|
|
40
38
|
|
|
41
|
-
assert
|
|
42
|
-
assert len(form.errors[
|
|
43
|
-
assert form.errors[
|
|
39
|
+
assert "target" in form.errors
|
|
40
|
+
assert len(form.errors["target"]) == 1
|
|
41
|
+
assert form.errors["target"][0] == _("Expect both class and identifier")
|
|
44
42
|
|
|
45
43
|
def test_error_with_identifier_only(self):
|
|
46
44
|
expected_target = Target.objects.create()
|
|
47
|
-
form = self.form.from_json(
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
45
|
+
form = self.form.from_json(
|
|
46
|
+
{
|
|
47
|
+
"name": "test",
|
|
48
|
+
"target": {"id": str(expected_target.pk)},
|
|
49
|
+
}
|
|
50
|
+
)
|
|
51
51
|
|
|
52
52
|
form.validate()
|
|
53
53
|
|
|
54
|
-
assert
|
|
55
|
-
assert len(form.errors[
|
|
56
|
-
assert form.errors[
|
|
54
|
+
assert "target" in form.errors
|
|
55
|
+
assert len(form.errors["target"]) == 1
|
|
56
|
+
assert form.errors["target"][0] == _("Expect both class and identifier")
|
|
57
57
|
|
|
58
58
|
def test_error_with_unknown_model(self):
|
|
59
|
-
form = self.form.from_json(
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
})
|
|
59
|
+
form = self.form.from_json(
|
|
60
|
+
{
|
|
61
|
+
"name": "test",
|
|
62
|
+
"target": {"class": "Unknown", "id": 42},
|
|
63
|
+
}
|
|
64
|
+
)
|
|
66
65
|
|
|
67
66
|
form.validate()
|
|
68
67
|
|
|
69
|
-
assert
|
|
70
|
-
assert len(form.errors[
|
|
71
|
-
assert form.errors[
|
|
68
|
+
assert "target" in form.errors
|
|
69
|
+
assert len(form.errors["target"]) == 1
|
|
70
|
+
assert form.errors["target"][0] == 'Model "Unknown" does not exist'
|
|
72
71
|
|
|
73
72
|
|
|
74
73
|
class Explicit:
|
|
@@ -77,10 +76,14 @@ class Explicit:
|
|
|
77
76
|
def test_with_inline_identifier_multidict(self):
|
|
78
77
|
expected_target = Target.objects.create()
|
|
79
78
|
model = self.model()
|
|
80
|
-
form = self.form(
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
79
|
+
form = self.form(
|
|
80
|
+
MultiDict(
|
|
81
|
+
{
|
|
82
|
+
"name": "test",
|
|
83
|
+
"target": str(expected_target.pk),
|
|
84
|
+
}
|
|
85
|
+
)
|
|
86
|
+
)
|
|
84
87
|
|
|
85
88
|
form.validate()
|
|
86
89
|
assert form.errors == {}
|
|
@@ -93,10 +96,14 @@ class Explicit:
|
|
|
93
96
|
def test_with_identifier_only_multidict(self):
|
|
94
97
|
expected_target = Target.objects.create()
|
|
95
98
|
model = self.model()
|
|
96
|
-
form = self.form(
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
99
|
+
form = self.form(
|
|
100
|
+
MultiDict(
|
|
101
|
+
{
|
|
102
|
+
"name": "test",
|
|
103
|
+
"target-id": str(expected_target.pk),
|
|
104
|
+
}
|
|
105
|
+
)
|
|
106
|
+
)
|
|
100
107
|
|
|
101
108
|
form.validate()
|
|
102
109
|
assert form.errors == {}
|
|
@@ -109,10 +116,12 @@ class Explicit:
|
|
|
109
116
|
def test_with_inline_identifier_json(self):
|
|
110
117
|
expected_target = Target.objects.create()
|
|
111
118
|
model = self.model()
|
|
112
|
-
form = self.form.from_json(
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
119
|
+
form = self.form.from_json(
|
|
120
|
+
{
|
|
121
|
+
"name": "test",
|
|
122
|
+
"target": str(expected_target.pk),
|
|
123
|
+
}
|
|
124
|
+
)
|
|
116
125
|
|
|
117
126
|
form.validate()
|
|
118
127
|
assert form.errors == {}
|
|
@@ -125,10 +134,12 @@ class Explicit:
|
|
|
125
134
|
def test_with_identifier_only_json(self):
|
|
126
135
|
expected_target = Target.objects.create()
|
|
127
136
|
model = self.model()
|
|
128
|
-
form = self.form.from_json(
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
137
|
+
form = self.form.from_json(
|
|
138
|
+
{
|
|
139
|
+
"name": "test",
|
|
140
|
+
"target": {"id": str(expected_target.pk)},
|
|
141
|
+
}
|
|
142
|
+
)
|
|
132
143
|
|
|
133
144
|
form.validate()
|
|
134
145
|
assert form.errors == {}
|
|
@@ -140,71 +151,79 @@ class Explicit:
|
|
|
140
151
|
|
|
141
152
|
def test_error_with_class_mismatch(self):
|
|
142
153
|
expected_target = Target.objects.create()
|
|
143
|
-
form = self.form.from_json(
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
})
|
|
154
|
+
form = self.form.from_json(
|
|
155
|
+
{
|
|
156
|
+
"name": "test",
|
|
157
|
+
"target": {"class": "Wrong", "id": str(expected_target.pk)},
|
|
158
|
+
}
|
|
159
|
+
)
|
|
150
160
|
|
|
151
161
|
form.validate()
|
|
152
162
|
|
|
153
|
-
assert
|
|
154
|
-
assert len(form.errors[
|
|
155
|
-
assert form.errors[
|
|
163
|
+
assert "target" in form.errors
|
|
164
|
+
assert len(form.errors["target"]) == 1
|
|
165
|
+
assert form.errors["target"][0] == _('Expect a "Target" class but "Wrong" was found')
|
|
156
166
|
|
|
157
167
|
|
|
158
168
|
class Required:
|
|
159
169
|
required = True
|
|
160
170
|
|
|
161
171
|
def test_not_provided(self):
|
|
162
|
-
form = self.form.from_json({
|
|
172
|
+
form = self.form.from_json({"name": "test"})
|
|
163
173
|
|
|
164
174
|
form.validate()
|
|
165
175
|
|
|
166
|
-
assert
|
|
167
|
-
assert len(form.errors[
|
|
168
|
-
assert
|
|
176
|
+
assert "target" in form.errors
|
|
177
|
+
assert len(form.errors["target"]) == 1
|
|
178
|
+
assert "requis" in form.errors["target"][0]
|
|
169
179
|
|
|
170
180
|
def test_none(self):
|
|
171
|
-
form = self.form.from_json(
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
181
|
+
form = self.form.from_json(
|
|
182
|
+
{
|
|
183
|
+
"name": "test",
|
|
184
|
+
"target": None,
|
|
185
|
+
}
|
|
186
|
+
)
|
|
175
187
|
|
|
176
188
|
form.validate()
|
|
177
189
|
|
|
178
|
-
assert
|
|
179
|
-
assert len(form.errors[
|
|
180
|
-
assert
|
|
190
|
+
assert "target" in form.errors
|
|
191
|
+
assert len(form.errors["target"]) == 1
|
|
192
|
+
assert "requis" in form.errors["target"][0]
|
|
181
193
|
|
|
182
194
|
def test_with_initial_object_none(self):
|
|
183
195
|
model = self.model(target=Target.objects.create())
|
|
184
196
|
|
|
185
|
-
form = self.form.from_json(
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
197
|
+
form = self.form.from_json(
|
|
198
|
+
{
|
|
199
|
+
"name": "test",
|
|
200
|
+
"target": None,
|
|
201
|
+
},
|
|
202
|
+
model,
|
|
203
|
+
)
|
|
189
204
|
|
|
190
205
|
form.validate()
|
|
191
206
|
|
|
192
|
-
assert
|
|
193
|
-
assert len(form.errors[
|
|
194
|
-
assert
|
|
207
|
+
assert "target" in form.errors
|
|
208
|
+
assert len(form.errors["target"]) == 1
|
|
209
|
+
assert "requis" in form.errors["target"][0]
|
|
195
210
|
|
|
196
211
|
|
|
197
212
|
class Optionnal:
|
|
198
|
-
|
|
213
|
+
"""Optional ModelField specific tests"""
|
|
214
|
+
|
|
199
215
|
required = False
|
|
200
216
|
|
|
201
217
|
def test_with_initial_object_none(self):
|
|
202
218
|
model = self.model(target=Target.objects.create())
|
|
203
219
|
|
|
204
|
-
form = self.form.from_json(
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
220
|
+
form = self.form.from_json(
|
|
221
|
+
{
|
|
222
|
+
"name": "test",
|
|
223
|
+
"target": None,
|
|
224
|
+
},
|
|
225
|
+
model,
|
|
226
|
+
)
|
|
208
227
|
|
|
209
228
|
form.validate()
|
|
210
229
|
assert form.errors == {}
|
|
@@ -236,11 +255,11 @@ class CommonMixin:
|
|
|
236
255
|
def test_with_valid_multidict(self):
|
|
237
256
|
expected_target = Target.objects.create()
|
|
238
257
|
model = self.model()
|
|
239
|
-
form = self.form(
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
258
|
+
form = self.form(
|
|
259
|
+
MultiDict(
|
|
260
|
+
{"name": "test", "target-class": "Target", "target-id": str(expected_target.pk)}
|
|
261
|
+
)
|
|
262
|
+
)
|
|
244
263
|
|
|
245
264
|
form.validate()
|
|
246
265
|
assert form.errors == {}
|
|
@@ -253,13 +272,9 @@ class CommonMixin:
|
|
|
253
272
|
def test_with_valid_json(self):
|
|
254
273
|
expected_target = Target.objects.create()
|
|
255
274
|
model = self.model()
|
|
256
|
-
form = self.form.from_json(
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
'class': 'Target',
|
|
260
|
-
'id': str(expected_target.pk)
|
|
261
|
-
}
|
|
262
|
-
})
|
|
275
|
+
form = self.form.from_json(
|
|
276
|
+
{"name": "test", "target": {"class": "Target", "id": str(expected_target.pk)}}
|
|
277
|
+
)
|
|
263
278
|
|
|
264
279
|
form.validate()
|
|
265
280
|
assert form.errors == {}
|
|
@@ -274,13 +289,9 @@ class CommonMixin:
|
|
|
274
289
|
expected_target = Target.objects.create()
|
|
275
290
|
model = self.model(target=initial_target)
|
|
276
291
|
|
|
277
|
-
form = self.form.from_json(
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
'class': 'Target',
|
|
281
|
-
'id': str(expected_target.pk)
|
|
282
|
-
}
|
|
283
|
-
}, model)
|
|
292
|
+
form = self.form.from_json(
|
|
293
|
+
{"name": "test", "target": {"class": "Target", "id": str(expected_target.pk)}}, model
|
|
294
|
+
)
|
|
284
295
|
|
|
285
296
|
form.validate()
|
|
286
297
|
assert form.errors == {}
|
|
@@ -294,7 +305,7 @@ class CommonMixin:
|
|
|
294
305
|
expected_target = Target.objects.create()
|
|
295
306
|
model = self.model(target=expected_target)
|
|
296
307
|
|
|
297
|
-
form = self.form.from_json({
|
|
308
|
+
form = self.form.from_json({"name": "test"}, model)
|
|
298
309
|
|
|
299
310
|
form.validate()
|
|
300
311
|
assert form.errors == {}
|
|
@@ -305,46 +316,46 @@ class CommonMixin:
|
|
|
305
316
|
assert model.target == expected_target
|
|
306
317
|
|
|
307
318
|
def test_multidict_errors(self):
|
|
308
|
-
form = self.form(
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
319
|
+
form = self.form(
|
|
320
|
+
MultiDict(
|
|
321
|
+
{
|
|
322
|
+
"name": "test",
|
|
323
|
+
"target-class": "Target",
|
|
324
|
+
}
|
|
325
|
+
)
|
|
326
|
+
)
|
|
312
327
|
|
|
313
328
|
form.validate()
|
|
314
329
|
|
|
315
|
-
assert
|
|
316
|
-
assert len(form.errors[
|
|
330
|
+
assert "target" in form.errors
|
|
331
|
+
assert len(form.errors["target"]) == 1
|
|
317
332
|
# assert 'Unsupported identifier' in form.errors['target'][0]
|
|
318
|
-
assert form.errors[
|
|
333
|
+
assert form.errors["target"][0] == _('Missing "id" field')
|
|
319
334
|
|
|
320
335
|
def test_json_errors(self):
|
|
321
|
-
form = self.form.from_json(
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
336
|
+
form = self.form.from_json(
|
|
337
|
+
{
|
|
338
|
+
"name": "test",
|
|
339
|
+
"target": {
|
|
340
|
+
"class": "Target",
|
|
341
|
+
},
|
|
325
342
|
}
|
|
326
|
-
|
|
343
|
+
)
|
|
327
344
|
|
|
328
345
|
form.validate()
|
|
329
346
|
|
|
330
|
-
assert
|
|
331
|
-
assert len(form.errors[
|
|
332
|
-
assert form.errors[
|
|
347
|
+
assert "target" in form.errors
|
|
348
|
+
assert len(form.errors["target"]) == 1
|
|
349
|
+
assert form.errors["target"][0] == _('Missing "id" field')
|
|
333
350
|
|
|
334
351
|
def test_bad_id(self):
|
|
335
|
-
form = self.form.from_json({
|
|
336
|
-
'name': 'test',
|
|
337
|
-
'target': {
|
|
338
|
-
'class': 'Target',
|
|
339
|
-
'id': 'wrong'
|
|
340
|
-
}
|
|
341
|
-
})
|
|
352
|
+
form = self.form.from_json({"name": "test", "target": {"class": "Target", "id": "wrong"}})
|
|
342
353
|
|
|
343
354
|
form.validate()
|
|
344
355
|
|
|
345
|
-
assert
|
|
346
|
-
assert len(form.errors[
|
|
347
|
-
assert
|
|
356
|
+
assert "target" in form.errors
|
|
357
|
+
assert len(form.errors["target"]) == 1
|
|
358
|
+
assert "Unsupported identifier" in form.errors["target"][0]
|
|
348
359
|
|
|
349
360
|
|
|
350
361
|
class Optionnal_GenericReference_Test(Generic, Optionnal, CommonMixin):
|
|
@@ -36,7 +36,7 @@ class ModelListFieldTest(TestCase):
|
|
|
36
36
|
def test_with_one_valid_data(self):
|
|
37
37
|
nested = Nested.objects.create(name=faker.name())
|
|
38
38
|
fake = Fake()
|
|
39
|
-
form = FakeForm(MultiDict({
|
|
39
|
+
form = FakeForm(MultiDict({"nested": str(nested.id)}))
|
|
40
40
|
|
|
41
41
|
form.validate()
|
|
42
42
|
self.assertEqual(form.errors, {})
|
|
@@ -51,7 +51,7 @@ class ModelListFieldTest(TestCase):
|
|
|
51
51
|
nesteds = [Nested.objects.create(name=faker.name()) for _ in range(3)]
|
|
52
52
|
ids = [str(n.id) for n in nesteds]
|
|
53
53
|
fake = Fake()
|
|
54
|
-
form = FakeForm(MultiDict({
|
|
54
|
+
form = FakeForm(MultiDict({"nested": ",".join(ids)}))
|
|
55
55
|
|
|
56
56
|
form.validate()
|
|
57
57
|
self.assertEqual(form.errors, {})
|
|
@@ -65,7 +65,7 @@ class ModelListFieldTest(TestCase):
|
|
|
65
65
|
def test_with_one_valid_json_id(self):
|
|
66
66
|
nested = Nested.objects.create(name=faker.name())
|
|
67
67
|
fake = Fake()
|
|
68
|
-
form = FakeForm.from_json({
|
|
68
|
+
form = FakeForm.from_json({"nested": [str(nested.id)]})
|
|
69
69
|
|
|
70
70
|
form.validate()
|
|
71
71
|
self.assertEqual(form.errors, {})
|
|
@@ -79,7 +79,7 @@ class ModelListFieldTest(TestCase):
|
|
|
79
79
|
def test_with_one_valid_json_object(self):
|
|
80
80
|
nested = Nested.objects.create(name=faker.name())
|
|
81
81
|
fake = Fake()
|
|
82
|
-
form = FakeForm.from_json({
|
|
82
|
+
form = FakeForm.from_json({"nested": [{"id": str(nested.id)}]})
|
|
83
83
|
|
|
84
84
|
form.validate()
|
|
85
85
|
self.assertEqual(form.errors, {})
|
|
@@ -94,7 +94,7 @@ class ModelListFieldTest(TestCase):
|
|
|
94
94
|
nested = [Nested.objects.create(name=faker.name()) for _ in range(3)]
|
|
95
95
|
ids = [str(n.id) for n in nested]
|
|
96
96
|
fake = Fake()
|
|
97
|
-
form = FakeForm.from_json({
|
|
97
|
+
form = FakeForm.from_json({"nested": ids})
|
|
98
98
|
|
|
99
99
|
form.validate()
|
|
100
100
|
self.assertEqual(form.errors, {})
|
|
@@ -107,9 +107,9 @@ class ModelListFieldTest(TestCase):
|
|
|
107
107
|
|
|
108
108
|
def test_with_multiple_valid_json_object(self):
|
|
109
109
|
nested = [Nested.objects.create(name=faker.name()) for _ in range(3)]
|
|
110
|
-
ids = [{
|
|
110
|
+
ids = [{"id": str(n.id)} for n in nested]
|
|
111
111
|
fake = Fake()
|
|
112
|
-
form = FakeForm.from_json({
|
|
112
|
+
form = FakeForm.from_json({"nested": ids})
|
|
113
113
|
|
|
114
114
|
form.validate()
|
|
115
115
|
self.assertEqual(form.errors, {})
|