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,306 +1,478 @@
1
- from udata.api import api, fields, base_reference
1
+ from udata.api import api, base_reference, fields
2
2
  from udata.core.badges.fields import badge_fields
3
+ from udata.core.contact_point.api_fields import contact_point_fields
3
4
  from udata.core.organization.api_fields import org_ref_fields
4
5
  from udata.core.organization.constants import BIGGEST_LOGO_SIZE
5
6
  from udata.core.spatial.api_fields import spatial_coverage_fields
6
7
  from udata.core.user.api_fields import user_ref_fields
7
- from udata.core.contact_point.api_fields import contact_point_fields
8
8
 
9
9
  from .constants import (
10
- UPDATE_FREQUENCIES, RESOURCE_FILETYPES, DEFAULT_FREQUENCY,
11
- CHECKSUM_TYPES, DEFAULT_CHECKSUM_TYPE, DEFAULT_LICENSE, RESOURCE_TYPES
10
+ CHECKSUM_TYPES,
11
+ DEFAULT_CHECKSUM_TYPE,
12
+ DEFAULT_FREQUENCY,
13
+ DEFAULT_LICENSE,
14
+ RESOURCE_FILETYPES,
15
+ RESOURCE_TYPES,
16
+ UPDATE_FREQUENCIES,
12
17
  )
13
18
 
14
-
15
- checksum_fields = api.model('Checksum', {
16
- 'type': fields.String(
17
- description='The hashing algorithm used to compute the checksum',
18
- default=DEFAULT_CHECKSUM_TYPE, enum=CHECKSUM_TYPES),
19
- 'value': fields.String(description="The resulting checksum/hash",
20
- required=True)
21
- })
19
+ checksum_fields = api.model(
20
+ "Checksum",
21
+ {
22
+ "type": fields.String(
23
+ description="The hashing algorithm used to compute the checksum",
24
+ default=DEFAULT_CHECKSUM_TYPE,
25
+ enum=CHECKSUM_TYPES,
26
+ ),
27
+ "value": fields.String(description="The resulting checksum/hash", required=True),
28
+ },
29
+ )
22
30
 
23
31
  # Use for schema inside Dataset or Resource
24
- schema_fields = api.model('Schema', {
25
- 'name': fields.String(),
26
- 'version': fields.String(),
27
- 'url': fields.String(),
28
- })
32
+ schema_fields = api.model(
33
+ "Schema",
34
+ {
35
+ "name": fields.String(),
36
+ "version": fields.String(),
37
+ "url": fields.String(),
38
+ },
39
+ )
29
40
 
30
- dataset_harvest_fields = api.model('HarvestDatasetMetadata', {
31
- 'backend': fields.String(description='Harvest backend used', allow_null=True),
32
- 'created_at': fields.ISODateTime(description='The dataset harvested creation date',
33
- allow_null=True, readonly=True),
34
- 'modified_at': fields.ISODateTime(description='The dataset harvest last modification date',
35
- allow_null=True, readonly=True),
36
- 'source_id': fields.String(description='The harvester id', allow_null=True),
37
- 'remote_id': fields.String(description='The dataset remote id on the source portal',
38
- allow_null=True),
39
- 'domain': fields.String(description='The harvested domain', allow_null=True),
40
- 'last_update': fields.ISODateTime(description='The last harvest date', allow_null=True),
41
- 'remote_url': fields.String(description='The dataset remote url', allow_null=True),
42
- 'uri': fields.String(description='The dataset harveted uri', allow_null=True),
43
- 'dct_identifier': fields.String(
44
- description='The dct:identifier property from the harvested dataset',
45
- allow_null=True),
46
- 'archived_at': fields.ISODateTime(description='The archive date', allow_null=True),
47
- 'archived': fields.String(
48
- description='The reason the dataset has been archived',
49
- allow_null=True),
50
- })
41
+ dataset_harvest_fields = api.model(
42
+ "HarvestDatasetMetadata",
43
+ {
44
+ "backend": fields.String(description="Harvest backend used", allow_null=True),
45
+ "created_at": fields.ISODateTime(
46
+ description="The dataset harvested creation date", allow_null=True, readonly=True
47
+ ),
48
+ "modified_at": fields.ISODateTime(
49
+ description="The dataset harvest last modification date", allow_null=True, readonly=True
50
+ ),
51
+ "source_id": fields.String(description="The harvester id", allow_null=True),
52
+ "remote_id": fields.String(
53
+ description="The dataset remote id on the source portal", allow_null=True
54
+ ),
55
+ "domain": fields.String(description="The harvested domain", allow_null=True),
56
+ "last_update": fields.ISODateTime(description="The last harvest date", allow_null=True),
57
+ "remote_url": fields.String(description="The dataset remote url", allow_null=True),
58
+ "uri": fields.String(description="The dataset harveted uri", allow_null=True),
59
+ "dct_identifier": fields.String(
60
+ description="The dct:identifier property from the harvested dataset", allow_null=True
61
+ ),
62
+ "archived_at": fields.ISODateTime(description="The archive date", allow_null=True),
63
+ "archived": fields.String(
64
+ description="The reason the dataset has been archived", allow_null=True
65
+ ),
66
+ },
67
+ )
51
68
 
52
- resource_harvest_fields = api.model('HarvestResourceMetadata', {
53
- 'created_at': fields.ISODateTime(description='The resource harvested creation date',
54
- allow_null=True, readonly=True),
55
- 'modified_at': fields.ISODateTime(description='The resource harvest last modification date',
56
- allow_null=True, readonly=True),
57
- 'uri': fields.String(description='The resource harvest uri', allow_null=True)
58
- })
69
+ resource_harvest_fields = api.model(
70
+ "HarvestResourceMetadata",
71
+ {
72
+ "created_at": fields.ISODateTime(
73
+ description="The resource harvested creation date", allow_null=True, readonly=True
74
+ ),
75
+ "modified_at": fields.ISODateTime(
76
+ description="The resource harvest last modification date",
77
+ allow_null=True,
78
+ readonly=True,
79
+ ),
80
+ "uri": fields.String(description="The resource harvest uri", allow_null=True),
81
+ },
82
+ )
59
83
 
60
- license_fields = api.model('License', {
61
- 'id': fields.String(description='The license identifier', required=True),
62
- 'title': fields.String(description='The resource title', required=True),
63
- 'maintainer': fields.String(description='The license official maintainer'),
64
- 'url': fields.String(description='The license official URL'),
65
- 'flags': fields.List(fields.String, description='Some arbitry flags'),
66
- 'alternate_urls': fields.List(
67
- fields.String,
68
- description='Same alternative known URLs (improve rematch)'
69
- ),
70
- 'alternate_titles': fields.List(
71
- fields.String,
72
- description='Same alternative known titles (improve rematch)'
73
- ),
74
- })
84
+ license_fields = api.model(
85
+ "License",
86
+ {
87
+ "id": fields.String(description="The license identifier", required=True),
88
+ "title": fields.String(description="The resource title", required=True),
89
+ "maintainer": fields.String(description="The license official maintainer"),
90
+ "url": fields.String(description="The license official URL"),
91
+ "flags": fields.List(fields.String, description="Some arbitry flags"),
92
+ "alternate_urls": fields.List(
93
+ fields.String, description="Same alternative known URLs (improve rematch)"
94
+ ),
95
+ "alternate_titles": fields.List(
96
+ fields.String, description="Same alternative known titles (improve rematch)"
97
+ ),
98
+ },
99
+ )
75
100
 
76
- frequency_fields = api.model('Frequency', {
77
- 'id': fields.String(description='The frequency identifier'),
78
- 'label': fields.String(description='The frequency display name')
79
- })
101
+ frequency_fields = api.model(
102
+ "Frequency",
103
+ {
104
+ "id": fields.String(description="The frequency identifier"),
105
+ "label": fields.String(description="The frequency display name"),
106
+ },
107
+ )
80
108
 
81
- resource_internal_fields = api.model('ResourceInternals', {
82
- 'created_at_internal': fields.ISODateTime(
83
- description='The resource\'s internal creation date on the site', required=True),
84
- 'last_modified_internal': fields.ISODateTime(
85
- description='The resource\'s internal last modification date', required=True),
86
- })
109
+ resource_internal_fields = api.model(
110
+ "ResourceInternals",
111
+ {
112
+ "created_at_internal": fields.ISODateTime(
113
+ description="The resource's internal creation date on the site", required=True
114
+ ),
115
+ "last_modified_internal": fields.ISODateTime(
116
+ description="The resource's internal last modification date", required=True
117
+ ),
118
+ },
119
+ )
87
120
 
88
- resource_fields = api.model('Resource', {
89
- 'id': fields.String(description='The resource unique ID', readonly=True),
90
- 'title': fields.String(description='The resource title', required=True),
91
- 'description': fields.Markdown(
92
- description='The resource markdown description'),
93
- 'filetype': fields.String(
94
- description=('Whether the resource is an uploaded file, '
95
- 'a remote file or an API'),
96
- required=True, enum=list(RESOURCE_FILETYPES)),
97
- 'type': fields.String(
98
- description=('Resource type (documentation, API...)'),
99
- required=True, enum=list(RESOURCE_TYPES)),
100
- 'format': fields.String(description='The resource format', required=True),
101
- 'url': fields.String(description='The resource URL', required=True),
102
- 'latest': fields.String(description='The permanent URL redirecting to '
103
- 'the latest version of the resource. When the '
104
- 'resource data is updated, the URL will '
105
- 'change, the latest URL won\'t.',
106
- readonly=True),
107
- 'checksum': fields.Nested(
108
- checksum_fields, allow_null=True,
109
- description='A checksum to validate file validity'),
110
- 'filesize': fields.Integer(description='The resource file size in bytes'),
111
- 'mime': fields.String(description='The resource mime type'),
112
- 'created_at': fields.ISODateTime(
113
- readonly=True, description='The resource creation date'),
114
- 'last_modified': fields.ISODateTime(readonly=True, description='The resource last modification date'),
115
- 'metrics': fields.Raw(
116
- description='The resource metrics', readonly=True),
117
- 'harvest': fields.Nested(
118
- resource_harvest_fields, allow_null=True, readonly=True,
119
- description='Harvest attributes metadata information',
120
- skip_none=True),
121
- 'extras': fields.Raw(description='Extra attributes as key-value pairs'),
122
- 'preview_url': fields.String(description='An optional preview URL to be '
123
- 'loaded as a standalone page (ie. iframe or '
124
- 'new page)',
125
- readonly=True),
126
- 'schema': fields.Nested(
127
- schema_fields, allow_null=True, description='Reference to the associated schema'),
128
- 'internal': fields.Nested(
129
- resource_internal_fields, readonly=True, description='Site internal and specific object\'s data'),
130
- })
121
+ resource_fields = api.model(
122
+ "Resource",
123
+ {
124
+ "id": fields.String(description="The resource unique ID", readonly=True),
125
+ "title": fields.String(description="The resource title", required=True),
126
+ "description": fields.Markdown(description="The resource markdown description"),
127
+ "filetype": fields.String(
128
+ description=("Whether the resource is an uploaded file, " "a remote file or an API"),
129
+ required=True,
130
+ enum=list(RESOURCE_FILETYPES),
131
+ ),
132
+ "type": fields.String(
133
+ description=("Resource type (documentation, API...)"),
134
+ required=True,
135
+ enum=list(RESOURCE_TYPES),
136
+ ),
137
+ "format": fields.String(description="The resource format", required=True),
138
+ "url": fields.String(description="The resource URL", required=True),
139
+ "latest": fields.String(
140
+ description="The permanent URL redirecting to "
141
+ "the latest version of the resource. When the "
142
+ "resource data is updated, the URL will "
143
+ "change, the latest URL won't.",
144
+ readonly=True,
145
+ ),
146
+ "checksum": fields.Nested(
147
+ checksum_fields, allow_null=True, description="A checksum to validate file validity"
148
+ ),
149
+ "filesize": fields.Integer(description="The resource file size in bytes"),
150
+ "mime": fields.String(description="The resource mime type"),
151
+ "created_at": fields.ISODateTime(readonly=True, description="The resource creation date"),
152
+ "last_modified": fields.ISODateTime(
153
+ readonly=True, description="The resource last modification date"
154
+ ),
155
+ "metrics": fields.Raw(description="The resource metrics", readonly=True),
156
+ "harvest": fields.Nested(
157
+ resource_harvest_fields,
158
+ allow_null=True,
159
+ readonly=True,
160
+ description="Harvest attributes metadata information",
161
+ skip_none=True,
162
+ ),
163
+ "extras": fields.Raw(description="Extra attributes as key-value pairs"),
164
+ "preview_url": fields.String(
165
+ description="An optional preview URL to be "
166
+ "loaded as a standalone page (ie. iframe or "
167
+ "new page)",
168
+ readonly=True,
169
+ ),
170
+ "schema": fields.Nested(
171
+ schema_fields, allow_null=True, description="Reference to the associated schema"
172
+ ),
173
+ "internal": fields.Nested(
174
+ resource_internal_fields,
175
+ readonly=True,
176
+ description="Site internal and specific object's data",
177
+ ),
178
+ },
179
+ )
131
180
 
132
- upload_fields = api.inherit('UploadedResource', resource_fields, {
133
- 'success': fields.Boolean(
134
- description='Whether the upload succeeded or not.',
135
- readonly=True, default=True),
136
- })
181
+ upload_fields = api.inherit(
182
+ "UploadedResource",
183
+ resource_fields,
184
+ {
185
+ "success": fields.Boolean(
186
+ description="Whether the upload succeeded or not.", readonly=True, default=True
187
+ ),
188
+ },
189
+ )
137
190
 
138
- resources_order = api.as_list(fields.String(description='Resource ID'))
191
+ resources_order = api.as_list(fields.String(description="Resource ID"))
139
192
 
140
- temporal_coverage_fields = api.model('TemporalCoverage', {
141
- 'start': fields.ISODateTime(description='The temporal coverage start date',
142
- required=True),
143
- 'end': fields.ISODateTime(description='The temporal coverage end date',
144
- required=True),
145
- })
193
+ temporal_coverage_fields = api.model(
194
+ "TemporalCoverage",
195
+ {
196
+ "start": fields.ISODateTime(description="The temporal coverage start date", required=True),
197
+ "end": fields.ISODateTime(description="The temporal coverage end date", required=True),
198
+ },
199
+ )
146
200
 
147
- dataset_ref_fields = api.inherit('DatasetReference', base_reference, {
148
- 'title': fields.String(description='The dataset title', readonly=True),
149
- 'acronym': fields.String(description='An optional dataset acronym',
150
- readonly=True),
151
- 'uri': fields.UrlFor(
152
- 'api.dataset', lambda d: {'dataset': d},
153
- description='The API URI for this dataset', readonly=True),
154
- 'page': fields.UrlFor(
155
- 'datasets.show', lambda d: {'dataset': d},
156
- description='The web page URL for this dataset', readonly=True,
157
- fallback_endpoint='api.dataset'),
158
- })
201
+ dataset_ref_fields = api.inherit(
202
+ "DatasetReference",
203
+ base_reference,
204
+ {
205
+ "title": fields.String(description="The dataset title", readonly=True),
206
+ "acronym": fields.String(description="An optional dataset acronym", readonly=True),
207
+ "uri": fields.UrlFor(
208
+ "api.dataset",
209
+ lambda d: {"dataset": d},
210
+ description="The API URI for this dataset",
211
+ readonly=True,
212
+ ),
213
+ "page": fields.UrlFor(
214
+ "datasets.show",
215
+ lambda d: {"dataset": d},
216
+ description="The web page URL for this dataset",
217
+ readonly=True,
218
+ fallback_endpoint="api.dataset",
219
+ ),
220
+ },
221
+ )
159
222
 
160
- community_resource_fields = api.inherit('CommunityResource', resource_fields, {
161
- 'dataset': fields.Nested(
162
- dataset_ref_fields, allow_null=True,
163
- description='Reference to the associated dataset'),
164
- 'organization': fields.Nested(
165
- org_ref_fields, allow_null=True,
166
- description='The producer organization'),
167
- 'owner': fields.Nested(
168
- user_ref_fields, allow_null=True,
169
- description='The user information')
170
- })
223
+ community_resource_fields = api.inherit(
224
+ "CommunityResource",
225
+ resource_fields,
226
+ {
227
+ "dataset": fields.Nested(
228
+ dataset_ref_fields, allow_null=True, description="Reference to the associated dataset"
229
+ ),
230
+ "organization": fields.Nested(
231
+ org_ref_fields, allow_null=True, description="The producer organization"
232
+ ),
233
+ "owner": fields.Nested(
234
+ user_ref_fields, allow_null=True, description="The user information"
235
+ ),
236
+ },
237
+ )
171
238
 
172
239
  community_resource_page_fields = api.model(
173
- 'CommunityResourcePage', fields.pager(community_resource_fields))
240
+ "CommunityResourcePage", fields.pager(community_resource_fields)
241
+ )
174
242
 
175
243
  #: Default mask to make it lightweight by default
176
- DEFAULT_MASK = ','.join((
177
- 'id', 'title', 'acronym', 'slug', 'description', 'created_at', 'last_modified', 'deleted',
178
- 'private', 'tags', 'badges', 'resources', 'frequency', 'frequency_date', 'extras', 'harvest',
179
- 'metrics', 'organization', 'owner', 'schema', 'temporal_coverage', 'spatial', 'license',
180
- 'uri', 'page', 'last_update', 'archived', 'quality', 'internal', 'contact_point',
181
- ))
244
+ DEFAULT_MASK = ",".join(
245
+ (
246
+ "id",
247
+ "title",
248
+ "acronym",
249
+ "slug",
250
+ "description",
251
+ "created_at",
252
+ "last_modified",
253
+ "deleted",
254
+ "private",
255
+ "tags",
256
+ "badges",
257
+ "resources",
258
+ "frequency",
259
+ "frequency_date",
260
+ "extras",
261
+ "harvest",
262
+ "metrics",
263
+ "organization",
264
+ "owner",
265
+ "schema",
266
+ "temporal_coverage",
267
+ "spatial",
268
+ "license",
269
+ "uri",
270
+ "page",
271
+ "last_update",
272
+ "archived",
273
+ "quality",
274
+ "internal",
275
+ "contact_point",
276
+ )
277
+ )
182
278
 
183
- dataset_internal_fields = api.model('DatasetInternals', {
184
- 'created_at_internal': fields.ISODateTime(
185
- description='The dataset\'s internal creation date on the site', required=True),
186
- 'last_modified_internal': fields.ISODateTime(
187
- description='The dataset\'s internal last modification date', required=True),
188
- })
279
+ dataset_internal_fields = api.model(
280
+ "DatasetInternals",
281
+ {
282
+ "created_at_internal": fields.ISODateTime(
283
+ description="The dataset's internal creation date on the site", required=True
284
+ ),
285
+ "last_modified_internal": fields.ISODateTime(
286
+ description="The dataset's internal last modification date", required=True
287
+ ),
288
+ },
289
+ )
189
290
 
190
- dataset_fields = api.model('Dataset', {
191
- 'id': fields.String(description='The dataset identifier', readonly=True),
192
- 'title': fields.String(description='The dataset title', required=True),
193
- 'acronym': fields.String(description='An optional dataset acronym'),
194
- 'slug': fields.String(
195
- description='The dataset permalink string', required=True),
196
- 'description': fields.Markdown(
197
- description='The dataset description in markdown', required=True),
198
- 'created_at': fields.ISODateTime(
199
- description='This date is computed between harvested creation date if any and site\'s internal creation date' , required=True, readonly=True),
200
- 'last_modified': fields.ISODateTime(
201
- description='The dataset last modification date', required=True, readonly=True),
202
- 'deleted': fields.ISODateTime(description='The deletion date if deleted', readonly=True),
203
- 'archived': fields.ISODateTime(description='The archival date if archived'),
204
- 'featured': fields.Boolean(description='Is the dataset featured'),
205
- 'private': fields.Boolean(
206
- description='Is the dataset private to the owner or the organization'),
207
- 'tags': fields.List(fields.String),
208
- 'badges': fields.List(fields.Nested(badge_fields),
209
- description='The dataset badges',
210
- readonly=True),
211
- 'resources': fields.List(
212
- fields.Nested(resource_fields, description='The dataset resources')),
213
- 'community_resources': fields.List(
214
- fields.Nested(
215
- community_resource_fields,
216
- description='The dataset community submitted resources')),
217
- 'frequency': fields.String(
218
- description='The update frequency', required=True,
219
- enum=list(UPDATE_FREQUENCIES), default=DEFAULT_FREQUENCY),
220
- 'frequency_date': fields.ISODateTime(
221
- description=('Next expected update date, you will be notified '
222
- 'once that date is reached.')),
223
- 'harvest': fields.Nested(
224
- dataset_harvest_fields, readonly=True, allow_null=True,
225
- description='Dataset harvest metadata attributes',
226
- skip_none=True
227
- ),
228
- 'extras': fields.Raw(description='Extras attributes as key-value pairs'),
229
- 'metrics': fields.Raw(attribute=lambda o: o.get_metrics(), description='The dataset metrics'),
230
- 'organization': fields.Nested(
231
- org_ref_fields, allow_null=True,
232
- description='The producer organization'),
233
- 'owner': fields.Nested(
234
- user_ref_fields, allow_null=True, description='The user information'),
235
- 'temporal_coverage': fields.Nested(
236
- temporal_coverage_fields, allow_null=True,
237
- description='The temporal coverage'),
238
- 'spatial': fields.Nested(
239
- spatial_coverage_fields, allow_null=True,
240
- description='The spatial coverage'),
241
- 'license': fields.String(attribute='license.id',
242
- default=DEFAULT_LICENSE['id'],
243
- description='The dataset license'),
244
- 'uri': fields.UrlFor(
245
- 'api.dataset', lambda o: {'dataset': o},
246
- description='The dataset API URI', required=True),
247
- 'page': fields.UrlFor(
248
- 'datasets.show', lambda o: {'dataset': o},
249
- description='The dataset page URL', required=True, fallback_endpoint='api.dataset'),
250
- 'quality': fields.Raw(description='The dataset quality', readonly=True),
251
- 'last_update': fields.ISODateTime(
252
- description='The resources last modification date', required=True),
253
- 'schema': fields.Nested(
254
- schema_fields, allow_null=True, description='Reference to the associated schema'),
255
- 'internal': fields.Nested(
256
- dataset_internal_fields, readonly=True, description='Site internal and specific object\'s data'),
257
- 'contact_point': fields.Nested(contact_point_fields, allow_null=True, description='The dataset\'s contact points'),
258
- }, mask=DEFAULT_MASK)
291
+ dataset_fields = api.model(
292
+ "Dataset",
293
+ {
294
+ "id": fields.String(description="The dataset identifier", readonly=True),
295
+ "title": fields.String(description="The dataset title", required=True),
296
+ "acronym": fields.String(description="An optional dataset acronym"),
297
+ "slug": fields.String(description="The dataset permalink string", required=True),
298
+ "description": fields.Markdown(
299
+ description="The dataset description in markdown", required=True
300
+ ),
301
+ "created_at": fields.ISODateTime(
302
+ description="This date is computed between harvested creation date if any and site's internal creation date",
303
+ required=True,
304
+ readonly=True,
305
+ ),
306
+ "last_modified": fields.ISODateTime(
307
+ description="The dataset last modification date", required=True, readonly=True
308
+ ),
309
+ "deleted": fields.ISODateTime(description="The deletion date if deleted", readonly=True),
310
+ "archived": fields.ISODateTime(description="The archival date if archived"),
311
+ "featured": fields.Boolean(description="Is the dataset featured"),
312
+ "private": fields.Boolean(
313
+ description="Is the dataset private to the owner or the organization"
314
+ ),
315
+ "tags": fields.List(fields.String),
316
+ "badges": fields.List(
317
+ fields.Nested(badge_fields), description="The dataset badges", readonly=True
318
+ ),
319
+ "resources": fields.List(
320
+ fields.Nested(resource_fields, description="The dataset resources")
321
+ ),
322
+ "community_resources": fields.List(
323
+ fields.Nested(
324
+ community_resource_fields, description="The dataset community submitted resources"
325
+ )
326
+ ),
327
+ "frequency": fields.String(
328
+ description="The update frequency",
329
+ required=True,
330
+ enum=list(UPDATE_FREQUENCIES),
331
+ default=DEFAULT_FREQUENCY,
332
+ ),
333
+ "frequency_date": fields.ISODateTime(
334
+ description=(
335
+ "Next expected update date, you will be notified " "once that date is reached."
336
+ )
337
+ ),
338
+ "harvest": fields.Nested(
339
+ dataset_harvest_fields,
340
+ readonly=True,
341
+ allow_null=True,
342
+ description="Dataset harvest metadata attributes",
343
+ skip_none=True,
344
+ ),
345
+ "extras": fields.Raw(description="Extras attributes as key-value pairs"),
346
+ "metrics": fields.Raw(
347
+ attribute=lambda o: o.get_metrics(), description="The dataset metrics"
348
+ ),
349
+ "organization": fields.Nested(
350
+ org_ref_fields, allow_null=True, description="The producer organization"
351
+ ),
352
+ "owner": fields.Nested(
353
+ user_ref_fields, allow_null=True, description="The user information"
354
+ ),
355
+ "temporal_coverage": fields.Nested(
356
+ temporal_coverage_fields, allow_null=True, description="The temporal coverage"
357
+ ),
358
+ "spatial": fields.Nested(
359
+ spatial_coverage_fields, allow_null=True, description="The spatial coverage"
360
+ ),
361
+ "license": fields.String(
362
+ attribute="license.id", default=DEFAULT_LICENSE["id"], description="The dataset license"
363
+ ),
364
+ "uri": fields.UrlFor(
365
+ "api.dataset",
366
+ lambda o: {"dataset": o},
367
+ description="The dataset API URI",
368
+ required=True,
369
+ ),
370
+ "page": fields.UrlFor(
371
+ "datasets.show",
372
+ lambda o: {"dataset": o},
373
+ description="The dataset page URL",
374
+ required=True,
375
+ fallback_endpoint="api.dataset",
376
+ ),
377
+ "quality": fields.Raw(description="The dataset quality", readonly=True),
378
+ "last_update": fields.ISODateTime(
379
+ description="The resources last modification date", required=True
380
+ ),
381
+ "schema": fields.Nested(
382
+ schema_fields, allow_null=True, description="Reference to the associated schema"
383
+ ),
384
+ "internal": fields.Nested(
385
+ dataset_internal_fields,
386
+ readonly=True,
387
+ description="Site internal and specific object's data",
388
+ ),
389
+ "contact_point": fields.Nested(
390
+ contact_point_fields, allow_null=True, description="The dataset's contact points"
391
+ ),
392
+ },
393
+ mask=DEFAULT_MASK,
394
+ )
259
395
 
260
- dataset_page_fields = api.model('DatasetPage', fields.pager(dataset_fields),
261
- mask='data{{{0}}},*'.format(DEFAULT_MASK))
396
+ dataset_page_fields = api.model(
397
+ "DatasetPage", fields.pager(dataset_fields), mask="data{{{0}}},*".format(DEFAULT_MASK)
398
+ )
262
399
 
263
400
 
264
- dataset_suggestion_fields = api.model('DatasetSuggestion', {
265
- 'id': fields.String(description='The dataset identifier'),
266
- 'title': fields.String(description='The dataset title'),
267
- 'acronym': fields.String(description='An optional dataset acronym'),
268
- 'slug': fields.String(
269
- description='The dataset permalink string'),
270
- 'image_url': fields.ImageField(size=BIGGEST_LOGO_SIZE, description='The dataset (organization) logo URL', readonly=True),
271
- 'page': fields.UrlFor(
272
- 'datasets.show_redirect', lambda d: {'dataset': d['slug']},
273
- description='The web page URL for this dataset', fallback_endpoint='api.dataset')
274
- })
401
+ dataset_suggestion_fields = api.model(
402
+ "DatasetSuggestion",
403
+ {
404
+ "id": fields.String(description="The dataset identifier"),
405
+ "title": fields.String(description="The dataset title"),
406
+ "acronym": fields.String(description="An optional dataset acronym"),
407
+ "slug": fields.String(description="The dataset permalink string"),
408
+ "image_url": fields.ImageField(
409
+ size=BIGGEST_LOGO_SIZE, description="The dataset (organization) logo URL", readonly=True
410
+ ),
411
+ "page": fields.UrlFor(
412
+ "datasets.show_redirect",
413
+ lambda d: {"dataset": d["slug"]},
414
+ description="The web page URL for this dataset",
415
+ fallback_endpoint="api.dataset",
416
+ ),
417
+ },
418
+ )
275
419
 
276
420
 
277
- resource_type_fields = api.model('ResourceType', {
278
- 'id': fields.String(description='The resource type identifier'),
279
- 'label': fields.String(description='The resource type display name')
280
- })
421
+ resource_type_fields = api.model(
422
+ "ResourceType",
423
+ {
424
+ "id": fields.String(description="The resource type identifier"),
425
+ "label": fields.String(description="The resource type display name"),
426
+ },
427
+ )
281
428
 
282
429
  # follow the specification of https://schema.data.gouv.fr/schemas/schemas.json
283
- catalog_schema_fields = api.model('CatalogSchema', {
284
- 'name': fields.String(),
285
- 'title': fields.String(),
286
- 'description': fields.String(),
287
- 'schema_url': fields.String(description="Often the link to the latest version"),
288
- 'schema_type': fields.String(enum=['tableschema', 'datapackage', 'jsonschema', 'other']),
289
- 'contact': fields.String(),
290
- 'examples': fields.List(fields.Nested(api.model('CatalogSchemaExample', {
291
- 'title': fields.String(),
292
- 'path': fields.String(),
293
- }))),
294
- 'labels': fields.List(fields.String()),
295
- 'consolidation_dataset_id': fields.String(),
296
- 'versions': fields.List(fields.Nested(api.model('CatalogSchemaVersion', {
297
- 'version_name': fields.String(),
298
- 'schema_url': fields.String(),
299
- }))),
300
- 'external_doc': fields.String(),
301
- 'external_tool': fields.String(description="Link to tools to create a file with this schema"),
302
- 'homepage': fields.String(),
303
- 'datapackage_title': fields.String(description="Only present if the schema is inside a datapackage"),
304
- 'datapackage_name': fields.String(description="Only present if the schema is inside a datapackage"),
305
- 'datapackage_description': fields.String(description="Only present if the schema is inside a datapackage"),
306
- })
430
+ catalog_schema_fields = api.model(
431
+ "CatalogSchema",
432
+ {
433
+ "name": fields.String(),
434
+ "title": fields.String(),
435
+ "description": fields.String(),
436
+ "schema_url": fields.String(description="Often the link to the latest version"),
437
+ "schema_type": fields.String(enum=["tableschema", "datapackage", "jsonschema", "other"]),
438
+ "contact": fields.String(),
439
+ "examples": fields.List(
440
+ fields.Nested(
441
+ api.model(
442
+ "CatalogSchemaExample",
443
+ {
444
+ "title": fields.String(),
445
+ "path": fields.String(),
446
+ },
447
+ )
448
+ )
449
+ ),
450
+ "labels": fields.List(fields.String()),
451
+ "consolidation_dataset_id": fields.String(),
452
+ "versions": fields.List(
453
+ fields.Nested(
454
+ api.model(
455
+ "CatalogSchemaVersion",
456
+ {
457
+ "version_name": fields.String(),
458
+ "schema_url": fields.String(),
459
+ },
460
+ )
461
+ )
462
+ ),
463
+ "external_doc": fields.String(),
464
+ "external_tool": fields.String(
465
+ description="Link to tools to create a file with this schema"
466
+ ),
467
+ "homepage": fields.String(),
468
+ "datapackage_title": fields.String(
469
+ description="Only present if the schema is inside a datapackage"
470
+ ),
471
+ "datapackage_name": fields.String(
472
+ description="Only present if the schema is inside a datapackage"
473
+ ),
474
+ "datapackage_description": fields.String(
475
+ description="Only present if the schema is inside a datapackage"
476
+ ),
477
+ },
478
+ )