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
udata/core/post/forms.py CHANGED
@@ -1,11 +1,10 @@
1
1
  from udata.forms import ModelForm, fields, validators, widgets
2
2
  from udata.i18n import lazy_gettext as _
3
3
 
4
- from .models import Post
5
4
  from .constants import IMAGE_SIZES
5
+ from .models import Post
6
6
 
7
-
8
- __all__ = ('PostForm', )
7
+ __all__ = ("PostForm",)
9
8
 
10
9
 
11
10
  class PostForm(ModelForm):
@@ -13,19 +12,19 @@ class PostForm(ModelForm):
13
12
 
14
13
  owner = fields.CurrentUserField()
15
14
 
16
- name = fields.StringField(_('Name'), [validators.DataRequired()])
17
- headline = fields.StringField(_('Headline'), widget=widgets.TextArea())
18
- content = fields.MarkdownField(_('Content'), [validators.DataRequired()])
15
+ name = fields.StringField(_("Name"), [validators.DataRequired()])
16
+ headline = fields.StringField(_("Headline"), widget=widgets.TextArea())
17
+ content = fields.MarkdownField(_("Content"), [validators.DataRequired()])
19
18
 
20
- datasets = fields.DatasetListField(_('Associated datasets'))
21
- reuses = fields.ReuseListField(_('Associated reuses'))
19
+ datasets = fields.DatasetListField(_("Associated datasets"))
20
+ reuses = fields.ReuseListField(_("Associated reuses"))
22
21
 
23
- image = fields.ImageField(_('Image'), sizes=IMAGE_SIZES)
24
- credit_to = fields.StringField(_('Image credits'))
25
- credit_url = fields.URLField(_('Credit URL'))
22
+ image = fields.ImageField(_("Image"), sizes=IMAGE_SIZES)
23
+ credit_to = fields.StringField(_("Image credits"))
24
+ credit_url = fields.URLField(_("Credit URL"))
26
25
 
27
- tags = fields.TagField(_('Tags'))
26
+ tags = fields.TagField(_("Tags"))
28
27
 
29
28
  body_type = fields.StringField(
30
- _('body type'),
31
- description=_('Specify your body type (HTML or markdown)'))
29
+ _("body type"), description=_("Specify your body type (HTML or markdown)")
30
+ )
udata/core/post/models.py CHANGED
@@ -1,59 +1,57 @@
1
1
  from flask import url_for
2
2
 
3
- from udata.core.storages import images, default_image_basename
3
+ from udata.core.storages import default_image_basename, images
4
4
  from udata.i18n import lazy_gettext as _
5
5
  from udata.mongo import db
6
+
6
7
  from .constants import BODY_TYPES, IMAGE_SIZES
7
8
 
8
- __all__ = ('Post', )
9
+ __all__ = ("Post",)
9
10
 
10
11
 
11
12
  class PostQuerySet(db.BaseQuerySet):
12
13
  def published(self):
13
- return self(published__ne=None).order_by('-published')
14
+ return self(published__ne=None).order_by("-published")
14
15
 
15
16
 
16
17
  class Post(db.Datetimed, db.Document):
17
18
  name = db.StringField(max_length=255, required=True)
18
- slug = db.SlugField(max_length=255, required=True, populate_from='name',
19
- update=True, follow=True)
19
+ slug = db.SlugField(
20
+ max_length=255, required=True, populate_from="name", update=True, follow=True
21
+ )
20
22
  headline = db.StringField()
21
23
  content = db.StringField(required=True)
22
24
  image_url = db.StringField()
23
- image = db.ImageField(
24
- fs=images, basename=default_image_basename, thumbnails=IMAGE_SIZES)
25
+ image = db.ImageField(fs=images, basename=default_image_basename, thumbnails=IMAGE_SIZES)
25
26
 
26
27
  credit_to = db.StringField()
27
28
  credit_url = db.URLField()
28
29
 
29
30
  tags = db.ListField(db.StringField())
30
- datasets = db.ListField(
31
- db.ReferenceField('Dataset', reverse_delete_rule=db.PULL))
32
- reuses = db.ListField(
33
- db.ReferenceField('Reuse', reverse_delete_rule=db.PULL))
31
+ datasets = db.ListField(db.ReferenceField("Dataset", reverse_delete_rule=db.PULL))
32
+ reuses = db.ListField(db.ReferenceField("Reuse", reverse_delete_rule=db.PULL))
34
33
 
35
- owner = db.ReferenceField('User')
34
+ owner = db.ReferenceField("User")
36
35
  published = db.DateTimeField()
37
36
 
38
- body_type = db.StringField(
39
- choices=list(BODY_TYPES), default='markdown', required=False)
37
+ body_type = db.StringField(choices=list(BODY_TYPES), default="markdown", required=False)
40
38
 
41
39
  meta = {
42
- 'ordering': ['-created_at'],
43
- 'indexes': [
44
- '-created_at',
45
- '-published',
40
+ "ordering": ["-created_at"],
41
+ "indexes": [
42
+ "-created_at",
43
+ "-published",
46
44
  ],
47
- 'queryset_class': PostQuerySet,
45
+ "queryset_class": PostQuerySet,
48
46
  }
49
47
 
50
- verbose_name = _('post')
48
+ verbose_name = _("post")
51
49
 
52
50
  def __str__(self):
53
- return self.name or ''
51
+ return self.name or ""
54
52
 
55
53
  def url_for(self, *args, **kwargs):
56
- return url_for('posts.show', post=self, *args, **kwargs)
54
+ return url_for("posts.show", post=self, *args, **kwargs)
57
55
 
58
56
  @property
59
57
  def display_url(self):
@@ -1,5 +1,4 @@
1
1
  import pytest
2
-
3
2
  from flask import url_for
4
3
 
5
4
  from udata.core.dataset.factories import DatasetFactory
@@ -7,90 +6,89 @@ from udata.core.post.factories import PostFactory
7
6
  from udata.core.post.models import Post
8
7
  from udata.core.reuse.factories import ReuseFactory
9
8
  from udata.core.user.factories import AdminFactory
10
-
11
9
  from udata.tests.helpers import assert200, assert201, assert204
12
10
 
13
11
 
14
- @pytest.mark.usefixtures('clean_db')
12
+ @pytest.mark.usefixtures("clean_db")
15
13
  class PostsAPITest:
16
14
  modules = []
17
15
 
18
16
  def test_post_api_list(self, api):
19
- '''It should fetch a post list from the API'''
17
+ """It should fetch a post list from the API"""
20
18
  posts = PostFactory.create_batch(3)
21
19
  posts.append(PostFactory(published=None))
22
20
 
23
- response = api.get(url_for('api.posts'))
21
+ response = api.get(url_for("api.posts"))
24
22
  assert200(response)
25
23
  # Response should not contain the unpublished post
26
- assert len(response.json['data']) == 3
24
+ assert len(response.json["data"]) == 3
27
25
 
28
26
  def test_post_api_get(self, api):
29
- '''It should fetch a post from the API'''
27
+ """It should fetch a post from the API"""
30
28
  post = PostFactory()
31
- response = api.get(url_for('api.post', post=post))
29
+ response = api.get(url_for("api.post", post=post))
32
30
  assert200(response)
33
31
 
34
32
  def test_post_api_create(self, api):
35
- '''It should create a post from the API'''
33
+ """It should create a post from the API"""
36
34
  data = PostFactory.as_dict()
37
- data['datasets'] = [str(d.id) for d in data['datasets']]
38
- data['reuses'] = [str(r.id) for r in data['reuses']]
35
+ data["datasets"] = [str(d.id) for d in data["datasets"]]
36
+ data["reuses"] = [str(r.id) for r in data["reuses"]]
39
37
  api.login(AdminFactory())
40
- response = api.post(url_for('api.posts'), data)
38
+ response = api.post(url_for("api.posts"), data)
41
39
  assert201(response)
42
40
  assert Post.objects.count() == 1
43
41
  post = Post.objects.first()
44
- for dataset, expected in zip(post.datasets, data['datasets']):
42
+ for dataset, expected in zip(post.datasets, data["datasets"]):
45
43
  assert str(dataset.id) == expected
46
- for reuse, expected in zip(post.reuses, data['reuses']):
44
+ for reuse, expected in zip(post.reuses, data["reuses"]):
47
45
  assert str(reuse.id) == expected
48
46
 
49
47
  def test_post_api_update(self, api):
50
- '''It should update a post from the API'''
48
+ """It should update a post from the API"""
51
49
  post = PostFactory()
52
50
  data = post.to_dict()
53
- data['content'] = 'new content'
51
+ data["content"] = "new content"
54
52
  api.login(AdminFactory())
55
- response = api.put(url_for('api.post', post=post), data)
53
+ response = api.put(url_for("api.post", post=post), data)
56
54
  assert200(response)
57
55
  assert Post.objects.count() == 1
58
- assert Post.objects.first().content == 'new content'
56
+ assert Post.objects.first().content == "new content"
59
57
 
60
58
  def test_post_api_update_with_related_dataset_and_reuse(self, api):
61
- '''It should update a post from the API with related dataset and reuse'''
59
+ """It should update a post from the API with related dataset and reuse"""
62
60
  api.login(AdminFactory())
63
61
  post = PostFactory()
64
62
  data = post.to_dict()
65
- data['content'] = 'new content'
63
+ data["content"] = "new content"
66
64
 
67
65
  # Add datasets
68
- data['datasets'] = [DatasetFactory().to_dict()]
69
- response = api.put(url_for('api.post', post=post), data)
66
+ data["datasets"] = [DatasetFactory().to_dict()]
67
+ response = api.put(url_for("api.post", post=post), data)
70
68
  assert200(response)
71
69
 
72
70
  # Add reuses to the post value returned by the previous api call
73
71
  data = response.json
74
- data['reuses'] = [ReuseFactory().to_dict()]
75
- response = api.put(url_for('api.post', post=post), data)
72
+ data["reuses"] = [ReuseFactory().to_dict()]
73
+ response = api.put(url_for("api.post", post=post), data)
76
74
  assert200(response)
77
75
 
78
- assert len(response.json['datasets']) == 1
79
- assert len(response.json['reuses']) == 1
76
+ assert len(response.json["datasets"]) == 1
77
+ assert len(response.json["reuses"]) == 1
80
78
 
81
79
  def test_post_api_delete(self, api):
82
- '''It should delete a post from the API'''
80
+ """It should delete a post from the API"""
83
81
  post = PostFactory()
84
82
  with api.user(AdminFactory()):
85
- response = api.delete(url_for('api.post', post=post))
83
+ response = api.delete(url_for("api.post", post=post))
86
84
  assert204(response)
87
85
  assert Post.objects.count() == 0
88
86
 
89
87
  def test_post_api_publish(self, api):
90
- '''It should update a post from the API'''
88
+ """It should update a post from the API"""
91
89
  post = PostFactory(published=None)
92
90
  api.login(AdminFactory())
93
- response = api.post(url_for('api.publish_post', post=post))
91
+ response = api.post(url_for("api.publish_post", post=post))
94
92
  assert200(response)
95
93
  assert Post.objects.count() == 1
96
94
 
@@ -98,10 +96,10 @@ class PostsAPITest:
98
96
  assert post.published is not None
99
97
 
100
98
  def test_post_api_unpublish(self, api):
101
- '''It should update a post from the API'''
99
+ """It should update a post from the API"""
102
100
  post = PostFactory()
103
101
  api.login(AdminFactory())
104
- response = api.delete(url_for('api.publish_post', post=post))
102
+ response = api.delete(url_for("api.publish_post", post=post))
105
103
  assert200(response)
106
104
  assert Post.objects.count() == 1
107
105
 
udata/core/reports/api.py CHANGED
@@ -8,11 +8,12 @@ from udata.api_fields import patch
8
8
  from .constants import reports_reasons_translations
9
9
  from .models import Report
10
10
 
11
- ns = api.namespace('reports', 'User reported objects related operations (beta)')
11
+ ns = api.namespace("reports", "User reported objects related operations (beta)")
12
12
 
13
- @ns.route('/', endpoint='reports')
13
+
14
+ @ns.route("/", endpoint="reports")
14
15
  class ReportsAPI(API):
15
- @api.doc('list_reports')
16
+ @api.doc("list_reports")
16
17
  @api.expect(Report.__index_parser__)
17
18
  @api.marshal_with(Report.__page_fields__)
18
19
  def get(self):
@@ -21,7 +22,7 @@ class ReportsAPI(API):
21
22
  return Report.apply_sort_filters_and_pagination(query)
22
23
 
23
24
  @api.secure
24
- @api.doc('create_report', responses={400: 'Validation error'})
25
+ @api.doc("create_report", responses={400: "Validation error"})
25
26
  @api.expect(Report.__write_fields__)
26
27
  @api.marshal_with(Report.__read_fields__, code=201)
27
28
  def post(self):
@@ -34,11 +35,11 @@ class ReportsAPI(API):
34
35
  api.abort(400, e.message)
35
36
 
36
37
  return report, 201
37
-
38
38
 
39
- @ns.route('/reasons/', endpoint='reports_reasons')
39
+
40
+ @ns.route("/reasons/", endpoint="reports_reasons")
40
41
  class ReportsReasonsAPI(API):
41
- @api.doc('list_reports_reasons')
42
+ @api.doc("list_reports_reasons")
42
43
  @ns.response(200, "list of available reasons associated with their labels", fields.Raw)
43
44
  def get(self):
44
45
  return reports_reasons_translations()
@@ -24,7 +24,5 @@ def reports_reasons_translations() -> list:
24
24
  ]
25
25
 
26
26
 
27
- REPORT_REASONS_CHOICES: list[str] = [
28
- item["value"] for item in reports_reasons_translations()
29
- ]
27
+ REPORT_REASONS_CHOICES: list[str] = [item["value"] for item in reports_reasons_translations()]
30
28
  REPORTABLE_MODELS = [Dataset]
@@ -20,12 +20,8 @@ class Report(db.Document):
20
20
  allow_null=True,
21
21
  )
22
22
 
23
- object_type = field(
24
- db.StringField(choices=[m.__name__ for m in REPORTABLE_MODELS])
25
- )
26
- object_id = field(
27
- db.ObjectIdField()
28
- )
23
+ object_type = field(db.StringField(choices=[m.__name__ for m in REPORTABLE_MODELS]))
24
+ object_id = field(db.ObjectIdField())
29
25
  object_deleted_at = field(
30
26
  db.DateTimeField(),
31
27
  allow_null=True,
@@ -47,12 +43,16 @@ class Report(db.Document):
47
43
  @classmethod
48
44
  def mark_as_deleted_soft_delete(cls, sender, document, **kwargs):
49
45
  if document.deleted:
50
- Report.objects(object_type=sender.__name__, object_id=document.id, object_deleted_at=None).update(object_deleted_at=datetime.utcnow)
51
-
46
+ Report.objects(
47
+ object_type=sender.__name__, object_id=document.id, object_deleted_at=None
48
+ ).update(object_deleted_at=datetime.utcnow)
49
+
52
50
  def mark_as_deleted_hard_delete(cls, document, **kwargs):
53
- Report.objects(object_type=document.__class__.__name__, object_id=document.id, object_deleted_at=None).update(object_deleted_at=datetime.utcnow)
51
+ Report.objects(
52
+ object_type=document.__class__.__name__, object_id=document.id, object_deleted_at=None
53
+ ).update(object_deleted_at=datetime.utcnow)
54
54
 
55
55
 
56
56
  for model in REPORTABLE_MODELS:
57
57
  signals.post_save.connect(Report.mark_as_deleted_soft_delete, sender=model)
58
- signals.post_delete.connect(Report.mark_as_deleted_hard_delete, sender=model)
58
+ signals.post_delete.connect(Report.mark_as_deleted_hard_delete, sender=model)
@@ -1,38 +1,34 @@
1
1
  from flask_security import current_user
2
2
 
3
3
  from udata.i18n import lazy_gettext as _
4
- from udata.models import db, Reuse, Activity
4
+ from udata.models import Activity, Reuse, db
5
5
 
6
-
7
- __all__ = (
8
- 'UserCreatedReuse', 'UserUpdatedReuse', 'UserDeletedReuse',
9
- 'ReuseRelatedActivity'
10
- )
6
+ __all__ = ("UserCreatedReuse", "UserUpdatedReuse", "UserDeletedReuse", "ReuseRelatedActivity")
11
7
 
12
8
 
13
9
  class ReuseRelatedActivity(object):
14
- template = 'activity/reuse.html'
15
- related_to = db.ReferenceField('Reuse')
10
+ template = "activity/reuse.html"
11
+ related_to = db.ReferenceField("Reuse")
16
12
 
17
13
 
18
14
  class UserCreatedReuse(ReuseRelatedActivity, Activity):
19
- key = 'reuse:created'
20
- icon = 'fa fa-plus'
21
- badge_type = 'success'
22
- label = _('created a reuse')
15
+ key = "reuse:created"
16
+ icon = "fa fa-plus"
17
+ badge_type = "success"
18
+ label = _("created a reuse")
23
19
 
24
20
 
25
21
  class UserUpdatedReuse(ReuseRelatedActivity, Activity):
26
- key = 'reuse:updated'
27
- icon = 'fa fa-pencil'
28
- label = _('updated a reuse')
22
+ key = "reuse:updated"
23
+ icon = "fa fa-pencil"
24
+ label = _("updated a reuse")
29
25
 
30
26
 
31
27
  class UserDeletedReuse(ReuseRelatedActivity, Activity):
32
- key = 'reuse:deleted'
33
- icon = 'fa fa-remove'
34
- badge_type = 'error'
35
- label = _('deleted a reuse')
28
+ key = "reuse:deleted"
29
+ icon = "fa fa-remove"
30
+ badge_type = "error"
31
+ label = _("deleted a reuse")
36
32
 
37
33
 
38
34
  @Reuse.on_create.connect