udata 9.1.2.dev30355__py2.py3-none-any.whl → 9.1.2.dev30382__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of udata might be problematic. Click here for more details.

Files changed (425) hide show
  1. tasks/__init__.py +109 -107
  2. tasks/helpers.py +18 -18
  3. udata/__init__.py +4 -4
  4. udata/admin/views.py +5 -5
  5. udata/api/__init__.py +135 -124
  6. udata/api/commands.py +45 -37
  7. udata/api/errors.py +5 -4
  8. udata/api/fields.py +23 -21
  9. udata/api/oauth2.py +55 -74
  10. udata/api/parsers.py +15 -15
  11. udata/api/signals.py +1 -1
  12. udata/api_fields.py +137 -89
  13. udata/app.py +56 -54
  14. udata/assets.py +5 -5
  15. udata/auth/__init__.py +37 -26
  16. udata/auth/forms.py +23 -15
  17. udata/auth/helpers.py +1 -1
  18. udata/auth/mails.py +3 -3
  19. udata/auth/password_validation.py +19 -15
  20. udata/auth/views.py +94 -68
  21. udata/commands/__init__.py +71 -69
  22. udata/commands/cache.py +7 -7
  23. udata/commands/db.py +201 -140
  24. udata/commands/dcat.py +36 -30
  25. udata/commands/fixtures.py +100 -84
  26. udata/commands/images.py +21 -20
  27. udata/commands/info.py +17 -20
  28. udata/commands/init.py +10 -10
  29. udata/commands/purge.py +12 -13
  30. udata/commands/serve.py +41 -29
  31. udata/commands/static.py +16 -18
  32. udata/commands/test.py +20 -20
  33. udata/commands/tests/fixtures.py +26 -24
  34. udata/commands/worker.py +31 -33
  35. udata/core/__init__.py +12 -12
  36. udata/core/activity/__init__.py +0 -1
  37. udata/core/activity/api.py +59 -49
  38. udata/core/activity/models.py +28 -26
  39. udata/core/activity/signals.py +1 -1
  40. udata/core/activity/tasks.py +16 -10
  41. udata/core/badges/api.py +6 -6
  42. udata/core/badges/commands.py +14 -13
  43. udata/core/badges/fields.py +8 -5
  44. udata/core/badges/forms.py +7 -4
  45. udata/core/badges/models.py +16 -31
  46. udata/core/badges/permissions.py +1 -3
  47. udata/core/badges/signals.py +2 -2
  48. udata/core/badges/tasks.py +3 -2
  49. udata/core/badges/tests/test_commands.py +10 -10
  50. udata/core/badges/tests/test_model.py +24 -31
  51. udata/core/contact_point/api.py +19 -18
  52. udata/core/contact_point/api_fields.py +21 -14
  53. udata/core/contact_point/factories.py +2 -2
  54. udata/core/contact_point/forms.py +7 -6
  55. udata/core/contact_point/models.py +3 -5
  56. udata/core/dataservices/api.py +26 -21
  57. udata/core/dataservices/factories.py +13 -11
  58. udata/core/dataservices/models.py +35 -40
  59. udata/core/dataservices/permissions.py +4 -4
  60. udata/core/dataservices/rdf.py +40 -17
  61. udata/core/dataservices/tasks.py +4 -3
  62. udata/core/dataset/actions.py +10 -10
  63. udata/core/dataset/activities.py +21 -23
  64. udata/core/dataset/api.py +321 -298
  65. udata/core/dataset/api_fields.py +443 -271
  66. udata/core/dataset/apiv2.py +305 -229
  67. udata/core/dataset/commands.py +38 -36
  68. udata/core/dataset/constants.py +61 -54
  69. udata/core/dataset/csv.py +70 -74
  70. udata/core/dataset/events.py +39 -32
  71. udata/core/dataset/exceptions.py +8 -4
  72. udata/core/dataset/factories.py +57 -65
  73. udata/core/dataset/forms.py +87 -63
  74. udata/core/dataset/models.py +336 -280
  75. udata/core/dataset/permissions.py +9 -6
  76. udata/core/dataset/preview.py +15 -17
  77. udata/core/dataset/rdf.py +156 -122
  78. udata/core/dataset/search.py +92 -77
  79. udata/core/dataset/signals.py +1 -1
  80. udata/core/dataset/tasks.py +63 -54
  81. udata/core/discussions/actions.py +5 -5
  82. udata/core/discussions/api.py +124 -120
  83. udata/core/discussions/factories.py +2 -2
  84. udata/core/discussions/forms.py +9 -7
  85. udata/core/discussions/metrics.py +1 -3
  86. udata/core/discussions/models.py +25 -24
  87. udata/core/discussions/notifications.py +18 -14
  88. udata/core/discussions/permissions.py +3 -3
  89. udata/core/discussions/signals.py +4 -4
  90. udata/core/discussions/tasks.py +24 -28
  91. udata/core/followers/api.py +32 -33
  92. udata/core/followers/models.py +9 -9
  93. udata/core/followers/signals.py +3 -3
  94. udata/core/jobs/actions.py +7 -7
  95. udata/core/jobs/api.py +99 -92
  96. udata/core/jobs/commands.py +48 -49
  97. udata/core/jobs/forms.py +11 -11
  98. udata/core/jobs/models.py +6 -6
  99. udata/core/metrics/__init__.py +2 -2
  100. udata/core/metrics/commands.py +34 -30
  101. udata/core/metrics/models.py +2 -4
  102. udata/core/metrics/signals.py +1 -1
  103. udata/core/metrics/tasks.py +3 -3
  104. udata/core/organization/activities.py +12 -15
  105. udata/core/organization/api.py +167 -174
  106. udata/core/organization/api_fields.py +183 -124
  107. udata/core/organization/apiv2.py +32 -32
  108. udata/core/organization/commands.py +20 -22
  109. udata/core/organization/constants.py +11 -11
  110. udata/core/organization/csv.py +17 -15
  111. udata/core/organization/factories.py +8 -11
  112. udata/core/organization/forms.py +32 -26
  113. udata/core/organization/metrics.py +2 -1
  114. udata/core/organization/models.py +87 -67
  115. udata/core/organization/notifications.py +18 -14
  116. udata/core/organization/permissions.py +10 -11
  117. udata/core/organization/rdf.py +14 -14
  118. udata/core/organization/search.py +30 -28
  119. udata/core/organization/signals.py +7 -7
  120. udata/core/organization/tasks.py +42 -61
  121. udata/core/owned.py +38 -27
  122. udata/core/post/api.py +82 -81
  123. udata/core/post/constants.py +8 -5
  124. udata/core/post/factories.py +4 -4
  125. udata/core/post/forms.py +13 -14
  126. udata/core/post/models.py +20 -22
  127. udata/core/post/tests/test_api.py +30 -32
  128. udata/core/reports/api.py +8 -7
  129. udata/core/reports/constants.py +1 -3
  130. udata/core/reports/models.py +10 -10
  131. udata/core/reuse/activities.py +15 -19
  132. udata/core/reuse/api.py +123 -126
  133. udata/core/reuse/api_fields.py +120 -85
  134. udata/core/reuse/apiv2.py +11 -10
  135. udata/core/reuse/constants.py +23 -23
  136. udata/core/reuse/csv.py +18 -18
  137. udata/core/reuse/factories.py +5 -9
  138. udata/core/reuse/forms.py +24 -21
  139. udata/core/reuse/models.py +55 -51
  140. udata/core/reuse/permissions.py +2 -2
  141. udata/core/reuse/search.py +49 -46
  142. udata/core/reuse/signals.py +1 -1
  143. udata/core/reuse/tasks.py +4 -5
  144. udata/core/site/api.py +47 -50
  145. udata/core/site/factories.py +2 -2
  146. udata/core/site/forms.py +4 -5
  147. udata/core/site/models.py +94 -63
  148. udata/core/site/rdf.py +14 -14
  149. udata/core/spam/api.py +16 -9
  150. udata/core/spam/constants.py +4 -4
  151. udata/core/spam/fields.py +13 -7
  152. udata/core/spam/models.py +27 -20
  153. udata/core/spam/signals.py +1 -1
  154. udata/core/spam/tests/test_spam.py +6 -5
  155. udata/core/spatial/api.py +72 -80
  156. udata/core/spatial/api_fields.py +73 -58
  157. udata/core/spatial/commands.py +67 -64
  158. udata/core/spatial/constants.py +3 -3
  159. udata/core/spatial/factories.py +37 -54
  160. udata/core/spatial/forms.py +27 -26
  161. udata/core/spatial/geoids.py +17 -17
  162. udata/core/spatial/models.py +43 -47
  163. udata/core/spatial/tasks.py +2 -1
  164. udata/core/spatial/tests/test_api.py +115 -130
  165. udata/core/spatial/tests/test_fields.py +74 -77
  166. udata/core/spatial/tests/test_geoid.py +22 -22
  167. udata/core/spatial/tests/test_models.py +5 -7
  168. udata/core/spatial/translations.py +16 -16
  169. udata/core/storages/__init__.py +16 -18
  170. udata/core/storages/api.py +66 -64
  171. udata/core/storages/tasks.py +7 -7
  172. udata/core/storages/utils.py +15 -15
  173. udata/core/storages/views.py +5 -6
  174. udata/core/tags/api.py +17 -14
  175. udata/core/tags/csv.py +4 -4
  176. udata/core/tags/models.py +8 -5
  177. udata/core/tags/tasks.py +11 -13
  178. udata/core/tags/views.py +4 -4
  179. udata/core/topic/api.py +84 -73
  180. udata/core/topic/apiv2.py +157 -127
  181. udata/core/topic/factories.py +3 -4
  182. udata/core/topic/forms.py +12 -14
  183. udata/core/topic/models.py +14 -19
  184. udata/core/topic/parsers.py +26 -26
  185. udata/core/user/activities.py +30 -29
  186. udata/core/user/api.py +151 -152
  187. udata/core/user/api_fields.py +132 -100
  188. udata/core/user/apiv2.py +7 -7
  189. udata/core/user/commands.py +38 -38
  190. udata/core/user/factories.py +8 -9
  191. udata/core/user/forms.py +14 -11
  192. udata/core/user/metrics.py +2 -2
  193. udata/core/user/models.py +68 -69
  194. udata/core/user/permissions.py +4 -5
  195. udata/core/user/rdf.py +7 -8
  196. udata/core/user/tasks.py +2 -2
  197. udata/core/user/tests/test_user_model.py +24 -16
  198. udata/db/tasks.py +2 -1
  199. udata/entrypoints.py +35 -31
  200. udata/errors.py +2 -1
  201. udata/event/values.py +6 -6
  202. udata/factories.py +2 -2
  203. udata/features/identicon/api.py +5 -6
  204. udata/features/identicon/backends.py +48 -55
  205. udata/features/identicon/tests/test_backends.py +4 -5
  206. udata/features/notifications/__init__.py +0 -1
  207. udata/features/notifications/actions.py +9 -9
  208. udata/features/notifications/api.py +17 -13
  209. udata/features/territories/__init__.py +12 -10
  210. udata/features/territories/api.py +14 -15
  211. udata/features/territories/models.py +23 -28
  212. udata/features/transfer/actions.py +8 -11
  213. udata/features/transfer/api.py +84 -77
  214. udata/features/transfer/factories.py +2 -1
  215. udata/features/transfer/models.py +11 -12
  216. udata/features/transfer/notifications.py +19 -15
  217. udata/features/transfer/permissions.py +5 -5
  218. udata/forms/__init__.py +5 -2
  219. udata/forms/fields.py +164 -172
  220. udata/forms/validators.py +19 -22
  221. udata/forms/widgets.py +9 -13
  222. udata/frontend/__init__.py +31 -26
  223. udata/frontend/csv.py +68 -58
  224. udata/frontend/markdown.py +40 -44
  225. udata/harvest/actions.py +89 -77
  226. udata/harvest/api.py +294 -238
  227. udata/harvest/backends/__init__.py +4 -4
  228. udata/harvest/backends/base.py +128 -111
  229. udata/harvest/backends/dcat.py +80 -66
  230. udata/harvest/commands.py +56 -60
  231. udata/harvest/csv.py +8 -8
  232. udata/harvest/exceptions.py +6 -3
  233. udata/harvest/filters.py +24 -23
  234. udata/harvest/forms.py +27 -28
  235. udata/harvest/models.py +88 -80
  236. udata/harvest/notifications.py +15 -10
  237. udata/harvest/signals.py +13 -13
  238. udata/harvest/tasks.py +11 -10
  239. udata/harvest/tests/factories.py +23 -24
  240. udata/harvest/tests/test_actions.py +136 -166
  241. udata/harvest/tests/test_api.py +220 -214
  242. udata/harvest/tests/test_base_backend.py +117 -112
  243. udata/harvest/tests/test_dcat_backend.py +380 -308
  244. udata/harvest/tests/test_filters.py +33 -22
  245. udata/harvest/tests/test_models.py +11 -14
  246. udata/harvest/tests/test_notifications.py +6 -7
  247. udata/harvest/tests/test_tasks.py +7 -6
  248. udata/i18n.py +237 -78
  249. udata/linkchecker/backends.py +5 -11
  250. udata/linkchecker/checker.py +23 -22
  251. udata/linkchecker/commands.py +4 -6
  252. udata/linkchecker/models.py +6 -6
  253. udata/linkchecker/tasks.py +18 -20
  254. udata/mail.py +21 -21
  255. udata/migrations/2020-07-24-remove-s-from-scope-oauth.py +9 -8
  256. udata/migrations/2020-08-24-add-fs-filename.py +9 -8
  257. udata/migrations/2020-09-28-update-reuses-datasets-metrics.py +5 -4
  258. udata/migrations/2020-10-16-migrate-ods-resources.py +9 -10
  259. udata/migrations/2021-04-08-update-schema-with-new-structure.py +8 -7
  260. udata/migrations/2021-05-27-fix-default-schema-name.py +7 -6
  261. udata/migrations/2021-07-05-remove-unused-badges.py +17 -15
  262. udata/migrations/2021-07-07-update-schema-for-community-resources.py +7 -6
  263. udata/migrations/2021-08-17-follow-integrity.py +5 -4
  264. udata/migrations/2021-08-17-harvest-integrity.py +13 -12
  265. udata/migrations/2021-08-17-oauth2client-integrity.py +5 -4
  266. udata/migrations/2021-08-17-transfer-integrity.py +5 -4
  267. udata/migrations/2021-08-17-users-integrity.py +9 -8
  268. udata/migrations/2021-12-14-reuse-topics.py +7 -6
  269. udata/migrations/2022-04-21-improve-extension-detection.py +8 -7
  270. udata/migrations/2022-09-22-clean-inactive-harvest-datasets.py +16 -14
  271. udata/migrations/2022-10-10-add-fs_uniquifier-to-user-model.py +6 -6
  272. udata/migrations/2022-10-10-migrate-harvest-extras.py +36 -26
  273. udata/migrations/2023-02-08-rename-internal-dates.py +46 -28
  274. udata/migrations/2024-01-29-fix-reuse-and-dataset-with-private-None.py +10 -8
  275. udata/migrations/2024-03-22-migrate-activity-kwargs-to-extras.py +6 -4
  276. udata/migrations/2024-06-11-fix-reuse-datasets-references.py +7 -6
  277. udata/migrations/__init__.py +123 -105
  278. udata/models/__init__.py +4 -4
  279. udata/mongo/__init__.py +13 -11
  280. udata/mongo/badges_field.py +3 -2
  281. udata/mongo/datetime_fields.py +13 -12
  282. udata/mongo/document.py +17 -16
  283. udata/mongo/engine.py +15 -16
  284. udata/mongo/errors.py +2 -1
  285. udata/mongo/extras_fields.py +30 -20
  286. udata/mongo/queryset.py +12 -12
  287. udata/mongo/slug_fields.py +38 -28
  288. udata/mongo/taglist_field.py +1 -2
  289. udata/mongo/url_field.py +5 -5
  290. udata/mongo/uuid_fields.py +4 -3
  291. udata/notifications/__init__.py +1 -1
  292. udata/notifications/mattermost.py +10 -9
  293. udata/rdf.py +167 -188
  294. udata/routing.py +40 -45
  295. udata/search/__init__.py +18 -19
  296. udata/search/adapter.py +17 -16
  297. udata/search/commands.py +44 -51
  298. udata/search/fields.py +13 -20
  299. udata/search/query.py +23 -18
  300. udata/search/result.py +9 -10
  301. udata/sentry.py +21 -19
  302. udata/settings.py +262 -198
  303. udata/sitemap.py +8 -6
  304. udata/static/chunks/{11.e9b9ca1f3e03d4020377.js → 11.52e531c19f8de80c00cf.js} +3 -3
  305. udata/static/chunks/{11.e9b9ca1f3e03d4020377.js.map → 11.52e531c19f8de80c00cf.js.map} +1 -1
  306. udata/static/chunks/{13.038c0d9aa0dfa0181c4b.js → 13.c3343a7f1070061c0e10.js} +2 -2
  307. udata/static/chunks/{13.038c0d9aa0dfa0181c4b.js.map → 13.c3343a7f1070061c0e10.js.map} +1 -1
  308. udata/static/chunks/{16.0baa2b64a74a2dcde25c.js → 16.8fa42440ad75ca172e6d.js} +2 -2
  309. udata/static/chunks/{16.0baa2b64a74a2dcde25c.js.map → 16.8fa42440ad75ca172e6d.js.map} +1 -1
  310. udata/static/chunks/{19.350a9f150b074b4ecefa.js → 19.9c6c8412729cd6d59cfa.js} +3 -3
  311. udata/static/chunks/{19.350a9f150b074b4ecefa.js.map → 19.9c6c8412729cd6d59cfa.js.map} +1 -1
  312. udata/static/chunks/{5.6ebbce2b9b3e696d3da5.js → 5.71d15c2e4f21feee2a9a.js} +3 -3
  313. udata/static/chunks/{5.6ebbce2b9b3e696d3da5.js.map → 5.71d15c2e4f21feee2a9a.js.map} +1 -1
  314. udata/static/chunks/{6.d8a5f7b017bcbd083641.js → 6.9139dc098b8ea640b890.js} +3 -3
  315. udata/static/chunks/{6.d8a5f7b017bcbd083641.js.map → 6.9139dc098b8ea640b890.js.map} +1 -1
  316. udata/static/common.js +1 -1
  317. udata/static/common.js.map +1 -1
  318. udata/storage/s3.py +20 -13
  319. udata/tags.py +4 -5
  320. udata/tasks.py +43 -42
  321. udata/tests/__init__.py +9 -6
  322. udata/tests/api/__init__.py +5 -6
  323. udata/tests/api/test_auth_api.py +395 -321
  324. udata/tests/api/test_base_api.py +31 -33
  325. udata/tests/api/test_contact_points.py +7 -9
  326. udata/tests/api/test_dataservices_api.py +211 -158
  327. udata/tests/api/test_datasets_api.py +823 -812
  328. udata/tests/api/test_follow_api.py +13 -15
  329. udata/tests/api/test_me_api.py +95 -112
  330. udata/tests/api/test_organizations_api.py +301 -339
  331. udata/tests/api/test_reports_api.py +35 -25
  332. udata/tests/api/test_reuses_api.py +134 -139
  333. udata/tests/api/test_swagger.py +5 -5
  334. udata/tests/api/test_tags_api.py +18 -25
  335. udata/tests/api/test_topics_api.py +94 -94
  336. udata/tests/api/test_transfer_api.py +53 -48
  337. udata/tests/api/test_user_api.py +128 -141
  338. udata/tests/apiv2/test_datasets.py +290 -198
  339. udata/tests/apiv2/test_me_api.py +10 -11
  340. udata/tests/apiv2/test_organizations.py +56 -74
  341. udata/tests/apiv2/test_swagger.py +5 -5
  342. udata/tests/apiv2/test_topics.py +69 -87
  343. udata/tests/cli/test_cli_base.py +8 -8
  344. udata/tests/cli/test_db_cli.py +21 -19
  345. udata/tests/dataservice/test_dataservice_tasks.py +8 -12
  346. udata/tests/dataset/test_csv_adapter.py +44 -35
  347. udata/tests/dataset/test_dataset_actions.py +2 -3
  348. udata/tests/dataset/test_dataset_commands.py +7 -8
  349. udata/tests/dataset/test_dataset_events.py +36 -29
  350. udata/tests/dataset/test_dataset_model.py +224 -217
  351. udata/tests/dataset/test_dataset_rdf.py +142 -131
  352. udata/tests/dataset/test_dataset_tasks.py +15 -15
  353. udata/tests/dataset/test_resource_preview.py +10 -13
  354. udata/tests/features/territories/__init__.py +9 -13
  355. udata/tests/features/territories/test_territories_api.py +71 -91
  356. udata/tests/forms/test_basic_fields.py +7 -7
  357. udata/tests/forms/test_current_user_field.py +39 -66
  358. udata/tests/forms/test_daterange_field.py +31 -39
  359. udata/tests/forms/test_dict_field.py +28 -26
  360. udata/tests/forms/test_extras_fields.py +102 -76
  361. udata/tests/forms/test_form_field.py +8 -8
  362. udata/tests/forms/test_image_field.py +33 -26
  363. udata/tests/forms/test_model_field.py +134 -123
  364. udata/tests/forms/test_model_list_field.py +7 -7
  365. udata/tests/forms/test_nested_model_list_field.py +117 -79
  366. udata/tests/forms/test_publish_as_field.py +36 -65
  367. udata/tests/forms/test_reference_field.py +34 -53
  368. udata/tests/forms/test_user_forms.py +23 -21
  369. udata/tests/forms/test_uuid_field.py +6 -10
  370. udata/tests/frontend/__init__.py +9 -6
  371. udata/tests/frontend/test_auth.py +7 -6
  372. udata/tests/frontend/test_csv.py +81 -96
  373. udata/tests/frontend/test_hooks.py +43 -43
  374. udata/tests/frontend/test_markdown.py +211 -191
  375. udata/tests/helpers.py +32 -37
  376. udata/tests/models.py +2 -2
  377. udata/tests/organization/test_csv_adapter.py +21 -16
  378. udata/tests/organization/test_notifications.py +11 -18
  379. udata/tests/organization/test_organization_model.py +13 -13
  380. udata/tests/organization/test_organization_rdf.py +29 -22
  381. udata/tests/organization/test_organization_tasks.py +16 -17
  382. udata/tests/plugin.py +76 -73
  383. udata/tests/reuse/test_reuse_model.py +21 -21
  384. udata/tests/reuse/test_reuse_task.py +11 -13
  385. udata/tests/search/__init__.py +11 -12
  386. udata/tests/search/test_adapter.py +60 -70
  387. udata/tests/search/test_query.py +16 -16
  388. udata/tests/search/test_results.py +10 -7
  389. udata/tests/site/test_site_api.py +11 -16
  390. udata/tests/site/test_site_metrics.py +20 -30
  391. udata/tests/site/test_site_model.py +4 -5
  392. udata/tests/site/test_site_rdf.py +94 -78
  393. udata/tests/test_activity.py +17 -17
  394. udata/tests/test_discussions.py +292 -299
  395. udata/tests/test_i18n.py +37 -40
  396. udata/tests/test_linkchecker.py +91 -85
  397. udata/tests/test_mail.py +13 -17
  398. udata/tests/test_migrations.py +219 -180
  399. udata/tests/test_model.py +164 -157
  400. udata/tests/test_notifications.py +17 -17
  401. udata/tests/test_owned.py +14 -14
  402. udata/tests/test_rdf.py +25 -23
  403. udata/tests/test_routing.py +89 -93
  404. udata/tests/test_storages.py +137 -128
  405. udata/tests/test_tags.py +44 -46
  406. udata/tests/test_topics.py +7 -7
  407. udata/tests/test_transfer.py +42 -49
  408. udata/tests/test_uris.py +160 -161
  409. udata/tests/test_utils.py +79 -71
  410. udata/tests/user/test_user_rdf.py +5 -9
  411. udata/tests/workers/test_jobs_commands.py +57 -58
  412. udata/tests/workers/test_tasks_routing.py +23 -29
  413. udata/tests/workers/test_workers_api.py +125 -131
  414. udata/tests/workers/test_workers_helpers.py +6 -6
  415. udata/tracking.py +4 -6
  416. udata/uris.py +45 -46
  417. udata/utils.py +68 -66
  418. udata/wsgi.py +1 -1
  419. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/METADATA +3 -2
  420. udata-9.1.2.dev30382.dist-info/RECORD +704 -0
  421. udata-9.1.2.dev30355.dist-info/RECORD +0 -704
  422. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/LICENSE +0 -0
  423. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/WHEEL +0 -0
  424. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/entry_points.txt +0 -0
  425. {udata-9.1.2.dev30355.dist-info → udata-9.1.2.dev30382.dist-info}/top_level.txt +0 -0
@@ -1,21 +1,24 @@
1
1
  import datetime
2
+ from unittest.mock import patch
2
3
 
3
4
  import pytest
4
-
5
5
  from flask import current_app
6
6
  from flask_restx import inputs
7
7
  from flask_restx.reqparse import RequestParser
8
- from unittest.mock import patch
9
8
 
10
9
  from udata import search
10
+ from udata.core.dataset.factories import (
11
+ DatasetFactory,
12
+ HiddenDatasetFactory,
13
+ ResourceFactory,
14
+ )
11
15
  from udata.core.dataset.models import Schema
16
+ from udata.core.dataset.search import DatasetSearch
12
17
  from udata.i18n import gettext as _
13
- from udata.utils import clean_string
14
- from udata.search import reindex, as_task_param
18
+ from udata.search import as_task_param, reindex
15
19
  from udata.search.commands import index_model
16
- from udata.core.dataset.search import DatasetSearch
17
- from udata.core.dataset.factories import DatasetFactory, ResourceFactory, HiddenDatasetFactory
18
20
  from udata.tests.api import APITestCase
21
+ from udata.utils import clean_string
19
22
 
20
23
  from . import FakeSearch
21
24
 
@@ -24,35 +27,30 @@ from . import FakeSearch
24
27
  #############################################################################
25
28
 
26
29
  RANGE_LABELS = {
27
- 'none': _('Never reused'),
28
- 'little': _('Little reused'),
29
- 'quite': _('Quite reused'),
30
- 'heavy': _('Heavily reused'),
30
+ "none": _("Never reused"),
31
+ "little": _("Little reused"),
32
+ "quite": _("Quite reused"),
33
+ "heavy": _("Heavily reused"),
31
34
  }
32
35
 
33
36
 
34
37
  class FakeSearchWithBool(FakeSearch):
35
- filters = {
36
- 'boolean': search.BoolFilter()
37
- }
38
+ filters = {"boolean": search.BoolFilter()}
38
39
 
39
40
 
40
41
  class FakeSearchWithCoverage(FakeSearch):
41
- filters = {
42
- 'coverage': search.TemporalCoverageFilter()
43
- }
42
+ filters = {"coverage": search.TemporalCoverageFilter()}
44
43
 
45
44
 
46
45
  #############################################################################
47
46
  # Helpers #
48
47
  #############################################################################
49
48
 
49
+
50
50
  def assertHasArgument(parser, name, _type, choices=None):
51
51
  __tracebackhide__ = True
52
- candidates = [
53
- arg for arg in parser.args if arg.name == name
54
- ]
55
- assert len(candidates) == 1, 'Should have strictly one argument'
52
+ candidates = [arg for arg in parser.args if arg.name == name]
53
+ assert len(candidates) == 1, "Should have strictly one argument"
56
54
  arg = candidates[0]
57
55
  assert arg.type == _type
58
56
  assert not arg.required
@@ -64,6 +62,7 @@ def assertHasArgument(parser, name, _type, choices=None):
64
62
  # Tests #
65
63
  #############################################################################
66
64
 
65
+
67
66
  class SearchAdaptorTest:
68
67
  def test_as_request_parser_filter(self):
69
68
  parser = FakeSearch.as_request_parser()
@@ -71,12 +70,12 @@ class SearchAdaptorTest:
71
70
 
72
71
  # query + tag and other filters + sorts + pagination
73
72
  assert len(parser.args) == 6
74
- assertHasArgument(parser, 'q', str)
75
- assertHasArgument(parser, 'sort', str)
76
- assertHasArgument(parser, 'tag', clean_string)
77
- assertHasArgument(parser, 'other', clean_string)
78
- assertHasArgument(parser, 'page', int)
79
- assertHasArgument(parser, 'page_size', int)
73
+ assertHasArgument(parser, "q", str)
74
+ assertHasArgument(parser, "sort", str)
75
+ assertHasArgument(parser, "tag", clean_string)
76
+ assertHasArgument(parser, "other", clean_string)
77
+ assertHasArgument(parser, "page", int)
78
+ assertHasArgument(parser, "page_size", int)
80
79
 
81
80
  def test_as_request_parser_bool_filter(self):
82
81
  parser = FakeSearchWithBool.as_request_parser()
@@ -84,102 +83,93 @@ class SearchAdaptorTest:
84
83
 
85
84
  # query + boolean filter + sorts + pagination
86
85
  assert len(parser.args) == 5
87
- assertHasArgument(parser, 'q', str)
88
- assertHasArgument(parser, 'sort', str)
89
- assertHasArgument(parser, 'boolean', inputs.boolean)
90
- assertHasArgument(parser, 'page', int)
91
- assertHasArgument(parser, 'page_size', int)
86
+ assertHasArgument(parser, "q", str)
87
+ assertHasArgument(parser, "sort", str)
88
+ assertHasArgument(parser, "boolean", inputs.boolean)
89
+ assertHasArgument(parser, "page", int)
90
+ assertHasArgument(parser, "page_size", int)
92
91
 
93
92
  def test_as_request_parser_temporal_coverage_facet(self):
94
93
  parser = FakeSearchWithCoverage.as_request_parser()
95
- filter = FakeSearchWithCoverage.filters['coverage']
94
+ filter = FakeSearchWithCoverage.filters["coverage"]
96
95
  assert isinstance(parser, RequestParser)
97
96
 
98
97
  # query + range facet + sorts + pagination
99
98
  assert len(parser.args) == 5
100
- assertHasArgument(parser, 'q', str)
101
- assertHasArgument(parser, 'sort', str)
102
- assertHasArgument(parser, 'coverage', filter.validate_parameter)
103
- assertHasArgument(parser, 'page', int)
104
- assertHasArgument(parser, 'page_size', int)
99
+ assertHasArgument(parser, "q", str)
100
+ assertHasArgument(parser, "sort", str)
101
+ assertHasArgument(parser, "coverage", filter.validate_parameter)
102
+ assertHasArgument(parser, "page", int)
103
+ assertHasArgument(parser, "page_size", int)
105
104
 
106
105
 
107
106
  @pytest.mark.options(SEARCH_SERVICE_API_URL="smtg/")
108
107
  class IndexingLifecycleTest(APITestCase):
109
-
110
- @patch('requests.delete')
108
+ @patch("requests.delete")
111
109
  def test_producer_should_send_a_message_without_payload_if_not_indexable(self, mock_req):
112
- fake_data = HiddenDatasetFactory(id='61fd30cb29ea95c7bc0e1211')
110
+ fake_data = HiddenDatasetFactory(id="61fd30cb29ea95c7bc0e1211")
113
111
 
114
112
  reindex.run(*as_task_param(fake_data))
115
113
 
116
- search_service_url = current_app.config['SEARCH_SERVICE_API_URL']
117
- url = f'{search_service_url}{DatasetSearch.search_url}{str(fake_data.id)}/unindex'
114
+ search_service_url = current_app.config["SEARCH_SERVICE_API_URL"]
115
+ url = f"{search_service_url}{DatasetSearch.search_url}{str(fake_data.id)}/unindex"
118
116
  mock_req.assert_called_with(url)
119
117
 
120
- @patch('requests.post')
118
+ @patch("requests.post")
121
119
  def test_producer_should_send_a_message_with_payload_if_indexable(self, mock_req):
122
120
  resource = ResourceFactory(schema=Schema(url="http://localhost/my-schema"))
123
- fake_data = DatasetFactory(id='61fd30cb29ea95c7bc0e1211', resources=[resource])
121
+ fake_data = DatasetFactory(id="61fd30cb29ea95c7bc0e1211", resources=[resource])
124
122
 
125
123
  reindex.run(*as_task_param(fake_data))
126
124
 
127
- expected_value = {
128
- 'document': DatasetSearch.serialize(fake_data)
129
- }
125
+ expected_value = {"document": DatasetSearch.serialize(fake_data)}
130
126
  url = f"{current_app.config['SEARCH_SERVICE_API_URL']}{DatasetSearch.search_url}index"
131
127
  mock_req.assert_called_with(url, json=expected_value)
132
128
 
133
- @patch('requests.Session.post')
129
+ @patch("requests.Session.post")
134
130
  def test_index_model(self, mock_req):
135
- fake_data = DatasetFactory(id='61fd30cb29ea95c7bc0e1211')
131
+ fake_data = DatasetFactory(id="61fd30cb29ea95c7bc0e1211")
136
132
 
137
133
  index_model(DatasetSearch, start=None, reindex=False, from_datetime=None)
138
134
 
139
- expected_value = {
140
- 'document': DatasetSearch.serialize(fake_data),
141
- 'index': 'dataset'
142
- }
135
+ expected_value = {"document": DatasetSearch.serialize(fake_data), "index": "dataset"}
143
136
  url = f"{current_app.config['SEARCH_SERVICE_API_URL']}/datasets/index"
144
137
  mock_req.assert_called_with(url, json=expected_value)
145
138
 
146
- @patch('requests.post')
147
- @patch('requests.Session.post')
139
+ @patch("requests.post")
140
+ @patch("requests.Session.post")
148
141
  def test_reindex_model(self, mock_session, mock_req):
149
- fake_data = DatasetFactory(id='61fd30cb29ea95c7bc0e1211')
142
+ fake_data = DatasetFactory(id="61fd30cb29ea95c7bc0e1211")
150
143
 
151
144
  index_model(DatasetSearch, start=datetime.datetime(2022, 2, 20, 20, 2), reindex=True)
152
145
 
153
146
  # Create index
154
- expected_value = {
155
- 'index': 'dataset-2022-02-20-20-02'
156
- }
147
+ expected_value = {"index": "dataset-2022-02-20-20-02"}
157
148
  url = f"{current_app.config['SEARCH_SERVICE_API_URL']}/create-index"
158
149
  mock_req.assert_called_with(url, json=expected_value)
159
150
 
160
151
  # Index document
161
152
  expected_value = {
162
- 'document': DatasetSearch.serialize(fake_data),
163
- 'index': 'dataset-2022-02-20-20-02'
153
+ "document": DatasetSearch.serialize(fake_data),
154
+ "index": "dataset-2022-02-20-20-02",
164
155
  }
165
156
  url = f"{current_app.config['SEARCH_SERVICE_API_URL']}/datasets/index"
166
157
  mock_session.assert_called_with(url, json=expected_value)
167
158
 
168
- @patch('requests.Session.post')
159
+ @patch("requests.Session.post")
169
160
  def test_index_model_from_datetime(self, mock_req):
170
- DatasetFactory(id='61fd30cb29ea95c7bc0e1211',
171
- last_modified_internal=datetime.datetime(2020, 1, 1))
172
- fake_data = DatasetFactory(id='61fd30cb29ea95c7bc0e1212',
173
- last_modified_internal=datetime.datetime(2022, 1, 1))
161
+ DatasetFactory(
162
+ id="61fd30cb29ea95c7bc0e1211", last_modified_internal=datetime.datetime(2020, 1, 1)
163
+ )
164
+ fake_data = DatasetFactory(
165
+ id="61fd30cb29ea95c7bc0e1212", last_modified_internal=datetime.datetime(2022, 1, 1)
166
+ )
174
167
 
175
168
  index_model(DatasetSearch, start=None, from_datetime=datetime.datetime(2023, 1, 1))
176
169
  mock_req.assert_not_called()
177
170
 
178
171
  index_model(DatasetSearch, start=None, from_datetime=datetime.datetime(2021, 1, 1))
179
172
 
180
- expected_value = {
181
- 'document': DatasetSearch.serialize(fake_data),
182
- 'index': 'dataset'
183
- }
173
+ expected_value = {"document": DatasetSearch.serialize(fake_data), "index": "dataset"}
184
174
  url = f"{current_app.config['SEARCH_SERVICE_API_URL']}/datasets/index"
185
175
  mock_req.assert_called_with(url, json=expected_value)
@@ -1,39 +1,39 @@
1
+ from udata.search.query import DEFAULT_PAGE_SIZE, SearchQuery
1
2
  from udata.tests.api import APITestCase
2
- from udata.search.query import SearchQuery, DEFAULT_PAGE_SIZE
3
3
 
4
4
 
5
5
  class QueryTest(APITestCase):
6
6
  def test_search_query_with_params(self):
7
7
  query = {
8
- 'organization': '534fff81a3a7292c64a77e5c',
9
- 'q': 'insee',
10
- 'sort': '-created',
11
- 'page': 1,
12
- 'page_size': 20
8
+ "organization": "534fff81a3a7292c64a77e5c",
9
+ "q": "insee",
10
+ "sort": "-created",
11
+ "page": 1,
12
+ "page_size": 20,
13
13
  }
14
14
  search_query = SearchQuery(params=query)
15
15
  assert search_query.page == 1
16
16
  assert search_query.page_size == 20
17
- assert search_query._query == 'insee'
18
- assert search_query.sort == '-created'
19
- assert search_query._filters['organization'] == '534fff81a3a7292c64a77e5c'
17
+ assert search_query._query == "insee"
18
+ assert search_query.sort == "-created"
19
+ assert search_query._filters["organization"] == "534fff81a3a7292c64a77e5c"
20
20
 
21
21
  def test_search_query_without_params(self):
22
22
  search_query = SearchQuery(params={})
23
23
  assert search_query.page == 1
24
24
  assert search_query.page_size == DEFAULT_PAGE_SIZE
25
- assert search_query._query == ''
25
+ assert search_query._query == ""
26
26
  assert search_query.sort is None
27
27
  assert search_query._filters == {}
28
28
 
29
29
  def test_search_query_to_url(self):
30
30
  query = {
31
- 'organization': '534fff81a3a7292c64a77e5c',
32
- 'q': 'insee',
33
- 'sort': '-created',
34
- 'page': 1,
35
- 'page_size': 20
31
+ "organization": "534fff81a3a7292c64a77e5c",
32
+ "q": "insee",
33
+ "sort": "-created",
34
+ "page": 1,
35
+ "page_size": 20,
36
36
  }
37
37
  search_query = SearchQuery(params=query)
38
38
  url = search_query.to_url()
39
- assert 'organization=534fff81a3a7292c64a77e5c&q=insee&sort=-created&page=1' in url
39
+ assert "organization=534fff81a3a7292c64a77e5c&q=insee&sort=-created&page=1" in url
@@ -1,8 +1,8 @@
1
- from udata.tests.api import APITestCase
2
- from udata.search.result import SearchResult
3
1
  from udata.core.dataset.factories import DatasetFactory
4
2
  from udata.core.dataset.search import DatasetSearch
5
3
  from udata.models import Dataset
4
+ from udata.search.result import SearchResult
5
+ from udata.tests.api import APITestCase
6
6
 
7
7
 
8
8
  class ResultTest(APITestCase):
@@ -21,9 +21,11 @@ class ResultTest(APITestCase):
21
21
  "previous_page": None,
22
22
  "page_size": 20,
23
23
  "total_pages": 1,
24
- "total": 3
24
+ "total": 3,
25
25
  }
26
- search_results = SearchResult(query=search_query, result=service_result.pop('data'), **service_result)
26
+ search_results = SearchResult(
27
+ query=search_query, result=service_result.pop("data"), **service_result
28
+ )
27
29
 
28
30
  assert len(search_results.get_objects()) == 3
29
31
 
@@ -45,9 +47,11 @@ class ResultTest(APITestCase):
45
47
  "previous_page": None,
46
48
  "page_size": 20,
47
49
  "total_pages": 1,
48
- "total": 3
50
+ "total": 3,
49
51
  }
50
- search_results = SearchResult(query=search_query, result=service_result.pop('data'), **service_result)
52
+ search_results = SearchResult(
53
+ query=search_query, result=service_result.pop("data"), **service_result
54
+ )
51
55
 
52
56
  to_delete_random_dataset.delete()
53
57
  assert len(search_results.get_objects()) == 3
@@ -56,4 +60,3 @@ class ResultTest(APITestCase):
56
60
  objects = search_results.objects
57
61
  for o in objects:
58
62
  assert isinstance(o, Dataset)
59
-
@@ -1,13 +1,10 @@
1
-
2
1
  from flask import url_for
3
2
 
4
- from udata.core.site.models import Site
5
- from udata.core.site.models import current_site
6
- from udata.core.site.factories import SiteFactory
7
3
  from udata.core.dataset.factories import DatasetFactory
8
4
  from udata.core.reuse.factories import VisibleReuseFactory
5
+ from udata.core.site.factories import SiteFactory
6
+ from udata.core.site.models import Site, current_site
9
7
  from udata.core.user.factories import AdminFactory
10
-
11
8
  from udata.tests.api import APITestCase
12
9
 
13
10
 
@@ -15,31 +12,29 @@ class SiteAPITest(APITestCase):
15
12
  modules = []
16
13
 
17
14
  def test_get_site(self):
18
- response = self.get(url_for('api.site'))
15
+ response = self.get(url_for("api.site"))
19
16
  self.assert200(response)
20
17
 
21
18
  def test_get_home_datasets(self):
22
19
  site = SiteFactory.create(
23
- id=self.app.config['SITE_ID'],
24
- settings__home_datasets=DatasetFactory.create_batch(3)
20
+ id=self.app.config["SITE_ID"], settings__home_datasets=DatasetFactory.create_batch(3)
25
21
  )
26
22
  current_site.reload()
27
23
 
28
24
  self.login(AdminFactory())
29
- response = self.get(url_for('api.home_datasets'))
25
+ response = self.get(url_for("api.home_datasets"))
30
26
  self.assert200(response)
31
27
 
32
28
  self.assertEqual(len(response.json), len(site.settings.home_datasets))
33
29
 
34
30
  def test_get_home_reuses(self):
35
31
  site = SiteFactory.create(
36
- id=self.app.config['SITE_ID'],
37
- settings__home_reuses=VisibleReuseFactory.create_batch(3)
32
+ id=self.app.config["SITE_ID"], settings__home_reuses=VisibleReuseFactory.create_batch(3)
38
33
  )
39
34
  current_site.reload()
40
35
 
41
36
  self.login(AdminFactory())
42
- response = self.get(url_for('api.home_reuses'))
37
+ response = self.get(url_for("api.home_reuses"))
43
38
  self.assert200(response)
44
39
 
45
40
  self.assertEqual(len(response.json), len(site.settings.home_reuses))
@@ -48,12 +43,12 @@ class SiteAPITest(APITestCase):
48
43
  ids = [d.id for d in DatasetFactory.create_batch(3)]
49
44
 
50
45
  self.login(AdminFactory())
51
- response = self.put(url_for('api.home_datasets'), ids)
46
+ response = self.put(url_for("api.home_datasets"), ids)
52
47
 
53
48
  self.assert200(response)
54
49
  self.assertEqual(len(response.json), len(ids))
55
50
 
56
- site = Site.objects.get(id=self.app.config['SITE_ID'])
51
+ site = Site.objects.get(id=self.app.config["SITE_ID"])
57
52
 
58
53
  self.assertEqual([d.id for d in site.settings.home_datasets], ids)
59
54
 
@@ -61,11 +56,11 @@ class SiteAPITest(APITestCase):
61
56
  ids = [r.id for r in VisibleReuseFactory.create_batch(3)]
62
57
 
63
58
  self.login(AdminFactory())
64
- response = self.put(url_for('api.home_reuses'), ids)
59
+ response = self.put(url_for("api.home_reuses"), ids)
65
60
 
66
61
  self.assert200(response)
67
62
  self.assertEqual(len(response.json), len(ids))
68
63
 
69
- site = Site.objects.get(id=self.app.config['SITE_ID'])
64
+ site = Site.objects.get(id=self.app.config["SITE_ID"])
70
65
 
71
66
  self.assertEqual([r.id for r in site.settings.home_reuses], ids)
@@ -1,67 +1,59 @@
1
1
  import pytest
2
2
 
3
- from udata.core.dataset.factories import DatasetFactory, HiddenDatasetFactory, OrganizationFactory
3
+ from udata.core.dataset.factories import (
4
+ DatasetFactory,
5
+ HiddenDatasetFactory,
6
+ OrganizationFactory,
7
+ )
8
+ from udata.core.organization.constants import PUBLIC_SERVICE
4
9
  from udata.core.reuse.factories import VisibleReuseFactory
5
- from udata.harvest.tests.factories import HarvestSourceFactory
6
10
  from udata.core.site.factories import SiteFactory
11
+ from udata.harvest.tests.factories import HarvestSourceFactory
7
12
  from udata.models import Badge
8
- from udata.core.organization.constants import PUBLIC_SERVICE
9
13
 
10
14
 
11
- @pytest.mark.usefixtures('clean_db')
15
+ @pytest.mark.usefixtures("clean_db")
12
16
  class SiteMetricTest:
13
17
  def test_orga_metric(self, app):
14
- site = SiteFactory.create(
15
- id=app.config['SITE_ID']
16
- )
18
+ site = SiteFactory.create(id=app.config["SITE_ID"])
17
19
  OrganizationFactory.create_batch(3)
18
20
 
19
21
  site.count_org()
20
22
 
21
- assert site.get_metrics()['organizations'] == 3
23
+ assert site.get_metrics()["organizations"] == 3
22
24
 
23
25
  def test_reuse_metric(self, app):
24
- site = SiteFactory.create(
25
- id=app.config['SITE_ID']
26
- )
26
+ site = SiteFactory.create(id=app.config["SITE_ID"])
27
27
  VisibleReuseFactory.create_batch(4)
28
28
 
29
29
  site.count_reuses()
30
30
 
31
- assert site.get_metrics()['reuses'] == 4
31
+ assert site.get_metrics()["reuses"] == 4
32
32
 
33
33
  def test_dataset_metric(self, app):
34
- site = SiteFactory.create(
35
- id=app.config['SITE_ID']
36
- )
34
+ site = SiteFactory.create(id=app.config["SITE_ID"])
37
35
  DatasetFactory.create_batch(2)
38
36
  HiddenDatasetFactory.create_batch(3)
39
37
 
40
38
  site.count_datasets()
41
39
 
42
- assert site.get_metrics()['datasets'] == 2
40
+ assert site.get_metrics()["datasets"] == 2
43
41
 
44
42
  def test_resources_metric(self, app):
45
- site = SiteFactory.create(
46
- id=app.config['SITE_ID']
47
- )
43
+ site = SiteFactory.create(id=app.config["SITE_ID"])
48
44
 
49
45
  DatasetFactory.create_batch(3, nb_resources=3)
50
46
 
51
47
  site.count_datasets()
52
48
  site.count_resources()
53
49
 
54
- assert site.get_metrics()['resources'] == 9
50
+ assert site.get_metrics()["resources"] == 9
55
51
 
56
52
  def test_badges_metric(self, app):
57
- site = SiteFactory.create(
58
- id=app.config['SITE_ID']
59
- )
53
+ site = SiteFactory.create(id=app.config["SITE_ID"])
60
54
 
61
55
  ps_badge = Badge(kind=PUBLIC_SERVICE)
62
- public_services = [
63
- OrganizationFactory(badges=[ps_badge]) for _ in range(2)
64
- ]
56
+ public_services = [OrganizationFactory(badges=[ps_badge]) for _ in range(2)]
65
57
  for _ in range(3):
66
58
  OrganizationFactory()
67
59
 
@@ -70,11 +62,9 @@ class SiteMetricTest:
70
62
  assert site.get_metrics()[PUBLIC_SERVICE] == len(public_services)
71
63
 
72
64
  def test_harvesters_metric(self, app):
73
- site = SiteFactory.create(
74
- id=app.config['SITE_ID']
75
- )
65
+ site = SiteFactory.create(id=app.config["SITE_ID"])
76
66
  sources = [HarvestSourceFactory() for i in range(10)]
77
67
 
78
68
  site.count_harvesters()
79
69
 
80
- assert site.get_metrics()['harvesters'] == len(sources)
70
+ assert site.get_metrics()["harvesters"] == len(sources)
@@ -1,15 +1,14 @@
1
1
  from datetime import datetime
2
2
 
3
3
  from udata.core.dataset.factories import DatasetFactory
4
- from udata.core.site.models import current_site
5
4
  from udata.core.reuse.factories import ReuseFactory
6
-
7
- from udata.tests import TestCase, DBTestMixin
5
+ from udata.core.site.models import current_site
6
+ from udata.tests import DBTestMixin, TestCase
8
7
 
9
8
 
10
9
  class SiteModelTest(DBTestMixin, TestCase):
11
10
  def test_delete_home_dataset(self):
12
- '''Should pull home datasets on deletion'''
11
+ """Should pull home datasets on deletion"""
13
12
  current_site.settings.home_datasets = DatasetFactory.create_batch(3)
14
13
  current_site.save()
15
14
 
@@ -23,7 +22,7 @@ class SiteModelTest(DBTestMixin, TestCase):
23
22
  self.assertNotIn(dataset.id, home_datasets)
24
23
 
25
24
  def test_delete_home_reuse(self):
26
- '''Should pull home reuses on deletion'''
25
+ """Should pull home reuses on deletion"""
27
26
  current_site.settings.home_reuses = ReuseFactory.create_batch(3)
28
27
  current_site.save()
29
28