udata 13.0.1.dev12__py3-none-any.whl → 14.4.1.dev7__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 (177) hide show
  1. udata/api/__init__.py +2 -8
  2. udata/api_fields.py +35 -4
  3. udata/app.py +30 -50
  4. udata/auth/__init__.py +29 -6
  5. udata/auth/forms.py +8 -6
  6. udata/auth/views.py +6 -3
  7. udata/commands/__init__.py +2 -14
  8. udata/commands/db.py +13 -25
  9. udata/commands/info.py +0 -16
  10. udata/commands/serve.py +3 -11
  11. udata/commands/tests/test_fixtures.py +9 -9
  12. udata/core/access_type/api.py +1 -1
  13. udata/core/access_type/constants.py +12 -8
  14. udata/core/activity/api.py +5 -6
  15. udata/core/avatars/api.py +43 -0
  16. udata/core/avatars/test_avatar_api.py +30 -0
  17. udata/core/badges/tests/test_commands.py +6 -6
  18. udata/core/csv.py +5 -0
  19. udata/core/dataservices/models.py +15 -3
  20. udata/core/dataservices/tasks.py +7 -0
  21. udata/core/dataset/api.py +2 -0
  22. udata/core/dataset/models.py +2 -2
  23. udata/core/dataset/permissions.py +31 -0
  24. udata/core/dataset/tasks.py +50 -10
  25. udata/core/discussions/models.py +1 -0
  26. udata/core/metrics/__init__.py +0 -6
  27. udata/core/organization/api.py +8 -5
  28. udata/core/organization/mails.py +1 -1
  29. udata/core/organization/models.py +9 -1
  30. udata/core/organization/notifications.py +84 -0
  31. udata/core/organization/permissions.py +1 -1
  32. udata/core/organization/tasks.py +3 -0
  33. udata/core/pages/tests/test_api.py +32 -0
  34. udata/core/post/api.py +24 -69
  35. udata/core/post/models.py +84 -16
  36. udata/core/post/tests/test_api.py +24 -1
  37. udata/core/reports/api.py +18 -0
  38. udata/core/reports/models.py +42 -2
  39. udata/core/reuse/models.py +1 -1
  40. udata/core/reuse/tasks.py +7 -0
  41. udata/core/site/models.py +2 -6
  42. udata/core/spatial/commands.py +2 -4
  43. udata/core/spatial/forms.py +2 -2
  44. udata/core/spatial/models.py +0 -10
  45. udata/core/spatial/tests/test_api.py +1 -36
  46. udata/core/user/models.py +15 -2
  47. udata/cors.py +2 -5
  48. udata/db/migrations.py +279 -0
  49. udata/features/notifications/api.py +7 -18
  50. udata/features/notifications/models.py +56 -0
  51. udata/features/notifications/tasks.py +25 -0
  52. udata/flask_mongoengine/engine.py +0 -4
  53. udata/frontend/__init__.py +3 -122
  54. udata/frontend/markdown.py +2 -1
  55. udata/harvest/actions.py +24 -9
  56. udata/harvest/api.py +30 -22
  57. udata/harvest/backends/__init__.py +21 -9
  58. udata/harvest/backends/base.py +29 -3
  59. udata/harvest/backends/ckan/harvesters.py +13 -2
  60. udata/harvest/backends/dcat.py +3 -0
  61. udata/harvest/backends/maaf.py +1 -0
  62. udata/harvest/commands.py +39 -4
  63. udata/harvest/filters.py +17 -6
  64. udata/harvest/forms.py +9 -6
  65. udata/harvest/models.py +16 -0
  66. udata/harvest/permissions.py +27 -0
  67. udata/harvest/tasks.py +3 -5
  68. udata/harvest/tests/ckan/test_ckan_backend.py +35 -2
  69. udata/harvest/tests/ckan/test_ckan_backend_errors.py +1 -1
  70. udata/harvest/tests/ckan/test_ckan_backend_filters.py +1 -1
  71. udata/harvest/tests/ckan/test_dkan_backend.py +1 -1
  72. udata/harvest/tests/dcat/udata.xml +6 -6
  73. udata/harvest/tests/factories.py +1 -1
  74. udata/harvest/tests/test_actions.py +63 -8
  75. udata/harvest/tests/test_api.py +278 -123
  76. udata/harvest/tests/test_base_backend.py +88 -1
  77. udata/harvest/tests/test_dcat_backend.py +60 -13
  78. udata/harvest/tests/test_filters.py +6 -0
  79. udata/i18n.py +11 -273
  80. udata/mail.py +5 -1
  81. udata/migrations/2025-10-31-create-membership-request-notifications.py +55 -0
  82. udata/migrations/2025-11-13-delete-user-email-index.py +25 -0
  83. udata/migrations/2025-12-04-add-uuid-to-discussion-messages.py +28 -0
  84. udata/models/__init__.py +0 -8
  85. udata/mongo/slug_fields.py +1 -1
  86. udata/rdf.py +45 -6
  87. udata/routing.py +2 -10
  88. udata/sentry.py +4 -10
  89. udata/settings.py +23 -17
  90. udata/tasks.py +4 -3
  91. udata/templates/mail/message.html +5 -31
  92. udata/tests/__init__.py +28 -12
  93. udata/tests/api/__init__.py +108 -21
  94. udata/tests/api/test_activities_api.py +36 -0
  95. udata/tests/api/test_auth_api.py +121 -95
  96. udata/tests/api/test_base_api.py +7 -4
  97. udata/tests/api/test_dataservices_api.py +29 -1
  98. udata/tests/api/test_datasets_api.py +45 -21
  99. udata/tests/api/test_organizations_api.py +192 -197
  100. udata/tests/api/test_reports_api.py +157 -0
  101. udata/tests/api/test_reuses_api.py +147 -147
  102. udata/tests/api/test_security_api.py +12 -12
  103. udata/tests/api/test_swagger.py +4 -4
  104. udata/tests/api/test_tags_api.py +8 -8
  105. udata/tests/api/test_user_api.py +13 -1
  106. udata/tests/apiv2/test_swagger.py +4 -4
  107. udata/tests/apiv2/test_topics.py +1 -1
  108. udata/tests/cli/test_cli_base.py +8 -9
  109. udata/tests/dataset/test_dataset_commands.py +4 -4
  110. udata/tests/dataset/test_dataset_model.py +66 -26
  111. udata/tests/dataset/test_dataset_rdf.py +99 -5
  112. udata/tests/dataset/test_resource_preview.py +0 -1
  113. udata/tests/frontend/test_auth.py +24 -1
  114. udata/tests/frontend/test_csv.py +0 -3
  115. udata/tests/helpers.py +37 -27
  116. udata/tests/organization/test_notifications.py +67 -2
  117. udata/tests/plugin.py +6 -261
  118. udata/tests/site/test_site_csv_exports.py +22 -10
  119. udata/tests/test_activity.py +9 -9
  120. udata/tests/test_cors.py +1 -1
  121. udata/tests/test_dcat_commands.py +2 -2
  122. udata/tests/test_discussions.py +5 -5
  123. udata/tests/test_migrations.py +181 -481
  124. udata/tests/test_notifications.py +15 -57
  125. udata/tests/test_notifications_task.py +43 -0
  126. udata/tests/test_owned.py +81 -1
  127. udata/tests/test_storages.py +25 -19
  128. udata/tests/test_topics.py +77 -61
  129. udata/tests/test_uris.py +33 -0
  130. udata/tests/workers/test_jobs_commands.py +23 -23
  131. udata/translations/ar/LC_MESSAGES/udata.mo +0 -0
  132. udata/translations/ar/LC_MESSAGES/udata.po +187 -108
  133. udata/translations/de/LC_MESSAGES/udata.mo +0 -0
  134. udata/translations/de/LC_MESSAGES/udata.po +187 -108
  135. udata/translations/es/LC_MESSAGES/udata.mo +0 -0
  136. udata/translations/es/LC_MESSAGES/udata.po +187 -108
  137. udata/translations/fr/LC_MESSAGES/udata.mo +0 -0
  138. udata/translations/fr/LC_MESSAGES/udata.po +188 -109
  139. udata/translations/it/LC_MESSAGES/udata.mo +0 -0
  140. udata/translations/it/LC_MESSAGES/udata.po +187 -108
  141. udata/translations/pt/LC_MESSAGES/udata.mo +0 -0
  142. udata/translations/pt/LC_MESSAGES/udata.po +187 -108
  143. udata/translations/sr/LC_MESSAGES/udata.mo +0 -0
  144. udata/translations/sr/LC_MESSAGES/udata.po +187 -108
  145. udata/translations/udata.pot +215 -106
  146. udata/uris.py +0 -2
  147. udata/utils.py +5 -0
  148. udata-14.4.1.dev7.dist-info/METADATA +109 -0
  149. {udata-13.0.1.dev12.dist-info → udata-14.4.1.dev7.dist-info}/RECORD +153 -166
  150. {udata-13.0.1.dev12.dist-info → udata-14.4.1.dev7.dist-info}/entry_points.txt +3 -5
  151. udata/core/followers/views.py +0 -15
  152. udata/core/post/forms.py +0 -30
  153. udata/entrypoints.py +0 -93
  154. udata/features/identicon/__init__.py +0 -0
  155. udata/features/identicon/api.py +0 -13
  156. udata/features/identicon/backends.py +0 -131
  157. udata/features/identicon/tests/__init__.py +0 -0
  158. udata/features/identicon/tests/test_backends.py +0 -18
  159. udata/features/territories/__init__.py +0 -49
  160. udata/features/territories/api.py +0 -25
  161. udata/features/territories/models.py +0 -51
  162. udata/flask_mongoengine/json.py +0 -38
  163. udata/migrations/__init__.py +0 -367
  164. udata/templates/mail/base.html +0 -105
  165. udata/templates/mail/base.txt +0 -6
  166. udata/templates/mail/button.html +0 -3
  167. udata/templates/mail/layouts/1-column.html +0 -19
  168. udata/templates/mail/layouts/2-columns.html +0 -20
  169. udata/templates/mail/layouts/center-panel.html +0 -16
  170. udata/tests/cli/test_db_cli.py +0 -68
  171. udata/tests/features/territories/__init__.py +0 -20
  172. udata/tests/features/territories/test_territories_api.py +0 -185
  173. udata/tests/frontend/test_hooks.py +0 -149
  174. udata-13.0.1.dev12.dist-info/METADATA +0 -133
  175. {udata-13.0.1.dev12.dist-info → udata-14.4.1.dev7.dist-info}/WHEEL +0 -0
  176. {udata-13.0.1.dev12.dist-info → udata-14.4.1.dev7.dist-info}/licenses/LICENSE +0 -0
  177. {udata-13.0.1.dev12.dist-info → udata-14.4.1.dev7.dist-info}/top_level.txt +0 -0
udata/uris.py CHANGED
@@ -91,8 +91,6 @@ def cdata_url(uri: str, **kwargs) -> str | None:
91
91
  uri += f"/{append.lstrip('/')}"
92
92
 
93
93
  url = urljoin(base_url, uri)
94
- if not url.endswith("/"):
95
- url += "/"
96
94
 
97
95
  url_parts = list(urlparse(url))
98
96
  url_parts[4] = urlencode(
udata/utils.py CHANGED
@@ -4,6 +4,7 @@ import math
4
4
  import re
5
5
  from collections import Counter
6
6
  from datetime import date, datetime, timedelta
7
+ from importlib.metadata import version
7
8
  from math import ceil
8
9
  from typing import Any, Hashable
9
10
  from uuid import UUID, uuid4
@@ -24,6 +25,10 @@ from mongoengine.fields import BaseQuerySet
24
25
  from udata import tags
25
26
 
26
27
 
28
+ def get_udata_version() -> str:
29
+ return version("udata")
30
+
31
+
27
32
  def get_by(lst, field, value):
28
33
  """Find an object in a list given a field value"""
29
34
  for row in lst:
@@ -0,0 +1,109 @@
1
+ Metadata-Version: 2.4
2
+ Name: udata
3
+ Version: 14.4.1.dev7
4
+ Summary: Open data portal
5
+ Author-email: Opendata Team <opendatateam@data.gouv.fr>
6
+ Maintainer-email: Opendata Team <opendatateam@data.gouv.fr>
7
+ License: MIT
8
+ Project-URL: Homepage, https://github.com/opendatateam/udata
9
+ Project-URL: Repository, https://github.com/opendatateam/udata
10
+ Project-URL: Documentation, https://udata.readthedocs.io/
11
+ Project-URL: Bug Tracker, https://github.com/opendatateam/udata/issues
12
+ Keywords: udata,open data,portal,data
13
+ Classifier: Development Status :: 5 - Production/Stable
14
+ Classifier: Programming Language :: Python
15
+ Classifier: Environment :: Web Environment
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Intended Audience :: Developers
18
+ Classifier: Topic :: System :: Software Distribution
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
24
+ Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
25
+ Requires-Python: <3.14,>=3.11
26
+ Description-Content-Type: text/markdown
27
+ License-File: LICENSE
28
+ Requires-Dist: authlib<2.0.0,>=1.5.1
29
+ Requires-Dist: awesome-slugify<2.0.0,>=1.6.5
30
+ Requires-Dist: babel<3.0.0,>=2.17.0
31
+ Requires-Dist: bcrypt<5.0.0,>=4.0.0
32
+ Requires-Dist: bleach[css]<7.0.0,>=6.2.0
33
+ Requires-Dist: blinker<2.0,>=1.5
34
+ Requires-Dist: boto3<2.0.0,>=1.26.102
35
+ Requires-Dist: botocore<2.0.0,>=1.29.165
36
+ Requires-Dist: celery<6.0.0,>=5.4.0
37
+ Requires-Dist: celerybeat-mongo<1.0.0,>=0.2.0
38
+ Requires-Dist: click<9.0.0,>=8.1.8
39
+ Requires-Dist: email-validator<3.0.0,>=2.2.0
40
+ Requires-Dist: factory-boy<4.0.0,>=3.3.3
41
+ Requires-Dist: feedgenerator<3.0.0,>=2.1.0
42
+ Requires-Dist: flask<4.0.0,>=3.0.0
43
+ Requires-Dist: flask-babel<5.0.0,>=4.0.0
44
+ Requires-Dist: flask-caching<3.0.0,>=2.3.1
45
+ Requires-Dist: flask-cdn<2.0.0,>=1.5.3
46
+ Requires-Dist: flask-gravatar<1.0.0,>=0.5.0
47
+ Requires-Dist: flask-login<1.0.0,>=0.6.3
48
+ Requires-Dist: flask-mail<1.0.0,>=0.10.0
49
+ Requires-Dist: flask-principal<1.0.0,>=0.4.0
50
+ Requires-Dist: flask-restx<2.0.0,>=1.3.0
51
+ Requires-Dist: flask-security-too<6.0.0,>=5.1.2
52
+ Requires-Dist: flask-sitemap<1.0.0,>=0.4.0
53
+ Requires-Dist: flask-storage<2.0.0,>=1.4.0
54
+ Requires-Dist: flask-wtf<2.0.0,>=1.2.2
55
+ Requires-Dist: geojson<4.0.0,>=3.2.0
56
+ Requires-Dist: geomet<2.0.0,>=1.1.0
57
+ Requires-Dist: html2text==2025.4.15
58
+ Requires-Dist: humanfriendly<11.0.0,>=10.0
59
+ Requires-Dist: importlib-resources<7.0.0,>=6.5.2
60
+ Requires-Dist: itsdangerous<3.0.0,>=2.2.0
61
+ Requires-Dist: jinja2<4.0.0,>=3.1.6
62
+ Requires-Dist: jsonschema<5.0.0,>=4.23.0
63
+ Requires-Dist: kombu[redis]<6.0.0,>=5.5.0
64
+ Requires-Dist: langdetect<2.0.0,>=1.0.9
65
+ Requires-Dist: levenshtein<1.0.0,>=0.27.1
66
+ Requires-Dist: lxml<7.0.0,>=6.0.0
67
+ Requires-Dist: markupsafe<4.0.0,>=3.0.3
68
+ Requires-Dist: mistune<4.0.0,>=3.1.3
69
+ Requires-Dist: mongoengine<1.0.0,>=0.29.1
70
+ Requires-Dist: netaddr<2.0.0,>=1.3.0
71
+ Requires-Dist: pillow<13.0.0,>=11.0.0
72
+ Requires-Dist: pydenticon<1.0.0,>=0.3.1
73
+ Requires-Dist: pymongo<5.0.0,>=4.11.3
74
+ Requires-Dist: python-dateutil<3.0.0,>=2.9.0.post0
75
+ Requires-Dist: pytz
76
+ Requires-Dist: rdflib<8.0.0,>=7.1.3
77
+ Requires-Dist: redis<8.0.0,>=5.0.0
78
+ Requires-Dist: requests<3.0.0,>=2.32.4
79
+ Requires-Dist: saxonche<13.0.0,>=12.8.0
80
+ Requires-Dist: sentry-sdk[flask]<3.0.0,>=2.23.1
81
+ Requires-Dist: speaklater<2.0.0,>=1.3
82
+ Requires-Dist: tlds>=2025022800
83
+ Requires-Dist: typing-extensions<5.0.0,>=4.12.2
84
+ Requires-Dist: tzdata
85
+ Requires-Dist: urlextract<2.0.0,>=1.9.0
86
+ Requires-Dist: urllib3<3.0.0,>=2.0.0
87
+ Requires-Dist: voluptuous<1.0.0,>=0.15.2
88
+ Requires-Dist: werkzeug<4.0.0,>=3.0.0
89
+ Requires-Dist: wtforms[email]<4.0.0,>=3.2.1
90
+ Requires-Dist: wtforms-json<1.0.0,>=0.3.5
91
+ Dynamic: license-file
92
+
93
+ <p align="center"><img src="https://i.imgur.com/rlRox1c.png"></p>
94
+
95
+ udata
96
+ =====
97
+
98
+ Customizable and skinnable social platform dedicated to (open) data.
99
+
100
+ The [full documentation][readthedocs-url] is hosted on Read the Docs.
101
+
102
+ udata is maintained by [data.gouv.fr](https://data.gouv.fr/), the
103
+ French public agency in charge of open data. data.gouv.fr is responsible
104
+ for publishing udata's roadmap and for building consensus around it.
105
+
106
+ It is collectively taken care of by members of the
107
+ [OpenDataTeam](https://github.com/opendatateam).
108
+
109
+ [readthedocs-url]: https://udata.readthedocs.io/en/stable/