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,47 +1,47 @@
1
- from udata.core.user.factories import UserFactory
2
1
  import pytest
3
2
 
4
- from udata.models import Dataset, Topic, CommunityResource, Transfer
5
3
  from udata.core.dataset import tasks
6
- from udata.core.dataset.factories import DatasetFactory, CommunityResourceFactory
4
+
7
5
  # Those imports seem mandatory for the csv adapters to be registered.
8
6
  # This might be because of the decorator mechanism.
9
7
  from udata.core.dataset.csv import DatasetCsvAdapter, ResourcesCsvAdapter # noqa
8
+ from udata.core.dataset.factories import CommunityResourceFactory, DatasetFactory
10
9
  from udata.core.organization.csv import OrganizationCsvAdapter # noqa
11
10
  from udata.core.reuse.csv import ReuseCsvAdapter # noqa
12
11
  from udata.core.tags.csv import TagCsvAdapter # noqa
12
+ from udata.core.user.factories import UserFactory
13
13
  from udata.harvest.csv import HarvestSourceCsvAdapter # noqa
14
+ from udata.models import CommunityResource, Dataset, Topic, Transfer
14
15
 
15
-
16
- pytestmark = pytest.mark.usefixtures('clean_db')
16
+ pytestmark = pytest.mark.usefixtures("clean_db")
17
17
 
18
18
 
19
19
  def test_purge_datasets():
20
20
  datasets = [
21
- Dataset.objects.create(title='delete me', deleted='2016-01-01'),
22
- Dataset.objects.create(title='keep me'),
21
+ Dataset.objects.create(title="delete me", deleted="2016-01-01"),
22
+ Dataset.objects.create(title="keep me"),
23
23
  ]
24
24
 
25
- topic = Topic.objects.create(name='test topic', datasets=datasets)
25
+ topic = Topic.objects.create(name="test topic", datasets=datasets)
26
26
 
27
27
  user = UserFactory()
28
28
  transfer = Transfer.objects.create(
29
29
  owner=user,
30
30
  recipient=user,
31
31
  subject=datasets[0],
32
- comment='comment',
32
+ comment="comment",
33
33
  )
34
34
 
35
35
  tasks.purge_datasets()
36
36
 
37
37
  assert Transfer.objects.filter(id=transfer.id).count() == 0
38
38
 
39
- topic = Topic.objects(name='test topic').first()
39
+ topic = Topic.objects(name="test topic").first()
40
40
  assert topic.datasets[0] == datasets[1]
41
41
 
42
42
 
43
43
  def test_purge_datasets_community():
44
- dataset = Dataset.objects.create(title='delete me', deleted='2016-01-01')
44
+ dataset = Dataset.objects.create(title="delete me", deleted="2016-01-01")
45
45
  community_resource1 = CommunityResourceFactory()
46
46
  community_resource1.dataset = dataset
47
47
  community_resource1.save()
@@ -50,15 +50,15 @@ def test_purge_datasets_community():
50
50
  assert CommunityResource.objects.count() == 0
51
51
 
52
52
 
53
- @pytest.mark.usefixtures('instance_path')
53
+ @pytest.mark.usefixtures("instance_path")
54
54
  def test_export_csv(app):
55
55
  dataset = DatasetFactory()
56
- app.config['EXPORT_CSV_DATASET_ID'] = dataset.id
57
- models = app.config['EXPORT_CSV_MODELS']
56
+ app.config["EXPORT_CSV_DATASET_ID"] = dataset.id
57
+ models = app.config["EXPORT_CSV_MODELS"]
58
58
  tasks.export_csv()
59
59
  dataset = Dataset.objects.get(id=dataset.id)
60
60
  assert len(dataset.resources) == len(models)
61
- extras = [r.extras.get('csv-export:model') for r in dataset.resources]
61
+ extras = [r.extras.get("csv-export:model") for r in dataset.resources]
62
62
  for model in models:
63
63
  assert model in extras
64
64
  fs_filenames = [r.fs_filename for r in dataset.resources if r.url.endswith(r.fs_filename)]
@@ -1,14 +1,12 @@
1
1
  import pytest
2
2
 
3
- from udata.core.dataset.preview import PreviewPlugin, PreviewWarning
4
3
  from udata.core.dataset.factories import DatasetFactory
4
+ from udata.core.dataset.preview import PreviewPlugin, PreviewWarning
5
5
 
6
- pytestmark = [
7
- pytest.mark.usefixtures('clean_db')
8
- ]
6
+ pytestmark = [pytest.mark.usefixtures("clean_db")]
9
7
 
10
- PREVIEW_URL = 'http://preview'
11
- FALLBACK_PREVIEW_URL = 'http://preview/default'
8
+ PREVIEW_URL = "http://preview"
9
+ FALLBACK_PREVIEW_URL = "http://preview/default"
12
10
 
13
11
 
14
12
  class AlwaysPreview(PreviewPlugin):
@@ -32,7 +30,7 @@ class PreviewFromDataset(PreviewPlugin):
32
30
  return True
33
31
 
34
32
  def preview_url(self, resource):
35
- return resource.dataset.extras['preview']
33
+ return resource.dataset.extras["preview"]
36
34
 
37
35
 
38
36
  class FallbackPreview(PreviewPlugin):
@@ -58,12 +56,12 @@ class NotAValidPlugin(object):
58
56
  class ResourcePreviewTest:
59
57
  @pytest.fixture(autouse=True)
60
58
  def patch_entrypoint(self, request, mocker, app):
61
- marker = request.node.get_closest_marker('preview')
59
+ marker = request.node.get_closest_marker("preview")
62
60
  plugins = marker.args[0] if marker else []
63
- m = mocker.patch('udata.entrypoints.get_enabled')
61
+ m = mocker.patch("udata.entrypoints.get_enabled")
64
62
  m.return_value.values.return_value = plugins # Keep order
65
63
  yield
66
- m.assert_called_with('udata.preview', app)
64
+ m.assert_called_with("udata.preview", app)
67
65
 
68
66
  def test_preview_is_none_by_default(self):
69
67
  dataset = DatasetFactory(visible=True)
@@ -90,8 +88,7 @@ class ResourcePreviewTest:
90
88
 
91
89
  @pytest.mark.preview([PreviewFromDataset])
92
90
  def test_can_access_dataset_metadata(self):
93
- dataset = DatasetFactory(visible=True,
94
- extras={'preview': PREVIEW_URL})
91
+ dataset = DatasetFactory(visible=True, extras={"preview": PREVIEW_URL})
95
92
  resource = dataset.resources[0]
96
93
  assert resource.preview_url == PREVIEW_URL
97
94
 
@@ -116,7 +113,7 @@ class ResourcePreviewTest:
116
113
 
117
114
  @pytest.mark.preview([NotAValidPlugin])
118
115
  def test_warn_but_ignore_invalid_plugins(self):
119
- expected_msg = 'NotAValidPlugin is not a valid preview plugin'
116
+ expected_msg = "NotAValidPlugin is not a valid preview plugin"
120
117
  with pytest.warns(PreviewWarning, match=expected_msg):
121
118
  dataset = DatasetFactory(visible=True)
122
119
  resource = dataset.resources[0]
@@ -4,27 +4,23 @@ from udata.settings import Testing
4
4
 
5
5
  def create_geozones_fixtures():
6
6
  paca = GeoZoneFactory(
7
- id='fr:region:93', level='fr:region',
8
- name='Provence Alpes Côtes dAzur', code='93')
7
+ id="fr:region:93", level="fr:region", name="Provence Alpes Côtes dAzur", code="93"
8
+ )
9
9
  bdr = GeoZoneFactory(
10
- id='fr:departement:13', level='fr:departement',
11
- name='Bouches-du-Rhône', code='13')
12
- arles = GeoZoneFactory(
13
- id='fr:commune:13004', level='fr:commune',
14
- name='Arles', code='13004')
10
+ id="fr:departement:13", level="fr:departement", name="Bouches-du-Rhône", code="13"
11
+ )
12
+ arles = GeoZoneFactory(id="fr:commune:13004", level="fr:commune", name="Arles", code="13004")
15
13
  return paca, bdr, arles
16
14
 
17
15
 
18
16
  def create_old_new_regions_fixtures():
19
- lr = GeoZoneFactory(
20
- id='fr:region:91', level='fr:region',
21
- name='Languedoc-Rousillon', code='91')
17
+ lr = GeoZoneFactory(id="fr:region:91", level="fr:region", name="Languedoc-Rousillon", code="91")
22
18
  occitanie = GeoZoneFactory(
23
- id='fr:region:76', level='fr:region',
24
- name='Languedoc-Rousillon et Midi-Pyrénées', code='76')
19
+ id="fr:region:76", level="fr:region", name="Languedoc-Rousillon et Midi-Pyrénées", code="76"
20
+ )
25
21
  return lr, occitanie
26
22
 
27
23
 
28
24
  class TerritoriesSettings(Testing):
29
25
  ACTIVATE_TERRITORIES = True
30
- HANDLED_LEVELS = ('fr:commune', 'fr:departement', 'fr:region', 'country')
26
+ HANDLED_LEVELS = ("fr:commune", "fr:departement", "fr:region", "country")
@@ -3,8 +3,9 @@ from flask import url_for
3
3
  from udata.core.spatial.factories import GeoZoneFactory
4
4
  from udata.tests.api import APITestCase
5
5
  from udata.tests.features.territories import (
6
- create_geozones_fixtures, create_old_new_regions_fixtures,
7
- TerritoriesSettings
6
+ TerritoriesSettings,
7
+ create_geozones_fixtures,
8
+ create_old_new_regions_fixtures,
8
9
  )
9
10
 
10
11
 
@@ -16,189 +17,168 @@ class TerritoriesAPITest(APITestCase):
16
17
  self.paca, self.bdr, self.arles = create_geozones_fixtures()
17
18
 
18
19
  def test_suggest_no_parameter(self):
19
- response = self.get(url_for('api.suggest_territory'))
20
+ response = self.get(url_for("api.suggest_territory"))
20
21
  self.assert400(response)
21
22
 
22
23
  def test_suggest_empty(self):
23
- response = self.get(
24
- url_for('api.suggest_territory'), qs={'q': 'tes'})
24
+ response = self.get(url_for("api.suggest_territory"), qs={"q": "tes"})
25
25
  self.assert200(response)
26
26
  self.assertEqual(response.json, [])
27
- response = self.get(
28
- url_for('api.suggest_territory'), qs={'q': 'test'})
27
+ response = self.get(url_for("api.suggest_territory"), qs={"q": "test"})
29
28
  self.assert200(response)
30
29
  self.assertEqual(response.json, [])
31
30
 
32
31
  def test_suggest_town(self):
33
- response = self.get(
34
- url_for('api.suggest_territory'), qs={'q': 'arle'})
32
+ response = self.get(url_for("api.suggest_territory"), qs={"q": "arle"})
35
33
  self.assert200(response)
36
34
  result = response.json[0]
37
- self.assertEqual(result['title'], self.arles.name)
38
- self.assertEqual(result['id'], self.arles.id)
39
- self.assertIn('page', result)
35
+ self.assertEqual(result["title"], self.arles.name)
36
+ self.assertEqual(result["id"], self.arles.id)
37
+ self.assertIn("page", result)
40
38
 
41
39
  def test_suggest_town_five_letters(self):
42
- response = self.get(
43
- url_for('api.suggest_territory'), qs={'q': 'arles'})
40
+ response = self.get(url_for("api.suggest_territory"), qs={"q": "arles"})
44
41
  self.assert200(response)
45
42
  result = response.json[0]
46
- self.assertEqual(result['title'], self.arles.name)
47
- self.assertEqual(result['id'], self.arles.id)
48
- self.assertIn('page', result)
43
+ self.assertEqual(result["title"], self.arles.name)
44
+ self.assertEqual(result["id"], self.arles.id)
45
+ self.assertIn("page", result)
49
46
 
50
47
  def test_suggest_town_by_insee_code(self):
51
- response = self.get(
52
- url_for('api.suggest_territory'), qs={'q': '13004'})
48
+ response = self.get(url_for("api.suggest_territory"), qs={"q": "13004"})
53
49
  self.assert200(response)
54
50
  result = response.json[0]
55
- self.assertEqual(result['id'], self.arles.id)
56
- self.assertEqual(result['title'], self.arles.name)
51
+ self.assertEqual(result["id"], self.arles.id)
52
+ self.assertEqual(result["title"], self.arles.name)
57
53
 
58
54
  def test_suggest_towns(self):
59
55
  arles_sur_tech = GeoZoneFactory(
60
- id='fr:commune:66009', level='fr:commune',
61
- name='Arles-sur-Tech', code='66009')
62
- response = self.get(
63
- url_for('api.suggest_territory'), qs={'q': 'arles'})
56
+ id="fr:commune:66009", level="fr:commune", name="Arles-sur-Tech", code="66009"
57
+ )
58
+ response = self.get(url_for("api.suggest_territory"), qs={"q": "arles"})
64
59
  self.assert200(response)
65
60
  results = response.json
66
61
  self.assertEqual(len(results), 2)
67
62
  # Arles must be first given the population.
68
- self.assertEqual(results[0]['id'], self.arles.id)
69
- self.assertEqual(results[1]['id'], arles_sur_tech.id)
63
+ self.assertEqual(results[0]["id"], self.arles.id)
64
+ self.assertEqual(results[1]["id"], arles_sur_tech.id)
70
65
 
71
66
  def test_suggest_county(self):
72
- response = self.get(
73
- url_for('api.suggest_territory'), qs={'q': 'bouche'})
67
+ response = self.get(url_for("api.suggest_territory"), qs={"q": "bouche"})
74
68
  self.assert200(response)
75
69
  result = response.json[0]
76
- self.assertEqual(result['title'], self.bdr.name)
77
- self.assertEqual(result['id'], self.bdr.id)
78
- self.assertIn('page', result)
70
+ self.assertEqual(result["title"], self.bdr.name)
71
+ self.assertEqual(result["id"], self.bdr.id)
72
+ self.assertIn("page", result)
79
73
 
80
74
  def test_suggest_region(self):
81
- response = self.get(
82
- url_for('api.suggest_territory'), qs={'q': 'prov'})
75
+ response = self.get(url_for("api.suggest_territory"), qs={"q": "prov"})
83
76
  self.assert200(response)
84
77
  result = response.json[0]
85
- self.assertEqual(result['title'], self.paca.name)
86
- self.assertEqual(result['id'], self.paca.id)
87
- self.assertIn('page', result)
78
+ self.assertEqual(result["title"], self.paca.name)
79
+ self.assertEqual(result["id"], self.paca.id)
80
+ self.assertIn("page", result)
88
81
 
89
82
  def test_suggest_old_new_region(self):
90
83
  lr, occitanie = create_old_new_regions_fixtures()
91
- response = self.get(
92
- url_for('api.suggest_territory'), qs={'q': 'langue'})
84
+ response = self.get(url_for("api.suggest_territory"), qs={"q": "langue"})
93
85
  self.assert200(response)
94
86
  self.assertEqual(len(response.json), 2)
95
87
  result = response.json[1]
96
- self.assertEqual(result['title'], occitanie.name)
97
- self.assertEqual(result['id'], occitanie.id)
88
+ self.assertEqual(result["title"], occitanie.name)
89
+ self.assertEqual(result["id"], occitanie.id)
98
90
  result = response.json[0]
99
- self.assertEqual(result['title'], lr.name)
100
- self.assertEqual(result['id'], lr.id)
91
+ self.assertEqual(result["title"], lr.name)
92
+ self.assertEqual(result["id"], lr.id)
101
93
 
102
94
  def test_suggest_county_by_id(self):
103
- response = self.get(
104
- url_for('api.suggest_territory'), qs={'q': '13'})
95
+ response = self.get(url_for("api.suggest_territory"), qs={"q": "13"})
105
96
  self.assert200(response)
106
97
  result = response.json[0]
107
- self.assertEqual(result['id'], self.bdr.id)
108
- self.assertEqual(result['title'], self.bdr.name)
98
+ self.assertEqual(result["id"], self.bdr.id)
99
+ self.assertEqual(result["title"], self.bdr.name)
109
100
 
110
101
  def test_suggest_town_and_county(self):
111
102
  bouchet = GeoZoneFactory(
112
- id='fr:commune:26054', level='fr:commune',
113
- name='Bouchet', code='26054')
114
- response = self.get(
115
- url_for('api.suggest_territory'), qs={'q': 'bouche'})
103
+ id="fr:commune:26054", level="fr:commune", name="Bouchet", code="26054"
104
+ )
105
+ response = self.get(url_for("api.suggest_territory"), qs={"q": "bouche"})
116
106
  self.assert200(response)
117
107
  results = response.json
118
108
  self.assertEqual(len(results), 2)
119
109
  # BDR must be first given the population.
120
- self.assertEqual(results[0]['id'], self.bdr.id)
121
- self.assertEqual(results[1]['id'], bouchet.id)
110
+ self.assertEqual(results[0]["id"], self.bdr.id)
111
+ self.assertEqual(results[1]["id"], bouchet.id)
122
112
 
123
113
  def test_suggest_drom_com(self):
124
114
  guyane = GeoZoneFactory(
125
- id='fr:departement:973', level='fr:departement',
126
- name='Guyane', code='973')
127
- response = self.get(
128
- url_for('api.suggest_territory'), qs={'q': 'guya'})
115
+ id="fr:departement:973", level="fr:departement", name="Guyane", code="973"
116
+ )
117
+ response = self.get(url_for("api.suggest_territory"), qs={"q": "guya"})
129
118
  self.assert200(response)
130
119
  results = response.json
131
120
  self.assertEqual(len(results), 1)
132
- self.assertEqual(results[0]['id'], guyane.id)
121
+ self.assertEqual(results[0]["id"], guyane.id)
133
122
 
134
123
  def test_suggest_drom_com_by_code(self):
135
124
  guyane = GeoZoneFactory(
136
- id='fr:departement:973', level='fr:departement',
137
- name='Guyane', code='973')
138
- response = self.get(
139
- url_for('api.suggest_territory'), qs={'q': '973'})
125
+ id="fr:departement:973", level="fr:departement", name="Guyane", code="973"
126
+ )
127
+ response = self.get(url_for("api.suggest_territory"), qs={"q": "973"})
140
128
  self.assert200(response)
141
129
  results = response.json
142
130
  self.assertEqual(len(results), 1)
143
- self.assertEqual(results[0]['id'], guyane.id)
131
+ self.assertEqual(results[0]["id"], guyane.id)
144
132
 
145
133
  def test_suggest_corsica(self):
146
134
  bastia = GeoZoneFactory(
147
- id='fr:commune:2b033', level='fr:commune',
148
- name='Bastia', code='2b033')
149
- response = self.get(
150
- url_for('api.suggest_territory'), qs={'q': 'basti'})
135
+ id="fr:commune:2b033", level="fr:commune", name="Bastia", code="2b033"
136
+ )
137
+ response = self.get(url_for("api.suggest_territory"), qs={"q": "basti"})
151
138
  self.assert200(response)
152
139
  results = response.json
153
140
  self.assertEqual(len(results), 1)
154
- self.assertEqual(results[0]['id'], bastia.id)
141
+ self.assertEqual(results[0]["id"], bastia.id)
155
142
 
156
143
  def test_suggest_corsica_by_code(self):
157
144
  bastia = GeoZoneFactory(
158
- id='fr:commune:2b033', level='fr:commune',
159
- name='Bastia', code='2b033')
160
- response = self.get(
161
- url_for('api.suggest_territory'), qs={'q': '2b033'})
145
+ id="fr:commune:2b033", level="fr:commune", name="Bastia", code="2b033"
146
+ )
147
+ response = self.get(url_for("api.suggest_territory"), qs={"q": "2b033"})
162
148
  self.assert200(response)
163
149
  results = response.json
164
150
  self.assertEqual(len(results), 1)
165
- self.assertEqual(results[0]['id'], bastia.id)
151
+ self.assertEqual(results[0]["id"], bastia.id)
166
152
 
167
153
  def test_suggest_corsica_by_county_code(self):
168
154
  haute_corse = GeoZoneFactory(
169
- id='fr:departement:2b', level='fr:departement',
170
- name='Haute-Corse', code='2b')
171
- response = self.get(
172
- url_for('api.suggest_territory'), qs={'q': '2b'})
155
+ id="fr:departement:2b", level="fr:departement", name="Haute-Corse", code="2b"
156
+ )
157
+ response = self.get(url_for("api.suggest_territory"), qs={"q": "2b"})
173
158
  self.assert200(response)
174
159
  results = response.json
175
160
  self.assertEqual(len(results), 1)
176
- self.assertEqual(results[0]['id'], haute_corse.id)
161
+ self.assertEqual(results[0]["id"], haute_corse.id)
177
162
 
178
163
  def test_not_suggest_country(self):
179
- GeoZoneFactory(
180
- id='country:fr', level='country', name='France')
181
- response = self.get(
182
- url_for('api.suggest_territory'), qs={'q': 'fra'})
164
+ GeoZoneFactory(id="country:fr", level="country", name="France")
165
+ response = self.get(url_for("api.suggest_territory"), qs={"q": "fra"})
183
166
  self.assert200(response)
184
167
  results = response.json
185
168
  self.assertEqual(len(results), 0)
186
- response = self.get(
187
- url_for('api.suggest_territory'), qs={'q': 'fran'})
169
+ response = self.get(url_for("api.suggest_territory"), qs={"q": "fran"})
188
170
  self.assert200(response)
189
171
  results = response.json
190
172
  self.assertEqual(len(results), 0)
191
- response = self.get(
192
- url_for('api.suggest_territory'), qs={'q': 'franc'})
173
+ response = self.get(url_for("api.suggest_territory"), qs={"q": "franc"})
193
174
  self.assert200(response)
194
175
  results = response.json
195
176
  self.assertEqual(len(results), 0)
196
177
 
197
178
  def test_suggest_unicode(self):
198
- response = self.get(url_for('api.suggest_territory'),
199
- qs={'q': 'Bouches-du-Rhône'})
179
+ response = self.get(url_for("api.suggest_territory"), qs={"q": "Bouches-du-Rhône"})
200
180
  self.assert200(response)
201
181
  result = response.json[0]
202
- self.assertEqual(result['title'], self.bdr.name)
203
- self.assertEqual(result['id'], self.bdr.id)
204
- self.assertIn('page', result)
182
+ self.assertEqual(result["title"], self.bdr.name)
183
+ self.assertEqual(result["id"], self.bdr.id)
184
+ self.assertIn("page", result)
@@ -38,7 +38,7 @@ class UrlFieldTest(TestCase):
38
38
 
39
39
  fake = Fake()
40
40
  url = faker.url()
41
- form = FakeForm(MultiDict({'url': url}))
41
+ form = FakeForm(MultiDict({"url": url}))
42
42
 
43
43
  form.validate()
44
44
  self.assertEqual(form.errors, {})
@@ -52,7 +52,7 @@ class UrlFieldTest(TestCase):
52
52
 
53
53
  fake = Fake()
54
54
  url = faker.url()
55
- form = FakeForm(MultiDict({'url': url + ' '}))
55
+ form = FakeForm(MultiDict({"url": url + " "}))
56
56
 
57
57
  form.validate()
58
58
  self.assertEqual(form.errors, {})
@@ -64,18 +64,18 @@ class UrlFieldTest(TestCase):
64
64
  def test_with_invalid_url(self):
65
65
  Fake, FakeForm = self.factory()
66
66
 
67
- form = FakeForm(MultiDict({'url': 'this-is-not-an-url'}))
67
+ form = FakeForm(MultiDict({"url": "this-is-not-an-url"}))
68
68
 
69
69
  form.validate()
70
- self.assertIn('url', form.errors)
71
- self.assertEqual(len(form.errors['url']), 1)
70
+ self.assertIn("url", form.errors)
71
+ self.assertEqual(len(form.errors["url"]), 1)
72
72
 
73
73
  def test_with_unicode_url(self):
74
74
  Fake, FakeForm = self.factory()
75
75
 
76
76
  fake = Fake()
77
- url = 'https://www.somewhère.com/with/accënts/'
78
- form = FakeForm(MultiDict({'url': url}))
77
+ url = "https://www.somewhère.com/with/accënts/"
78
+ form = FakeForm(MultiDict({"url": url}))
79
79
 
80
80
  form.validate()
81
81
  self.assertEqual(form.errors, {})