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,5 +1,4 @@
1
1
  import json
2
-
3
2
  from datetime import timedelta
4
3
 
5
4
  from werkzeug.datastructures import MultiDict
@@ -14,7 +13,6 @@ from ..factories import GeoZoneFactory
14
13
  from ..forms import SpatialCoverageField
15
14
  from ..models import SpatialCoverage
16
15
 
17
-
18
16
  A_YEAR = timedelta(days=365)
19
17
 
20
18
 
@@ -32,9 +30,9 @@ class SpatialCoverageFieldTest(TestCase):
32
30
  Fake, FakeForm = self.factory()
33
31
 
34
32
  form = FakeForm()
35
- self.assertEqual(form.spatial.zones._value(), '')
33
+ self.assertEqual(form.spatial.zones._value(), "")
36
34
  self.assertEqual(form.spatial.zones.data, [])
37
- self.assertEqual(form.spatial.granularity.data, 'other')
35
+ self.assertEqual(form.spatial.granularity.data, "other")
38
36
  self.assertIsNone(form.spatial.geom.data)
39
37
 
40
38
  self.assertIsNone(form.spatial.data)
@@ -57,17 +55,15 @@ class SpatialCoverageFieldTest(TestCase):
57
55
 
58
56
  fake = Fake(spatial=SpatialCoverage(zones=zones))
59
57
  form = FakeForm(None, obj=fake)
60
- self.assertEqual(
61
- form.spatial.zones._value(), ','.join([z.id for z in zones]))
58
+ self.assertEqual(form.spatial.zones._value(), ",".join([z.id for z in zones]))
62
59
 
63
60
  def test_with_zone_empty_string(self):
64
61
  Fake, FakeForm = self.factory()
65
62
 
66
63
  fake = Fake()
67
- form = FakeForm(MultiDict({
68
- 'spatial-zones': '',
69
- 'spatial-granularity': faker.spatial_granularity()
70
- }))
64
+ form = FakeForm(
65
+ MultiDict({"spatial-zones": "", "spatial-granularity": faker.spatial_granularity()})
66
+ )
71
67
 
72
68
  form.validate()
73
69
  self.assertEqual(form.errors, {})
@@ -81,10 +77,11 @@ class SpatialCoverageFieldTest(TestCase):
81
77
  zone = GeoZoneFactory()
82
78
 
83
79
  fake = Fake()
84
- form = FakeForm(MultiDict({
85
- 'spatial-zones': zone.id,
86
- 'spatial-granularity': faker.spatial_granularity()
87
- }))
80
+ form = FakeForm(
81
+ MultiDict(
82
+ {"spatial-zones": zone.id, "spatial-granularity": faker.spatial_granularity()}
83
+ )
84
+ )
88
85
 
89
86
  form.validate()
90
87
  self.assertEqual(form.errors, {})
@@ -99,12 +96,9 @@ class SpatialCoverageFieldTest(TestCase):
99
96
  zone = GeoZoneFactory()
100
97
 
101
98
  fake = Fake()
102
- form = FakeForm.from_json({
103
- 'spatial': {
104
- 'zones': zone.id,
105
- 'granularity': faker.spatial_granularity()
106
- }
107
- })
99
+ form = FakeForm.from_json(
100
+ {"spatial": {"zones": zone.id, "granularity": faker.spatial_granularity()}}
101
+ )
108
102
 
109
103
  form.validate()
110
104
  self.assertEqual(form.errors, {})
@@ -119,10 +113,14 @@ class SpatialCoverageFieldTest(TestCase):
119
113
  zones = [GeoZoneFactory() for _ in range(3)]
120
114
 
121
115
  fake = Fake()
122
- form = FakeForm(MultiDict({
123
- 'spatial-zones': ','.join([z.id for z in zones]),
124
- 'spatial-granularity': faker.spatial_granularity()
125
- }))
116
+ form = FakeForm(
117
+ MultiDict(
118
+ {
119
+ "spatial-zones": ",".join([z.id for z in zones]),
120
+ "spatial-granularity": faker.spatial_granularity(),
121
+ }
122
+ )
123
+ )
126
124
 
127
125
  form.validate()
128
126
  self.assertEqual(form.errors, {})
@@ -140,12 +138,14 @@ class SpatialCoverageFieldTest(TestCase):
140
138
  zones = [GeoZoneFactory() for _ in range(3)]
141
139
 
142
140
  fake = Fake()
143
- form = FakeForm.from_json({
144
- 'spatial': {
145
- 'zones': ','.join([z.id for z in zones]),
146
- 'granularity': faker.spatial_granularity()
141
+ form = FakeForm.from_json(
142
+ {
143
+ "spatial": {
144
+ "zones": ",".join([z.id for z in zones]),
145
+ "granularity": faker.spatial_granularity(),
146
+ }
147
147
  }
148
- })
148
+ )
149
149
 
150
150
  form.validate()
151
151
  self.assertEqual(form.errors, {})
@@ -163,7 +163,7 @@ class SpatialCoverageFieldTest(TestCase):
163
163
  geom = faker.multipolygon()
164
164
 
165
165
  fake = Fake()
166
- form = FakeForm(MultiDict({'spatial-geom': json.dumps(geom)}))
166
+ form = FakeForm(MultiDict({"spatial-geom": json.dumps(geom)}))
167
167
 
168
168
  form.validate()
169
169
  self.assertEqual(form.errors, {})
@@ -177,7 +177,7 @@ class SpatialCoverageFieldTest(TestCase):
177
177
  geom = faker.multipolygon()
178
178
 
179
179
  fake = Fake()
180
- form = FakeForm.from_json({'spatial': {'geom': geom}})
180
+ form = FakeForm.from_json({"spatial": {"geom": geom}})
181
181
 
182
182
  form.validate()
183
183
  self.assertEqual(form.errors, {})
@@ -188,35 +188,36 @@ class SpatialCoverageFieldTest(TestCase):
188
188
 
189
189
  def test_with_invalid_geom_from_json(self):
190
190
  Fake, FakeForm = self.factory()
191
- geom = {'type': 'InvalidGeoJSON', 'coordinates': []}
191
+ geom = {"type": "InvalidGeoJSON", "coordinates": []}
192
192
 
193
- form = FakeForm.from_json({
194
- 'spatial': {
195
- 'geom': geom,
193
+ form = FakeForm.from_json(
194
+ {
195
+ "spatial": {
196
+ "geom": geom,
197
+ }
196
198
  }
197
- })
199
+ )
198
200
 
199
201
  form.validate()
200
- self.assertIn('spatial', form.errors)
201
- self.assertEqual(len(form.errors['spatial']), 1)
202
+ self.assertIn("spatial", form.errors)
203
+ self.assertEqual(len(form.errors["spatial"]), 1)
202
204
 
203
- self.assertIn('geom', form.errors['spatial'])
204
- self.assertEqual(len(form.errors['spatial']['geom']), 1)
205
+ self.assertIn("geom", form.errors["spatial"])
206
+ self.assertEqual(len(form.errors["spatial"]["geom"]), 1)
205
207
 
206
208
  def test_with_invalid_data(self):
207
209
  Fake, FakeForm = self.factory()
208
210
 
209
- form = FakeForm(MultiDict({
210
- 'spatial-zones': 'wrong-data', 'spatial-granularity': 'wrong'}))
211
+ form = FakeForm(MultiDict({"spatial-zones": "wrong-data", "spatial-granularity": "wrong"}))
211
212
 
212
213
  form.validate()
213
- self.assertIn('spatial', form.errors)
214
- self.assertEqual(len(form.errors['spatial']), 2)
214
+ self.assertIn("spatial", form.errors)
215
+ self.assertEqual(len(form.errors["spatial"]), 2)
215
216
 
216
- self.assertIn('granularity', form.errors['spatial'])
217
- self.assertEqual(len(form.errors['spatial']['granularity']), 1)
218
- self.assertIn('zones', form.errors['spatial'])
219
- self.assertEqual(len(form.errors['spatial']['zones']), 1)
217
+ self.assertIn("granularity", form.errors["spatial"])
218
+ self.assertEqual(len(form.errors["spatial"]["granularity"]), 1)
219
+ self.assertIn("zones", form.errors["spatial"])
220
+ self.assertEqual(len(form.errors["spatial"]["zones"]), 1)
220
221
 
221
222
  def test_with_initial_zones(self):
222
223
  Fake, FakeForm = self.factory()
@@ -225,7 +226,7 @@ class SpatialCoverageFieldTest(TestCase):
225
226
  fake = Fake(spatial=SpatialCoverage(zones=zones))
226
227
 
227
228
  zone = GeoZoneFactory()
228
- data = MultiDict({'spatial-zones': zone.id})
229
+ data = MultiDict({"spatial-zones": zone.id})
229
230
 
230
231
  form = FakeForm(data, obj=fake)
231
232
 
@@ -240,13 +241,11 @@ class SpatialCoverageFieldTest(TestCase):
240
241
  def test_with_initial_granularity(self):
241
242
  Fake, FakeForm = self.factory()
242
243
 
243
- fake = Fake(spatial=SpatialCoverage(
244
- granularity=faker.spatial_granularity()
245
- ))
244
+ fake = Fake(spatial=SpatialCoverage(granularity=faker.spatial_granularity()))
246
245
 
247
246
  granularity = faker.spatial_granularity()
248
247
 
249
- data = MultiDict({'spatial-granularity': granularity})
248
+ data = MultiDict({"spatial-granularity": granularity})
250
249
 
251
250
  form = FakeForm(data, obj=fake)
252
251
 
@@ -263,7 +262,7 @@ class SpatialCoverageFieldTest(TestCase):
263
262
 
264
263
  fake = Fake(spatial=SpatialCoverage(geom=geom))
265
264
 
266
- data = {'spatial': {'geom': geom}}
265
+ data = {"spatial": {"geom": geom}}
267
266
 
268
267
  form = FakeForm.from_json(data, fake)
269
268
 
@@ -279,10 +278,12 @@ class SpatialCoverageFieldTest(TestCase):
279
278
  zone = GeoZoneFactory()
280
279
 
281
280
  fake = Fake(spatial=None)
282
- form = FakeForm(MultiDict({
283
- 'spatial-zones': str(zone.id),
284
- 'spatial-granularity': faker.spatial_granularity()
285
- }), obj=fake)
281
+ form = FakeForm(
282
+ MultiDict(
283
+ {"spatial-zones": str(zone.id), "spatial-granularity": faker.spatial_granularity()}
284
+ ),
285
+ obj=fake,
286
+ )
286
287
 
287
288
  form.validate()
288
289
  self.assertEqual(form.errors, {})
@@ -300,15 +301,12 @@ class SpatialCoverageFieldTest(TestCase):
300
301
  for i in range(3):
301
302
  GeoZoneFactory(code=zone.code)
302
303
 
303
- geoid = '{0.level}:{0.code}'.format(zone)
304
+ geoid = "{0.level}:{0.code}".format(zone)
304
305
 
305
306
  fake = Fake()
306
- form = FakeForm.from_json({
307
- 'spatial': {
308
- 'zones': [geoid],
309
- 'granularity': faker.spatial_granularity()
310
- }
311
- })
307
+ form = FakeForm.from_json(
308
+ {"spatial": {"zones": [geoid], "granularity": faker.spatial_granularity()}}
309
+ )
312
310
 
313
311
  form.validate()
314
312
  self.assertEqual(form.errors, {})
@@ -321,20 +319,19 @@ class SpatialCoverageFieldTest(TestCase):
321
319
  def test_resolve_zones_from_json_failure(self):
322
320
  Fake, FakeForm = self.factory()
323
321
  GeoZoneFactory.create_batch(3)
324
- form = FakeForm.from_json({
325
- 'spatial': {
326
- 'zones': [
327
- '{0}:{0}@{0}'.format(faker.unique_string())
328
- for _ in range(2)
329
- ],
330
- 'granularity': faker.spatial_granularity()
322
+ form = FakeForm.from_json(
323
+ {
324
+ "spatial": {
325
+ "zones": ["{0}:{0}@{0}".format(faker.unique_string()) for _ in range(2)],
326
+ "granularity": faker.spatial_granularity(),
327
+ }
331
328
  }
332
- })
329
+ )
333
330
 
334
331
  form.validate()
335
332
 
336
- self.assertIn('spatial', form.errors)
337
- self.assertEqual(len(form.errors['spatial']), 1)
333
+ self.assertIn("spatial", form.errors)
334
+ self.assertEqual(len(form.errors["spatial"]), 1)
338
335
 
339
- self.assertIn('zones', form.errors['spatial'])
340
- self.assertEqual(len(form.errors['spatial']['zones']), 1)
336
+ self.assertIn("zones", form.errors["spatial"])
337
+ self.assertEqual(len(form.errors["spatial"]["zones"]), 1)
@@ -6,64 +6,64 @@ from ..models import GeoZone
6
6
 
7
7
  class GeoIDTest:
8
8
  def test_parse_full_geoid(self):
9
- geoid = 'level:code'
9
+ geoid = "level:code"
10
10
 
11
11
  level, code = geoids.parse(geoid)
12
12
 
13
- assert level == 'level'
14
- assert code == 'code'
13
+ assert level == "level"
14
+ assert code == "code"
15
15
 
16
16
  def test_parse_legacy_geoid(self):
17
- geoid = 'level/code'
17
+ geoid = "level/code"
18
18
 
19
19
  level, code = geoids.parse(geoid)
20
20
 
21
- assert level == 'level'
22
- assert code == 'code'
21
+ assert level == "level"
22
+ assert code == "code"
23
23
 
24
24
  def test_parse_implicit_latest(self):
25
- geoid = 'level:code'
25
+ geoid = "level:code"
26
26
 
27
27
  level, code = geoids.parse(geoid)
28
28
 
29
- assert level == 'level'
30
- assert code == 'code'
29
+ assert level == "level"
30
+ assert code == "code"
31
31
 
32
32
  def test_parse_nested_levels(self):
33
- geoid = 'nested:level:code'
33
+ geoid = "nested:level:code"
34
34
 
35
35
  level, code = geoids.parse(geoid)
36
36
 
37
- assert level == 'nested:level'
38
- assert code == 'code'
37
+ assert level == "nested:level"
38
+ assert code == "code"
39
39
 
40
40
  def test_parse_country_subset_levels(self):
41
- geoid = 'country-subset:country:code'
41
+ geoid = "country-subset:country:code"
42
42
 
43
43
  level, code = geoids.parse(geoid)
44
44
 
45
- assert level == 'country-subset'
46
- assert code == 'country:code'
45
+ assert level == "country-subset"
46
+ assert code == "country:code"
47
47
 
48
48
  def test_parse_invalid_geoid(self):
49
- geoid = 'this-is-not-a-geoid'
49
+ geoid = "this-is-not-a-geoid"
50
50
 
51
51
  with pytest.raises(geoids.GeoIDError):
52
52
  geoids.parse(geoid)
53
53
 
54
54
  def test_build(self):
55
- level = 'level'
56
- code = 'code'
55
+ level = "level"
56
+ code = "code"
57
57
 
58
58
  geoid = geoids.build(level, code)
59
59
 
60
- assert geoid == 'level:code'
60
+ assert geoid == "level:code"
61
61
 
62
62
  def test_from_zone(self):
63
- level = 'level'
64
- code = 'code'
63
+ level = "level"
64
+ code = "code"
65
65
  zone = GeoZone(level=level, code=code)
66
66
 
67
67
  geoid = geoids.from_zone(zone)
68
68
 
69
- assert geoid == 'level:code'
69
+ assert geoid == "level:code"
@@ -1,11 +1,10 @@
1
1
  from datetime import timedelta
2
2
 
3
- from udata.tests import TestCase, DBTestMixin
3
+ from udata.tests import DBTestMixin, TestCase
4
4
 
5
- from ..factories import GeoZoneFactory, GeoLevelFactory
5
+ from ..factories import GeoLevelFactory, GeoZoneFactory
6
6
  from ..models import GeoZone, SpatialCoverage
7
7
 
8
-
9
8
  A_YEAR = timedelta(days=365)
10
9
 
11
10
 
@@ -15,19 +14,18 @@ class SpacialCoverageTest(DBTestMixin, TestCase):
15
14
  self.assertIsNone(coverage.top_label)
16
15
 
17
16
  def test_top_label_single(self):
18
- zone = GeoZoneFactory(name='name', level='level', code='code')
17
+ zone = GeoZoneFactory(name="name", level="level", code="code")
19
18
  coverage = SpatialCoverage(zones=[zone])
20
- self.assertEqual(coverage.top_label, 'name')
19
+ self.assertEqual(coverage.top_label, "name")
21
20
 
22
21
 
23
22
  class SpatialTemporalResolutionTest(DBTestMixin, TestCase):
24
-
25
23
  def test_resolve_id_only(self):
26
24
  zone = GeoZoneFactory()
27
25
  for i in range(3):
28
26
  GeoZoneFactory(code=zone.code)
29
27
 
30
- geoid = '{0.level}:{0.code}'.format(zone)
28
+ geoid = "{0.level}:{0.code}".format(zone)
31
29
  result = GeoZone.objects.resolve(geoid, id_only=True)
32
30
 
33
31
  self.assertEqual(result, zone.id)
@@ -2,20 +2,20 @@
2
2
  _ = lambda s: s # noqa: force translations
3
3
 
4
4
  TRANSLATIONS = (
5
- _('French region'),
6
- _('French intermunicipal (EPCI)'),
7
- _('French county'),
8
- _('French district'),
9
- _('French town'),
10
- _('French canton'),
11
- _('Iris (Insee districts)'),
12
- _('Country'),
13
- _('World'),
14
- _('Country group'),
15
- _('Country subset'),
16
- _('European Union'),
17
- _('Metropolitan France'),
18
- _('Overseas France'),
19
- _('French overseas collectivities'),
20
- _('French arrondissement'),
5
+ _("French region"),
6
+ _("French intermunicipal (EPCI)"),
7
+ _("French county"),
8
+ _("French district"),
9
+ _("French town"),
10
+ _("French canton"),
11
+ _("Iris (Insee districts)"),
12
+ _("Country"),
13
+ _("World"),
14
+ _("Country group"),
15
+ _("Country subset"),
16
+ _("European Union"),
17
+ _("Metropolitan France"),
18
+ _("Overseas France"),
19
+ _("French overseas collectivities"),
20
+ _("French arrondissement"),
21
21
  )
@@ -1,43 +1,41 @@
1
1
  from datetime import date
2
2
  from uuid import uuid4
3
3
 
4
- from flask import current_app
5
-
6
4
  import flask_storage as fs
5
+ from flask import current_app
7
6
 
8
7
  AUTHORIZED_TYPES = fs.AllExcept(fs.SCRIPTS + fs.EXECUTABLES)
9
8
 
10
9
 
11
10
  class ConfigurableAuthorizedTypes(object):
12
11
  def __contains__(self, value):
13
- return value in current_app.config['ALLOWED_RESOURCES_EXTENSIONS']
12
+ return value in current_app.config["ALLOWED_RESOURCES_EXTENSIONS"]
14
13
 
15
14
 
16
15
  CONFIGURABLE_AUTHORIZED_TYPES = ConfigurableAuthorizedTypes()
17
16
 
18
17
 
19
18
  def tmp_upload_to():
20
- uuid = str(uuid4()).replace('-', '')
19
+ uuid = str(uuid4()).replace("-", "")
21
20
  isodate = date.today().isoformat()
22
- return '/'.join((isodate, uuid))
21
+ return "/".join((isodate, uuid))
23
22
 
24
23
 
25
- resources = fs.Storage('resources', CONFIGURABLE_AUTHORIZED_TYPES)
26
- avatars = fs.Storage('avatars', fs.IMAGES)
27
- logos = fs.Storage('logos', fs.IMAGES)
28
- images = fs.Storage('images', fs.IMAGES)
29
- chunks = fs.Storage('chunks', AUTHORIZED_TYPES)
30
- tmp = fs.Storage('tmp', fs.ALL, upload_to=tmp_upload_to)
31
- references = fs.Storage('references', AUTHORIZED_TYPES)
24
+ resources = fs.Storage("resources", CONFIGURABLE_AUTHORIZED_TYPES)
25
+ avatars = fs.Storage("avatars", fs.IMAGES)
26
+ logos = fs.Storage("logos", fs.IMAGES)
27
+ images = fs.Storage("images", fs.IMAGES)
28
+ chunks = fs.Storage("chunks", AUTHORIZED_TYPES)
29
+ tmp = fs.Storage("tmp", fs.ALL, upload_to=tmp_upload_to)
30
+ references = fs.Storage("references", AUTHORIZED_TYPES)
32
31
 
33
32
 
34
33
  def default_image_basename(*args, **kwargs):
35
- uuid = str(uuid4()).replace('-', '')
36
- return '/'.join((uuid[:2], uuid[2:]))
34
+ uuid = str(uuid4()).replace("-", "")
35
+ return "/".join((uuid[:2], uuid[2:]))
37
36
 
38
37
 
39
38
  def init_app(app):
40
- if 'BUCKETS_PREFIX' not in app.config:
41
- app.config['BUCKETS_PREFIX'] = '/s'
42
- fs.init_app(
43
- app, resources, avatars, logos, images, chunks, tmp, references)
39
+ if "BUCKETS_PREFIX" not in app.config:
40
+ app.config["BUCKETS_PREFIX"] = "/s"
41
+ fs.init_app(app, resources, avatars, logos, images, chunks, tmp, references)