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,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, {})