udata 9.1.2.dev30355__py2.py3-none-any.whl → 9.1.2.dev30382__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of udata might be problematic. Click here for more details.

Files changed (425) 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 +135 -124
  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 +56 -54
  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/db/tasks.py +2 -1
  199. udata/entrypoints.py +35 -31
  200. udata/errors.py +2 -1
  201. udata/event/values.py +6 -6
  202. udata/factories.py +2 -2
  203. udata/features/identicon/api.py +5 -6
  204. udata/features/identicon/backends.py +48 -55
  205. udata/features/identicon/tests/test_backends.py +4 -5
  206. udata/features/notifications/__init__.py +0 -1
  207. udata/features/notifications/actions.py +9 -9
  208. udata/features/notifications/api.py +17 -13
  209. udata/features/territories/__init__.py +12 -10
  210. udata/features/territories/api.py +14 -15
  211. udata/features/territories/models.py +23 -28
  212. udata/features/transfer/actions.py +8 -11
  213. udata/features/transfer/api.py +84 -77
  214. udata/features/transfer/factories.py +2 -1
  215. udata/features/transfer/models.py +11 -12
  216. udata/features/transfer/notifications.py +19 -15
  217. udata/features/transfer/permissions.py +5 -5
  218. udata/forms/__init__.py +5 -2
  219. udata/forms/fields.py +164 -172
  220. udata/forms/validators.py +19 -22
  221. udata/forms/widgets.py +9 -13
  222. udata/frontend/__init__.py +31 -26
  223. udata/frontend/csv.py +68 -58
  224. udata/frontend/markdown.py +40 -44
  225. udata/harvest/actions.py +89 -77
  226. udata/harvest/api.py +294 -238
  227. udata/harvest/backends/__init__.py +4 -4
  228. udata/harvest/backends/base.py +128 -111
  229. udata/harvest/backends/dcat.py +80 -66
  230. udata/harvest/commands.py +56 -60
  231. udata/harvest/csv.py +8 -8
  232. udata/harvest/exceptions.py +6 -3
  233. udata/harvest/filters.py +24 -23
  234. udata/harvest/forms.py +27 -28
  235. udata/harvest/models.py +88 -80
  236. udata/harvest/notifications.py +15 -10
  237. udata/harvest/signals.py +13 -13
  238. udata/harvest/tasks.py +11 -10
  239. udata/harvest/tests/factories.py +23 -24
  240. udata/harvest/tests/test_actions.py +136 -166
  241. udata/harvest/tests/test_api.py +220 -214
  242. udata/harvest/tests/test_base_backend.py +117 -112
  243. udata/harvest/tests/test_dcat_backend.py +380 -308
  244. udata/harvest/tests/test_filters.py +33 -22
  245. udata/harvest/tests/test_models.py +11 -14
  246. udata/harvest/tests/test_notifications.py +6 -7
  247. udata/harvest/tests/test_tasks.py +7 -6
  248. udata/i18n.py +237 -78
  249. udata/linkchecker/backends.py +5 -11
  250. udata/linkchecker/checker.py +23 -22
  251. udata/linkchecker/commands.py +4 -6
  252. udata/linkchecker/models.py +6 -6
  253. udata/linkchecker/tasks.py +18 -20
  254. udata/mail.py +21 -21
  255. udata/migrations/2020-07-24-remove-s-from-scope-oauth.py +9 -8
  256. udata/migrations/2020-08-24-add-fs-filename.py +9 -8
  257. udata/migrations/2020-09-28-update-reuses-datasets-metrics.py +5 -4
  258. udata/migrations/2020-10-16-migrate-ods-resources.py +9 -10
  259. udata/migrations/2021-04-08-update-schema-with-new-structure.py +8 -7
  260. udata/migrations/2021-05-27-fix-default-schema-name.py +7 -6
  261. udata/migrations/2021-07-05-remove-unused-badges.py +17 -15
  262. udata/migrations/2021-07-07-update-schema-for-community-resources.py +7 -6
  263. udata/migrations/2021-08-17-follow-integrity.py +5 -4
  264. udata/migrations/2021-08-17-harvest-integrity.py +13 -12
  265. udata/migrations/2021-08-17-oauth2client-integrity.py +5 -4
  266. udata/migrations/2021-08-17-transfer-integrity.py +5 -4
  267. udata/migrations/2021-08-17-users-integrity.py +9 -8
  268. udata/migrations/2021-12-14-reuse-topics.py +7 -6
  269. udata/migrations/2022-04-21-improve-extension-detection.py +8 -7
  270. udata/migrations/2022-09-22-clean-inactive-harvest-datasets.py +16 -14
  271. udata/migrations/2022-10-10-add-fs_uniquifier-to-user-model.py +6 -6
  272. udata/migrations/2022-10-10-migrate-harvest-extras.py +36 -26
  273. udata/migrations/2023-02-08-rename-internal-dates.py +46 -28
  274. udata/migrations/2024-01-29-fix-reuse-and-dataset-with-private-None.py +10 -8
  275. udata/migrations/2024-03-22-migrate-activity-kwargs-to-extras.py +6 -4
  276. udata/migrations/2024-06-11-fix-reuse-datasets-references.py +7 -6
  277. udata/migrations/__init__.py +123 -105
  278. udata/models/__init__.py +4 -4
  279. udata/mongo/__init__.py +13 -11
  280. udata/mongo/badges_field.py +3 -2
  281. udata/mongo/datetime_fields.py +13 -12
  282. udata/mongo/document.py +17 -16
  283. udata/mongo/engine.py +15 -16
  284. udata/mongo/errors.py +2 -1
  285. udata/mongo/extras_fields.py +30 -20
  286. udata/mongo/queryset.py +12 -12
  287. udata/mongo/slug_fields.py +38 -28
  288. udata/mongo/taglist_field.py +1 -2
  289. udata/mongo/url_field.py +5 -5
  290. udata/mongo/uuid_fields.py +4 -3
  291. udata/notifications/__init__.py +1 -1
  292. udata/notifications/mattermost.py +10 -9
  293. udata/rdf.py +167 -188
  294. udata/routing.py +40 -45
  295. udata/search/__init__.py +18 -19
  296. udata/search/adapter.py +17 -16
  297. udata/search/commands.py +44 -51
  298. udata/search/fields.py +13 -20
  299. udata/search/query.py +23 -18
  300. udata/search/result.py +9 -10
  301. udata/sentry.py +21 -19
  302. udata/settings.py +262 -198
  303. udata/sitemap.py +8 -6
  304. udata/static/chunks/{11.e9b9ca1f3e03d4020377.js → 11.52e531c19f8de80c00cf.js} +3 -3
  305. udata/static/chunks/{11.e9b9ca1f3e03d4020377.js.map → 11.52e531c19f8de80c00cf.js.map} +1 -1
  306. udata/static/chunks/{13.038c0d9aa0dfa0181c4b.js → 13.c3343a7f1070061c0e10.js} +2 -2
  307. udata/static/chunks/{13.038c0d9aa0dfa0181c4b.js.map → 13.c3343a7f1070061c0e10.js.map} +1 -1
  308. udata/static/chunks/{16.0baa2b64a74a2dcde25c.js → 16.8fa42440ad75ca172e6d.js} +2 -2
  309. udata/static/chunks/{16.0baa2b64a74a2dcde25c.js.map → 16.8fa42440ad75ca172e6d.js.map} +1 -1
  310. udata/static/chunks/{19.350a9f150b074b4ecefa.js → 19.9c6c8412729cd6d59cfa.js} +3 -3
  311. udata/static/chunks/{19.350a9f150b074b4ecefa.js.map → 19.9c6c8412729cd6d59cfa.js.map} +1 -1
  312. udata/static/chunks/{5.6ebbce2b9b3e696d3da5.js → 5.71d15c2e4f21feee2a9a.js} +3 -3
  313. udata/static/chunks/{5.6ebbce2b9b3e696d3da5.js.map → 5.71d15c2e4f21feee2a9a.js.map} +1 -1
  314. udata/static/chunks/{6.d8a5f7b017bcbd083641.js → 6.9139dc098b8ea640b890.js} +3 -3
  315. udata/static/chunks/{6.d8a5f7b017bcbd083641.js.map → 6.9139dc098b8ea640b890.js.map} +1 -1
  316. udata/static/common.js +1 -1
  317. udata/static/common.js.map +1 -1
  318. udata/storage/s3.py +20 -13
  319. udata/tags.py +4 -5
  320. udata/tasks.py +43 -42
  321. udata/tests/__init__.py +9 -6
  322. udata/tests/api/__init__.py +5 -6
  323. udata/tests/api/test_auth_api.py +395 -321
  324. udata/tests/api/test_base_api.py +31 -33
  325. udata/tests/api/test_contact_points.py +7 -9
  326. udata/tests/api/test_dataservices_api.py +211 -158
  327. udata/tests/api/test_datasets_api.py +823 -812
  328. udata/tests/api/test_follow_api.py +13 -15
  329. udata/tests/api/test_me_api.py +95 -112
  330. udata/tests/api/test_organizations_api.py +301 -339
  331. udata/tests/api/test_reports_api.py +35 -25
  332. udata/tests/api/test_reuses_api.py +134 -139
  333. udata/tests/api/test_swagger.py +5 -5
  334. udata/tests/api/test_tags_api.py +18 -25
  335. udata/tests/api/test_topics_api.py +94 -94
  336. udata/tests/api/test_transfer_api.py +53 -48
  337. udata/tests/api/test_user_api.py +128 -141
  338. udata/tests/apiv2/test_datasets.py +290 -198
  339. udata/tests/apiv2/test_me_api.py +10 -11
  340. udata/tests/apiv2/test_organizations.py +56 -74
  341. udata/tests/apiv2/test_swagger.py +5 -5
  342. udata/tests/apiv2/test_topics.py +69 -87
  343. udata/tests/cli/test_cli_base.py +8 -8
  344. udata/tests/cli/test_db_cli.py +21 -19
  345. udata/tests/dataservice/test_dataservice_tasks.py +8 -12
  346. udata/tests/dataset/test_csv_adapter.py +44 -35
  347. udata/tests/dataset/test_dataset_actions.py +2 -3
  348. udata/tests/dataset/test_dataset_commands.py +7 -8
  349. udata/tests/dataset/test_dataset_events.py +36 -29
  350. udata/tests/dataset/test_dataset_model.py +224 -217
  351. udata/tests/dataset/test_dataset_rdf.py +142 -131
  352. udata/tests/dataset/test_dataset_tasks.py +15 -15
  353. udata/tests/dataset/test_resource_preview.py +10 -13
  354. udata/tests/features/territories/__init__.py +9 -13
  355. udata/tests/features/territories/test_territories_api.py +71 -91
  356. udata/tests/forms/test_basic_fields.py +7 -7
  357. udata/tests/forms/test_current_user_field.py +39 -66
  358. udata/tests/forms/test_daterange_field.py +31 -39
  359. udata/tests/forms/test_dict_field.py +28 -26
  360. udata/tests/forms/test_extras_fields.py +102 -76
  361. udata/tests/forms/test_form_field.py +8 -8
  362. udata/tests/forms/test_image_field.py +33 -26
  363. udata/tests/forms/test_model_field.py +134 -123
  364. udata/tests/forms/test_model_list_field.py +7 -7
  365. udata/tests/forms/test_nested_model_list_field.py +117 -79
  366. udata/tests/forms/test_publish_as_field.py +36 -65
  367. udata/tests/forms/test_reference_field.py +34 -53
  368. udata/tests/forms/test_user_forms.py +23 -21
  369. udata/tests/forms/test_uuid_field.py +6 -10
  370. udata/tests/frontend/__init__.py +9 -6
  371. udata/tests/frontend/test_auth.py +7 -6
  372. udata/tests/frontend/test_csv.py +81 -96
  373. udata/tests/frontend/test_hooks.py +43 -43
  374. udata/tests/frontend/test_markdown.py +211 -191
  375. udata/tests/helpers.py +32 -37
  376. udata/tests/models.py +2 -2
  377. udata/tests/organization/test_csv_adapter.py +21 -16
  378. udata/tests/organization/test_notifications.py +11 -18
  379. udata/tests/organization/test_organization_model.py +13 -13
  380. udata/tests/organization/test_organization_rdf.py +29 -22
  381. udata/tests/organization/test_organization_tasks.py +16 -17
  382. udata/tests/plugin.py +76 -73
  383. udata/tests/reuse/test_reuse_model.py +21 -21
  384. udata/tests/reuse/test_reuse_task.py +11 -13
  385. udata/tests/search/__init__.py +11 -12
  386. udata/tests/search/test_adapter.py +60 -70
  387. udata/tests/search/test_query.py +16 -16
  388. udata/tests/search/test_results.py +10 -7
  389. udata/tests/site/test_site_api.py +11 -16
  390. udata/tests/site/test_site_metrics.py +20 -30
  391. udata/tests/site/test_site_model.py +4 -5
  392. udata/tests/site/test_site_rdf.py +94 -78
  393. udata/tests/test_activity.py +17 -17
  394. udata/tests/test_discussions.py +292 -299
  395. udata/tests/test_i18n.py +37 -40
  396. udata/tests/test_linkchecker.py +91 -85
  397. udata/tests/test_mail.py +13 -17
  398. udata/tests/test_migrations.py +219 -180
  399. udata/tests/test_model.py +164 -157
  400. udata/tests/test_notifications.py +17 -17
  401. udata/tests/test_owned.py +14 -14
  402. udata/tests/test_rdf.py +25 -23
  403. udata/tests/test_routing.py +89 -93
  404. udata/tests/test_storages.py +137 -128
  405. udata/tests/test_tags.py +44 -46
  406. udata/tests/test_topics.py +7 -7
  407. udata/tests/test_transfer.py +42 -49
  408. udata/tests/test_uris.py +160 -161
  409. udata/tests/test_utils.py +79 -71
  410. udata/tests/user/test_user_rdf.py +5 -9
  411. udata/tests/workers/test_jobs_commands.py +57 -58
  412. udata/tests/workers/test_tasks_routing.py +23 -29
  413. udata/tests/workers/test_workers_api.py +125 -131
  414. udata/tests/workers/test_workers_helpers.py +6 -6
  415. udata/tracking.py +4 -6
  416. udata/uris.py +45 -46
  417. udata/utils.py +68 -66
  418. udata/wsgi.py +1 -1
  419. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/METADATA +3 -2
  420. udata-9.1.2.dev30382.dist-info/RECORD +704 -0
  421. udata-9.1.2.dev30355.dist-info/RECORD +0 -704
  422. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/LICENSE +0 -0
  423. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/WHEEL +0 -0
  424. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/entry_points.txt +0 -0
  425. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/top_level.txt +0 -0
@@ -1,33 +1,28 @@
1
- import factory
2
-
3
1
  import json
4
2
  from os.path import join
5
3
 
6
- from udata.app import ROOT_DIR
7
- from udata.factories import ModelFactory
8
-
9
- from .models import Dataset, Resource, Checksum, CommunityResource, License
4
+ import factory
10
5
 
6
+ from udata.app import ROOT_DIR
11
7
  from udata.core.organization.factories import OrganizationFactory
12
8
  from udata.core.spatial.factories import SpatialCoverageFactory
9
+ from udata.factories import ModelFactory
10
+
11
+ from .models import Checksum, CommunityResource, Dataset, License, Resource
13
12
 
14
13
 
15
14
  class DatasetFactory(ModelFactory):
16
15
  class Meta:
17
16
  model = Dataset
18
17
 
19
- title = factory.Faker('sentence')
20
- description = factory.Faker('text')
21
- frequency = 'unknown'
18
+ title = factory.Faker("sentence")
19
+ description = factory.Faker("text")
20
+ frequency = "unknown"
22
21
  resources = factory.LazyAttribute(lambda o: ResourceFactory.build_batch(o.nb_resources))
23
22
 
24
23
  class Params:
25
- geo = factory.Trait(
26
- spatial=factory.SubFactory(SpatialCoverageFactory)
27
- )
28
- visible = factory.Trait(
29
- resources=factory.LazyAttribute(lambda o: [ResourceFactory()])
30
- )
24
+ geo = factory.Trait(spatial=factory.SubFactory(SpatialCoverageFactory))
25
+ visible = factory.Trait(resources=factory.LazyAttribute(lambda o: [ResourceFactory()]))
31
26
  org = factory.Trait(
32
27
  organization=factory.SubFactory(OrganizationFactory),
33
28
  )
@@ -42,19 +37,19 @@ class ChecksumFactory(ModelFactory):
42
37
  class Meta:
43
38
  model = Checksum
44
39
 
45
- type = 'sha1'
46
- value = factory.Faker('sha1')
40
+ type = "sha1"
41
+ value = factory.Faker("sha1")
47
42
 
48
43
 
49
44
  class BaseResourceFactory(ModelFactory):
50
- title = factory.Faker('sentence')
51
- description = factory.Faker('text')
52
- filetype = 'file'
53
- type = 'documentation'
54
- url = factory.Faker('url')
45
+ title = factory.Faker("sentence")
46
+ description = factory.Faker("text")
47
+ filetype = "file"
48
+ type = "documentation"
49
+ url = factory.Faker("url")
55
50
  checksum = factory.SubFactory(ChecksumFactory)
56
- mime = factory.Faker('mime_type', category='text')
57
- filesize = factory.Faker('pyint')
51
+ mime = factory.Faker("mime_type", category="text")
52
+ filesize = factory.Faker("pyint")
58
53
 
59
54
 
60
55
  class CommunityResourceFactory(BaseResourceFactory):
@@ -71,21 +66,24 @@ class LicenseFactory(ModelFactory):
71
66
  class Meta:
72
67
  model = License
73
68
 
74
- id = factory.Faker('unique_string')
75
- title = factory.Faker('sentence')
76
- url = factory.Faker('uri')
69
+ id = factory.Faker("unique_string")
70
+ title = factory.Faker("sentence")
71
+ url = factory.Faker("uri")
72
+
77
73
 
78
- class ResourceSchemaMockData():
74
+ class ResourceSchemaMockData:
79
75
  @staticmethod
80
76
  def get_mock_data():
81
- return json.load(open(join(ROOT_DIR, 'tests', 'schemas.json')))
82
-
77
+ return json.load(open(join(ROOT_DIR, "tests", "schemas.json")))
78
+
83
79
  @staticmethod
84
- def get_all_schemas_from_mock_data(with_datapackage_info = True):
85
- '''
80
+ def get_all_schemas_from_mock_data(with_datapackage_info=True):
81
+ """
86
82
  with_datapackage_info is here to allow testing with or without marshalling (marshalling add None for inexistant datapackage_* fields)
87
- '''
88
- schemas = ResourceSchemaMockData.get_expected_assignable_schemas_from_mock_data(with_datapackage_info)
83
+ """
84
+ schemas = ResourceSchemaMockData.get_expected_assignable_schemas_from_mock_data(
85
+ with_datapackage_info
86
+ )
89
87
 
90
88
  datapackage = {
91
89
  "name": "etalab/schema-irve",
@@ -95,28 +93,25 @@ class ResourceSchemaMockData():
95
93
  "schema_type": "datapackage",
96
94
  "contact": "contact@transport.beta.gouv.fr",
97
95
  "examples": [],
98
- "labels": [
99
- "Socle Commun des Donn\u00e9es Locales",
100
- "transport.data.gouv.fr"
101
- ],
96
+ "labels": ["Socle Commun des Donn\u00e9es Locales", "transport.data.gouv.fr"],
102
97
  "consolidation_dataset_id": "5448d3e0c751df01f85d0572",
103
98
  "versions": [
104
99
  {
105
100
  "version_name": "2.2.0",
106
- "schema_url": "https://schema.data.gouv.fr/schemas/etalab/schema-irve/2.2.0/datapackage.json"
101
+ "schema_url": "https://schema.data.gouv.fr/schemas/etalab/schema-irve/2.2.0/datapackage.json",
107
102
  },
108
103
  {
109
104
  "version_name": "2.2.1",
110
- "schema_url": "https://schema.data.gouv.fr/schemas/etalab/schema-irve/2.2.1/datapackage.json"
105
+ "schema_url": "https://schema.data.gouv.fr/schemas/etalab/schema-irve/2.2.1/datapackage.json",
111
106
  },
112
107
  {
113
108
  "version_name": "2.3.0",
114
- "schema_url": "https://schema.data.gouv.fr/schemas/etalab/schema-irve/2.3.0/datapackage.json"
109
+ "schema_url": "https://schema.data.gouv.fr/schemas/etalab/schema-irve/2.3.0/datapackage.json",
115
110
  },
116
111
  {
117
112
  "version_name": "2.3.1",
118
- "schema_url": "https://schema.data.gouv.fr/schemas/etalab/schema-irve/2.3.1/datapackage.json"
119
- }
113
+ "schema_url": "https://schema.data.gouv.fr/schemas/etalab/schema-irve/2.3.1/datapackage.json",
114
+ },
120
115
  ],
121
116
  "external_doc": "https://doc.transport.data.gouv.fr/producteurs/infrastructures-de-recharge-de-vehicules-electriques-irve",
122
117
  "external_tool": None,
@@ -129,12 +124,12 @@ class ResourceSchemaMockData():
129
124
  datapackage["datapackage_description"] = None
130
125
 
131
126
  return [datapackage] + schemas
132
-
127
+
133
128
  @staticmethod
134
- def get_expected_assignable_schemas_from_mock_data(with_datapackage_info = True):
135
- '''
129
+ def get_expected_assignable_schemas_from_mock_data(with_datapackage_info=True):
130
+ """
136
131
  with_datapackage_info is here to allow testing with or without marshalling (marshalling add None for inexistant datapackage_* fields)
137
- '''
132
+ """
138
133
  schemas = [
139
134
  {
140
135
  "name": "etalab/schema-irve-statique",
@@ -145,31 +140,28 @@ class ResourceSchemaMockData():
145
140
  "contact": "contact@transport.beta.gouv.fr",
146
141
  "examples": [
147
142
  {
148
- "title": "Exemple de fichier IRVE valide",
149
- "path": "https://github.com/etalab/schema-irve/raw/v2.2.1/exemple-valide.csv"
143
+ "title": "Exemple de fichier IRVE valide",
144
+ "path": "https://github.com/etalab/schema-irve/raw/v2.2.1/exemple-valide.csv",
150
145
  }
151
146
  ],
152
- "labels": [
153
- "Socle Commun des Donn\u00e9es Locales",
154
- "transport.data.gouv.fr"
155
- ],
147
+ "labels": ["Socle Commun des Donn\u00e9es Locales", "transport.data.gouv.fr"],
156
148
  "consolidation_dataset_id": "5448d3e0c751df01f85d0572",
157
149
  "versions": [
158
150
  {
159
151
  "version_name": "2.2.0",
160
- "schema_url": "https://schema.data.gouv.fr/schemas/etalab/schema-irve-statique/2.2.0/schema-statique.json"
152
+ "schema_url": "https://schema.data.gouv.fr/schemas/etalab/schema-irve-statique/2.2.0/schema-statique.json",
161
153
  },
162
154
  {
163
155
  "version_name": "2.2.1",
164
- "schema_url": "https://schema.data.gouv.fr/schemas/etalab/schema-irve-statique/2.2.1/schema-statique.json"
165
- }
156
+ "schema_url": "https://schema.data.gouv.fr/schemas/etalab/schema-irve-statique/2.2.1/schema-statique.json",
157
+ },
166
158
  ],
167
159
  "external_doc": "https://doc.transport.data.gouv.fr/producteurs/infrastructures-de-recharge-de-vehicules-electriques-irve",
168
160
  "external_tool": None,
169
161
  "homepage": "https://github.com/etalab/schema-irve.git",
170
162
  "datapackage_title": "Infrastructures de recharges pour v\u00e9hicules \u00e9lectriques (IRVE)",
171
163
  "datapackage_name": "etalab/schema-irve",
172
- "datapackage_description": "data package contenant 2 sch\u00e9mas : IRVE statique et IRVE dynamique"
164
+ "datapackage_description": "data package contenant 2 sch\u00e9mas : IRVE statique et IRVE dynamique",
173
165
  },
174
166
  {
175
167
  "name": "139bercy/format-commande-publique",
@@ -184,29 +176,29 @@ class ResourceSchemaMockData():
184
176
  "versions": [
185
177
  {
186
178
  "version_name": "1.3.0",
187
- "schema_url": "https://schema.data.gouv.fr/schemas/139bercy/format-commande-publique/1.3.0/sch\u00e9mas/json/contrats-concessions.json"
179
+ "schema_url": "https://schema.data.gouv.fr/schemas/139bercy/format-commande-publique/1.3.0/sch\u00e9mas/json/contrats-concessions.json",
188
180
  },
189
181
  {
190
182
  "version_name": "1.4.0",
191
- "schema_url": "https://schema.data.gouv.fr/schemas/139bercy/format-commande-publique/1.4.0/marches.json"
183
+ "schema_url": "https://schema.data.gouv.fr/schemas/139bercy/format-commande-publique/1.4.0/marches.json",
192
184
  },
193
185
  {
194
186
  "version_name": "1.5.0",
195
- "schema_url": "https://schema.data.gouv.fr/schemas/139bercy/format-commande-publique/1.5.0/marches.json"
187
+ "schema_url": "https://schema.data.gouv.fr/schemas/139bercy/format-commande-publique/1.5.0/marches.json",
196
188
  },
197
189
  {
198
190
  "version_name": "2.0.0",
199
- "schema_url": "https://schema.data.gouv.fr/schemas/139bercy/format-commande-publique/2.0.0/marches.json"
191
+ "schema_url": "https://schema.data.gouv.fr/schemas/139bercy/format-commande-publique/2.0.0/marches.json",
200
192
  },
201
193
  {
202
194
  "version_name": "2.0.1",
203
- "schema_url": "https://schema.data.gouv.fr/schemas/139bercy/format-commande-publique/2.0.1/marches.json"
204
- }
195
+ "schema_url": "https://schema.data.gouv.fr/schemas/139bercy/format-commande-publique/2.0.1/marches.json",
196
+ },
205
197
  ],
206
198
  "external_doc": None,
207
199
  "external_tool": None,
208
200
  "homepage": "https://github.com/139bercy/format-commande-publique",
209
- }
201
+ },
210
202
  ]
211
203
 
212
204
  if with_datapackage_info:
@@ -214,4 +206,4 @@ class ResourceSchemaMockData():
214
206
  schemas[1]["datapackage_name"] = None
215
207
  schemas[1]["datapackage_description"] = None
216
208
 
217
- return schemas
209
+ return schemas
@@ -1,46 +1,59 @@
1
1
  from mongoengine import ValidationError
2
2
 
3
+ from udata.core.spatial.forms import SpatialCoverageField
4
+ from udata.core.storages import resources
3
5
  from udata.forms import ModelForm, fields, validators
4
6
  from udata.i18n import lazy_gettext as _
5
-
6
- from udata.core.storages import resources
7
- from udata.core.spatial.forms import SpatialCoverageField
8
7
  from udata.mongo.errors import FieldValidationError
9
8
 
10
- from .models import (
11
- Dataset, Resource, Schema, License, Checksum, CommunityResource,
12
- )
13
9
  from .constants import (
14
- UPDATE_FREQUENCIES, DEFAULT_FREQUENCY, RESOURCE_FILETYPES, CHECKSUM_TYPES,
15
- LEGACY_FREQUENCIES, RESOURCE_TYPES, TITLE_SIZE_LIMIT, DESCRIPTION_SIZE_LIMIT,
10
+ CHECKSUM_TYPES,
11
+ DEFAULT_FREQUENCY,
12
+ DESCRIPTION_SIZE_LIMIT,
13
+ LEGACY_FREQUENCIES,
14
+ RESOURCE_FILETYPES,
15
+ RESOURCE_TYPES,
16
+ TITLE_SIZE_LIMIT,
17
+ UPDATE_FREQUENCIES,
18
+ )
19
+ from .models import (
20
+ Checksum,
21
+ CommunityResource,
22
+ Dataset,
23
+ License,
24
+ Resource,
25
+ Schema,
16
26
  )
17
27
 
18
- __all__ = ('DatasetForm', 'ResourceForm', 'CommunityResourceForm')
28
+ __all__ = ("DatasetForm", "ResourceForm", "CommunityResourceForm")
29
+
19
30
 
20
31
  class ChecksumForm(ModelForm):
21
32
  model_class = Checksum
22
33
  choices = list(zip(CHECKSUM_TYPES, CHECKSUM_TYPES))
23
- type = fields.SelectField(choices=choices, default='sha1')
24
- value = fields.StringField(_('Checksum value'), [validators.DataRequired()])
34
+ type = fields.SelectField(choices=choices, default="sha1")
35
+ value = fields.StringField(_("Checksum value"), [validators.DataRequired()])
25
36
 
26
37
 
27
38
  def normalize_format(data):
28
- '''Normalize format field: strip and lowercase'''
39
+ """Normalize format field: strip and lowercase"""
29
40
  if data:
30
41
  return data.strip().lower()
31
42
 
32
43
 
33
44
  class SchemaForm(ModelForm):
34
45
  model_class = Schema
35
- url = fields.URLField(_('URL of the schema'))
36
- name = fields.StringField(_('Name of the schema'))
37
- version = fields.StringField(_('Version of the schema'))
46
+ url = fields.URLField(_("URL of the schema"))
47
+ name = fields.StringField(_("Name of the schema"))
48
+ version = fields.StringField(_("Version of the schema"))
38
49
 
39
- def validate(self, extra_validators = None):
50
+ def validate(self, extra_validators=None):
40
51
  validation = super().validate(extra_validators)
41
52
 
42
53
  try:
43
- Schema(url=self.url.data, name=self.name.data, version=self.version.data).clean(check_schema_in_catalog=True)
54
+ Schema(url=self.url.data, name=self.name.data, version=self.version.data).clean(
55
+ check_schema_in_catalog=True
56
+ )
44
57
  except FieldValidationError as err:
45
58
  field = getattr(self, err.field)
46
59
  field.errors.append(err.message)
@@ -51,32 +64,38 @@ class SchemaForm(ModelForm):
51
64
 
52
65
  class BaseResourceForm(ModelForm):
53
66
  title = fields.StringField(
54
- _('Title'), [validators.DataRequired(), validators.Length(max=TITLE_SIZE_LIMIT)])
67
+ _("Title"), [validators.DataRequired(), validators.Length(max=TITLE_SIZE_LIMIT)]
68
+ )
55
69
  description = fields.MarkdownField(
56
- _('Description'), [validators.Length(max=DESCRIPTION_SIZE_LIMIT)])
70
+ _("Description"), [validators.Length(max=DESCRIPTION_SIZE_LIMIT)]
71
+ )
57
72
  filetype = fields.RadioField(
58
- _('File type'), [validators.DataRequired()],
59
- choices=list(RESOURCE_FILETYPES.items()), default='file',
60
- description=_('Whether the resource is an uploaded file, '
61
- 'a remote file or an API'))
73
+ _("File type"),
74
+ [validators.DataRequired()],
75
+ choices=list(RESOURCE_FILETYPES.items()),
76
+ default="file",
77
+ description=_("Whether the resource is an uploaded file, " "a remote file or an API"),
78
+ )
62
79
  type = fields.RadioField(
63
- _('Type'), [validators.DataRequired()],
64
- choices=list(RESOURCE_TYPES.items()), default='other',
65
- description=_('Resource type (documentation, API...)'))
66
- url = fields.UploadableURLField(
67
- _('URL'), [validators.DataRequired()], storage=resources)
80
+ _("Type"),
81
+ [validators.DataRequired()],
82
+ choices=list(RESOURCE_TYPES.items()),
83
+ default="other",
84
+ description=_("Resource type (documentation, API...)"),
85
+ )
86
+ url = fields.UploadableURLField(_("URL"), [validators.DataRequired()], storage=resources)
68
87
  format = fields.StringField(
69
- _('Format'),
88
+ _("Format"),
70
89
  filters=[normalize_format],
71
90
  )
72
91
  checksum = fields.FormField(ChecksumForm)
73
92
  mime = fields.StringField(
74
- _('Mime type'),
75
- description=_('The mime type associated to the extension. '
76
- '(ex: text/plain)'))
93
+ _("Mime type"),
94
+ description=_("The mime type associated to the extension. " "(ex: text/plain)"),
95
+ )
77
96
  filesize = fields.IntegerField(
78
- _('Size'), [validators.optional()],
79
- description=_('The file size in bytes'))
97
+ _("Size"), [validators.optional()], description=_("The file size in bytes")
98
+ )
80
99
  extras = fields.ExtrasField()
81
100
  schema = fields.FormField(SchemaForm)
82
101
 
@@ -90,67 +109,72 @@ class ResourceForm(BaseResourceForm):
90
109
  class CommunityResourceForm(BaseResourceForm):
91
110
  model_class = CommunityResource
92
111
 
93
- dataset = fields.DatasetField(_('Related dataset'))
112
+ dataset = fields.DatasetField(_("Related dataset"))
94
113
  owner = fields.CurrentUserField()
95
- organization = fields.PublishAsField(_('Publish as'))
114
+ organization = fields.PublishAsField(_("Publish as"))
96
115
 
97
116
 
98
117
  def map_legacy_frequencies(form, field):
99
- ''' Map legacy frequencies to new ones'''
118
+ """Map legacy frequencies to new ones"""
100
119
  if field.data in LEGACY_FREQUENCIES:
101
120
  field.data = LEGACY_FREQUENCIES[field.data]
102
121
 
103
122
 
104
123
  def validate_contact_point(form, field):
105
- '''Validates contact point with dataset's org or owner'''
124
+ """Validates contact point with dataset's org or owner"""
106
125
  from udata.models import ContactPoint
126
+
107
127
  if field.data:
108
128
  if form.organization.data:
109
129
  contact_point = ContactPoint.objects(
110
- id=field.data.id, organization=form.organization.data).first()
130
+ id=field.data.id, organization=form.organization.data
131
+ ).first()
111
132
  elif form.owner.data:
112
- contact_point = ContactPoint.objects(
113
- id=field.data.id, owner=form.owner.data).first()
133
+ contact_point = ContactPoint.objects(id=field.data.id, owner=form.owner.data).first()
114
134
  if not contact_point:
115
- raise validators.ValidationError(_('Wrong contact point id or contact point ownership mismatch'))
135
+ raise validators.ValidationError(
136
+ _("Wrong contact point id or contact point ownership mismatch")
137
+ )
116
138
 
117
139
 
118
140
  class DatasetForm(ModelForm):
119
141
  model_class = Dataset
120
142
 
121
143
  title = fields.StringField(
122
- _('Title'), [validators.DataRequired(), validators.Length(max=TITLE_SIZE_LIMIT)])
123
- acronym = fields.StringField(_('Acronym'),
124
- description=_('An optional acronym'))
144
+ _("Title"), [validators.DataRequired(), validators.Length(max=TITLE_SIZE_LIMIT)]
145
+ )
146
+ acronym = fields.StringField(_("Acronym"), description=_("An optional acronym"))
125
147
  description = fields.MarkdownField(
126
- _('Description'), [validators.DataRequired(), validators.Length(max=DESCRIPTION_SIZE_LIMIT)],
127
- description=_('The details about the dataset '
128
- '(collection process, specifics...).'))
129
- license = fields.ModelSelectField(
130
- _('License'), model=License, allow_blank=True)
148
+ _("Description"),
149
+ [validators.DataRequired(), validators.Length(max=DESCRIPTION_SIZE_LIMIT)],
150
+ description=_("The details about the dataset " "(collection process, specifics...)."),
151
+ )
152
+ license = fields.ModelSelectField(_("License"), model=License, allow_blank=True)
131
153
  frequency = fields.SelectField(
132
- _('Update frequency'),
133
- choices=list(UPDATE_FREQUENCIES.items()), default=DEFAULT_FREQUENCY,
154
+ _("Update frequency"),
155
+ choices=list(UPDATE_FREQUENCIES.items()),
156
+ default=DEFAULT_FREQUENCY,
134
157
  validators=[validators.optional()],
135
158
  preprocessors=[map_legacy_frequencies],
136
- description=_('The frequency at which data are updated.'))
137
- frequency_date = fields.DateTimeField(_('Expected frequency date'))
159
+ description=_("The frequency at which data are updated."),
160
+ )
161
+ frequency_date = fields.DateTimeField(_("Expected frequency date"))
138
162
  deleted = fields.DateTimeField()
139
163
  archived = fields.DateTimeField()
140
164
  temporal_coverage = fields.DateRangeField(
141
- _('Temporal coverage'),
142
- description=_('The period covered by the data'))
165
+ _("Temporal coverage"), description=_("The period covered by the data")
166
+ )
143
167
  spatial = SpatialCoverageField(
144
- _('Spatial coverage'),
145
- description=_('The geographical area covered by the data.'))
146
- tags = fields.TagField(_('Tags'), description=_('Some taxonomy keywords'))
168
+ _("Spatial coverage"), description=_("The geographical area covered by the data.")
169
+ )
170
+ tags = fields.TagField(_("Tags"), description=_("Some taxonomy keywords"))
147
171
  private = fields.BooleanField(
148
- _('Private'),
149
- description=_('Restrict the dataset visibility to you or '
150
- 'your organization only.'))
172
+ _("Private"),
173
+ description=_("Restrict the dataset visibility to you or " "your organization only."),
174
+ )
151
175
 
152
176
  owner = fields.CurrentUserField()
153
- organization = fields.PublishAsField(_('Publish as'))
177
+ organization = fields.PublishAsField(_("Publish as"))
154
178
  extras = fields.ExtrasField()
155
179
  resources = fields.NestedModelList(ResourceForm)
156
180
  contact_point = fields.ContactPointField(validators=[validate_contact_point])