udata 14.0.3.dev1__py3-none-any.whl → 14.7.3.dev4__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.
Files changed (151) hide show
  1. udata/api/__init__.py +2 -0
  2. udata/api_fields.py +120 -19
  3. udata/app.py +18 -20
  4. udata/auth/__init__.py +4 -7
  5. udata/auth/forms.py +3 -3
  6. udata/auth/views.py +13 -6
  7. udata/commands/dcat.py +1 -1
  8. udata/commands/serve.py +3 -11
  9. udata/core/activity/api.py +5 -6
  10. udata/core/badges/tests/test_tasks.py +0 -2
  11. udata/core/csv.py +5 -0
  12. udata/core/dataservices/api.py +8 -1
  13. udata/core/dataservices/apiv2.py +3 -6
  14. udata/core/dataservices/models.py +5 -2
  15. udata/core/dataservices/rdf.py +2 -1
  16. udata/core/dataservices/tasks.py +6 -2
  17. udata/core/dataset/api.py +30 -4
  18. udata/core/dataset/api_fields.py +1 -1
  19. udata/core/dataset/apiv2.py +1 -1
  20. udata/core/dataset/constants.py +2 -9
  21. udata/core/dataset/models.py +21 -9
  22. udata/core/dataset/permissions.py +31 -0
  23. udata/core/dataset/rdf.py +18 -16
  24. udata/core/dataset/tasks.py +16 -7
  25. udata/core/discussions/api.py +15 -1
  26. udata/core/discussions/models.py +6 -0
  27. udata/core/legal/__init__.py +0 -0
  28. udata/core/legal/mails.py +128 -0
  29. udata/core/organization/api.py +16 -5
  30. udata/core/organization/api_fields.py +3 -3
  31. udata/core/organization/apiv2.py +3 -4
  32. udata/core/organization/mails.py +1 -1
  33. udata/core/organization/models.py +40 -7
  34. udata/core/organization/notifications.py +84 -0
  35. udata/core/organization/permissions.py +1 -1
  36. udata/core/organization/tasks.py +3 -0
  37. udata/core/pages/models.py +49 -0
  38. udata/core/pages/tests/test_api.py +165 -1
  39. udata/core/post/api.py +25 -70
  40. udata/core/post/constants.py +8 -0
  41. udata/core/post/models.py +109 -17
  42. udata/core/post/tests/test_api.py +140 -3
  43. udata/core/post/tests/test_models.py +24 -0
  44. udata/core/reports/api.py +18 -0
  45. udata/core/reports/models.py +42 -2
  46. udata/core/reuse/api.py +8 -0
  47. udata/core/reuse/apiv2.py +3 -6
  48. udata/core/reuse/models.py +1 -1
  49. udata/core/spatial/forms.py +2 -2
  50. udata/core/topic/models.py +8 -2
  51. udata/core/user/api.py +10 -3
  52. udata/core/user/api_fields.py +3 -3
  53. udata/core/user/models.py +33 -8
  54. udata/features/notifications/api.py +7 -18
  55. udata/features/notifications/models.py +59 -0
  56. udata/features/notifications/tasks.py +25 -0
  57. udata/features/transfer/actions.py +2 -0
  58. udata/features/transfer/models.py +17 -0
  59. udata/features/transfer/notifications.py +96 -0
  60. udata/flask_mongoengine/engine.py +0 -4
  61. udata/flask_mongoengine/pagination.py +1 -1
  62. udata/frontend/markdown.py +2 -1
  63. udata/harvest/actions.py +20 -0
  64. udata/harvest/api.py +24 -7
  65. udata/harvest/backends/base.py +27 -1
  66. udata/harvest/backends/ckan/harvesters.py +21 -4
  67. udata/harvest/backends/dcat.py +4 -1
  68. udata/harvest/commands.py +33 -0
  69. udata/harvest/filters.py +17 -6
  70. udata/harvest/models.py +16 -0
  71. udata/harvest/permissions.py +27 -0
  72. udata/harvest/tests/ckan/test_ckan_backend.py +33 -0
  73. udata/harvest/tests/test_actions.py +46 -2
  74. udata/harvest/tests/test_api.py +161 -6
  75. udata/harvest/tests/test_base_backend.py +86 -1
  76. udata/harvest/tests/test_dcat_backend.py +68 -3
  77. udata/harvest/tests/test_filters.py +6 -0
  78. udata/i18n.py +1 -4
  79. udata/mail.py +14 -0
  80. udata/migrations/2021-08-17-harvest-integrity.py +23 -16
  81. udata/migrations/2025-10-31-create-membership-request-notifications.py +55 -0
  82. udata/migrations/2025-12-04-add-uuid-to-discussion-messages.py +28 -0
  83. udata/migrations/2025-12-16-create-transfer-request-notifications.py +69 -0
  84. udata/migrations/2026-01-14-add-default-kind-to-posts.py +17 -0
  85. udata/mongo/slug_fields.py +1 -1
  86. udata/rdf.py +65 -11
  87. udata/routing.py +2 -2
  88. udata/settings.py +11 -0
  89. udata/tasks.py +2 -0
  90. udata/templates/mail/message.html +3 -1
  91. udata/tests/api/__init__.py +7 -17
  92. udata/tests/api/test_activities_api.py +36 -0
  93. udata/tests/api/test_datasets_api.py +69 -0
  94. udata/tests/api/test_organizations_api.py +0 -3
  95. udata/tests/api/test_reports_api.py +157 -0
  96. udata/tests/api/test_user_api.py +1 -1
  97. udata/tests/apiv2/test_dataservices.py +14 -0
  98. udata/tests/apiv2/test_organizations.py +9 -0
  99. udata/tests/apiv2/test_reuses.py +11 -0
  100. udata/tests/cli/test_cli_base.py +0 -1
  101. udata/tests/dataservice/test_dataservice_tasks.py +29 -0
  102. udata/tests/dataset/test_dataset_model.py +13 -1
  103. udata/tests/dataset/test_dataset_rdf.py +164 -5
  104. udata/tests/dataset/test_dataset_tasks.py +25 -0
  105. udata/tests/frontend/test_auth.py +58 -1
  106. udata/tests/frontend/test_csv.py +0 -3
  107. udata/tests/helpers.py +31 -27
  108. udata/tests/organization/test_notifications.py +67 -2
  109. udata/tests/search/test_search_integration.py +70 -0
  110. udata/tests/site/test_site_csv_exports.py +22 -10
  111. udata/tests/test_activity.py +9 -9
  112. udata/tests/test_api_fields.py +10 -0
  113. udata/tests/test_discussions.py +5 -5
  114. udata/tests/test_legal_mails.py +359 -0
  115. udata/tests/test_notifications.py +15 -57
  116. udata/tests/test_notifications_task.py +43 -0
  117. udata/tests/test_owned.py +81 -1
  118. udata/tests/test_transfer.py +181 -2
  119. udata/tests/test_uris.py +33 -0
  120. udata/translations/ar/LC_MESSAGES/udata.mo +0 -0
  121. udata/translations/ar/LC_MESSAGES/udata.po +309 -158
  122. udata/translations/de/LC_MESSAGES/udata.mo +0 -0
  123. udata/translations/de/LC_MESSAGES/udata.po +313 -160
  124. udata/translations/es/LC_MESSAGES/udata.mo +0 -0
  125. udata/translations/es/LC_MESSAGES/udata.po +312 -160
  126. udata/translations/fr/LC_MESSAGES/udata.mo +0 -0
  127. udata/translations/fr/LC_MESSAGES/udata.po +475 -202
  128. udata/translations/it/LC_MESSAGES/udata.mo +0 -0
  129. udata/translations/it/LC_MESSAGES/udata.po +317 -162
  130. udata/translations/pt/LC_MESSAGES/udata.mo +0 -0
  131. udata/translations/pt/LC_MESSAGES/udata.po +315 -161
  132. udata/translations/sr/LC_MESSAGES/udata.mo +0 -0
  133. udata/translations/sr/LC_MESSAGES/udata.po +323 -164
  134. udata/translations/udata.pot +169 -124
  135. udata/uris.py +0 -2
  136. udata/utils.py +23 -0
  137. udata-14.7.3.dev4.dist-info/METADATA +109 -0
  138. {udata-14.0.3.dev1.dist-info → udata-14.7.3.dev4.dist-info}/RECORD +142 -135
  139. udata/core/post/forms.py +0 -30
  140. udata/flask_mongoengine/json.py +0 -38
  141. udata/templates/mail/base.html +0 -105
  142. udata/templates/mail/base.txt +0 -6
  143. udata/templates/mail/button.html +0 -3
  144. udata/templates/mail/layouts/1-column.html +0 -19
  145. udata/templates/mail/layouts/2-columns.html +0 -20
  146. udata/templates/mail/layouts/center-panel.html +0 -16
  147. udata-14.0.3.dev1.dist-info/METADATA +0 -132
  148. {udata-14.0.3.dev1.dist-info → udata-14.7.3.dev4.dist-info}/WHEEL +0 -0
  149. {udata-14.0.3.dev1.dist-info → udata-14.7.3.dev4.dist-info}/entry_points.txt +0 -0
  150. {udata-14.0.3.dev1.dist-info → udata-14.7.3.dev4.dist-info}/licenses/LICENSE +0 -0
  151. {udata-14.0.3.dev1.dist-info → udata-14.7.3.dev4.dist-info}/top_level.txt +0 -0
udata/core/post/forms.py DELETED
@@ -1,30 +0,0 @@
1
- from udata.forms import ModelForm, fields, validators, widgets
2
- from udata.i18n import lazy_gettext as _
3
-
4
- from .constants import IMAGE_SIZES
5
- from .models import Post
6
-
7
- __all__ = ("PostForm",)
8
-
9
-
10
- class PostForm(ModelForm):
11
- model_class = Post
12
-
13
- owner = fields.CurrentUserField()
14
-
15
- name = fields.StringField(_("Name"), [validators.DataRequired()])
16
- headline = fields.StringField(_("Headline"), widget=widgets.TextArea())
17
- content = fields.MarkdownField(_("Content"), [validators.DataRequired()])
18
-
19
- datasets = fields.DatasetListField(_("Associated datasets"))
20
- reuses = fields.ReuseListField(_("Associated reuses"))
21
-
22
- image = fields.ImageField(_("Image"), sizes=IMAGE_SIZES)
23
- credit_to = fields.StringField(_("Image credits"))
24
- credit_url = fields.URLField(_("Credit URL"))
25
-
26
- tags = fields.TagField(_("Tags"))
27
-
28
- body_type = fields.StringField(
29
- _("body type"), description=_("Specify your body type (HTML or markdown)")
30
- )
@@ -1,38 +0,0 @@
1
- from bson import json_util
2
- from flask.json import JSONEncoder
3
- from mongoengine.base import BaseDocument
4
- from mongoengine.queryset import QuerySet
5
-
6
-
7
- def _make_encoder(superclass):
8
- class MongoEngineJSONEncoder(superclass):
9
- """
10
- A JSONEncoder which provides serialization of MongoEngine
11
- documents and queryset objects.
12
- """
13
-
14
- def default(self, obj):
15
- if isinstance(obj, BaseDocument):
16
- return json_util._json_convert(obj.to_mongo())
17
- elif isinstance(obj, QuerySet):
18
- return json_util._json_convert(obj.as_pymongo())
19
- return superclass.default(self, obj)
20
-
21
- return MongoEngineJSONEncoder
22
-
23
-
24
- MongoEngineJSONEncoder = _make_encoder(JSONEncoder)
25
-
26
-
27
- def override_json_encoder(app):
28
- """
29
- A function to dynamically create a new MongoEngineJSONEncoder class
30
- based upon a custom base class.
31
- This function allows us to combine MongoEngine serialization with
32
- any changes to Flask's JSONEncoder which a user may have made
33
- prior to calling init_app.
34
-
35
- NOTE: This does not cover situations where users override
36
- an instance's json_encoder after calling init_app.
37
- """
38
- app.json_encoder = _make_encoder(app.json_encoder)
@@ -1,105 +0,0 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
- <html xmlns="http://www.w3.org/1999/xhtml" style="margin: 0;padding: 0;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;">
3
- <head>
4
- <!-- If you delete this meta tag, Half Life 3 will never be released. -->
5
- <meta name="viewport" content="width=device-width">
6
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
7
- <title>{{config.SITE_TITLE}} - {{subject}}</title>
8
- <style>
9
- /* -------------------------------------------
10
- PHONE
11
- For clients that support media queries.
12
- Nothing fancy.
13
- -------------------------------------------- */
14
- @media only screen and (max-width: 600px) {
15
-
16
- a[class="btn"] { display:block!important; margin-bottom:10px!important; background-image:none!important; margin-right:0!important;}
17
-
18
- div[class="column"] { width: auto!important; float:none!important;}
19
-
20
- table.social div[class="column"] {
21
- width:auto!important;
22
- }
23
- }
24
- </style>
25
- {% block head %}{% endblock %}
26
- </head>
27
-
28
- <body bgcolor="#efefef" style="margin: 0;padding: 0;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-webkit-text-size-adjust: none;height: 100%;color: #373737;width: 100%!important;background-color: #efefef;">
29
-
30
- <!-- HEADER -->
31
- <table class="head-wrap" cellpadding="0" cellspacing="0" style="margin: 0;padding: 0;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;width: 100%;">
32
- <tr style="margin: 0;padding: 0;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;">
33
- <td style="margin: 0;padding: 0;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;"></td>
34
- <td class="header container" style="margin: 0 auto!important;padding: 0;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;display: block!important;max-width: 628px!important;clear: both!important;">
35
-
36
- <div style="margin: 0;padding: 0;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;">
37
- <table cellpadding="0" cellspacing="0" style="margin: 0;padding: 0;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;">
38
- <tr style="margin: 0;padding: 0;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;">
39
- <td align="center" class="head-message" style="margin: 0;padding: 16px;font-family: arial,helvetica,sans-serif;color: #888888;font-size: 11px;">
40
- {% if browser_url %}
41
- {% set link =
42
- '<a href="'|safe
43
- + browser_link
44
- + '&quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;color: #2081c5;text-decoration: none;"> '|safe
45
- + _('on your browser.')
46
- + '</a>'|safe
47
- %}
48
- {{ _('View this email %(link)s', link=link) }}
49
- {% else %}
50
- &nbsp;
51
- {% endif %}
52
- </td>
53
- </tr>
54
- </table>
55
- </div>
56
-
57
- </td>
58
- <td style="margin: 0;padding: 0;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;"></td>
59
- </tr>
60
- </table><!-- /HEADER -->
61
-
62
-
63
- <!-- BODY -->
64
- <table class="body-wrap" cellpadding="0" cellspacing="0" style="margin: 0;padding: 0;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;width: 100%;">
65
-
66
-
67
-
68
- <tr style="margin: 0;padding: 0;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;">
69
- <td style="margin: 0;padding: 0;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;"></td>
70
- <td class="container" bgcolor="#FFFFFF" style="margin: 0 auto!important;padding: 0;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;display: block!important;max-width: 628px!important;clear: both!important;">
71
-
72
- <div class="content" style="margin: 0 auto;padding: 35px 47px;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;max-width: 628px;display: block;">
73
- <table style="margin: 0;padding: 0;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;width: 100%;">
74
- <tr style="margin: 0;padding: 0;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;">
75
- <td style="margin: 0;padding: 0;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;">
76
- <h3 style="margin: 0;padding: 0;font-family: &quot;HelveticaNeue-Light&quot;, &quot;Helvetica Neue Light&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, &quot;Lucida Grande&quot;, sans-serif;line-height: 1.1;margin-bottom: 15px;color: #000;font-weight: 500;font-size: 24px;">{{ _('Hi %(user)s', user=recipient.first_name) }}</h3>
77
- </td>
78
- </tr>
79
- <tr style="margin: 0;padding: 0;">
80
- <td style="margin: 0;padding: 0;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;margin-bottom: 20px;font-weight: normal;font-size: 14px;line-height: 1.5;">
81
- {% block body %}{% endblock %}
82
- </td>
83
- </tr>
84
-
85
- <tr style="margin: 0;padding: 0;">
86
- <td style="margin: 0;padding: 0;">
87
- <p style="margin: 0;padding: 0;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;margin-top: 20px;margin-bottom: 20px;font-weight: normal;font-size: 14px;line-height: 1.5;">{{ _('See you soon on the platform') }}<br/>
88
- <i>{{ _('The %(site)s team', site=config.SITE_TITLE) }}</i></p>
89
- </td>
90
- </tr>
91
-
92
- </table>
93
-
94
- </div></td>
95
- </tr>
96
- </table>
97
- <!-- /content -->
98
-
99
-
100
- <td style="margin: 0;padding: 0;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;"></td>
101
-
102
- <!-- /BODY -->
103
-
104
- </body>
105
- </html>
@@ -1,6 +0,0 @@
1
- {{ _('Hi %(user)s', user=recipient.first_name) }}
2
-
3
- {% block body %}{% endblock %}
4
-
5
- {{ _('See you soon on the platform') }}
6
- {{ _('The %(site)s team', site=config.SITE_TITLE) }}
@@ -1,3 +0,0 @@
1
- {% macro mail_button(label, url) %}
2
- <a class="btn" href="{{ url }}" style="margin: 30px 15px;padding: 8px 20px;font-family: &quot;Helvetica Neue&quot;, &quot;Helvetica&quot;, Helvetica, Arial, sans-serif;color: #ffffff;text-decoration: none;background-color: #438fc5;font-weight: bold;text-align: center;cursor: pointer;display: inline-block;font-size: 11px;text-transform: uppercase;">{{ label }}</a>
3
- {% endmacro %}
@@ -1,19 +0,0 @@
1
- {% extends 'base.html' %}
2
- {% from 'macros/breadcrumb.html' import breadcrumb with context %}
3
- {% set section_class = section_class|default('default') %}
4
- {% set toolbar_class = toolbar_class|default('') %}
5
-
6
- {% block content %}
7
- {{ breadcrumb(self,
8
- breadcrum_class=breadcrum_class,
9
- toolbar_class=toolbar_class
10
- ) }}
11
-
12
- <section class="{{ section_class }}">
13
- <div class="{{ container_class }}">
14
- {% block main_content %}{% endblock %}
15
- </div>
16
- </section>
17
-
18
- {% block extra_sections %}{% endblock %}
19
- {% endblock %}
@@ -1,20 +0,0 @@
1
- {% extends 'base.html' %}
2
- {% from 'macros/breadcrumb.html' import breadcrumb with context %}
3
- {% set section_class = section_class|default('default') %}
4
-
5
- {% block content %}
6
- {{ breadcrumb(self) }}
7
-
8
- <section class="{{ section_class }}">
9
- <div class="container {{ container_class }}">
10
- <div class="row">
11
- <div class="col-lg-8">
12
- {% block main_content %}{% endblock %}
13
- </div>
14
- <aside class="col-lg-4">
15
- {% block sidebar %}{% endblock %}
16
- </aside>
17
- </div>
18
- </div>
19
- </section>
20
- {% endblock %}
@@ -1,16 +0,0 @@
1
- {% extends 'raw.html' %}
2
-
3
- {% set body_class = 'panel-center' %}
4
-
5
- {% block body %}
6
- <div class="container">
7
- <div class="row">
8
- <div class="col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2">
9
- <div class="panel panel-default">
10
- {% block panel_content %}
11
- {% endblock %}
12
- </div>
13
- </div>
14
- </div>
15
- </div>
16
- {% endblock %}
@@ -1,132 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: udata
3
- Version: 14.0.3.dev1
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==1.5.1
29
- Requires-Dist: awesome-slugify==1.6.5
30
- Requires-Dist: babel==2.17.0
31
- Requires-Dist: bcrypt==4.3.0
32
- Requires-Dist: bleach[css]==6.2.0
33
- Requires-Dist: blinker==1.5
34
- Requires-Dist: boto3==1.26.102
35
- Requires-Dist: botocore==1.29.165
36
- Requires-Dist: celery==5.4.0
37
- Requires-Dist: celerybeat-mongo==0.2.0
38
- Requires-Dist: click==8.1.8
39
- Requires-Dist: cryptography==44.0.2
40
- Requires-Dist: email-validator==2.2.0
41
- Requires-Dist: factory-boy==3.3.3
42
- Requires-Dist: feedgenerator==2.1.0
43
- Requires-Dist: flask==2.1.2
44
- Requires-Dist: flask-babel==4.0.0
45
- Requires-Dist: flask-caching==2.3.1
46
- Requires-Dist: flask-cdn==1.5.3
47
- Requires-Dist: flask-gravatar==0.5.0
48
- Requires-Dist: flask-login==0.6.3
49
- Requires-Dist: flask-mail==0.10.0
50
- Requires-Dist: flask-principal==0.4.0
51
- Requires-Dist: flask-restx==1.3.0
52
- Requires-Dist: flask-security-too==5.1.2
53
- Requires-Dist: flask-sitemap==0.4.0
54
- Requires-Dist: flask-storage~=1.4.0
55
- Requires-Dist: flask-wtf==1.2.2
56
- Requires-Dist: geojson==3.2.0
57
- Requires-Dist: geomet==1.1.0
58
- Requires-Dist: html2text==2024.2.26
59
- Requires-Dist: humanfriendly==10.0
60
- Requires-Dist: importlib-resources==6.5.2
61
- Requires-Dist: itsdangerous==2.2.0
62
- Requires-Dist: jinja2==3.1.6
63
- Requires-Dist: jsonschema==4.23.0
64
- Requires-Dist: kombu[redis]==5.5.0
65
- Requires-Dist: langdetect==1.0.9
66
- Requires-Dist: levenshtein==0.27.1
67
- Requires-Dist: lxml==5.3.1
68
- Requires-Dist: mistune==3.1.3
69
- Requires-Dist: mongoengine==0.29.1
70
- Requires-Dist: netaddr==1.3.0
71
- Requires-Dist: pillow==9.2.0
72
- Requires-Dist: pydenticon==0.3.1
73
- Requires-Dist: pymongo==4.11.3
74
- Requires-Dist: python-dateutil==2.9.0.post0
75
- Requires-Dist: pytz==2025.1
76
- Requires-Dist: rdflib==7.1.3
77
- Requires-Dist: redis==5.2.1
78
- Requires-Dist: requests==2.32.4
79
- Requires-Dist: saxonche==12.8.0
80
- Requires-Dist: sentry-sdk[flask]==2.23.1
81
- Requires-Dist: speaklater==1.3
82
- Requires-Dist: tlds==2025022800
83
- Requires-Dist: typing-extensions==4.12.2
84
- Requires-Dist: tzdata==2025.1
85
- Requires-Dist: urlextract==1.9.0
86
- Requires-Dist: urllib3==1.26.20
87
- Requires-Dist: voluptuous==0.15.2
88
- Requires-Dist: werkzeug==2.2.3
89
- Requires-Dist: wtforms[email]==3.2.1
90
- Requires-Dist: wtforms-json==0.3.5
91
- Provides-Extra: dev
92
- Requires-Dist: flask-shell-ipython<1.0,>=0.5.3; extra == "dev"
93
- Requires-Dist: invoke<3.0,>=2.2.0; extra == "dev"
94
- Requires-Dist: pip-tools<8.0,>=7.4.1; extra == "dev"
95
- Requires-Dist: pre-commit<5.0,>=4.2.0; extra == "dev"
96
- Requires-Dist: ruff<1.0,>=0.11.0; extra == "dev"
97
- Provides-Extra: test
98
- Requires-Dist: faker<38.0,>=37.0.2; extra == "test"
99
- Requires-Dist: feedparser<7.0,>=6.0.11; extra == "test"
100
- Requires-Dist: httpretty<2.0,>=1.1.4; extra == "test"
101
- Requires-Dist: mock<6.0,>=5.2.0; extra == "test"
102
- Requires-Dist: pytest<9.0,>=8.3.5; extra == "test"
103
- Requires-Dist: pytest-env<2.0,>=1.1.5; extra == "test"
104
- Requires-Dist: pytest-flask<2.0,>=1.3.0; extra == "test"
105
- Requires-Dist: pytest-mock<4.0,>=3.14.0; extra == "test"
106
- Requires-Dist: pytest-sugar<2.0,>=1.0.0; extra == "test"
107
- Requires-Dist: requests-mock<2.0,>=1.12.1; extra == "test"
108
- Provides-Extra: doc
109
- Requires-Dist: mkdocs<2.0,>=1.6.1; extra == "doc"
110
- Provides-Extra: report
111
- Requires-Dist: coverage[toml]<8.0,>=7.7.0; extra == "report"
112
- Requires-Dist: flake8<8.0,>=7.1.2; extra == "report"
113
- Requires-Dist: pytest-cov<8.0,>=7.0.0; extra == "report"
114
- Dynamic: license-file
115
-
116
- <p align="center"><img src="https://i.imgur.com/rlRox1c.png"></p>
117
-
118
- udata
119
- =====
120
-
121
- Customizable and skinnable social platform dedicated to (open) data.
122
-
123
- The [full documentation][readthedocs-url] is hosted on Read the Docs.
124
-
125
- udata is maintained by [data.gouv.fr](https://data.gouv.fr/), the
126
- French public agency in charge of open data. data.gouv.fr is responsible
127
- for publishing udata's roadmap and for building consensus around it.
128
-
129
- It is collectively taken care of by members of the
130
- [OpenDataTeam](https://github.com/opendatateam).
131
-
132
- [readthedocs-url]: https://udata.readthedocs.io/en/stable/