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,30 +1,32 @@
1
- import pytest
2
-
3
1
  from datetime import datetime
4
2
 
3
+ import pytest
5
4
  from flask import url_for
6
5
 
7
- from udata.models import (
8
- Organization, Member, MembershipRequest, Follow, Discussion
9
- )
10
-
11
- from udata.utils import faker
12
6
  from udata.core.badges.factories import badge_factory
13
7
  from udata.core.badges.signals import on_badge_added, on_badge_removed
14
- from udata.core.organization.factories import OrganizationFactory
15
- from udata.core.user.factories import UserFactory, AdminFactory
16
8
  from udata.core.dataset.factories import DatasetFactory
9
+ from udata.core.organization.factories import OrganizationFactory
17
10
  from udata.core.reuse.factories import ReuseFactory
11
+ from udata.core.user.factories import AdminFactory, UserFactory
18
12
  from udata.i18n import _
19
-
13
+ from udata.models import Discussion, Follow, Member, MembershipRequest, Organization
20
14
  from udata.tests.helpers import (
21
- assert_emit, assert_not_emit,
22
- assert200, assert201, assert204, assert403, assert400, assert404,
23
- assert410, assert_status
15
+ assert200,
16
+ assert201,
17
+ assert204,
18
+ assert400,
19
+ assert403,
20
+ assert404,
21
+ assert410,
22
+ assert_emit,
23
+ assert_not_emit,
24
+ assert_status,
24
25
  )
26
+ from udata.utils import faker
25
27
 
26
28
  pytestmark = [
27
- pytest.mark.usefixtures('clean_db'),
29
+ pytest.mark.usefixtures("clean_db"),
28
30
  ]
29
31
 
30
32
 
@@ -32,152 +34,155 @@ class OrganizationAPITest:
32
34
  modules = []
33
35
 
34
36
  def test_organization_api_list(self, api):
35
- '''It should fetch an organization list from the API'''
37
+ """It should fetch an organization list from the API"""
36
38
  organizations = OrganizationFactory.create_batch(3)
37
39
 
38
- response = api.get(url_for('api.organizations'))
40
+ response = api.get(url_for("api.organizations"))
39
41
  assert200(response)
40
- len(response.json['data']) == len(organizations)
42
+ len(response.json["data"]) == len(organizations)
41
43
 
42
44
  def test_organization_role_api_get(self, api):
43
- '''It should fetch an organization's roles list from the API'''
44
- response = api.get(url_for('api.org_roles'))
45
+ """It should fetch an organization's roles list from the API"""
46
+ response = api.get(url_for("api.org_roles"))
45
47
  assert200(response)
46
48
 
47
49
  def test_organization_api_get(self, api):
48
- '''It should fetch an organization from the API'''
50
+ """It should fetch an organization from the API"""
49
51
  organization = OrganizationFactory()
50
- response = api.get(url_for('api.organization', org=organization))
52
+ response = api.get(url_for("api.organization", org=organization))
51
53
  assert200(response)
52
54
 
53
55
  def test_organization_api_get_deleted(self, api):
54
- '''It should not fetch a deleted organization from the API'''
56
+ """It should not fetch a deleted organization from the API"""
55
57
  organization = OrganizationFactory(deleted=datetime.utcnow())
56
- response = api.get(url_for('api.organization', org=organization))
58
+ response = api.get(url_for("api.organization", org=organization))
57
59
  assert410(response)
58
60
 
59
61
  def test_organization_api_get_deleted_but_authorized(self, api):
60
- '''It should fetch a deleted organization from the API if authorized'''
62
+ """It should fetch a deleted organization from the API if authorized"""
61
63
  user = api.login()
62
- member = Member(user=user, role='editor')
63
- organization = OrganizationFactory(deleted=datetime.utcnow(),
64
- members=[member])
65
- response = api.get(url_for('api.organization', org=organization))
64
+ member = Member(user=user, role="editor")
65
+ organization = OrganizationFactory(deleted=datetime.utcnow(), members=[member])
66
+ response = api.get(url_for("api.organization", org=organization))
66
67
  assert200(response)
67
68
 
68
69
  def test_organization_api_create(self, api):
69
- '''It should create an organization from the API'''
70
+ """It should create an organization from the API"""
70
71
  data = OrganizationFactory.as_dict()
71
72
  user = api.login()
72
- response = api.post(url_for('api.organizations'), data)
73
+ response = api.post(url_for("api.organizations"), data)
73
74
  assert201(response)
74
75
  assert Organization.objects.count() is 1
75
76
 
76
77
  org = Organization.objects.first()
77
78
  member = org.member(user)
78
- assert member is not None, 'Current user should be a member'
79
- assert member.role == 'admin', 'Current user should be an administrator'
80
- assert org.get_metrics()['members'] == 1
79
+ assert member is not None, "Current user should be a member"
80
+ assert member.role == "admin", "Current user should be an administrator"
81
+ assert org.get_metrics()["members"] == 1
81
82
 
82
83
  def test_organization_api_update(self, api):
83
- '''It should update an organization from the API'''
84
+ """It should update an organization from the API"""
84
85
  user = api.login()
85
- member = Member(user=user, role='admin')
86
+ member = Member(user=user, role="admin")
86
87
  org = OrganizationFactory(members=[member])
87
88
  data = org.to_dict()
88
- data['description'] = 'new description'
89
- response = api.put(url_for('api.organization', org=org), data)
89
+ data["description"] = "new description"
90
+ response = api.put(url_for("api.organization", org=org), data)
90
91
  assert200(response)
91
92
  assert Organization.objects.count() is 1
92
- assert Organization.objects.first().description == 'new description'
93
+ assert Organization.objects.first().description == "new description"
93
94
 
94
95
  def test_organization_api_update_business_number_id(self, api):
95
- '''It should update an organization from the API by adding a business number id'''
96
+ """It should update an organization from the API by adding a business number id"""
96
97
  user = api.login()
97
- member = Member(user=user, role='admin')
98
+ member = Member(user=user, role="admin")
98
99
  org = OrganizationFactory(members=[member])
99
100
  data = org.to_dict()
100
- data['business_number_id'] = '13002526500013'
101
- response = api.put(url_for('api.organization', org=org), data)
101
+ data["business_number_id"] = "13002526500013"
102
+ response = api.put(url_for("api.organization", org=org), data)
102
103
  assert200(response)
103
104
  assert Organization.objects.count() is 1
104
- assert Organization.objects.first().business_number_id == '13002526500013'
105
+ assert Organization.objects.first().business_number_id == "13002526500013"
105
106
 
106
107
  def test_organization_api_update_business_number_id_failing(self, api):
107
- '''It should update an organization from the API by adding a business number id'''
108
+ """It should update an organization from the API by adding a business number id"""
108
109
  user = api.login()
109
- member = Member(user=user, role='admin')
110
+ member = Member(user=user, role="admin")
110
111
  org = OrganizationFactory(members=[member])
111
112
  data = org.to_dict()
112
- data['business_number_id'] = '110014016'
113
- response = api.put(url_for('api.organization', org=org), data)
113
+ data["business_number_id"] = "110014016"
114
+ response = api.put(url_for("api.organization", org=org), data)
114
115
  assert400(response)
115
- assert response.json['errors']['business_number_id'][0] == _('A siret number is made of 14 digits')
116
+ assert response.json["errors"]["business_number_id"][0] == _(
117
+ "A siret number is made of 14 digits"
118
+ )
116
119
 
117
- data['business_number_id'] = '12345678901234'
118
- response = api.put(url_for('api.organization', org=org), data)
120
+ data["business_number_id"] = "12345678901234"
121
+ response = api.put(url_for("api.organization", org=org), data)
119
122
  assert400(response)
120
- assert response.json['errors']['business_number_id'][0] == _('Invalid Siret number')
123
+ assert response.json["errors"]["business_number_id"][0] == _("Invalid Siret number")
121
124
 
122
- data['business_number_id'] = 'tttttttttttttt'
123
- response = api.put(url_for('api.organization', org=org), data)
125
+ data["business_number_id"] = "tttttttttttttt"
126
+ response = api.put(url_for("api.organization", org=org), data)
124
127
  assert400(response)
125
- assert response.json['errors']['business_number_id'][0] == _('A siret number is only made of digits')
128
+ assert response.json["errors"]["business_number_id"][0] == _(
129
+ "A siret number is only made of digits"
130
+ )
126
131
 
127
132
  def test_organization_api_update_deleted(self, api):
128
- '''It should not update a deleted organization from the API'''
133
+ """It should not update a deleted organization from the API"""
129
134
  org = OrganizationFactory(deleted=datetime.utcnow())
130
135
  data = org.to_dict()
131
- data['description'] = 'new description'
136
+ data["description"] = "new description"
132
137
  api.login()
133
- response = api.put(url_for('api.organization', org=org), data)
138
+ response = api.put(url_for("api.organization", org=org), data)
134
139
  assert410(response)
135
140
  assert Organization.objects.first().description == org.description
136
141
 
137
142
  def test_organization_api_update_forbidden(self, api):
138
- '''It should not update an organization from the API if not admin'''
143
+ """It should not update an organization from the API if not admin"""
139
144
  org = OrganizationFactory()
140
145
  data = org.to_dict()
141
- data['description'] = 'new description'
146
+ data["description"] = "new description"
142
147
  api.login()
143
- response = api.put(url_for('api.organization', org=org), data)
148
+ response = api.put(url_for("api.organization", org=org), data)
144
149
  assert403(response)
145
150
  assert Organization.objects.count() is 1
146
151
  assert Organization.objects.first().description == org.description
147
152
 
148
153
  def test_organization_api_delete(self, api):
149
- '''It should delete an organization from the API'''
154
+ """It should delete an organization from the API"""
150
155
  user = api.login()
151
- member = Member(user=user, role='admin')
156
+ member = Member(user=user, role="admin")
152
157
  org = OrganizationFactory(members=[member])
153
- response = api.delete(url_for('api.organization', org=org))
158
+ response = api.delete(url_for("api.organization", org=org))
154
159
  assert204(response)
155
160
  assert Organization.objects.count() is 1
156
161
  assert Organization.objects[0].deleted is not None
157
162
 
158
163
  def test_organization_api_delete_deleted(self, api):
159
- '''It should not delete a deleted organization from the API'''
164
+ """It should not delete a deleted organization from the API"""
160
165
  api.login()
161
166
  organization = OrganizationFactory(deleted=datetime.utcnow())
162
- response = api.delete(url_for('api.organization', org=organization))
167
+ response = api.delete(url_for("api.organization", org=organization))
163
168
  assert410(response)
164
169
  assert Organization.objects[0].deleted is not None
165
170
 
166
171
  def test_organization_api_delete_as_editor_forbidden(self, api):
167
- '''It should not delete an organization from the API if not admin'''
172
+ """It should not delete an organization from the API if not admin"""
168
173
  user = api.login()
169
- member = Member(user=user, role='editor')
174
+ member = Member(user=user, role="editor")
170
175
  org = OrganizationFactory(members=[member])
171
- response = api.delete(url_for('api.organization', org=org))
176
+ response = api.delete(url_for("api.organization", org=org))
172
177
  assert403(response)
173
178
  assert Organization.objects.count() is 1
174
179
  assert Organization.objects[0].deleted is None
175
180
 
176
181
  def test_organization_api_delete_as_non_member_forbidden(self, api):
177
- '''It should delete an organization from the API if not member'''
182
+ """It should delete an organization from the API if not member"""
178
183
  api.login()
179
184
  org = OrganizationFactory()
180
- response = api.delete(url_for('api.organization', org=org))
185
+ response = api.delete(url_for("api.organization", org=org))
181
186
  assert403(response)
182
187
  assert Organization.objects.count() is 1
183
188
  assert Organization.objects[0].deleted is None
@@ -189,9 +194,9 @@ class MembershipAPITest:
189
194
  def test_request_membership(self, api):
190
195
  organization = OrganizationFactory()
191
196
  user = api.login()
192
- data = {'comment': 'a comment'}
197
+ data = {"comment": "a comment"}
193
198
 
194
- response = api.post(url_for('api.request_membership', org=organization), data)
199
+ response = api.post(url_for("api.request_membership", org=organization), data)
195
200
  assert201(response)
196
201
 
197
202
  organization.reload()
@@ -202,19 +207,19 @@ class MembershipAPITest:
202
207
 
203
208
  request = organization.requests[0]
204
209
  assert request.user == user
205
- assert request.status == 'pending'
206
- assert request.comment == 'a comment'
210
+ assert request.status == "pending"
211
+ assert request.comment == "a comment"
207
212
  assert request.handled_on is None
208
213
  assert request.handled_by is None
209
214
  assert request.refusal_comment is None
210
215
 
211
216
  def test_request_existing_pending_membership_do_not_duplicate_it(self, api):
212
217
  user = api.login()
213
- previous_request = MembershipRequest(user=user, comment='previous')
218
+ previous_request = MembershipRequest(user=user, comment="previous")
214
219
  organization = OrganizationFactory(requests=[previous_request])
215
- data = {'comment': 'a comment'}
220
+ data = {"comment": "a comment"}
216
221
 
217
- response = api.post(url_for('api.request_membership', org=organization), data)
222
+ response = api.post(url_for("api.request_membership", org=organization), data)
218
223
  assert200(response)
219
224
 
220
225
  organization.reload()
@@ -225,8 +230,8 @@ class MembershipAPITest:
225
230
 
226
231
  request = organization.requests[0]
227
232
  assert request.user == user
228
- assert request.status == 'pending'
229
- assert request.comment == 'a comment'
233
+ assert request.status == "pending"
234
+ assert request.comment == "a comment"
230
235
  assert request.handled_on is None
231
236
  assert request.handled_by is None
232
237
  assert request.refusal_comment is None
@@ -234,94 +239,91 @@ class MembershipAPITest:
234
239
  def test_get_membership_requests(self, api):
235
240
  user = api.login()
236
241
  applicant = UserFactory(email="thibaud@example.org")
237
- membership_request = MembershipRequest(user=applicant, comment='test')
238
- member = Member(user=user, role='admin')
239
- organization = OrganizationFactory(
240
- members=[member], requests=[membership_request])
242
+ membership_request = MembershipRequest(user=applicant, comment="test")
243
+ member = Member(user=user, role="admin")
244
+ organization = OrganizationFactory(members=[member], requests=[membership_request])
241
245
 
242
- response = api.get(url_for('api.request_membership', org=organization))
246
+ response = api.get(url_for("api.request_membership", org=organization))
243
247
  assert200(response)
244
248
 
245
249
  assert len(response.json) == 1
246
- assert response.json[0]['comment'] == 'test'
247
- assert response.json[0]['user']['email'] == 'thibaud@example.org' # Can see email of applicant
250
+ assert response.json[0]["comment"] == "test"
251
+ assert (
252
+ response.json[0]["user"]["email"] == "thibaud@example.org"
253
+ ) # Can see email of applicant
248
254
 
249
255
  def test_only_org_member_can_get_membership_requests(self, api):
250
256
  api.login()
251
257
  applicant = UserFactory(email="thibaud@example.org")
252
- membership_request = MembershipRequest(user=applicant, comment='test')
253
- organization = OrganizationFactory(
254
- members=[], requests=[membership_request])
258
+ membership_request = MembershipRequest(user=applicant, comment="test")
259
+ organization = OrganizationFactory(members=[], requests=[membership_request])
255
260
 
256
- response = api.get(url_for('api.request_membership', org=organization))
261
+ response = api.get(url_for("api.request_membership", org=organization))
257
262
  assert403(response)
258
263
 
259
-
260
264
  def test_get_members_with_or_without_email(self, api):
261
- admin = Member(user=UserFactory(email="admin@example.org"), role='admin', since="2024-04-14")
262
- editor = Member(user=UserFactory(email="editor@example.org"), role='editor')
265
+ admin = Member(
266
+ user=UserFactory(email="admin@example.org"), role="admin", since="2024-04-14"
267
+ )
268
+ editor = Member(user=UserFactory(email="editor@example.org"), role="editor")
263
269
  other = UserFactory(email="other@example.org")
264
270
 
265
271
  organization = OrganizationFactory(members=[admin, editor])
266
272
 
267
273
  # Admin can see emails
268
274
  api.login(admin.user)
269
- response = api.get(url_for('api.organization', org=organization))
275
+ response = api.get(url_for("api.organization", org=organization))
270
276
  assert200(response)
271
277
 
272
- members = response.json['members']
278
+ members = response.json["members"]
273
279
  assert len(members) == 2
274
- assert members[0]['role'] == 'admin'
275
- assert members[0]['since'] == '2024-04-14T00:00:00+00:00'
276
- assert members[0]['user']['email'] == 'admin@example.org'
280
+ assert members[0]["role"] == "admin"
281
+ assert members[0]["since"] == "2024-04-14T00:00:00+00:00"
282
+ assert members[0]["user"]["email"] == "admin@example.org"
277
283
 
278
- assert members[1]['role'] == 'editor'
279
- assert members[1]['user']['email'] == 'editor@example.org'
284
+ assert members[1]["role"] == "editor"
285
+ assert members[1]["user"]["email"] == "editor@example.org"
280
286
 
281
287
  # Editor can see emails
282
288
  api.login(editor.user)
283
- response = api.get(url_for('api.organization', org=organization))
289
+ response = api.get(url_for("api.organization", org=organization))
284
290
  assert200(response)
285
291
 
286
- members = response.json['members']
292
+ members = response.json["members"]
287
293
  assert len(members) == 2
288
- assert members[0]['role'] == 'admin'
289
- assert members[0]['since'] == '2024-04-14T00:00:00+00:00'
290
- assert members[0]['user']['email'] == 'admin@example.org'
294
+ assert members[0]["role"] == "admin"
295
+ assert members[0]["since"] == "2024-04-14T00:00:00+00:00"
296
+ assert members[0]["user"]["email"] == "admin@example.org"
297
+
298
+ assert members[1]["role"] == "editor"
299
+ assert members[1]["user"]["email"] == "editor@example.org"
291
300
 
292
- assert members[1]['role'] == 'editor'
293
- assert members[1]['user']['email'] == 'editor@example.org'
294
-
295
301
  # Others cannot see emails
296
302
  api.login(other)
297
- response = api.get(url_for('api.organization', org=organization))
303
+ response = api.get(url_for("api.organization", org=organization))
298
304
  assert200(response)
299
305
 
300
- members = response.json['members']
306
+ members = response.json["members"]
301
307
  assert len(members) == 2
302
- assert members[0]['role'] == 'admin'
303
- assert members[0]['since'] == '2024-04-14T00:00:00+00:00'
304
- assert members[0]['user']['email'] is None
308
+ assert members[0]["role"] == "admin"
309
+ assert members[0]["since"] == "2024-04-14T00:00:00+00:00"
310
+ assert members[0]["user"]["email"] is None
305
311
 
306
- assert members[1]['role'] == 'editor'
307
- assert members[1]['user']['email'] is None
312
+ assert members[1]["role"] == "editor"
313
+ assert members[1]["user"]["email"] is None
308
314
 
309
315
  def test_accept_membership(self, api):
310
316
  user = api.login()
311
317
  applicant = UserFactory()
312
- membership_request = MembershipRequest(user=applicant, comment='test')
313
- member = Member(user=user, role='admin')
314
- organization = OrganizationFactory(
315
- members=[member], requests=[membership_request])
318
+ membership_request = MembershipRequest(user=applicant, comment="test")
319
+ member = Member(user=user, role="admin")
320
+ organization = OrganizationFactory(members=[member], requests=[membership_request])
316
321
 
317
- api_url = url_for(
318
- 'api.accept_membership',
319
- org=organization,
320
- id=membership_request.id)
322
+ api_url = url_for("api.accept_membership", org=organization, id=membership_request.id)
321
323
  response = api.post(api_url)
322
324
  assert200(response)
323
325
 
324
- assert response.json['role'] == 'editor'
326
+ assert response.json["role"] == "editor"
325
327
 
326
328
  organization.reload()
327
329
  assert len(organization.requests) is 1
@@ -332,62 +334,48 @@ class MembershipAPITest:
332
334
 
333
335
  request = organization.requests[0]
334
336
  assert request.user == applicant
335
- assert request.status == 'accepted'
336
- assert request.comment == 'test'
337
+ assert request.status == "accepted"
338
+ assert request.comment == "test"
337
339
  assert request.handled_by == user
338
340
  assert request.handled_on is not None
339
341
  assert request.refusal_comment is None
340
342
 
341
343
  # test accepting twice will raise 409
342
- api_url = url_for(
343
- 'api.accept_membership',
344
- org=organization,
345
- id=membership_request.id)
344
+ api_url = url_for("api.accept_membership", org=organization, id=membership_request.id)
346
345
  response = api.post(api_url)
347
346
  assert_status(response, 409)
348
347
 
349
348
  def test_only_admin_can_accept_membership(self, api):
350
349
  user = api.login()
351
350
  applicant = UserFactory()
352
- membership_request = MembershipRequest(user=applicant, comment='test')
353
- member = Member(user=user, role='editor')
354
- organization = OrganizationFactory(
355
- members=[member], requests=[membership_request])
351
+ membership_request = MembershipRequest(user=applicant, comment="test")
352
+ member = Member(user=user, role="editor")
353
+ organization = OrganizationFactory(members=[member], requests=[membership_request])
356
354
 
357
- api_url = url_for(
358
- 'api.accept_membership',
359
- org=organization,
360
- id=membership_request.id)
355
+ api_url = url_for("api.accept_membership", org=organization, id=membership_request.id)
361
356
  response = api.post(api_url)
362
357
  assert403(response)
363
358
 
364
359
  def test_accept_membership_404(self, api):
365
360
  user = api.login()
366
- member = Member(user=user, role='admin')
361
+ member = Member(user=user, role="admin")
367
362
  organization = OrganizationFactory(members=[member])
368
363
 
369
- api_url = url_for(
370
- 'api.accept_membership',
371
- org=organization,
372
- id=MembershipRequest().id)
364
+ api_url = url_for("api.accept_membership", org=organization, id=MembershipRequest().id)
373
365
  response = api.post(api_url)
374
366
  assert404(response)
375
367
 
376
- assert response.json['message'] == 'Unknown membership request id'
368
+ assert response.json["message"] == "Unknown membership request id"
377
369
 
378
370
  def test_refuse_membership(self, api):
379
371
  user = api.login()
380
372
  applicant = UserFactory()
381
- membership_request = MembershipRequest(user=applicant, comment='test')
382
- member = Member(user=user, role='admin')
383
- organization = OrganizationFactory(
384
- members=[member], requests=[membership_request])
385
- data = {'comment': 'no'}
373
+ membership_request = MembershipRequest(user=applicant, comment="test")
374
+ member = Member(user=user, role="admin")
375
+ organization = OrganizationFactory(members=[member], requests=[membership_request])
376
+ data = {"comment": "no"}
386
377
 
387
- api_url = url_for(
388
- 'api.refuse_membership',
389
- org=organization,
390
- id=membership_request.id)
378
+ api_url = url_for("api.refuse_membership", org=organization, id=membership_request.id)
391
379
  response = api.post(api_url, data)
392
380
  assert200(response)
393
381
 
@@ -400,70 +388,67 @@ class MembershipAPITest:
400
388
 
401
389
  request = organization.requests[0]
402
390
  assert request.user == applicant
403
- assert request.status == 'refused'
404
- assert request.comment == 'test'
405
- assert request.refusal_comment == 'no'
391
+ assert request.status == "refused"
392
+ assert request.comment == "test"
393
+ assert request.refusal_comment == "no"
406
394
  assert request.handled_by == user
407
395
  assert request.handled_on is not None
408
396
 
409
397
  def test_only_admin_can_refuse_membership(self, api):
410
398
  user = api.login()
411
399
  applicant = UserFactory()
412
- membership_request = MembershipRequest(user=applicant, comment='test')
413
- member = Member(user=user, role='editor')
414
- organization = OrganizationFactory(
415
- members=[member], requests=[membership_request])
416
- data = {'comment': 'no'}
400
+ membership_request = MembershipRequest(user=applicant, comment="test")
401
+ member = Member(user=user, role="editor")
402
+ organization = OrganizationFactory(members=[member], requests=[membership_request])
403
+ data = {"comment": "no"}
417
404
 
418
- api_url = url_for(
419
- 'api.refuse_membership',
420
- org=organization,
421
- id=membership_request.id)
405
+ api_url = url_for("api.refuse_membership", org=organization, id=membership_request.id)
422
406
  response = api.post(api_url, data)
423
407
  assert403(response)
424
408
 
425
409
  def test_refuse_membership_404(self, api):
426
410
  user = api.login()
427
- member = Member(user=user, role='admin')
411
+ member = Member(user=user, role="admin")
428
412
  organization = OrganizationFactory(members=[member])
429
413
 
430
- api_url = url_for(
431
- 'api.refuse_membership',
432
- org=organization,
433
- id=MembershipRequest().id)
414
+ api_url = url_for("api.refuse_membership", org=organization, id=MembershipRequest().id)
434
415
  response = api.post(api_url)
435
416
  assert404(response)
436
417
 
437
- assert response.json['message'] == 'Unknown membership request id'
418
+ assert response.json["message"] == "Unknown membership request id"
438
419
 
439
420
  def test_create_member(self, api):
440
421
  user = api.login()
441
422
  added_user = UserFactory()
442
- organization = OrganizationFactory(members=[
443
- Member(user=user, role='admin'),
444
- ])
423
+ organization = OrganizationFactory(
424
+ members=[
425
+ Member(user=user, role="admin"),
426
+ ]
427
+ )
445
428
 
446
- api_url = url_for('api.member', org=organization, user=added_user)
447
- response = api.post(api_url, {'role': 'admin'})
429
+ api_url = url_for("api.member", org=organization, user=added_user)
430
+ response = api.post(api_url, {"role": "admin"})
448
431
 
449
432
  assert201(response)
450
433
 
451
- assert response.json['role'] == 'admin'
434
+ assert response.json["role"] == "admin"
452
435
 
453
436
  organization.reload()
454
437
  assert organization.is_member(added_user)
455
438
  assert organization.is_admin(added_user)
456
- assert organization.get_metrics()['members'] == 2
439
+ assert organization.get_metrics()["members"] == 2
457
440
 
458
441
  def test_only_admin_can_create_member(self, api):
459
442
  user = api.login()
460
443
  added_user = UserFactory()
461
- organization = OrganizationFactory(members=[
462
- Member(user=user, role='editor'),
463
- ])
444
+ organization = OrganizationFactory(
445
+ members=[
446
+ Member(user=user, role="editor"),
447
+ ]
448
+ )
464
449
 
465
- api_url = url_for('api.member', org=organization, user=added_user)
466
- response = api.post(api_url, {'role': 'editor'})
450
+ api_url = url_for("api.member", org=organization, user=added_user)
451
+ response = api.post(api_url, {"role": "editor"})
467
452
 
468
453
  assert403(response)
469
454
 
@@ -473,17 +458,16 @@ class MembershipAPITest:
473
458
  def test_create_member_exists(self, api):
474
459
  user = api.login()
475
460
  added_user = UserFactory()
476
- organization = OrganizationFactory(members=[
477
- Member(user=user, role='admin'),
478
- Member(user=added_user, role='editor')
479
- ])
461
+ organization = OrganizationFactory(
462
+ members=[Member(user=user, role="admin"), Member(user=added_user, role="editor")]
463
+ )
480
464
 
481
- api_url = url_for('api.member', org=organization, user=added_user)
482
- response = api.post(api_url, {'role': 'admin'})
465
+ api_url = url_for("api.member", org=organization, user=added_user)
466
+ response = api.post(api_url, {"role": "admin"})
483
467
 
484
468
  assert_status(response, 409)
485
469
 
486
- assert response.json['role'] == 'editor'
470
+ assert response.json["role"] == "editor"
487
471
 
488
472
  organization.reload()
489
473
  assert organization.is_member(added_user)
@@ -492,17 +476,16 @@ class MembershipAPITest:
492
476
  def test_update_member(self, api):
493
477
  user = api.login()
494
478
  updated_user = UserFactory()
495
- organization = OrganizationFactory(members=[
496
- Member(user=user, role='admin'),
497
- Member(user=updated_user, role='editor')
498
- ])
479
+ organization = OrganizationFactory(
480
+ members=[Member(user=user, role="admin"), Member(user=updated_user, role="editor")]
481
+ )
499
482
 
500
- api_url = url_for('api.member', org=organization, user=updated_user)
501
- response = api.put(api_url, {'role': 'admin'})
483
+ api_url = url_for("api.member", org=organization, user=updated_user)
484
+ response = api.put(api_url, {"role": "admin"})
502
485
 
503
486
  assert200(response)
504
487
 
505
- assert response.json['role'] == 'admin'
488
+ assert response.json["role"] == "admin"
506
489
 
507
490
  organization.reload()
508
491
  assert organization.is_member(updated_user)
@@ -511,13 +494,12 @@ class MembershipAPITest:
511
494
  def test_only_admin_can_update_member(self, api):
512
495
  user = api.login()
513
496
  updated_user = UserFactory()
514
- organization = OrganizationFactory(members=[
515
- Member(user=user, role='editor'),
516
- Member(user=updated_user, role='editor')
517
- ])
497
+ organization = OrganizationFactory(
498
+ members=[Member(user=user, role="editor"), Member(user=updated_user, role="editor")]
499
+ )
518
500
 
519
- api_url = url_for('api.member', org=organization, user=updated_user)
520
- response = api.put(api_url, {'role': 'admin'})
501
+ api_url = url_for("api.member", org=organization, user=updated_user)
502
+ response = api.put(api_url, {"role": "admin"})
521
503
 
522
504
  assert403(response)
523
505
 
@@ -528,28 +510,26 @@ class MembershipAPITest:
528
510
  def test_delete_member(self, api):
529
511
  user = api.login()
530
512
  deleted_user = UserFactory()
531
- organization = OrganizationFactory(members=[
532
- Member(user=user, role='admin'),
533
- Member(user=deleted_user, role='editor')
534
- ])
513
+ organization = OrganizationFactory(
514
+ members=[Member(user=user, role="admin"), Member(user=deleted_user, role="editor")]
515
+ )
535
516
 
536
- api_url = url_for('api.member', org=organization, user=deleted_user)
517
+ api_url = url_for("api.member", org=organization, user=deleted_user)
537
518
  response = api.delete(api_url)
538
519
  assert204(response)
539
520
 
540
521
  organization.reload()
541
522
  assert not organization.is_member(deleted_user)
542
- assert organization.get_metrics()['members'] == 1
523
+ assert organization.get_metrics()["members"] == 1
543
524
 
544
525
  def test_only_admin_can_delete_member(self, api):
545
526
  user = api.login()
546
527
  deleted_user = UserFactory()
547
- organization = OrganizationFactory(members=[
548
- Member(user=user, role='editor'),
549
- Member(user=deleted_user, role='editor')
550
- ])
528
+ organization = OrganizationFactory(
529
+ members=[Member(user=user, role="editor"), Member(user=deleted_user, role="editor")]
530
+ )
551
531
 
552
- api_url = url_for('api.member', org=organization, user=deleted_user)
532
+ api_url = url_for("api.member", org=organization, user=deleted_user)
553
533
  response = api.delete(api_url)
554
534
  assert403(response)
555
535
 
@@ -557,16 +537,16 @@ class MembershipAPITest:
557
537
  assert organization.is_member(deleted_user)
558
538
 
559
539
  def test_follow_org(self, api):
560
- '''It should follow an organization on POST'''
540
+ """It should follow an organization on POST"""
561
541
  user = api.login()
562
542
  to_follow = OrganizationFactory()
563
543
 
564
- url = url_for('api.organization_followers', id=to_follow.id)
544
+ url = url_for("api.organization_followers", id=to_follow.id)
565
545
  response = api.post(url)
566
546
  assert201(response)
567
547
 
568
548
  to_follow.count_followers()
569
- assert to_follow.get_metrics()['followers'] == 1
549
+ assert to_follow.get_metrics()["followers"] == 1
570
550
 
571
551
  assert Follow.objects.following(to_follow).count() is 0
572
552
  assert Follow.objects.followers(to_follow).count() is 1
@@ -576,250 +556,234 @@ class MembershipAPITest:
576
556
  assert Follow.objects.followers(user).count() is 0
577
557
 
578
558
  def test_unfollow_org(self, api):
579
- '''It should unfollow the organization on DELETE'''
559
+ """It should unfollow the organization on DELETE"""
580
560
  user = api.login()
581
561
  to_follow = OrganizationFactory()
582
562
  Follow.objects.create(follower=user, following=to_follow)
583
563
 
584
- url = url_for('api.organization_followers', id=to_follow.id)
564
+ url = url_for("api.organization_followers", id=to_follow.id)
585
565
  response = api.delete(url)
586
566
  assert200(response)
587
567
 
588
568
  nb_followers = Follow.objects.followers(to_follow).count()
589
569
 
590
570
  assert nb_followers is 0
591
- assert response.json['followers'] == nb_followers
571
+ assert response.json["followers"] == nb_followers
592
572
 
593
573
  assert Follow.objects.following(to_follow).count() is 0
594
574
  assert Follow.objects.following(user).count() is 0
595
575
  assert Follow.objects.followers(user).count() is 0
596
576
 
597
577
  def test_suggest_organizations_api(self, api):
598
- '''It should suggest organizations'''
578
+ """It should suggest organizations"""
599
579
  for i in range(3):
600
580
  OrganizationFactory(
601
- name='test-{0}'.format(i) if i % 2 else faker.word(),
602
- metrics={"followers": i})
603
- max_follower_organization = OrganizationFactory(
604
- name='test-4',
605
- metrics={"followers": 10}
606
- )
607
- response = api.get(url_for('api.suggest_organizations'),
608
- qs={'q': 'tes', 'size': '5'})
581
+ name="test-{0}".format(i) if i % 2 else faker.word(), metrics={"followers": i}
582
+ )
583
+ max_follower_organization = OrganizationFactory(name="test-4", metrics={"followers": 10})
584
+ response = api.get(url_for("api.suggest_organizations"), qs={"q": "tes", "size": "5"})
609
585
  assert200(response)
610
586
 
611
587
  assert len(response.json) <= 5
612
588
  assert len(response.json) > 1
613
589
 
614
590
  for suggestion in response.json:
615
- assert 'id' in suggestion
616
- assert 'slug' in suggestion
617
- assert 'name' in suggestion
618
- assert 'image_url' in suggestion
619
- assert 'acronym' in suggestion
620
- assert 'tes' in suggestion['name']
621
- assert response.json[0]['id'] == str(max_follower_organization.id)
591
+ assert "id" in suggestion
592
+ assert "slug" in suggestion
593
+ assert "name" in suggestion
594
+ assert "image_url" in suggestion
595
+ assert "acronym" in suggestion
596
+ assert "tes" in suggestion["name"]
597
+ assert response.json[0]["id"] == str(max_follower_organization.id)
622
598
 
623
599
  def test_suggest_organizations_with_special_chars(self, api):
624
- '''It should suggest organizations with special caracters'''
600
+ """It should suggest organizations with special caracters"""
625
601
  for i in range(4):
626
- OrganizationFactory(
627
- name='testé-{0}'.format(i) if i % 2 else faker.word())
602
+ OrganizationFactory(name="testé-{0}".format(i) if i % 2 else faker.word())
628
603
 
629
- response = api.get(url_for('api.suggest_organizations'),
630
- qs={'q': 'testé', 'size': '5'})
604
+ response = api.get(url_for("api.suggest_organizations"), qs={"q": "testé", "size": "5"})
631
605
  assert200(response)
632
606
 
633
607
  assert len(response.json) <= 5
634
608
  assert len(response.json) > 1
635
609
 
636
610
  for suggestion in response.json:
637
- assert 'id' in suggestion
638
- assert 'slug' in suggestion
639
- assert 'name' in suggestion
640
- assert 'image_url' in suggestion
641
- assert 'testé' in suggestion['name']
611
+ assert "id" in suggestion
612
+ assert "slug" in suggestion
613
+ assert "name" in suggestion
614
+ assert "image_url" in suggestion
615
+ assert "testé" in suggestion["name"]
642
616
 
643
617
  def test_suggest_organizations_with_multiple_words(self, api):
644
- '''It should suggest organizations with words'''
618
+ """It should suggest organizations with words"""
645
619
  for i in range(4):
646
- OrganizationFactory(
647
- name='mon testé-{0}'.format(i) if i % 2 else faker.word())
620
+ OrganizationFactory(name="mon testé-{0}".format(i) if i % 2 else faker.word())
648
621
 
649
- response = api.get(url_for('api.suggest_organizations'),
650
- qs={'q': 'mon testé', 'size': '5'})
622
+ response = api.get(url_for("api.suggest_organizations"), qs={"q": "mon testé", "size": "5"})
651
623
  assert200(response)
652
624
 
653
625
  assert len(response.json) <= 5
654
626
  assert len(response.json) > 1
655
627
 
656
628
  for suggestion in response.json:
657
- assert 'id' in suggestion
658
- assert 'slug' in suggestion
659
- assert 'name' in suggestion
660
- assert 'image_url' in suggestion
661
- assert 'mon testé' in suggestion['name']
629
+ assert "id" in suggestion
630
+ assert "slug" in suggestion
631
+ assert "name" in suggestion
632
+ assert "image_url" in suggestion
633
+ assert "mon testé" in suggestion["name"]
662
634
 
663
635
  def test_suggest_organizations_with_apostrophe(self, api):
664
- '''It should suggest organizations with words'''
636
+ """It should suggest organizations with words"""
665
637
  for i in range(4):
666
638
  OrganizationFactory(
667
- name='Ministère de l\'intérieur {0}'.format(i)
668
- if i % 2 else faker.word())
639
+ name="Ministère de l'intérieur {0}".format(i) if i % 2 else faker.word()
640
+ )
669
641
 
670
- response = api.get(url_for('api.suggest_organizations'),
671
- qs={'q': 'Ministère', 'size': '5'})
642
+ response = api.get(url_for("api.suggest_organizations"), qs={"q": "Ministère", "size": "5"})
672
643
  assert200(response)
673
644
 
674
645
  assert len(response.json) <= 5
675
646
  assert len(response.json) > 1
676
647
 
677
648
  for suggestion in response.json:
678
- assert 'id' in suggestion
679
- assert 'slug' in suggestion
680
- assert 'name' in suggestion
681
- assert 'image_url' in suggestion
682
- assert 'Ministère' in suggestion['name']
649
+ assert "id" in suggestion
650
+ assert "slug" in suggestion
651
+ assert "name" in suggestion
652
+ assert "image_url" in suggestion
653
+ assert "Ministère" in suggestion["name"]
683
654
 
684
655
  def test_suggest_organizations_api_no_match(self, api):
685
- '''It should not provide organization suggestion if no match'''
656
+ """It should not provide organization suggestion if no match"""
686
657
  OrganizationFactory.create_batch(3)
687
658
 
688
- response = api.get(url_for('api.suggest_organizations'),
689
- qs={'q': 'xxxxxx', 'size': '5'})
659
+ response = api.get(url_for("api.suggest_organizations"), qs={"q": "xxxxxx", "size": "5"})
690
660
  assert200(response)
691
661
  assert len(response.json) is 0
692
662
 
693
663
  def test_suggest_organizations_api_empty(self, api):
694
- '''It should not provide organization suggestion if no data'''
695
- response = api.get(url_for('api.suggest_organizations'),
696
- qs={'q': 'xxxxxx', 'size': '5'})
664
+ """It should not provide organization suggestion if no data"""
665
+ response = api.get(url_for("api.suggest_organizations"), qs={"q": "xxxxxx", "size": "5"})
697
666
  assert200(response)
698
667
  assert len(response.json) is 0
699
668
 
700
669
  def test_suggest_organizations_homonyms(self, api):
701
- '''It should suggest organizations and not deduplicate homonyms'''
702
- OrganizationFactory.create_batch(2, name='homonym')
670
+ """It should suggest organizations and not deduplicate homonyms"""
671
+ OrganizationFactory.create_batch(2, name="homonym")
703
672
 
704
- response = api.get(url_for('api.suggest_organizations'),
705
- qs={'q': 'homonym', 'size': '5'})
673
+ response = api.get(url_for("api.suggest_organizations"), qs={"q": "homonym", "size": "5"})
706
674
  assert200(response)
707
675
 
708
676
  assert len(response.json) is 2
709
677
 
710
678
  for suggestion in response.json:
711
- assert suggestion['name'] == 'homonym'
679
+ assert suggestion["name"] == "homonym"
712
680
 
713
681
  def test_suggest_organizations_acronym(self, api):
714
- '''Should suggest organizations based on acronym'''
682
+ """Should suggest organizations based on acronym"""
715
683
 
716
684
  for i in range(3):
717
685
  OrganizationFactory(
718
686
  name=faker.word(),
719
- acronym=f'UDATA{i}' if i % 2 else faker.word(),
720
- metrics={"followers": i})
687
+ acronym=f"UDATA{i}" if i % 2 else faker.word(),
688
+ metrics={"followers": i},
689
+ )
721
690
  max_follower_organization = OrganizationFactory(
722
- name=faker.word(),
723
- acronym='UDATA4',
724
- metrics={"followers": 10}
691
+ name=faker.word(), acronym="UDATA4", metrics={"followers": 10}
725
692
  )
726
- response = api.get(url_for('api.suggest_organizations'),
727
- qs={'q': 'uDaTa', 'size': '5'})
693
+ response = api.get(url_for("api.suggest_organizations"), qs={"q": "uDaTa", "size": "5"})
728
694
  assert200(response)
729
695
 
730
696
  assert len(response.json) == 2
731
697
 
732
698
  for suggestion in response.json:
733
- assert 'id' in suggestion
734
- assert 'slug' in suggestion
735
- assert 'name' in suggestion
736
- assert 'image_url' in suggestion
737
- assert 'acronym' in suggestion
738
- assert 'UDATA' in suggestion['acronym']
739
- assert response.json[0]['id'] == str(max_follower_organization.id)
699
+ assert "id" in suggestion
700
+ assert "slug" in suggestion
701
+ assert "name" in suggestion
702
+ assert "image_url" in suggestion
703
+ assert "acronym" in suggestion
704
+ assert "UDATA" in suggestion["acronym"]
705
+ assert response.json[0]["id"] == str(max_follower_organization.id)
740
706
 
741
707
 
742
708
  class OrganizationDatasetsAPITest:
743
709
  modules = []
744
710
 
745
711
  def test_list_org_datasets(self, api):
746
- '''Should list organization datasets'''
712
+ """Should list organization datasets"""
747
713
  org = OrganizationFactory()
748
714
  datasets = DatasetFactory.create_batch(3, organization=org)
749
715
 
750
- response = api.get(url_for('api.org_datasets', org=org))
716
+ response = api.get(url_for("api.org_datasets", org=org))
751
717
 
752
718
  assert200(response)
753
- assert len(response.json['data']) == len(datasets)
719
+ assert len(response.json["data"]) == len(datasets)
754
720
 
755
721
  def test_list_org_datasets_private(self, api):
756
- '''Should include private datasets when member'''
722
+ """Should include private datasets when member"""
757
723
  user = api.login()
758
- member = Member(user=user, role='admin')
724
+ member = Member(user=user, role="admin")
759
725
  org = OrganizationFactory(members=[member])
760
- datasets = DatasetFactory.create_batch(3, organization=org,
761
- private=True)
726
+ datasets = DatasetFactory.create_batch(3, organization=org, private=True)
762
727
 
763
- response = api.get(url_for('api.org_datasets', org=org))
728
+ response = api.get(url_for("api.org_datasets", org=org))
764
729
 
765
730
  assert200(response)
766
- assert len(response.json['data']) == len(datasets)
731
+ assert len(response.json["data"]) == len(datasets)
767
732
 
768
733
  def test_list_org_datasets_hide_private(self, api):
769
- '''Should not include private datasets when not member'''
734
+ """Should not include private datasets when not member"""
770
735
  org = OrganizationFactory()
771
736
  datasets = DatasetFactory.create_batch(3, organization=org)
772
737
  DatasetFactory.create_batch(2, organization=org, private=True)
773
738
 
774
- response = api.get(url_for('api.org_datasets', org=org))
739
+ response = api.get(url_for("api.org_datasets", org=org))
775
740
 
776
741
  assert200(response)
777
- assert len(response.json['data']) == len(datasets)
742
+ assert len(response.json["data"]) == len(datasets)
778
743
 
779
744
  def test_list_org_datasets_with_size(self, api):
780
- '''Should list organization datasets'''
745
+ """Should list organization datasets"""
781
746
  org = OrganizationFactory()
782
747
  DatasetFactory.create_batch(3, organization=org)
783
748
 
784
- response = api.get(
785
- url_for('api.org_datasets', org=org), qs={'page_size': 2})
749
+ response = api.get(url_for("api.org_datasets", org=org), qs={"page_size": 2})
786
750
 
787
751
  assert200(response)
788
- assert len(response.json['data']) is 2
752
+ assert len(response.json["data"]) is 2
789
753
 
790
754
 
791
755
  class OrganizationReusesAPITest:
792
756
  modules = []
793
757
 
794
758
  def test_list_org_reuses(self, api):
795
- '''Should list organization reuses'''
759
+ """Should list organization reuses"""
796
760
  org = OrganizationFactory()
797
761
  reuses = ReuseFactory.create_batch(3, organization=org)
798
762
 
799
- response = api.get(url_for('api.org_reuses', org=org))
763
+ response = api.get(url_for("api.org_reuses", org=org))
800
764
 
801
765
  assert200(response)
802
766
  assert len(response.json) == len(reuses)
803
767
 
804
768
  def test_list_org_reuses_private(self, api):
805
- '''Should include private reuses when member'''
769
+ """Should include private reuses when member"""
806
770
  user = api.login()
807
- member = Member(user=user, role='admin')
771
+ member = Member(user=user, role="admin")
808
772
  org = OrganizationFactory(members=[member])
809
773
  reuses = ReuseFactory.create_batch(3, organization=org, private=True)
810
774
 
811
- response = api.get(url_for('api.org_reuses', org=org))
775
+ response = api.get(url_for("api.org_reuses", org=org))
812
776
 
813
777
  assert200(response)
814
778
  assert len(response.json) == len(reuses)
815
779
 
816
780
  def test_list_org_reuses_hide_private(self, api):
817
- '''Should not include private reuses when not member'''
781
+ """Should not include private reuses when not member"""
818
782
  org = OrganizationFactory()
819
783
  reuses = ReuseFactory.create_batch(3, organization=org)
820
784
  ReuseFactory.create_batch(2, organization=org, private=True)
821
785
 
822
- response = api.get(url_for('api.org_reuses', org=org))
786
+ response = api.get(url_for("api.org_reuses", org=org))
823
787
 
824
788
  assert200(response)
825
789
  assert len(response.json) == len(reuses)
@@ -829,24 +793,24 @@ class OrganizationDiscussionsAPITest:
829
793
  modules = []
830
794
 
831
795
  def test_list_org_discussions(self, api):
832
- '''Should list organization discussions'''
796
+ """Should list organization discussions"""
833
797
  user = UserFactory()
834
798
  org = OrganizationFactory()
835
799
  reuse = ReuseFactory(organization=org)
836
800
  dataset = DatasetFactory(organization=org)
837
801
  discussions = [
838
- Discussion.objects.create(subject=dataset, title='', user=user),
839
- Discussion.objects.create(subject=reuse, title='', user=user)
802
+ Discussion.objects.create(subject=dataset, title="", user=user),
803
+ Discussion.objects.create(subject=reuse, title="", user=user),
840
804
  ]
841
805
 
842
- response = api.get(url_for('api.org_discussions', org=org))
806
+ response = api.get(url_for("api.org_discussions", org=org))
843
807
 
844
808
  assert200(response)
845
809
  assert len(response.json) == len(discussions)
846
810
 
847
811
  discussions_ids = [str(d.id) for d in discussions]
848
812
  for discussion in response.json:
849
- assert discussion['id'] in discussions_ids
813
+ assert discussion["id"] in discussions_ids
850
814
 
851
815
 
852
816
  class OrganizationBadgeAPITest:
@@ -855,15 +819,15 @@ class OrganizationBadgeAPITest:
855
819
  @pytest.fixture(autouse=True)
856
820
  def setUp(self, api, clean_db):
857
821
  # Register at least two badges
858
- Organization.__badges__['test-1'] = 'Test 1'
859
- Organization.__badges__['test-2'] = 'Test 2'
822
+ Organization.__badges__["test-1"] = "Test 1"
823
+ Organization.__badges__["test-2"] = "Test 2"
860
824
 
861
825
  self.factory = badge_factory(Organization)
862
826
  self.user = api.login(AdminFactory())
863
827
  self.organization = OrganizationFactory()
864
828
 
865
829
  def test_list(self, api):
866
- response = api.get(url_for('api.available_organization_badges'))
830
+ response = api.get(url_for("api.available_organization_badges"))
867
831
  assert200(response)
868
832
  assert len(response.json) == len(Organization.__badges__)
869
833
  for kind, label in Organization.__badges__.items():
@@ -872,7 +836,7 @@ class OrganizationBadgeAPITest:
872
836
 
873
837
  def test_create(self, api):
874
838
  data = self.factory.as_dict()
875
- url = url_for('api.organization_badges', org=self.organization)
839
+ url = url_for("api.organization_badges", org=self.organization)
876
840
  with assert_emit(on_badge_added):
877
841
  response = api.post(url, data)
878
842
  assert201(response)
@@ -881,7 +845,7 @@ class OrganizationBadgeAPITest:
881
845
 
882
846
  def test_create_same(self, api):
883
847
  data = self.factory.as_dict()
884
- url = url_for('api.organization_badges', org=self.organization)
848
+ url = url_for("api.organization_badges", org=self.organization)
885
849
  with assert_emit(on_badge_added):
886
850
  api.post(url, data)
887
851
  with assert_not_emit(on_badge_added):
@@ -896,8 +860,8 @@ class OrganizationBadgeAPITest:
896
860
  kinds_keys = list(Organization.__badges__)
897
861
  self.organization.add_badge(kinds_keys[0])
898
862
  data = self.factory.as_dict()
899
- data['kind'] = kinds_keys[1]
900
- url = url_for('api.organization_badges', org=self.organization)
863
+ data["kind"] = kinds_keys[1]
864
+ url = url_for("api.organization_badges", org=self.organization)
901
865
  response = api.post(url, data)
902
866
  assert201(response)
903
867
  self.organization.reload()
@@ -907,9 +871,7 @@ class OrganizationBadgeAPITest:
907
871
  badge = self.factory()
908
872
  self.organization.add_badge(badge.kind)
909
873
  self.organization.save()
910
- url = url_for('api.organization_badge',
911
- org=self.organization,
912
- badge_kind=str(badge.kind))
874
+ url = url_for("api.organization_badge", org=self.organization, badge_kind=str(badge.kind))
913
875
  with assert_emit(on_badge_removed):
914
876
  response = api.delete(url)
915
877
  assert204(response)
@@ -918,7 +880,7 @@ class OrganizationBadgeAPITest:
918
880
 
919
881
  def test_delete_404(self, api):
920
882
  kind = str(self.factory().kind)
921
- url = url_for('api.organization_badge', org=self.organization, badge_kind=kind)
883
+ url = url_for("api.organization_badge", org=self.organization, badge_kind=kind)
922
884
  response = api.delete(url)
923
885
  assert404(response)
924
886
 
@@ -928,18 +890,18 @@ class OrganizationContactPointsAPITest:
928
890
 
929
891
  def test_org_contact_points(self, api):
930
892
  user = api.login()
931
- member = Member(user=user, role='admin')
893
+ member = Member(user=user, role="admin")
932
894
  org = OrganizationFactory(members=[member])
933
895
  data = {
934
- 'email': 'mooneywayne@cobb-cochran.com',
935
- 'name': 'Martin Schultz',
936
- 'organization': str(org.id)
896
+ "email": "mooneywayne@cobb-cochran.com",
897
+ "name": "Martin Schultz",
898
+ "organization": str(org.id),
937
899
  }
938
- response = api.post(url_for('api.contact_points'), data)
900
+ response = api.post(url_for("api.contact_points"), data)
939
901
  assert201(response)
940
902
 
941
- response = api.get(url_for('api.org_contact_points', org=org))
903
+ response = api.get(url_for("api.org_contact_points", org=org))
942
904
  assert200(response)
943
905
 
944
- assert response.json['data'][0]['name'] == data['name']
945
- assert response.json['data'][0]['email'] == data['email']
906
+ assert response.json["data"][0]["name"] == data["name"]
907
+ assert response.json["data"][0]["email"] == data["email"]