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.

Files changed (413) hide show
  1. tasks/__init__.py +109 -107
  2. tasks/helpers.py +18 -18
  3. udata/__init__.py +4 -4
  4. udata/admin/views.py +5 -5
  5. udata/api/__init__.py +111 -134
  6. udata/api/commands.py +45 -37
  7. udata/api/errors.py +5 -4
  8. udata/api/fields.py +23 -21
  9. udata/api/oauth2.py +55 -74
  10. udata/api/parsers.py +15 -15
  11. udata/api/signals.py +1 -1
  12. udata/api_fields.py +137 -89
  13. udata/app.py +58 -55
  14. udata/assets.py +5 -5
  15. udata/auth/__init__.py +37 -26
  16. udata/auth/forms.py +23 -15
  17. udata/auth/helpers.py +1 -1
  18. udata/auth/mails.py +3 -3
  19. udata/auth/password_validation.py +19 -15
  20. udata/auth/views.py +94 -68
  21. udata/commands/__init__.py +71 -69
  22. udata/commands/cache.py +7 -7
  23. udata/commands/db.py +201 -140
  24. udata/commands/dcat.py +36 -30
  25. udata/commands/fixtures.py +100 -84
  26. udata/commands/images.py +21 -20
  27. udata/commands/info.py +17 -20
  28. udata/commands/init.py +10 -10
  29. udata/commands/purge.py +12 -13
  30. udata/commands/serve.py +41 -29
  31. udata/commands/static.py +16 -18
  32. udata/commands/test.py +20 -20
  33. udata/commands/tests/fixtures.py +26 -24
  34. udata/commands/worker.py +31 -33
  35. udata/core/__init__.py +12 -12
  36. udata/core/activity/__init__.py +0 -1
  37. udata/core/activity/api.py +59 -49
  38. udata/core/activity/models.py +28 -26
  39. udata/core/activity/signals.py +1 -1
  40. udata/core/activity/tasks.py +16 -10
  41. udata/core/badges/api.py +6 -6
  42. udata/core/badges/commands.py +14 -13
  43. udata/core/badges/fields.py +8 -5
  44. udata/core/badges/forms.py +7 -4
  45. udata/core/badges/models.py +16 -31
  46. udata/core/badges/permissions.py +1 -3
  47. udata/core/badges/signals.py +2 -2
  48. udata/core/badges/tasks.py +3 -2
  49. udata/core/badges/tests/test_commands.py +10 -10
  50. udata/core/badges/tests/test_model.py +24 -31
  51. udata/core/contact_point/api.py +19 -18
  52. udata/core/contact_point/api_fields.py +21 -14
  53. udata/core/contact_point/factories.py +2 -2
  54. udata/core/contact_point/forms.py +7 -6
  55. udata/core/contact_point/models.py +3 -5
  56. udata/core/dataservices/api.py +26 -21
  57. udata/core/dataservices/factories.py +13 -11
  58. udata/core/dataservices/models.py +35 -40
  59. udata/core/dataservices/permissions.py +4 -4
  60. udata/core/dataservices/rdf.py +40 -17
  61. udata/core/dataservices/tasks.py +4 -3
  62. udata/core/dataset/actions.py +10 -10
  63. udata/core/dataset/activities.py +21 -23
  64. udata/core/dataset/api.py +321 -298
  65. udata/core/dataset/api_fields.py +443 -271
  66. udata/core/dataset/apiv2.py +305 -229
  67. udata/core/dataset/commands.py +38 -36
  68. udata/core/dataset/constants.py +61 -54
  69. udata/core/dataset/csv.py +70 -74
  70. udata/core/dataset/events.py +39 -32
  71. udata/core/dataset/exceptions.py +8 -4
  72. udata/core/dataset/factories.py +57 -65
  73. udata/core/dataset/forms.py +87 -63
  74. udata/core/dataset/models.py +336 -280
  75. udata/core/dataset/permissions.py +9 -6
  76. udata/core/dataset/preview.py +15 -17
  77. udata/core/dataset/rdf.py +156 -122
  78. udata/core/dataset/search.py +92 -77
  79. udata/core/dataset/signals.py +1 -1
  80. udata/core/dataset/tasks.py +63 -54
  81. udata/core/discussions/actions.py +5 -5
  82. udata/core/discussions/api.py +124 -120
  83. udata/core/discussions/factories.py +2 -2
  84. udata/core/discussions/forms.py +9 -7
  85. udata/core/discussions/metrics.py +1 -3
  86. udata/core/discussions/models.py +25 -24
  87. udata/core/discussions/notifications.py +18 -14
  88. udata/core/discussions/permissions.py +3 -3
  89. udata/core/discussions/signals.py +4 -4
  90. udata/core/discussions/tasks.py +24 -28
  91. udata/core/followers/api.py +32 -33
  92. udata/core/followers/models.py +9 -9
  93. udata/core/followers/signals.py +3 -3
  94. udata/core/jobs/actions.py +7 -7
  95. udata/core/jobs/api.py +99 -92
  96. udata/core/jobs/commands.py +48 -49
  97. udata/core/jobs/forms.py +11 -11
  98. udata/core/jobs/models.py +6 -6
  99. udata/core/metrics/__init__.py +2 -2
  100. udata/core/metrics/commands.py +34 -30
  101. udata/core/metrics/models.py +2 -4
  102. udata/core/metrics/signals.py +1 -1
  103. udata/core/metrics/tasks.py +3 -3
  104. udata/core/organization/activities.py +12 -15
  105. udata/core/organization/api.py +167 -174
  106. udata/core/organization/api_fields.py +183 -124
  107. udata/core/organization/apiv2.py +32 -32
  108. udata/core/organization/commands.py +20 -22
  109. udata/core/organization/constants.py +11 -11
  110. udata/core/organization/csv.py +17 -15
  111. udata/core/organization/factories.py +8 -11
  112. udata/core/organization/forms.py +32 -26
  113. udata/core/organization/metrics.py +2 -1
  114. udata/core/organization/models.py +87 -67
  115. udata/core/organization/notifications.py +18 -14
  116. udata/core/organization/permissions.py +10 -11
  117. udata/core/organization/rdf.py +14 -14
  118. udata/core/organization/search.py +30 -28
  119. udata/core/organization/signals.py +7 -7
  120. udata/core/organization/tasks.py +42 -61
  121. udata/core/owned.py +38 -27
  122. udata/core/post/api.py +82 -81
  123. udata/core/post/constants.py +8 -5
  124. udata/core/post/factories.py +4 -4
  125. udata/core/post/forms.py +13 -14
  126. udata/core/post/models.py +20 -22
  127. udata/core/post/tests/test_api.py +30 -32
  128. udata/core/reports/api.py +8 -7
  129. udata/core/reports/constants.py +1 -3
  130. udata/core/reports/models.py +10 -10
  131. udata/core/reuse/activities.py +15 -19
  132. udata/core/reuse/api.py +123 -126
  133. udata/core/reuse/api_fields.py +120 -85
  134. udata/core/reuse/apiv2.py +11 -10
  135. udata/core/reuse/constants.py +23 -23
  136. udata/core/reuse/csv.py +18 -18
  137. udata/core/reuse/factories.py +5 -9
  138. udata/core/reuse/forms.py +24 -21
  139. udata/core/reuse/models.py +55 -51
  140. udata/core/reuse/permissions.py +2 -2
  141. udata/core/reuse/search.py +49 -46
  142. udata/core/reuse/signals.py +1 -1
  143. udata/core/reuse/tasks.py +4 -5
  144. udata/core/site/api.py +47 -50
  145. udata/core/site/factories.py +2 -2
  146. udata/core/site/forms.py +4 -5
  147. udata/core/site/models.py +94 -63
  148. udata/core/site/rdf.py +14 -14
  149. udata/core/spam/api.py +16 -9
  150. udata/core/spam/constants.py +4 -4
  151. udata/core/spam/fields.py +13 -7
  152. udata/core/spam/models.py +27 -20
  153. udata/core/spam/signals.py +1 -1
  154. udata/core/spam/tests/test_spam.py +6 -5
  155. udata/core/spatial/api.py +72 -80
  156. udata/core/spatial/api_fields.py +73 -58
  157. udata/core/spatial/commands.py +67 -64
  158. udata/core/spatial/constants.py +3 -3
  159. udata/core/spatial/factories.py +37 -54
  160. udata/core/spatial/forms.py +27 -26
  161. udata/core/spatial/geoids.py +17 -17
  162. udata/core/spatial/models.py +43 -47
  163. udata/core/spatial/tasks.py +2 -1
  164. udata/core/spatial/tests/test_api.py +115 -130
  165. udata/core/spatial/tests/test_fields.py +74 -77
  166. udata/core/spatial/tests/test_geoid.py +22 -22
  167. udata/core/spatial/tests/test_models.py +5 -7
  168. udata/core/spatial/translations.py +16 -16
  169. udata/core/storages/__init__.py +16 -18
  170. udata/core/storages/api.py +66 -64
  171. udata/core/storages/tasks.py +7 -7
  172. udata/core/storages/utils.py +15 -15
  173. udata/core/storages/views.py +5 -6
  174. udata/core/tags/api.py +17 -14
  175. udata/core/tags/csv.py +4 -4
  176. udata/core/tags/models.py +8 -5
  177. udata/core/tags/tasks.py +11 -13
  178. udata/core/tags/views.py +4 -4
  179. udata/core/topic/api.py +84 -73
  180. udata/core/topic/apiv2.py +157 -127
  181. udata/core/topic/factories.py +3 -4
  182. udata/core/topic/forms.py +12 -14
  183. udata/core/topic/models.py +14 -19
  184. udata/core/topic/parsers.py +26 -26
  185. udata/core/user/activities.py +30 -29
  186. udata/core/user/api.py +151 -152
  187. udata/core/user/api_fields.py +132 -100
  188. udata/core/user/apiv2.py +7 -7
  189. udata/core/user/commands.py +38 -38
  190. udata/core/user/factories.py +8 -9
  191. udata/core/user/forms.py +14 -11
  192. udata/core/user/metrics.py +2 -2
  193. udata/core/user/models.py +68 -69
  194. udata/core/user/permissions.py +4 -5
  195. udata/core/user/rdf.py +7 -8
  196. udata/core/user/tasks.py +2 -2
  197. udata/core/user/tests/test_user_model.py +24 -16
  198. udata/cors.py +99 -0
  199. udata/db/tasks.py +2 -1
  200. udata/entrypoints.py +35 -31
  201. udata/errors.py +2 -1
  202. udata/event/values.py +6 -6
  203. udata/factories.py +2 -2
  204. udata/features/identicon/api.py +5 -6
  205. udata/features/identicon/backends.py +48 -55
  206. udata/features/identicon/tests/test_backends.py +4 -5
  207. udata/features/notifications/__init__.py +0 -1
  208. udata/features/notifications/actions.py +9 -9
  209. udata/features/notifications/api.py +17 -13
  210. udata/features/territories/__init__.py +12 -10
  211. udata/features/territories/api.py +14 -15
  212. udata/features/territories/models.py +23 -28
  213. udata/features/transfer/actions.py +8 -11
  214. udata/features/transfer/api.py +84 -77
  215. udata/features/transfer/factories.py +2 -1
  216. udata/features/transfer/models.py +11 -12
  217. udata/features/transfer/notifications.py +19 -15
  218. udata/features/transfer/permissions.py +5 -5
  219. udata/forms/__init__.py +5 -2
  220. udata/forms/fields.py +164 -172
  221. udata/forms/validators.py +19 -22
  222. udata/forms/widgets.py +9 -13
  223. udata/frontend/__init__.py +31 -26
  224. udata/frontend/csv.py +68 -58
  225. udata/frontend/markdown.py +40 -44
  226. udata/harvest/actions.py +89 -77
  227. udata/harvest/api.py +294 -238
  228. udata/harvest/backends/__init__.py +4 -4
  229. udata/harvest/backends/base.py +128 -111
  230. udata/harvest/backends/dcat.py +80 -66
  231. udata/harvest/commands.py +56 -60
  232. udata/harvest/csv.py +8 -8
  233. udata/harvest/exceptions.py +6 -3
  234. udata/harvest/filters.py +24 -23
  235. udata/harvest/forms.py +27 -28
  236. udata/harvest/models.py +88 -80
  237. udata/harvest/notifications.py +15 -10
  238. udata/harvest/signals.py +13 -13
  239. udata/harvest/tasks.py +11 -10
  240. udata/harvest/tests/factories.py +23 -24
  241. udata/harvest/tests/test_actions.py +136 -166
  242. udata/harvest/tests/test_api.py +220 -214
  243. udata/harvest/tests/test_base_backend.py +117 -112
  244. udata/harvest/tests/test_dcat_backend.py +380 -308
  245. udata/harvest/tests/test_filters.py +33 -22
  246. udata/harvest/tests/test_models.py +11 -14
  247. udata/harvest/tests/test_notifications.py +6 -7
  248. udata/harvest/tests/test_tasks.py +7 -6
  249. udata/i18n.py +237 -78
  250. udata/linkchecker/backends.py +5 -11
  251. udata/linkchecker/checker.py +23 -22
  252. udata/linkchecker/commands.py +4 -6
  253. udata/linkchecker/models.py +6 -6
  254. udata/linkchecker/tasks.py +18 -20
  255. udata/mail.py +21 -21
  256. udata/migrations/2020-07-24-remove-s-from-scope-oauth.py +9 -8
  257. udata/migrations/2020-08-24-add-fs-filename.py +9 -8
  258. udata/migrations/2020-09-28-update-reuses-datasets-metrics.py +5 -4
  259. udata/migrations/2020-10-16-migrate-ods-resources.py +9 -10
  260. udata/migrations/2021-04-08-update-schema-with-new-structure.py +8 -7
  261. udata/migrations/2021-05-27-fix-default-schema-name.py +7 -6
  262. udata/migrations/2021-07-05-remove-unused-badges.py +17 -15
  263. udata/migrations/2021-07-07-update-schema-for-community-resources.py +7 -6
  264. udata/migrations/2021-08-17-follow-integrity.py +5 -4
  265. udata/migrations/2021-08-17-harvest-integrity.py +13 -12
  266. udata/migrations/2021-08-17-oauth2client-integrity.py +5 -4
  267. udata/migrations/2021-08-17-transfer-integrity.py +5 -4
  268. udata/migrations/2021-08-17-users-integrity.py +9 -8
  269. udata/migrations/2021-12-14-reuse-topics.py +7 -6
  270. udata/migrations/2022-04-21-improve-extension-detection.py +8 -7
  271. udata/migrations/2022-09-22-clean-inactive-harvest-datasets.py +16 -14
  272. udata/migrations/2022-10-10-add-fs_uniquifier-to-user-model.py +6 -6
  273. udata/migrations/2022-10-10-migrate-harvest-extras.py +36 -26
  274. udata/migrations/2023-02-08-rename-internal-dates.py +46 -28
  275. udata/migrations/2024-01-29-fix-reuse-and-dataset-with-private-None.py +10 -8
  276. udata/migrations/2024-03-22-migrate-activity-kwargs-to-extras.py +6 -4
  277. udata/migrations/2024-06-11-fix-reuse-datasets-references.py +7 -6
  278. udata/migrations/__init__.py +123 -105
  279. udata/models/__init__.py +4 -4
  280. udata/mongo/__init__.py +13 -11
  281. udata/mongo/badges_field.py +3 -2
  282. udata/mongo/datetime_fields.py +13 -12
  283. udata/mongo/document.py +17 -16
  284. udata/mongo/engine.py +15 -16
  285. udata/mongo/errors.py +2 -1
  286. udata/mongo/extras_fields.py +30 -20
  287. udata/mongo/queryset.py +12 -12
  288. udata/mongo/slug_fields.py +38 -28
  289. udata/mongo/taglist_field.py +1 -2
  290. udata/mongo/url_field.py +5 -5
  291. udata/mongo/uuid_fields.py +4 -3
  292. udata/notifications/__init__.py +1 -1
  293. udata/notifications/mattermost.py +10 -9
  294. udata/rdf.py +167 -188
  295. udata/routing.py +40 -45
  296. udata/search/__init__.py +18 -19
  297. udata/search/adapter.py +17 -16
  298. udata/search/commands.py +44 -51
  299. udata/search/fields.py +13 -20
  300. udata/search/query.py +23 -18
  301. udata/search/result.py +9 -10
  302. udata/sentry.py +21 -19
  303. udata/settings.py +262 -198
  304. udata/sitemap.py +8 -6
  305. udata/storage/s3.py +20 -13
  306. udata/tags.py +4 -5
  307. udata/tasks.py +43 -42
  308. udata/tests/__init__.py +9 -6
  309. udata/tests/api/__init__.py +8 -6
  310. udata/tests/api/test_auth_api.py +395 -321
  311. udata/tests/api/test_base_api.py +33 -35
  312. udata/tests/api/test_contact_points.py +7 -9
  313. udata/tests/api/test_dataservices_api.py +211 -158
  314. udata/tests/api/test_datasets_api.py +823 -812
  315. udata/tests/api/test_follow_api.py +13 -15
  316. udata/tests/api/test_me_api.py +95 -112
  317. udata/tests/api/test_organizations_api.py +301 -339
  318. udata/tests/api/test_reports_api.py +35 -25
  319. udata/tests/api/test_reuses_api.py +134 -139
  320. udata/tests/api/test_swagger.py +5 -5
  321. udata/tests/api/test_tags_api.py +18 -25
  322. udata/tests/api/test_topics_api.py +94 -94
  323. udata/tests/api/test_transfer_api.py +53 -48
  324. udata/tests/api/test_user_api.py +128 -141
  325. udata/tests/apiv2/test_datasets.py +290 -198
  326. udata/tests/apiv2/test_me_api.py +10 -11
  327. udata/tests/apiv2/test_organizations.py +56 -74
  328. udata/tests/apiv2/test_swagger.py +5 -5
  329. udata/tests/apiv2/test_topics.py +69 -87
  330. udata/tests/cli/test_cli_base.py +8 -8
  331. udata/tests/cli/test_db_cli.py +21 -19
  332. udata/tests/dataservice/test_dataservice_tasks.py +8 -12
  333. udata/tests/dataset/test_csv_adapter.py +44 -35
  334. udata/tests/dataset/test_dataset_actions.py +2 -3
  335. udata/tests/dataset/test_dataset_commands.py +7 -8
  336. udata/tests/dataset/test_dataset_events.py +36 -29
  337. udata/tests/dataset/test_dataset_model.py +224 -217
  338. udata/tests/dataset/test_dataset_rdf.py +142 -131
  339. udata/tests/dataset/test_dataset_tasks.py +15 -15
  340. udata/tests/dataset/test_resource_preview.py +10 -13
  341. udata/tests/features/territories/__init__.py +9 -13
  342. udata/tests/features/territories/test_territories_api.py +71 -91
  343. udata/tests/forms/test_basic_fields.py +7 -7
  344. udata/tests/forms/test_current_user_field.py +39 -66
  345. udata/tests/forms/test_daterange_field.py +31 -39
  346. udata/tests/forms/test_dict_field.py +28 -26
  347. udata/tests/forms/test_extras_fields.py +102 -76
  348. udata/tests/forms/test_form_field.py +8 -8
  349. udata/tests/forms/test_image_field.py +33 -26
  350. udata/tests/forms/test_model_field.py +134 -123
  351. udata/tests/forms/test_model_list_field.py +7 -7
  352. udata/tests/forms/test_nested_model_list_field.py +117 -79
  353. udata/tests/forms/test_publish_as_field.py +36 -65
  354. udata/tests/forms/test_reference_field.py +34 -53
  355. udata/tests/forms/test_user_forms.py +23 -21
  356. udata/tests/forms/test_uuid_field.py +6 -10
  357. udata/tests/frontend/__init__.py +9 -6
  358. udata/tests/frontend/test_auth.py +7 -6
  359. udata/tests/frontend/test_csv.py +81 -96
  360. udata/tests/frontend/test_hooks.py +43 -43
  361. udata/tests/frontend/test_markdown.py +211 -191
  362. udata/tests/helpers.py +32 -37
  363. udata/tests/models.py +2 -2
  364. udata/tests/organization/test_csv_adapter.py +21 -16
  365. udata/tests/organization/test_notifications.py +11 -18
  366. udata/tests/organization/test_organization_model.py +13 -13
  367. udata/tests/organization/test_organization_rdf.py +29 -22
  368. udata/tests/organization/test_organization_tasks.py +16 -17
  369. udata/tests/plugin.py +79 -73
  370. udata/tests/reuse/test_reuse_model.py +21 -21
  371. udata/tests/reuse/test_reuse_task.py +11 -13
  372. udata/tests/search/__init__.py +11 -12
  373. udata/tests/search/test_adapter.py +60 -70
  374. udata/tests/search/test_query.py +16 -16
  375. udata/tests/search/test_results.py +10 -7
  376. udata/tests/site/test_site_api.py +11 -16
  377. udata/tests/site/test_site_metrics.py +20 -30
  378. udata/tests/site/test_site_model.py +4 -5
  379. udata/tests/site/test_site_rdf.py +94 -78
  380. udata/tests/test_activity.py +17 -17
  381. udata/tests/test_cors.py +62 -0
  382. udata/tests/test_discussions.py +292 -299
  383. udata/tests/test_i18n.py +37 -40
  384. udata/tests/test_linkchecker.py +91 -85
  385. udata/tests/test_mail.py +13 -17
  386. udata/tests/test_migrations.py +219 -180
  387. udata/tests/test_model.py +164 -157
  388. udata/tests/test_notifications.py +17 -17
  389. udata/tests/test_owned.py +14 -14
  390. udata/tests/test_rdf.py +25 -23
  391. udata/tests/test_routing.py +89 -93
  392. udata/tests/test_storages.py +137 -128
  393. udata/tests/test_tags.py +44 -46
  394. udata/tests/test_topics.py +7 -7
  395. udata/tests/test_transfer.py +42 -49
  396. udata/tests/test_uris.py +160 -161
  397. udata/tests/test_utils.py +79 -71
  398. udata/tests/user/test_user_rdf.py +5 -9
  399. udata/tests/workers/test_jobs_commands.py +57 -58
  400. udata/tests/workers/test_tasks_routing.py +23 -29
  401. udata/tests/workers/test_workers_api.py +125 -131
  402. udata/tests/workers/test_workers_helpers.py +6 -6
  403. udata/tracking.py +4 -6
  404. udata/uris.py +45 -46
  405. udata/utils.py +68 -66
  406. udata/wsgi.py +1 -1
  407. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/METADATA +7 -3
  408. udata-9.1.2.dev30454.dist-info/RECORD +706 -0
  409. udata-9.1.2.dev30355.dist-info/RECORD +0 -704
  410. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/LICENSE +0 -0
  411. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/WHEEL +0 -0
  412. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/entry_points.txt +0 -0
  413. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30454.dist-info}/top_level.txt +0 -0
@@ -68,7 +68,7 @@ class NestedModelListFieldTest(TestCase):
68
68
 
69
69
  def test_with_one_valid_data(self):
70
70
  fake = Fake()
71
- form = self.factory(MultiDict({'nested-0-name': 'John Doe'}))
71
+ form = self.factory(MultiDict({"nested-0-name": "John Doe"}))
72
72
 
73
73
  form.validate()
74
74
  self.assertEqual(form.errors, {})
@@ -77,11 +77,11 @@ class NestedModelListFieldTest(TestCase):
77
77
 
78
78
  self.assertEqual(len(fake.nested), 1)
79
79
  self.assertIsInstance(fake.nested[0], Nested)
80
- self.assertEqual(fake.nested[0].name, 'John Doe')
80
+ self.assertEqual(fake.nested[0].name, "John Doe")
81
81
 
82
82
  def test_with_one_valid_json(self):
83
83
  fake = Fake()
84
- form = self.factory({'nested': [{'name': 'John Doe'}]})
84
+ form = self.factory({"nested": [{"name": "John Doe"}]})
85
85
 
86
86
  form.validate()
87
87
  self.assertEqual(form.errors, {})
@@ -90,15 +90,19 @@ class NestedModelListFieldTest(TestCase):
90
90
 
91
91
  self.assertEqual(len(fake.nested), 1)
92
92
  self.assertIsInstance(fake.nested[0], Nested)
93
- self.assertEqual(fake.nested[0].name, 'John Doe')
93
+ self.assertEqual(fake.nested[0].name, "John Doe")
94
94
 
95
95
  def test_with_multiple_valid_data(self):
96
96
  fake = Fake()
97
- form = self.factory(MultiDict([
98
- ('nested-0-name', faker.name()),
99
- ('nested-1-name', faker.name()),
100
- ('nested-2-name', faker.name()),
101
- ]))
97
+ form = self.factory(
98
+ MultiDict(
99
+ [
100
+ ("nested-0-name", faker.name()),
101
+ ("nested-1-name", faker.name()),
102
+ ("nested-2-name", faker.name()),
103
+ ]
104
+ )
105
+ )
102
106
 
103
107
  form.validate()
104
108
  self.assertEqual(form.errors, {})
@@ -111,11 +115,15 @@ class NestedModelListFieldTest(TestCase):
111
115
 
112
116
  def test_with_multiple_valid_json(self):
113
117
  fake = Fake()
114
- form = self.factory({'nested': [
115
- {'name': faker.name()},
116
- {'name': faker.name()},
117
- {'name': faker.name()},
118
- ]})
118
+ form = self.factory(
119
+ {
120
+ "nested": [
121
+ {"name": faker.name()},
122
+ {"name": faker.name()},
123
+ {"name": faker.name()},
124
+ ]
125
+ }
126
+ )
119
127
 
120
128
  form.validate()
121
129
  self.assertEqual(form.errors, {})
@@ -127,16 +135,23 @@ class NestedModelListFieldTest(TestCase):
127
135
  self.assertIsInstance(nested, Nested)
128
136
 
129
137
  def test_with_initial_elements(self):
130
- fake = Fake.objects.create(nested=[
131
- Nested(name=faker.name()),
132
- Nested(name=faker.name()),
133
- ])
138
+ fake = Fake.objects.create(
139
+ nested=[
140
+ Nested(name=faker.name()),
141
+ Nested(name=faker.name()),
142
+ ]
143
+ )
134
144
  order = [n.id for n in fake.nested]
135
- form = self.factory({'nested': [
136
- {'id': str(fake.nested[0].id)},
137
- {'id': str(fake.nested[1].id)},
138
- {'name': faker.name()},
139
- ]}, fake)
145
+ form = self.factory(
146
+ {
147
+ "nested": [
148
+ {"id": str(fake.nested[0].id)},
149
+ {"id": str(fake.nested[1].id)},
150
+ {"name": faker.name()},
151
+ ]
152
+ },
153
+ fake,
154
+ )
140
155
 
141
156
  form.validate()
142
157
  self.assertEqual(form.errors, {})
@@ -149,17 +164,19 @@ class NestedModelListFieldTest(TestCase):
149
164
  self.assertIsNotNone(fake.nested[2].id)
150
165
 
151
166
  def test_with_nested_initial_elements(self):
152
- fake = Fake.objects.create(nested=[
153
- Nested(name=faker.name(), sub=SubNested(name=faker.word())),
154
- Nested(name=faker.name(), sub=SubNested(name=faker.word())),
155
- ])
167
+ fake = Fake.objects.create(
168
+ nested=[
169
+ Nested(name=faker.name(), sub=SubNested(name=faker.word())),
170
+ Nested(name=faker.name(), sub=SubNested(name=faker.word())),
171
+ ]
172
+ )
156
173
  order = [n.id for n in fake.nested]
157
174
  data = [
158
- {'id': str(fake.nested[0].id)},
159
- {'id': str(fake.nested[1].id)},
160
- {'name': faker.name(), 'sub': {'name': faker.name()}},
175
+ {"id": str(fake.nested[0].id)},
176
+ {"id": str(fake.nested[1].id)},
177
+ {"name": faker.name(), "sub": {"name": faker.name()}},
161
178
  ]
162
- form = self.factory({'nested': data}, fake, sub=True)
179
+ form = self.factory({"nested": data}, fake, sub=True)
163
180
 
164
181
  form.validate()
165
182
  self.assertEqual(form.errors, {})
@@ -173,19 +190,26 @@ class NestedModelListFieldTest(TestCase):
173
190
  self.assertIsNotNone(nested.sub)
174
191
  self.assertIsNotNone(nested.sub.name)
175
192
  self.assertIsNotNone(fake.nested[2].id)
176
- self.assertEqual(fake.nested[2].sub.name, data[2]['sub']['name'])
193
+ self.assertEqual(fake.nested[2].sub.name, data[2]["sub"]["name"])
177
194
 
178
195
  def test_with_initial_elements_as_ids(self):
179
- fake = Fake.objects.create(nested=[
180
- Nested(name=faker.name()),
181
- Nested(name=faker.name()),
182
- ])
196
+ fake = Fake.objects.create(
197
+ nested=[
198
+ Nested(name=faker.name()),
199
+ Nested(name=faker.name()),
200
+ ]
201
+ )
183
202
  order = [n.id for n in fake.nested]
184
- form = self.factory({'nested': [
185
- str(fake.nested[0].id),
186
- str(fake.nested[1].id),
187
- {'name': faker.name()},
188
- ]}, fake)
203
+ form = self.factory(
204
+ {
205
+ "nested": [
206
+ str(fake.nested[0].id),
207
+ str(fake.nested[1].id),
208
+ {"name": faker.name()},
209
+ ]
210
+ },
211
+ fake,
212
+ )
189
213
 
190
214
  form.validate()
191
215
  self.assertEqual(form.errors, {})
@@ -198,12 +222,14 @@ class NestedModelListFieldTest(TestCase):
198
222
  self.assertIsNotNone(fake.nested[2].id)
199
223
 
200
224
  def test_with_non_submitted_initial_elements(self):
201
- fake = Fake.objects.create(nested=[
202
- Nested(name=faker.name()),
203
- Nested(name=faker.name()),
204
- ])
225
+ fake = Fake.objects.create(
226
+ nested=[
227
+ Nested(name=faker.name()),
228
+ Nested(name=faker.name()),
229
+ ]
230
+ )
205
231
  initial = [(n.id, n.name) for n in fake.nested]
206
- form = self.factory({'name': faker.word()}, fake)
232
+ form = self.factory({"name": faker.word()}, fake)
207
233
 
208
234
  form.validate()
209
235
  self.assertEqual(form.errors, {})
@@ -217,17 +243,24 @@ class NestedModelListFieldTest(TestCase):
217
243
  self.assertEqual(nested.name, name)
218
244
 
219
245
  def test_update_initial_elements(self):
220
- fake = Fake.objects.create(nested=[
221
- Nested(name=faker.name()),
222
- Nested(name=faker.name()),
223
- ])
246
+ fake = Fake.objects.create(
247
+ nested=[
248
+ Nested(name=faker.name()),
249
+ Nested(name=faker.name()),
250
+ ]
251
+ )
224
252
  initial = [n.id for n in fake.nested]
225
- form = self.factory({'nested': [
226
- {'id': str(fake.nested[0].id), 'name': faker.name()},
227
- {'id': str(fake.nested[1].id), 'name': faker.name()},
228
- {'name': faker.name()},
229
- ]}, fake)
230
- names = [n['name'] for n in form.data['nested']]
253
+ form = self.factory(
254
+ {
255
+ "nested": [
256
+ {"id": str(fake.nested[0].id), "name": faker.name()},
257
+ {"id": str(fake.nested[1].id), "name": faker.name()},
258
+ {"name": faker.name()},
259
+ ]
260
+ },
261
+ fake,
262
+ )
263
+ names = [n["name"] for n in form.data["nested"]]
231
264
 
232
265
  form.validate()
233
266
  self.assertEqual(form.errors, {})
@@ -242,10 +275,15 @@ class NestedModelListFieldTest(TestCase):
242
275
  self.assertIsNotNone(fake.nested[2].id)
243
276
 
244
277
  def test_non_submitted_subnested(self):
245
- form = self.factory({'nested': [
246
- {'name': faker.name()},
247
- {'name': faker.name(), 'sub': {'name': faker.name()}},
248
- ]}, sub=True)
278
+ form = self.factory(
279
+ {
280
+ "nested": [
281
+ {"name": faker.name()},
282
+ {"name": faker.name(), "sub": {"name": faker.name()}},
283
+ ]
284
+ },
285
+ sub=True,
286
+ )
249
287
 
250
288
  form.validate()
251
289
  self.assertEqual(form.errors, {})
@@ -257,17 +295,17 @@ class NestedModelListFieldTest(TestCase):
257
295
  self.assertIsNotNone(fake.nested[1].sub)
258
296
 
259
297
  def test_reorder_initial_elements(self):
260
- fake = Fake.objects.create(nested=[
261
- Nested(name=faker.name()),
262
- Nested(name=faker.name()),
263
- Nested(name=faker.name()),
264
- Nested(name=faker.name()),
265
- ])
298
+ fake = Fake.objects.create(
299
+ nested=[
300
+ Nested(name=faker.name()),
301
+ Nested(name=faker.name()),
302
+ Nested(name=faker.name()),
303
+ Nested(name=faker.name()),
304
+ ]
305
+ )
266
306
  initial = [(n.id, n.name) for n in fake.nested]
267
307
  new_order = [1, 2, 3, 0]
268
- form = self.factory({'nested': [
269
- {'id': str(fake.nested[i].id)} for i in new_order
270
- ]}, fake)
308
+ form = self.factory({"nested": [{"id": str(fake.nested[i].id)} for i in new_order]}, fake)
271
309
 
272
310
  form.validate()
273
311
  self.assertEqual(form.errors, {})
@@ -281,18 +319,18 @@ class NestedModelListFieldTest(TestCase):
281
319
  self.assertEqual(nested.name, name)
282
320
 
283
321
  def test_reorder_initial_elements_with_raw(self):
284
- fake = Fake.objects.create(nested=[
285
- Nested(name=faker.name(), raw={'test': 0}),
286
- Nested(name=faker.name(), raw={'test': 1}),
287
- Nested(name=faker.name(), raw={'test': 2}),
288
- Nested(name=faker.name(), raw={'test': 3}),
289
- ])
322
+ fake = Fake.objects.create(
323
+ nested=[
324
+ Nested(name=faker.name(), raw={"test": 0}),
325
+ Nested(name=faker.name(), raw={"test": 1}),
326
+ Nested(name=faker.name(), raw={"test": 2}),
327
+ Nested(name=faker.name(), raw={"test": 3}),
328
+ ]
329
+ )
290
330
  initial = [(n.id, n.name) for n in fake.nested]
291
331
 
292
332
  new_order = [1, 2, 3, 0]
293
- form = self.factory({'nested': [
294
- {'id': str(fake.nested[i].id)} for i in new_order
295
- ]}, fake)
333
+ form = self.factory({"nested": [{"id": str(fake.nested[i].id)} for i in new_order]}, fake)
296
334
 
297
335
  form.validate()
298
336
  self.assertEqual(form.errors, {})
@@ -304,4 +342,4 @@ class NestedModelListFieldTest(TestCase):
304
342
  id, name = initial[old_idx]
305
343
  self.assertEqual(nested.id, id)
306
344
  self.assertEqual(nested.name, name)
307
- self.assertEqual(nested.raw['test'], old_idx)
345
+ self.assertEqual(nested.raw["test"], old_idx)
@@ -1,12 +1,11 @@
1
1
  from bson import ObjectId
2
-
3
2
  from werkzeug.datastructures import MultiDict
4
3
 
5
4
  from udata.auth import login_user
6
- from udata.core.user.factories import UserFactory, AdminFactory
7
5
  from udata.core.organization.factories import OrganizationFactory
6
+ from udata.core.user.factories import AdminFactory, UserFactory
8
7
  from udata.forms import ModelForm, fields
9
- from udata.models import db, User, Organization, Member
8
+ from udata.models import Member, Organization, User, db
10
9
  from udata.tests import TestCase
11
10
 
12
11
 
@@ -86,14 +85,12 @@ class PublishFieldTest(TestCase):
86
85
  def test_with_valid_organization(self):
87
86
  Ownable, OwnableForm = self.factory()
88
87
  user = UserFactory()
89
- member = Member(user=user, role='editor')
88
+ member = Member(user=user, role="editor")
90
89
  org = OrganizationFactory(members=[member])
91
90
 
92
91
  login_user(user)
93
92
 
94
- form = OwnableForm(MultiDict({
95
- 'organization': str(org.id)
96
- }))
93
+ form = OwnableForm(MultiDict({"organization": str(org.id)}))
97
94
 
98
95
  self.assertEqual(form.owner.data, user)
99
96
  self.assertEqual(form.organization.data, org)
@@ -112,15 +109,12 @@ class PublishFieldTest(TestCase):
112
109
  def test_organization_over_owner(self):
113
110
  Ownable, OwnableForm = self.factory()
114
111
  user = UserFactory()
115
- member = Member(user=user, role='editor')
112
+ member = Member(user=user, role="editor")
116
113
  org = OrganizationFactory(members=[member])
117
114
 
118
115
  login_user(user)
119
116
 
120
- form = OwnableForm(MultiDict({
121
- 'owner': str(user.id),
122
- 'organization': str(org.id)
123
- }))
117
+ form = OwnableForm(MultiDict({"owner": str(user.id), "organization": str(org.id)}))
124
118
 
125
119
  self.assertEqual(form.owner.data, user)
126
120
  self.assertEqual(form.organization.data, org)
@@ -139,14 +133,12 @@ class PublishFieldTest(TestCase):
139
133
  def test_with_valid_organization_from_json(self):
140
134
  Ownable, OwnableForm = self.factory()
141
135
  user = UserFactory()
142
- member = Member(user=user, role='editor')
136
+ member = Member(user=user, role="editor")
143
137
  org = OrganizationFactory(members=[member])
144
138
 
145
139
  login_user(user)
146
140
 
147
- form = OwnableForm.from_json({
148
- 'organization': str(org.id)
149
- })
141
+ form = OwnableForm.from_json({"organization": str(org.id)})
150
142
 
151
143
  self.assertEqual(form.owner.data, user)
152
144
  self.assertEqual(form.organization.data, org)
@@ -165,14 +157,12 @@ class PublishFieldTest(TestCase):
165
157
  def test_with_organization_object_from_json(self):
166
158
  Ownable, OwnableForm = self.factory()
167
159
  user = UserFactory()
168
- member = Member(user=user, role='editor')
160
+ member = Member(user=user, role="editor")
169
161
  org = OrganizationFactory(members=[member])
170
162
 
171
163
  login_user(user)
172
164
 
173
- form = OwnableForm.from_json({
174
- 'organization': {'id': str(org.id)}
175
- })
165
+ form = OwnableForm.from_json({"organization": {"id": str(org.id)}})
176
166
 
177
167
  self.assertEqual(form.organization.data, org)
178
168
 
@@ -187,36 +177,29 @@ class PublishFieldTest(TestCase):
187
177
  def test_with_invalid_data(self):
188
178
  Ownable, OwnableForm = self.factory()
189
179
 
190
- form = OwnableForm(MultiDict({
191
- 'organization': str('wrongwith12c')
192
- }))
180
+ form = OwnableForm(MultiDict({"organization": str("wrongwith12c")}))
193
181
 
194
182
  form.validate()
195
- self.assertIn('organization', form.errors)
196
- self.assertEqual(len(form.errors['organization']), 1)
183
+ self.assertIn("organization", form.errors)
184
+ self.assertEqual(len(form.errors["organization"]), 1)
197
185
 
198
186
  def test_with_organization_not_found(self):
199
187
  Ownable, OwnableForm = self.factory()
200
188
 
201
- form = OwnableForm(MultiDict({
202
- 'organization': str(ObjectId())
203
- }))
189
+ form = OwnableForm(MultiDict({"organization": str(ObjectId())}))
204
190
 
205
191
  form.validate()
206
- self.assertIn('organization', form.errors)
207
- self.assertEqual(len(form.errors['organization']), 1)
192
+ self.assertIn("organization", form.errors)
193
+ self.assertEqual(len(form.errors["organization"]), 1)
208
194
 
209
195
  def test_with_initial_and_both_member(self):
210
196
  Ownable, OwnableForm = self.factory()
211
197
  user = UserFactory()
212
- org = OrganizationFactory(members=[Member(user=user, role='editor')])
213
- neworg = OrganizationFactory(
214
- members=[Member(user=user, role='editor')])
198
+ org = OrganizationFactory(members=[Member(user=user, role="editor")])
199
+ neworg = OrganizationFactory(members=[Member(user=user, role="editor")])
215
200
  ownable = Ownable(organization=org)
216
201
 
217
- form = OwnableForm(MultiDict({
218
- 'organization': str(neworg.id)
219
- }), obj=ownable)
202
+ form = OwnableForm(MultiDict({"organization": str(neworg.id)}), obj=ownable)
220
203
 
221
204
  self.assertEqual(form.organization.data, neworg)
222
205
 
@@ -231,65 +214,57 @@ class PublishFieldTest(TestCase):
231
214
  def test_with_initial_and_not_member(self):
232
215
  Ownable, OwnableForm = self.factory()
233
216
  user = UserFactory()
234
- org = OrganizationFactory(members=[Member(user=user, role='editor')])
217
+ org = OrganizationFactory(members=[Member(user=user, role="editor")])
235
218
  neworg = OrganizationFactory()
236
219
  ownable = Ownable(organization=org)
237
220
 
238
- form = OwnableForm(MultiDict({
239
- 'organization': str(neworg.id)
240
- }), obj=ownable)
221
+ form = OwnableForm(MultiDict({"organization": str(neworg.id)}), obj=ownable)
241
222
 
242
223
  self.assertEqual(form.organization.data, neworg)
243
224
 
244
225
  login_user(user)
245
226
  form.validate()
246
- self.assertIn('organization', form.errors)
247
- self.assertEqual(len(form.errors['organization']), 1)
227
+ self.assertIn("organization", form.errors)
228
+ self.assertEqual(len(form.errors["organization"]), 1)
248
229
 
249
230
  def test_not_member(self):
250
231
  Ownable, OwnableForm = self.factory()
251
- member = Member(user=UserFactory(), role='editor')
232
+ member = Member(user=UserFactory(), role="editor")
252
233
  org = OrganizationFactory(members=[member])
253
234
 
254
235
  login_user(UserFactory())
255
236
 
256
- form = OwnableForm(MultiDict({
257
- 'organization': str(org.id)
258
- }))
237
+ form = OwnableForm(MultiDict({"organization": str(org.id)}))
259
238
 
260
239
  self.assertEqual(form.organization.data, org)
261
240
 
262
241
  self.assertFalse(form.validate())
263
- self.assertIn('organization', form.errors)
264
- self.assertEqual(len(form.errors['organization']), 1)
242
+ self.assertIn("organization", form.errors)
243
+ self.assertEqual(len(form.errors["organization"]), 1)
265
244
 
266
245
  def test_no_user_logged_in_permission(self):
267
246
  Ownable, OwnableForm = self.factory()
268
- member = Member(user=UserFactory(), role='editor')
247
+ member = Member(user=UserFactory(), role="editor")
269
248
  org = OrganizationFactory(members=[member])
270
249
 
271
- form = OwnableForm(MultiDict({
272
- 'organization': str(org.id)
273
- }))
250
+ form = OwnableForm(MultiDict({"organization": str(org.id)}))
274
251
 
275
252
  self.assertEqual(form.organization.data, org)
276
253
 
277
254
  self.assertFalse(form.validate())
278
- self.assertIn('organization', form.errors)
279
- self.assertEqual(len(form.errors['organization']), 1)
255
+ self.assertIn("organization", form.errors)
256
+ self.assertEqual(len(form.errors["organization"]), 1)
280
257
 
281
258
  def test_set_organization_if_permissions(self):
282
259
  Ownable, OwnableForm = self.factory()
283
260
  user = UserFactory()
284
- member = Member(user=user, role='editor')
261
+ member = Member(user=user, role="editor")
285
262
  org = OrganizationFactory(members=[member])
286
263
  ownable = Ownable(owner=user)
287
264
 
288
265
  login_user(user)
289
266
 
290
- form = OwnableForm(MultiDict({
291
- 'organization': str(org.id)
292
- }), obj=ownable)
267
+ form = OwnableForm(MultiDict({"organization": str(org.id)}), obj=ownable)
293
268
 
294
269
  self.assertTrue(form.validate())
295
270
  self.assertEqual(form.errors, {})
@@ -306,9 +281,7 @@ class PublishFieldTest(TestCase):
306
281
 
307
282
  login_user(AdminFactory())
308
283
 
309
- form = OwnableForm(MultiDict({
310
- 'owner': str(user.id)
311
- }), obj=ownable)
284
+ form = OwnableForm(MultiDict({"owner": str(user.id)}), obj=ownable)
312
285
 
313
286
  self.assertEqual(form.owner.data, user)
314
287
  self.assertEqual(form.organization.data, org)
@@ -331,9 +304,7 @@ class PublishFieldTest(TestCase):
331
304
 
332
305
  login_user(AdminFactory())
333
306
 
334
- form = OwnableForm(MultiDict({
335
- 'organization': str(org.id)
336
- }), obj=ownable)
307
+ form = OwnableForm(MultiDict({"organization": str(org.id)}), obj=ownable)
337
308
 
338
309
  self.assertEqual(form.owner.data, user)
339
310
  self.assertEqual(form.organization.data, org)
@@ -351,7 +322,7 @@ class PublishFieldTest(TestCase):
351
322
  def test_with_initial_org_and_no_data_provided(self):
352
323
  Ownable, OwnableForm = self.factory()
353
324
  user = UserFactory()
354
- org = OrganizationFactory(members=[Member(user=user, role='editor')])
325
+ org = OrganizationFactory(members=[Member(user=user, role="editor")])
355
326
  ownable = Ownable(organization=org)
356
327
 
357
328
  form = OwnableForm(MultiDict({}), obj=ownable)