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,8 +1,8 @@
1
1
  from flask import url_for
2
2
 
3
- from udata.models import Member
4
3
  from udata.core.organization.factories import OrganizationFactory
5
4
  from udata.core.topic.factories import TopicFactory
5
+ from udata.models import Member
6
6
  from udata.tests.api import APITestCase
7
7
 
8
8
 
@@ -11,30 +11,29 @@ class MeAPIv2Test(APITestCase):
11
11
 
12
12
  def test_my_org_topics(self):
13
13
  user = self.login()
14
- member = Member(user=user, role='editor')
14
+ member = Member(user=user, role="editor")
15
15
  organization = OrganizationFactory(members=[member])
16
16
  topics = [
17
- TopicFactory(organization=organization, private=False, tags=['energy']),
17
+ TopicFactory(organization=organization, private=False, tags=["energy"]),
18
18
  TopicFactory(organization=organization, private=True),
19
19
  TopicFactory(owner=user),
20
20
  ]
21
21
  # another topic that shouldn't pop up
22
22
  TopicFactory()
23
23
 
24
- response = self.get(url_for('apiv2.my_org_topics'))
24
+ response = self.get(url_for("apiv2.my_org_topics"))
25
25
  assert response.status_code == 200
26
- data = response.json['data']
26
+ data = response.json["data"]
27
27
  assert len(data) == 3
28
28
  assert all(
29
- str(topic.id) in [remote_topic["id"] for remote_topic in data]
30
- for topic in topics
29
+ str(topic.id) in [remote_topic["id"] for remote_topic in data] for topic in topics
31
30
  )
32
- assert 'rel' in data[0]['datasets']
31
+ assert "rel" in data[0]["datasets"]
33
32
 
34
33
  # topic parser is already tested in topics test
35
34
  # we're just making sure one of theme is working
36
- response = self.get(url_for('apiv2.my_org_topics', tag='energy'))
35
+ response = self.get(url_for("apiv2.my_org_topics", tag="energy"))
37
36
  assert response.status_code == 200
38
- data = response.json['data']
37
+ data = response.json["data"]
39
38
  assert len(data) == 1
40
- assert data[0]['id'] == str(topics[0].id)
39
+ assert data[0]["id"] == str(topics[0].id)
@@ -1,71 +1,70 @@
1
1
  from flask import url_for
2
2
 
3
+ from udata.core.organization.factories import Member, OrganizationFactory
3
4
  from udata.tests.api import APITestCase
4
5
 
5
- from udata.core.organization.factories import OrganizationFactory, Member
6
-
7
6
 
8
7
  class OrganizationExtrasAPITest(APITestCase):
9
8
  modules = None
10
9
 
11
10
  def setUp(self):
12
11
  self.login()
13
- member = Member(user=self.user, role='admin')
12
+ member = Member(user=self.user, role="admin")
14
13
  self.org = OrganizationFactory(members=[member])
15
14
 
16
15
  def test_get_organization_extras(self):
17
- self.org.extras = {'test::extra': 'test-value'}
16
+ self.org.extras = {"test::extra": "test-value"}
18
17
  self.org.save()
19
- response = self.get(url_for('apiv2.organization_extras', org=self.org))
18
+ response = self.get(url_for("apiv2.organization_extras", org=self.org))
20
19
  self.assert200(response)
21
20
  data = response.json
22
- assert data['test::extra'] == 'test-value'
21
+ assert data["test::extra"] == "test-value"
23
22
 
24
23
  def test_update_organization_extras(self):
25
24
  self.org.extras = {
26
- 'test::extra': 'test-value',
27
- 'test::extra-second': 'test-value-second',
28
- 'test::none-will-be-deleted': 'test-value',
25
+ "test::extra": "test-value",
26
+ "test::extra-second": "test-value-second",
27
+ "test::none-will-be-deleted": "test-value",
29
28
  }
30
29
  self.org.save()
31
30
 
32
- data = ['test::extra-second', 'another::key']
33
- response = self.put(url_for('apiv2.organization_extras', org=self.org), data)
31
+ data = ["test::extra-second", "another::key"]
32
+ response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
34
33
  self.assert400(response)
35
- assert response.json['message'] == 'Wrong payload format, dict expected'
34
+ assert response.json["message"] == "Wrong payload format, dict expected"
36
35
 
37
36
  data = {
38
- 'test::extra-second': 'test-value-changed',
39
- 'another::key': 'another-value',
40
- 'test::none': None,
41
- 'test::none-will-be-deleted': None,
37
+ "test::extra-second": "test-value-changed",
38
+ "another::key": "another-value",
39
+ "test::none": None,
40
+ "test::none-will-be-deleted": None,
42
41
  }
43
- response = self.put(url_for('apiv2.organization_extras', org=self.org), data)
42
+ response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
44
43
  self.assert200(response)
45
44
 
46
45
  self.org.reload()
47
- assert self.org.extras['test::extra'] == 'test-value'
48
- assert self.org.extras['test::extra-second'] == 'test-value-changed'
49
- assert self.org.extras['another::key'] == 'another-value'
50
- assert 'test::none' not in self.org.extras
51
- assert 'test::none-will-be-deleted' not in self.org.extras
46
+ assert self.org.extras["test::extra"] == "test-value"
47
+ assert self.org.extras["test::extra-second"] == "test-value-changed"
48
+ assert self.org.extras["another::key"] == "another-value"
49
+ assert "test::none" not in self.org.extras
50
+ assert "test::none-will-be-deleted" not in self.org.extras
52
51
 
53
52
  def test_delete_organization_extras(self):
54
- self.org.extras = {'test::extra': 'test-value', 'another::key': 'another-value'}
53
+ self.org.extras = {"test::extra": "test-value", "another::key": "another-value"}
55
54
  self.org.save()
56
55
 
57
- data = {'another::key': 'another-value'}
58
- response = self.delete(url_for('apiv2.organization_extras', org=self.org), data)
56
+ data = {"another::key": "another-value"}
57
+ response = self.delete(url_for("apiv2.organization_extras", org=self.org), data)
59
58
  self.assert400(response)
60
- assert response.json['message'] == 'Wrong payload format, list expected'
59
+ assert response.json["message"] == "Wrong payload format, list expected"
61
60
 
62
- data = ['another::key']
63
- response = self.delete(url_for('apiv2.organization_extras', org=self.org), data)
61
+ data = ["another::key"]
62
+ response = self.delete(url_for("apiv2.organization_extras", org=self.org), data)
64
63
  self.assert204(response)
65
64
 
66
65
  self.org.reload()
67
66
  assert len(self.org.extras) == 1
68
- assert self.org.extras['test::extra'] == 'test-value'
67
+ assert self.org.extras["test::extra"] == "test-value"
69
68
 
70
69
  def test_update_organization_custom_extras(self):
71
70
  # Wrong type
@@ -74,47 +73,32 @@ class OrganizationExtrasAPITest(APITestCase):
74
73
  {
75
74
  "title": "color",
76
75
  "description": "the banner color of the dataset (Hex code)",
77
- "type": "tuple"
76
+ "type": "tuple",
78
77
  }
79
78
  ]
80
79
  }
81
- response = self.put(url_for('apiv2.organization_extras', org=self.org), data)
80
+ response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
82
81
  self.assert400(response)
83
82
 
84
83
  # Missing title
85
84
  data = {
86
- "custom": [
87
- {
88
- "description": "the banner color of the dataset (Hex code)",
89
- "type": "str"
90
- }
91
- ]
85
+ "custom": [{"description": "the banner color of the dataset (Hex code)", "type": "str"}]
92
86
  }
93
- response = self.put(url_for('apiv2.organization_extras', org=self.org), data)
87
+ response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
94
88
  self.assert400(response)
95
89
 
96
90
  # Missing description
97
- data = {
98
- "custom": [
99
- {
100
- "title": "color",
101
- "type": "str"
102
- }
103
- ]
104
- }
105
- response = self.put(url_for('apiv2.organization_extras', org=self.org), data)
91
+ data = {"custom": [{"title": "color", "type": "str"}]}
92
+ response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
106
93
  self.assert400(response)
107
94
 
108
95
  # Missing type
109
96
  data = {
110
97
  "custom": [
111
- {
112
- "title": "color",
113
- "description": "the banner color of the dataset (Hex code)"
114
- }
98
+ {"title": "color", "description": "the banner color of the dataset (Hex code)"}
115
99
  ]
116
100
  }
117
- response = self.put(url_for('apiv2.organization_extras', org=self.org), data)
101
+ response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
118
102
  self.assert400(response)
119
103
 
120
104
  # Choice type but missing choices key
@@ -123,11 +107,11 @@ class OrganizationExtrasAPITest(APITestCase):
123
107
  {
124
108
  "title": "color",
125
109
  "description": "the banner color of the dataset (Hex code)",
126
- "type": "choice"
110
+ "type": "choice",
127
111
  }
128
112
  ]
129
113
  }
130
- response = self.put(url_for('apiv2.organization_extras', org=self.org), data)
114
+ response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
131
115
  self.assert400(response)
132
116
 
133
117
  # Str type but present choices key
@@ -137,25 +121,20 @@ class OrganizationExtrasAPITest(APITestCase):
137
121
  "title": "color",
138
122
  "description": "the banner color of the dataset (Hex code)",
139
123
  "type": "str",
140
- "choices": ["yellow"]
124
+ "choices": ["yellow"],
141
125
  }
142
126
  ]
143
127
  }
144
- response = self.put(url_for('apiv2.organization_extras', org=self.org), data)
128
+ response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
145
129
  self.assert400(response)
146
130
 
147
131
  # Choice type but empty list choices
148
132
  data = {
149
133
  "custom": [
150
- {
151
- "title": "lispum",
152
- "description": "lispum",
153
- "type": "choice",
154
- "choices": []
155
- }
134
+ {"title": "lispum", "description": "lispum", "type": "choice", "choices": []}
156
135
  ]
157
136
  }
158
- response = self.put(url_for('apiv2.organization_extras', org=self.org), data)
137
+ response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
159
138
  self.assert400(response)
160
139
 
161
140
  data = {
@@ -163,16 +142,19 @@ class OrganizationExtrasAPITest(APITestCase):
163
142
  {
164
143
  "title": "color",
165
144
  "description": "the banner color of the dataset (Hex code)",
166
- "type": "str"
145
+ "type": "str",
167
146
  }
168
147
  ]
169
148
  }
170
- response = self.put(url_for('apiv2.organization_extras', org=self.org), data)
149
+ response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
171
150
  self.assert200(response)
172
151
  self.org.reload()
173
- assert self.org.extras['custom'][0]['title'] == 'color'
174
- assert self.org.extras['custom'][0]['description'] == 'the banner color of the dataset (Hex code)'
175
- assert self.org.extras['custom'][0]['type'] == 'str'
152
+ assert self.org.extras["custom"][0]["title"] == "color"
153
+ assert (
154
+ self.org.extras["custom"][0]["description"]
155
+ == "the banner color of the dataset (Hex code)"
156
+ )
157
+ assert self.org.extras["custom"][0]["type"] == "str"
176
158
 
177
159
  data = {
178
160
  "custom": [
@@ -180,14 +162,14 @@ class OrganizationExtrasAPITest(APITestCase):
180
162
  "title": "lispum",
181
163
  "description": "lispum",
182
164
  "type": "choice",
183
- "choices": ['lorem', 'ipsum']
165
+ "choices": ["lorem", "ipsum"],
184
166
  }
185
167
  ]
186
168
  }
187
- response = self.put(url_for('apiv2.organization_extras', org=self.org), data)
169
+ response = self.put(url_for("apiv2.organization_extras", org=self.org), data)
188
170
  self.assert200(response)
189
171
  self.org.reload()
190
- assert self.org.extras['custom'][0]['title'] == 'lispum'
191
- assert self.org.extras['custom'][0]['description'] == 'lispum'
192
- assert self.org.extras['custom'][0]['type'] == 'choice'
193
- assert self.org.extras['custom'][0]['choices'] == ['lorem', 'ipsum']
172
+ assert self.org.extras["custom"][0]["title"] == "lispum"
173
+ assert self.org.extras["custom"][0]["description"] == "lispum"
174
+ assert self.org.extras["custom"][0]["type"] == "choice"
175
+ assert self.org.extras["custom"][0]["choices"] == ["lorem", "ipsum"]
@@ -10,15 +10,15 @@ class SwaggerBlueprintTest:
10
10
  modules = []
11
11
 
12
12
  def test_swagger_resource_type(self, api):
13
- response = api.get(url_for('apiv2.specs'))
13
+ response = api.get(url_for("apiv2.specs"))
14
14
  assert200(response)
15
15
  swagger = json.loads(response.data)
16
- expected = swagger['paths']['/datasets/{dataset}/resources/']
17
- expected = expected['get']['responses']['200']['schema']['$ref']
18
- assert expected == '#/definitions/ResourcePage'
16
+ expected = swagger["paths"]["/datasets/{dataset}/resources/"]
17
+ expected = expected["get"]["responses"]["200"]["schema"]["$ref"]
18
+ assert expected == "#/definitions/ResourcePage"
19
19
 
20
20
  def test_swagger_specs_validate(self, api):
21
- response = api.get(url_for('apiv2.specs'))
21
+ response = api.get(url_for("apiv2.specs"))
22
22
  try:
23
23
  schemas.validate(response.json)
24
24
  except schemas.SchemaValidationError as e:
@@ -2,8 +2,8 @@ from flask import url_for
2
2
 
3
3
  from udata.core.dataset.factories import DatasetFactory
4
4
  from udata.core.organization.factories import OrganizationFactory
5
- from udata.core.spatial.factories import SpatialCoverageFactory
6
5
  from udata.core.reuse.factories import ReuseFactory
6
+ from udata.core.spatial.factories import SpatialCoverageFactory
7
7
  from udata.core.topic.factories import TopicFactory
8
8
  from udata.core.user.factories import UserFactory
9
9
  from udata.tests.api import APITestCase
@@ -14,100 +14,98 @@ class TopicsAPITest(APITestCase):
14
14
  modules = []
15
15
 
16
16
  def test_topic_api_list(self):
17
- '''It should fetch a topic list from the API'''
17
+ """It should fetch a topic list from the API"""
18
18
  owner = UserFactory()
19
19
  org = OrganizationFactory()
20
20
  paca, _, _ = create_geozones_fixtures()
21
21
 
22
- tag_topic = TopicFactory(tags=['energy'])
23
- name_topic = TopicFactory(name='topic-for-query')
22
+ tag_topic = TopicFactory(tags=["energy"])
23
+ name_topic = TopicFactory(name="topic-for-query")
24
24
  private_topic = TopicFactory(private=True)
25
25
  geozone_topic = TopicFactory(spatial=SpatialCoverageFactory(zones=[paca.id]))
26
- granularity_topic = TopicFactory(
27
- spatial=SpatialCoverageFactory(granularity='country')
28
- )
26
+ granularity_topic = TopicFactory(spatial=SpatialCoverageFactory(granularity="country"))
29
27
  owner_topic = TopicFactory(owner=owner)
30
28
  org_topic = TopicFactory(organization=org)
31
29
 
32
- response = self.get(url_for('apiv2.topics_list'))
30
+ response = self.get(url_for("apiv2.topics_list"))
33
31
  assert response.status_code == 200
34
- data = response.json['data']
32
+ data = response.json["data"]
35
33
  assert len(data) == 6
36
34
 
37
35
  hateoas_fields = ["rel", "href", "type", "total"]
38
36
  assert all(k in data[0]["datasets"] for k in hateoas_fields)
39
37
  assert all(k in data[0]["reuses"] for k in hateoas_fields)
40
38
 
41
- response = self.get(url_for('apiv2.topics_list', q='topic-for'))
39
+ response = self.get(url_for("apiv2.topics_list", q="topic-for"))
42
40
  assert response.status_code == 200
43
- assert len(response.json['data']) == 1
44
- assert response.json['data'][0]['id'] == str(name_topic.id)
41
+ assert len(response.json["data"]) == 1
42
+ assert response.json["data"][0]["id"] == str(name_topic.id)
45
43
 
46
- response = self.get(url_for('apiv2.topics_list', tag='energy'))
44
+ response = self.get(url_for("apiv2.topics_list", tag="energy"))
47
45
  assert response.status_code == 200
48
- assert len(response.json['data']) == 1
49
- assert response.json['data'][0]['id'] == str(tag_topic.id)
46
+ assert len(response.json["data"]) == 1
47
+ assert response.json["data"][0]["id"] == str(tag_topic.id)
50
48
 
51
- response = self.get(url_for('api.topics', include_private='true'))
49
+ response = self.get(url_for("api.topics", include_private="true"))
52
50
  assert response.status_code == 200
53
- assert len(response.json['data']) == 7
54
- assert str(private_topic.id) in [t['id'] for t in response.json['data']]
51
+ assert len(response.json["data"]) == 7
52
+ assert str(private_topic.id) in [t["id"] for t in response.json["data"]]
55
53
 
56
- response = self.get(url_for('api.topics', geozone=paca.id))
54
+ response = self.get(url_for("api.topics", geozone=paca.id))
57
55
  assert response.status_code == 200
58
- assert len(response.json['data']) == 1
59
- assert str(geozone_topic.id) in [t['id'] for t in response.json['data']]
56
+ assert len(response.json["data"]) == 1
57
+ assert str(geozone_topic.id) in [t["id"] for t in response.json["data"]]
60
58
 
61
- response = self.get(url_for('api.topics', granularity='country'))
59
+ response = self.get(url_for("api.topics", granularity="country"))
62
60
  assert response.status_code == 200
63
- assert len(response.json['data']) == 1
64
- assert str(granularity_topic.id) in [t['id'] for t in response.json['data']]
61
+ assert len(response.json["data"]) == 1
62
+ assert str(granularity_topic.id) in [t["id"] for t in response.json["data"]]
65
63
 
66
- response = self.get(url_for('api.topics', owner=owner.id))
64
+ response = self.get(url_for("api.topics", owner=owner.id))
67
65
  assert response.status_code == 200
68
- assert len(response.json['data']) == 1
69
- assert str(owner_topic.id) in [t['id'] for t in response.json['data']]
66
+ assert len(response.json["data"]) == 1
67
+ assert str(owner_topic.id) in [t["id"] for t in response.json["data"]]
70
68
 
71
- response = self.get(url_for('api.topics', organization=org.id))
69
+ response = self.get(url_for("api.topics", organization=org.id))
72
70
  assert response.status_code == 200
73
- assert len(response.json['data']) == 1
74
- assert str(org_topic.id) in [t['id'] for t in response.json['data']]
71
+ assert len(response.json["data"]) == 1
72
+ assert str(org_topic.id) in [t["id"] for t in response.json["data"]]
75
73
 
76
74
  def test_topic_api_get(self):
77
- '''It should fetch a topic from the API'''
75
+ """It should fetch a topic from the API"""
78
76
  topic = TopicFactory()
79
- topic_response = self.get(url_for('apiv2.topic', topic=topic))
77
+ topic_response = self.get(url_for("apiv2.topic", topic=topic))
80
78
  assert topic_response.status_code == 200
81
- assert 'spatial' in topic_response.json
79
+ assert "spatial" in topic_response.json
82
80
 
83
- assert topic_response.json['created_at'] is not None
84
- assert topic_response.json['last_modified'] is not None
81
+ assert topic_response.json["created_at"] is not None
82
+ assert topic_response.json["last_modified"] is not None
85
83
 
86
- response = self.get(topic_response.json['datasets']['href'])
84
+ response = self.get(topic_response.json["datasets"]["href"])
87
85
  data = response.json
88
- assert all(str(d.id) in (_d['id'] for _d in data['data']) for d in topic.datasets)
86
+ assert all(str(d.id) in (_d["id"] for _d in data["data"]) for d in topic.datasets)
89
87
 
90
- response = self.get(topic_response.json['reuses']['href'])
88
+ response = self.get(topic_response.json["reuses"]["href"])
91
89
  data = response.json
92
- assert all(str(r.id) in (_r['id'] for _r in data['data']) for r in topic.reuses)
90
+ assert all(str(r.id) in (_r["id"] for _r in data["data"]) for r in topic.reuses)
93
91
 
94
92
 
95
93
  class TopicDatasetsAPITest(APITestCase):
96
94
  def test_list(self):
97
95
  topic = TopicFactory()
98
- response = self.get(url_for('apiv2.topic_datasets', topic=topic))
96
+ response = self.get(url_for("apiv2.topic_datasets", topic=topic))
99
97
  assert response.status_code == 200
100
- data = response.json['data']
98
+ data = response.json["data"]
101
99
  assert len(data) == 3
102
- assert all(str(d.id) in (_d['id'] for _d in data) for d in topic.datasets)
100
+ assert all(str(d.id) in (_d["id"] for _d in data) for d in topic.datasets)
103
101
 
104
102
  def test_add_datasets(self):
105
103
  owner = self.login()
106
104
  topic = TopicFactory(owner=owner)
107
105
  d1, d2 = DatasetFactory.create_batch(2)
108
- response = self.post(url_for('apiv2.topic_datasets', topic=topic), [
109
- {'id': d1.id}, {'id': d2.id}
110
- ])
106
+ response = self.post(
107
+ url_for("apiv2.topic_datasets", topic=topic), [{"id": d1.id}, {"id": d2.id}]
108
+ )
111
109
  assert response.status_code == 201
112
110
  topic.reload()
113
111
  assert len(topic.datasets) == 5
@@ -117,15 +115,13 @@ class TopicDatasetsAPITest(APITestCase):
117
115
  owner = self.login()
118
116
  topic = TopicFactory(owner=owner)
119
117
  dataset = DatasetFactory()
120
- response = self.post(url_for('apiv2.topic_datasets', topic=topic), [
121
- {'id': dataset.id}, {'id': dataset.id}
122
- ])
118
+ response = self.post(
119
+ url_for("apiv2.topic_datasets", topic=topic), [{"id": dataset.id}, {"id": dataset.id}]
120
+ )
123
121
  assert response.status_code == 201
124
122
  topic.reload()
125
123
  assert len(topic.datasets) == 4
126
- response = self.post(url_for('apiv2.topic_datasets', topic=topic), [
127
- {'id': dataset.id}
128
- ])
124
+ response = self.post(url_for("apiv2.topic_datasets", topic=topic), [{"id": dataset.id}])
129
125
  assert response.status_code == 201
130
126
  topic.reload()
131
127
  assert len(topic.datasets) == 4
@@ -135,23 +131,17 @@ class TopicDatasetsAPITest(APITestCase):
135
131
  topic = TopicFactory(owner=user)
136
132
  dataset = DatasetFactory()
137
133
  self.login()
138
- response = self.post(url_for('apiv2.topic_datasets', topic=topic), [
139
- {'id': dataset.id}
140
- ])
134
+ response = self.post(url_for("apiv2.topic_datasets", topic=topic), [{"id": dataset.id}])
141
135
  assert response.status_code == 403
142
136
 
143
137
  def test_add_datasets_wrong_payload(self):
144
138
  owner = self.login()
145
139
  topic = TopicFactory(owner=owner)
146
- response = self.post(url_for('apiv2.topic_datasets', topic=topic), [
147
- {'id': 'xxx'}
148
- ])
140
+ response = self.post(url_for("apiv2.topic_datasets", topic=topic), [{"id": "xxx"}])
149
141
  assert response.status_code == 400
150
- response = self.post(url_for('apiv2.topic_datasets', topic=topic), [
151
- {'nain': 'portekoi'}
152
- ])
142
+ response = self.post(url_for("apiv2.topic_datasets", topic=topic), [{"nain": "portekoi"}])
153
143
  assert response.status_code == 400
154
- response = self.post(url_for('apiv2.topic_datasets', topic=topic), {'non': 'mais'})
144
+ response = self.post(url_for("apiv2.topic_datasets", topic=topic), {"non": "mais"})
155
145
  assert response.status_code == 400
156
146
 
157
147
 
@@ -160,7 +150,7 @@ class TopicDatasetAPITest(APITestCase):
160
150
  owner = self.login()
161
151
  topic = TopicFactory(owner=owner)
162
152
  dataset = topic.datasets[0]
163
- response = self.delete(url_for('apiv2.topic_dataset', topic=topic, dataset=dataset))
153
+ response = self.delete(url_for("apiv2.topic_dataset", topic=topic, dataset=dataset))
164
154
  assert response.status_code == 204
165
155
  topic.reload()
166
156
  assert len(topic.datasets) == 2
@@ -170,26 +160,26 @@ class TopicDatasetAPITest(APITestCase):
170
160
  topic = TopicFactory(owner=UserFactory())
171
161
  dataset = topic.datasets[0]
172
162
  self.login()
173
- response = self.delete(url_for('apiv2.topic_dataset', topic=topic, dataset=dataset))
163
+ response = self.delete(url_for("apiv2.topic_dataset", topic=topic, dataset=dataset))
174
164
  assert response.status_code == 403
175
165
 
176
166
 
177
167
  class TopicReusesAPITest(APITestCase):
178
168
  def test_list(self):
179
169
  topic = TopicFactory()
180
- response = self.get(url_for('apiv2.topic_reuses', topic=topic))
170
+ response = self.get(url_for("apiv2.topic_reuses", topic=topic))
181
171
  assert response.status_code == 200
182
- data = response.json['data']
172
+ data = response.json["data"]
183
173
  assert len(data) == 3
184
- assert all(str(r.id) in (_r['id'] for _r in data) for r in topic.reuses)
174
+ assert all(str(r.id) in (_r["id"] for _r in data) for r in topic.reuses)
185
175
 
186
176
  def test_add_reuses(self):
187
177
  owner = self.login()
188
178
  topic = TopicFactory(owner=owner)
189
179
  r1, r2 = ReuseFactory.create_batch(2)
190
- response = self.post(url_for('apiv2.topic_reuses', topic=topic), [
191
- {'id': r1.id}, {'id': r2.id}
192
- ])
180
+ response = self.post(
181
+ url_for("apiv2.topic_reuses", topic=topic), [{"id": r1.id}, {"id": r2.id}]
182
+ )
193
183
  assert response.status_code == 201
194
184
  topic.reload()
195
185
  assert len(topic.reuses) == 5
@@ -199,15 +189,13 @@ class TopicReusesAPITest(APITestCase):
199
189
  owner = self.login()
200
190
  topic = TopicFactory(owner=owner)
201
191
  reuse = ReuseFactory()
202
- response = self.post(url_for('apiv2.topic_reuses', topic=topic), [
203
- {'id': reuse.id}, {'id': reuse.id}
204
- ])
192
+ response = self.post(
193
+ url_for("apiv2.topic_reuses", topic=topic), [{"id": reuse.id}, {"id": reuse.id}]
194
+ )
205
195
  assert response.status_code == 201
206
196
  topic.reload()
207
197
  assert len(topic.reuses) == 4
208
- response = self.post(url_for('apiv2.topic_reuses', topic=topic), [
209
- {'id': reuse.id}
210
- ])
198
+ response = self.post(url_for("apiv2.topic_reuses", topic=topic), [{"id": reuse.id}])
211
199
  assert response.status_code == 201
212
200
  topic.reload()
213
201
  assert len(topic.reuses) == 4
@@ -217,23 +205,17 @@ class TopicReusesAPITest(APITestCase):
217
205
  topic = TopicFactory(owner=user)
218
206
  reuse = ReuseFactory()
219
207
  self.login()
220
- response = self.post(url_for('apiv2.topic_reuses', topic=topic), [
221
- {'id': reuse.id}
222
- ])
208
+ response = self.post(url_for("apiv2.topic_reuses", topic=topic), [{"id": reuse.id}])
223
209
  assert response.status_code == 403
224
210
 
225
211
  def test_add_reuses_wrong_payload(self):
226
212
  owner = self.login()
227
213
  topic = TopicFactory(owner=owner)
228
- response = self.post(url_for('apiv2.topic_reuses', topic=topic), [
229
- {'id': 'xxx'}
230
- ])
214
+ response = self.post(url_for("apiv2.topic_reuses", topic=topic), [{"id": "xxx"}])
231
215
  assert response.status_code == 400
232
- response = self.post(url_for('apiv2.topic_reuses', topic=topic), [
233
- {'nain': 'portekoi'}
234
- ])
216
+ response = self.post(url_for("apiv2.topic_reuses", topic=topic), [{"nain": "portekoi"}])
235
217
  assert response.status_code == 400
236
- response = self.post(url_for('apiv2.topic_reuses', topic=topic), {'non': 'mais'})
218
+ response = self.post(url_for("apiv2.topic_reuses", topic=topic), {"non": "mais"})
237
219
  assert response.status_code == 400
238
220
 
239
221
 
@@ -242,7 +224,7 @@ class TopicReuseAPITest(APITestCase):
242
224
  owner = self.login()
243
225
  topic = TopicFactory(owner=owner)
244
226
  reuse = topic.reuses[0]
245
- response = self.delete(url_for('apiv2.topic_reuse', topic=topic, reuse=reuse))
227
+ response = self.delete(url_for("apiv2.topic_reuse", topic=topic, reuse=reuse))
246
228
  assert response.status_code == 204
247
229
  topic.reload()
248
230
  assert len(topic.reuses) == 2
@@ -252,5 +234,5 @@ class TopicReuseAPITest(APITestCase):
252
234
  topic = TopicFactory(owner=UserFactory())
253
235
  reuse = topic.reuses[0]
254
236
  self.login()
255
- response = self.delete(url_for('apiv2.topic_reuse', topic=topic, reuse=reuse))
237
+ response = self.delete(url_for("apiv2.topic_reuse", topic=topic, reuse=reuse))
256
238
  assert response.status_code == 403