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
@@ -1,15 +1,15 @@
1
1
  import datetime
2
- from bson import ObjectId
3
2
 
3
+ from bson import ObjectId
4
4
  from werkzeug.datastructures import MultiDict
5
5
 
6
6
  from udata.auth import login_user
7
7
  from udata.auth.forms import ExtendedLoginForm, ExtendedRegisterForm
8
- from udata.core.user.factories import UserFactory, AdminFactory
8
+ from udata.core.user.factories import AdminFactory, UserFactory
9
9
  from udata.forms import ModelForm, fields
10
10
  from udata.i18n import gettext as _
11
- from udata.models import db, User
12
- from udata.tests import TestCase, DBTestMixin
11
+ from udata.models import User, db
12
+ from udata.tests import DBTestMixin, TestCase
13
13
  from udata.tests.helpers import security_gettext
14
14
 
15
15
 
@@ -53,9 +53,7 @@ class CurrentUserFieldTest(TestCase, DBTestMixin):
53
53
 
54
54
  login_user(user)
55
55
 
56
- form = OwnableForm(MultiDict({
57
- 'owner': str(user.id)
58
- }))
56
+ form = OwnableForm(MultiDict({"owner": str(user.id)}))
59
57
 
60
58
  self.assertEqual(form.owner.data, user)
61
59
 
@@ -73,15 +71,13 @@ class CurrentUserFieldTest(TestCase, DBTestMixin):
73
71
 
74
72
  login_user(user)
75
73
 
76
- form = OwnableForm(MultiDict({
77
- 'owner': str(other.id)
78
- }))
74
+ form = OwnableForm(MultiDict({"owner": str(other.id)}))
79
75
 
80
76
  self.assertEqual(form.owner.data, other)
81
77
 
82
78
  form.validate()
83
- self.assertIn('owner', form.errors)
84
- self.assertEqual(len(form.errors['owner']), 1)
79
+ self.assertIn("owner", form.errors)
80
+ self.assertEqual(len(form.errors["owner"]), 1)
85
81
 
86
82
  def test_with_other_user_admin(self):
87
83
  Ownable, OwnableForm = self.factory()
@@ -90,9 +86,7 @@ class CurrentUserFieldTest(TestCase, DBTestMixin):
90
86
 
91
87
  login_user(admin)
92
88
 
93
- form = OwnableForm(MultiDict({
94
- 'owner': str(user.id)
95
- }))
89
+ form = OwnableForm(MultiDict({"owner": str(user.id)}))
96
90
 
97
91
  self.assertEqual(form.owner.data, user)
98
92
 
@@ -108,9 +102,7 @@ class CurrentUserFieldTest(TestCase, DBTestMixin):
108
102
  user = UserFactory()
109
103
  login_user(user)
110
104
 
111
- form = OwnableForm.from_json({
112
- 'owner': str(user.id)
113
- })
105
+ form = OwnableForm.from_json({"owner": str(user.id)})
114
106
 
115
107
  self.assertEqual(form.owner.data, user)
116
108
 
@@ -126,9 +118,7 @@ class CurrentUserFieldTest(TestCase, DBTestMixin):
126
118
  user = UserFactory()
127
119
  login_user(user)
128
120
 
129
- form = OwnableForm.from_json({
130
- 'owner': None
131
- })
121
+ form = OwnableForm.from_json({"owner": None})
132
122
 
133
123
  self.assertEqual(form.owner.data, user)
134
124
 
@@ -144,9 +134,7 @@ class CurrentUserFieldTest(TestCase, DBTestMixin):
144
134
  user = UserFactory()
145
135
  login_user(user)
146
136
 
147
- form = OwnableForm.from_json({
148
- 'owner': {'id': str(user.id)}
149
- })
137
+ form = OwnableForm.from_json({"owner": {"id": str(user.id)}})
150
138
 
151
139
  self.assertEqual(form.owner.data, user)
152
140
 
@@ -163,13 +151,11 @@ class CurrentUserFieldTest(TestCase, DBTestMixin):
163
151
 
164
152
  login_user(user)
165
153
 
166
- form = OwnableForm(MultiDict({
167
- 'owner': str('wrongwith12c')
168
- }))
154
+ form = OwnableForm(MultiDict({"owner": str("wrongwith12c")}))
169
155
 
170
156
  form.validate()
171
- self.assertIn('owner', form.errors)
172
- self.assertEqual(len(form.errors['owner']), 1)
157
+ self.assertIn("owner", form.errors)
158
+ self.assertEqual(len(form.errors["owner"]), 1)
173
159
 
174
160
  def test_with_user_not_found(self):
175
161
  Ownable, OwnableForm = self.factory()
@@ -177,72 +163,59 @@ class CurrentUserFieldTest(TestCase, DBTestMixin):
177
163
 
178
164
  login_user(user)
179
165
 
180
- form = OwnableForm(MultiDict({
181
- 'owner': str(ObjectId())
182
- }))
166
+ form = OwnableForm(MultiDict({"owner": str(ObjectId())}))
183
167
 
184
168
  form.validate()
185
- self.assertIn('owner', form.errors)
186
- self.assertEqual(len(form.errors['owner']), 1)
169
+ self.assertIn("owner", form.errors)
170
+ self.assertEqual(len(form.errors["owner"]), 1)
187
171
 
188
172
  def test_with_user_not_logged_found(self):
189
173
  Ownable, OwnableForm = self.factory()
190
174
  user = UserFactory()
191
175
 
192
- form = OwnableForm(MultiDict({
193
- 'owner': str(user.id)
194
- }))
176
+ form = OwnableForm(MultiDict({"owner": str(user.id)}))
195
177
 
196
178
  form.validate()
197
- self.assertIn('owner', form.errors)
198
- self.assertEqual(len(form.errors['owner']), 1)
179
+ self.assertIn("owner", form.errors)
180
+ self.assertEqual(len(form.errors["owner"]), 1)
199
181
 
200
182
  def test_password_rotation(self):
201
183
  today = datetime.datetime.utcnow()
202
184
  user = UserFactory(
203
- password='password',
204
- password_rotation_demanded=today,
205
- confirmed_at=today
185
+ password="password", password_rotation_demanded=today, confirmed_at=today
206
186
  )
207
187
 
208
- form = ExtendedLoginForm.from_json({
209
- 'email': user.email,
210
- 'password': 'password'
211
- })
188
+ form = ExtendedLoginForm.from_json({"email": user.email, "password": "password"})
212
189
 
213
190
  form.validate()
214
191
 
215
- self.assertIn(_('Password must be changed for security reasons'), form.errors['password'])
192
+ self.assertIn(_("Password must be changed for security reasons"), form.errors["password"])
216
193
 
217
194
  def test_user_without_password(self):
218
195
  user = UserFactory(password=None)
219
196
 
220
- form = ExtendedLoginForm.from_json({
221
- 'email': user.email,
222
- 'password': ''
223
- })
197
+ form = ExtendedLoginForm.from_json({"email": user.email, "password": ""})
224
198
 
225
199
  form.validate()
226
200
 
227
- self.assertIn(security_gettext('Password not provided'), form.errors['password'])
201
+ self.assertIn(security_gettext("Password not provided"), form.errors["password"])
228
202
 
229
203
  def test_email_validation(self):
230
- self.app.config['SECURITY_EMAIL_VALIDATOR_ARGS'] = None
231
- form = ExtendedRegisterForm.from_json({
232
- 'email': 'a@test.notreal',
233
- 'password': 'passpass',
234
- 'password_confirm': 'passpass',
235
- 'first_name': 'azeaezr',
236
- 'last_name': 'azeaze',
237
- })
204
+ self.app.config["SECURITY_EMAIL_VALIDATOR_ARGS"] = None
205
+ form = ExtendedRegisterForm.from_json(
206
+ {
207
+ "email": "a@test.notreal",
208
+ "password": "passpass",
209
+ "password_confirm": "passpass",
210
+ "first_name": "azeaezr",
211
+ "last_name": "azeaze",
212
+ }
213
+ )
238
214
  form.validate()
239
- self.assertIn(security_gettext('Invalid email address'), form.errors['email'])
215
+ self.assertIn(security_gettext("Invalid email address"), form.errors["email"])
240
216
 
241
217
  today = datetime.datetime.utcnow()
242
- user = UserFactory(email='b@fake.com', password='password', confirmed_at=today)
243
- form = ExtendedLoginForm.from_json({
244
- 'email': user.email,
245
- 'password': 'password'
246
- })
218
+ user = UserFactory(email="b@fake.com", password="password", confirmed_at=today)
219
+ form = ExtendedLoginForm.from_json({"email": user.email, "password": "password"})
247
220
  form.validate()
248
221
  assert not form.errors
@@ -22,7 +22,7 @@ class DateRangeFieldTest(TestCase):
22
22
  Fake, FakeForm = self.factory()
23
23
 
24
24
  form = FakeForm()
25
- self.assertEqual(form.daterange._value(), '')
25
+ self.assertEqual(form.daterange._value(), "")
26
26
  self.assertEqual(form.daterange.data, None)
27
27
 
28
28
  fake = Fake()
@@ -31,24 +31,21 @@ class DateRangeFieldTest(TestCase):
31
31
 
32
32
  def test_initial_values(self):
33
33
  Fake, FakeForm = self.factory()
34
- dr = db.DateRange(start=date.today() - timedelta(days=1),
35
- end=date.today())
34
+ dr = db.DateRange(start=date.today() - timedelta(days=1), end=date.today())
36
35
 
37
36
  fake = Fake(daterange=dr)
38
37
  form = FakeForm(None, obj=fake)
39
- expected = ' - '.join([to_iso_date(dr.start), to_iso_date(dr.end)])
38
+ expected = " - ".join([to_iso_date(dr.start), to_iso_date(dr.end)])
40
39
  self.assertEqual(form.daterange._value(), expected)
41
40
 
42
41
  def test_with_valid_dates(self):
43
42
  Fake, FakeForm = self.factory()
44
43
  start = date.today() - timedelta(days=1)
45
44
  end = date.today()
46
- expected = ' - '.join([to_iso_date(start), to_iso_date(end)])
45
+ expected = " - ".join([to_iso_date(start), to_iso_date(end)])
47
46
 
48
47
  fake = Fake()
49
- form = FakeForm(MultiDict({
50
- 'daterange': expected
51
- }))
48
+ form = FakeForm(MultiDict({"daterange": expected}))
52
49
 
53
50
  form.validate()
54
51
  self.assertEqual(form.errors, {})
@@ -63,12 +60,14 @@ class DateRangeFieldTest(TestCase):
63
60
  end = date.today()
64
61
 
65
62
  fake = Fake()
66
- form = FakeForm.from_json({
67
- 'daterange': {
68
- 'start': to_iso_date(start),
69
- 'end': to_iso_date(end),
63
+ form = FakeForm.from_json(
64
+ {
65
+ "daterange": {
66
+ "start": to_iso_date(start),
67
+ "end": to_iso_date(end),
68
+ }
70
69
  }
71
- })
70
+ )
72
71
 
73
72
  form.validate()
74
73
  self.assertEqual(form.errors, {})
@@ -80,54 +79,47 @@ class DateRangeFieldTest(TestCase):
80
79
  def test_with_invalid_dates(self):
81
80
  Fake, FakeForm = self.factory()
82
81
 
83
- form = FakeForm(MultiDict({
84
- 'daterange': 'XXX - ZZZ'
85
- }))
82
+ form = FakeForm(MultiDict({"daterange": "XXX - ZZZ"}))
86
83
 
87
84
  form.validate()
88
- self.assertIn('daterange', form.errors)
89
- self.assertEqual(len(form.errors['daterange']), 1)
85
+ self.assertIn("daterange", form.errors)
86
+ self.assertEqual(len(form.errors["daterange"]), 1)
90
87
 
91
88
  def test_with_invalid_format(self):
92
89
  Fake, FakeForm = self.factory()
93
90
  start = date.today() - timedelta(days=1)
94
91
  end = date.today()
95
- wrong = ' xx '.join([to_iso_date(start), to_iso_date(end)])
92
+ wrong = " xx ".join([to_iso_date(start), to_iso_date(end)])
96
93
 
97
- form = FakeForm(MultiDict({
98
- 'daterange': wrong
99
- }))
94
+ form = FakeForm(MultiDict({"daterange": wrong}))
100
95
 
101
96
  form.validate()
102
- self.assertIn('daterange', form.errors)
103
- self.assertEqual(len(form.errors['daterange']), 1)
97
+ self.assertIn("daterange", form.errors)
98
+ self.assertEqual(len(form.errors["daterange"]), 1)
104
99
 
105
100
  def test_with_invalid_dates_from_json(self):
106
101
  Fake, FakeForm = self.factory()
107
102
 
108
- form = FakeForm.from_json({
109
- 'daterange': {
110
- 'start': 'XXX',
111
- 'end': 'ZZZ'
112
- }
113
- })
103
+ form = FakeForm.from_json({"daterange": {"start": "XXX", "end": "ZZZ"}})
114
104
 
115
105
  form.validate()
116
- self.assertIn('daterange', form.errors)
117
- self.assertEqual(len(form.errors['daterange']), 1)
106
+ self.assertIn("daterange", form.errors)
107
+ self.assertEqual(len(form.errors["daterange"]), 1)
118
108
 
119
109
  def test_with_invalid_json_format(self):
120
110
  Fake, FakeForm = self.factory()
121
111
  start = date.today() - timedelta(days=1)
122
112
  end = date.today()
123
113
 
124
- form = FakeForm.from_json({
125
- 'daterange': {
126
- 'a': to_iso_date(start),
127
- 'b': to_iso_date(end),
114
+ form = FakeForm.from_json(
115
+ {
116
+ "daterange": {
117
+ "a": to_iso_date(start),
118
+ "b": to_iso_date(end),
119
+ }
128
120
  }
129
- })
121
+ )
130
122
 
131
123
  form.validate()
132
- self.assertIn('daterange', form.errors)
133
- self.assertEqual(len(form.errors['daterange']), 1)
124
+ self.assertIn("daterange", form.errors)
125
+ self.assertEqual(len(form.errors["daterange"]), 1)
@@ -1,19 +1,15 @@
1
- import pytest
2
-
3
1
  from datetime import date, datetime
4
2
 
3
+ import pytest
5
4
  from werkzeug.datastructures import MultiDict
6
5
 
7
- from udata.forms import fields, ModelForm
6
+ from udata.forms import ModelForm, fields
8
7
  from udata.mongo import db
9
8
 
10
- pytestmark = [
11
- pytest.mark.usefixtures('app')
12
- ]
9
+ pytestmark = [pytest.mark.usefixtures("app")]
13
10
 
14
11
 
15
12
  class DictFieldTest:
16
-
17
13
  def factory(self):
18
14
  class Fake(db.Document):
19
15
  raw = db.DictField()
@@ -40,15 +36,21 @@ class DictFieldTest:
40
36
  today = date.today()
41
37
 
42
38
  fake = Fake()
43
- form = FakeForm(MultiDict({'raw': {
44
- 'integer': 42,
45
- 'float': 42.0,
46
- 'string': 'value',
47
- 'datetime': now,
48
- 'date': today,
49
- 'bool': True,
50
- 'dict': {'key': 'value'}
51
- }}))
39
+ form = FakeForm(
40
+ MultiDict(
41
+ {
42
+ "raw": {
43
+ "integer": 42,
44
+ "float": 42.0,
45
+ "string": "value",
46
+ "datetime": now,
47
+ "date": today,
48
+ "bool": True,
49
+ "dict": {"key": "value"},
50
+ }
51
+ }
52
+ )
53
+ )
52
54
 
53
55
  form.validate()
54
56
  assert form.errors == {}
@@ -56,20 +58,20 @@ class DictFieldTest:
56
58
  form.populate_obj(fake)
57
59
 
58
60
  assert fake.raw == {
59
- 'integer': 42,
60
- 'float': 42.0,
61
- 'string': 'value',
62
- 'datetime': now,
63
- 'date': today,
64
- 'bool': True,
65
- 'dict': {'key': 'value'}
61
+ "integer": 42,
62
+ "float": 42.0,
63
+ "string": "value",
64
+ "datetime": now,
65
+ "date": today,
66
+ "bool": True,
67
+ "dict": {"key": "value"},
66
68
  }
67
69
 
68
70
  def test_with_invalid_data(self):
69
71
  Fake, FakeForm = self.factory()
70
72
 
71
- form = FakeForm(MultiDict({'raw': 42}))
73
+ form = FakeForm(MultiDict({"raw": 42}))
72
74
 
73
75
  form.validate()
74
- assert 'raw' in form.errors
75
- assert len(form.errors['raw']) == 1
76
+ assert "raw" in form.errors
77
+ assert len(form.errors["raw"]) == 1
@@ -1,20 +1,16 @@
1
- import pytest
2
-
3
1
  from datetime import date, datetime
4
2
  from uuid import UUID
5
3
 
4
+ import pytest
6
5
  from werkzeug.datastructures import MultiDict
7
6
 
8
- from udata.forms import fields, ModelForm
7
+ from udata.forms import ModelForm, fields
9
8
  from udata.mongo import db
10
9
 
11
- pytestmark = [
12
- pytest.mark.usefixtures('app')
13
- ]
10
+ pytestmark = [pytest.mark.usefixtures("app")]
14
11
 
15
12
 
16
13
  class ExtrasFieldTest:
17
-
18
14
  def factory(self):
19
15
  class Fake(db.Document):
20
16
  extras = db.ExtrasField()
@@ -41,19 +37,25 @@ class ExtrasFieldTest:
41
37
  today = date.today()
42
38
 
43
39
  fake = Fake()
44
- form = FakeForm(MultiDict({'extras': {
45
- 'integer': 42,
46
- 'float': 42.0,
47
- 'string': 'value',
48
- 'datetime': now,
49
- 'date': today,
50
- 'bool': True,
51
- 'dict': {
52
- 'integer': 42,
53
- 'float': 42.0,
54
- 'string': 'value',
55
- }
56
- }}))
40
+ form = FakeForm(
41
+ MultiDict(
42
+ {
43
+ "extras": {
44
+ "integer": 42,
45
+ "float": 42.0,
46
+ "string": "value",
47
+ "datetime": now,
48
+ "date": today,
49
+ "bool": True,
50
+ "dict": {
51
+ "integer": 42,
52
+ "float": 42.0,
53
+ "string": "value",
54
+ },
55
+ }
56
+ }
57
+ )
58
+ )
57
59
 
58
60
  form.validate()
59
61
  assert form.errors == {}
@@ -61,24 +63,24 @@ class ExtrasFieldTest:
61
63
  form.populate_obj(fake)
62
64
 
63
65
  assert fake.extras == {
64
- 'integer': 42,
65
- 'float': 42.0,
66
- 'string': 'value',
67
- 'datetime': now,
68
- 'date': today,
69
- 'bool': True,
70
- 'dict': {
71
- 'integer': 42,
72
- 'float': 42.0,
73
- 'string': 'value',
74
- }
66
+ "integer": 42,
67
+ "float": 42.0,
68
+ "string": "value",
69
+ "datetime": now,
70
+ "date": today,
71
+ "bool": True,
72
+ "dict": {
73
+ "integer": 42,
74
+ "float": 42.0,
75
+ "string": "value",
76
+ },
75
77
  }
76
78
 
77
79
  def test_with_null_data(self):
78
80
  Fake, FakeForm = self.factory()
79
81
 
80
82
  fake = Fake()
81
- form = FakeForm(MultiDict({'extras': None}))
83
+ form = FakeForm(MultiDict({"extras": None}))
82
84
 
83
85
  form.validate()
84
86
  assert form.errors == {}
@@ -89,77 +91,101 @@ class ExtrasFieldTest:
89
91
  def test_with_valid_registered_data(self):
90
92
  Fake, FakeForm = self.factory()
91
93
 
92
- @Fake.extras('dict')
94
+ @Fake.extras("dict")
93
95
  class Custom(db.DictField):
94
96
  pass
95
97
 
96
98
  fake = Fake()
97
- form = FakeForm(MultiDict({'extras': {
98
- 'dict': {
99
- 'integer': 42,
100
- 'float': 42.0,
101
- 'string': 'value',
102
- }
103
- }}))
99
+ form = FakeForm(
100
+ MultiDict(
101
+ {
102
+ "extras": {
103
+ "dict": {
104
+ "integer": 42,
105
+ "float": 42.0,
106
+ "string": "value",
107
+ }
108
+ }
109
+ }
110
+ )
111
+ )
104
112
 
105
113
  form.validate()
106
114
  assert form.errors == {}
107
115
 
108
116
  form.populate_obj(fake)
109
117
  assert fake.extras == {
110
- 'dict': {
111
- 'integer': 42,
112
- 'float': 42.0,
113
- 'string': 'value',
118
+ "dict": {
119
+ "integer": 42,
120
+ "float": 42.0,
121
+ "string": "value",
114
122
  }
115
123
  }
116
124
 
117
- @pytest.mark.parametrize('dbfield,value,type,expected', [
118
- pytest.param(*p, id=p[0].__name__) for p in [
119
- (db.DateTimeField, '2018-05-29T13:15:04.397603', datetime,
120
- datetime(2018, 5, 29, 13, 15, 4, 397603)),
121
- (db.DateField, '2018-05-29', date, date(2018, 5, 29)),
122
- (db.BooleanField, 'true', bool, True),
123
- (db.IntField, 42, int, 42),
124
- (db.StringField, '42', str, '42'),
125
- (db.FloatField, '42.0', float, 42.0),
126
- (db.URLField, 'http://test.com', str, 'http://test.com'),
127
- (db.UUIDField, 'e3b06d6d-90c0-4407-adc0-de81d327f181', UUID,
128
- UUID('e3b06d6d-90c0-4407-adc0-de81d327f181')),
129
- ]])
125
+ @pytest.mark.parametrize(
126
+ "dbfield,value,type,expected",
127
+ [
128
+ pytest.param(*p, id=p[0].__name__)
129
+ for p in [
130
+ (
131
+ db.DateTimeField,
132
+ "2018-05-29T13:15:04.397603",
133
+ datetime,
134
+ datetime(2018, 5, 29, 13, 15, 4, 397603),
135
+ ),
136
+ (db.DateField, "2018-05-29", date, date(2018, 5, 29)),
137
+ (db.BooleanField, "true", bool, True),
138
+ (db.IntField, 42, int, 42),
139
+ (db.StringField, "42", str, "42"),
140
+ (db.FloatField, "42.0", float, 42.0),
141
+ (db.URLField, "http://test.com", str, "http://test.com"),
142
+ (
143
+ db.UUIDField,
144
+ "e3b06d6d-90c0-4407-adc0-de81d327f181",
145
+ UUID,
146
+ UUID("e3b06d6d-90c0-4407-adc0-de81d327f181"),
147
+ ),
148
+ ]
149
+ ],
150
+ )
130
151
  def test_can_parse_registered_data(self, dbfield, value, type, expected):
131
152
  Fake, FakeForm = self.factory()
132
153
 
133
- Fake.extras.register('my:extra', dbfield)
154
+ Fake.extras.register("my:extra", dbfield)
134
155
 
135
156
  fake = Fake()
136
- form = FakeForm(MultiDict({'extras': {'my:extra': value}}))
157
+ form = FakeForm(MultiDict({"extras": {"my:extra": value}}))
137
158
 
138
159
  form.validate()
139
160
  assert form.errors == {}
140
161
 
141
162
  form.populate_obj(fake)
142
163
 
143
- assert isinstance(fake.extras['my:extra'], type)
144
- assert fake.extras['my:extra'] == expected
145
-
146
- @pytest.mark.parametrize('dbfield,value', [
147
- pytest.param(*p, id=p[0].__name__) for p in [
148
- (db.DateTimeField, 'xxxx'),
149
- (db.DateField, 'xxxx'),
150
- (db.IntField, 'xxxx'),
151
- (db.StringField, 42),
152
- (db.FloatField, 'xxxx'),
153
- (db.URLField, 'not-an-url'),
154
- (db.UUIDField, 'not-a-uuid'),
155
- ]])
164
+ assert isinstance(fake.extras["my:extra"], type)
165
+ assert fake.extras["my:extra"] == expected
166
+
167
+ @pytest.mark.parametrize(
168
+ "dbfield,value",
169
+ [
170
+ pytest.param(*p, id=p[0].__name__)
171
+ for p in [
172
+ (db.DateTimeField, "xxxx"),
173
+ (db.DateField, "xxxx"),
174
+ (db.IntField, "xxxx"),
175
+ (db.StringField, 42),
176
+ (db.FloatField, "xxxx"),
177
+ (db.URLField, "not-an-url"),
178
+ (db.UUIDField, "not-a-uuid"),
179
+ ]
180
+ ],
181
+ )
156
182
  def test_fail_bad_registered_data(self, dbfield, value):
157
183
  Fake, FakeForm = self.factory()
158
184
 
159
- Fake.extras.register('my:extra', dbfield)
185
+ Fake.extras.register("my:extra", dbfield)
160
186
 
161
- form = FakeForm(MultiDict({'extras': {'my:extra': value}}))
187
+ form = FakeForm(MultiDict({"extras": {"my:extra": value}}))
162
188
 
163
189
  form.validate()
164
- assert 'extras' in form.errors
165
- assert 'my:extra' in form.errors['extras']
190
+ assert "extras" in form.errors
191
+ assert "my:extra" in form.errors["extras"]