udata 14.0.0__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 (130) hide show
  1. udata/api_fields.py +35 -4
  2. udata/app.py +18 -20
  3. udata/auth/__init__.py +29 -6
  4. udata/auth/forms.py +2 -2
  5. udata/auth/views.py +6 -3
  6. udata/commands/serve.py +3 -11
  7. udata/commands/tests/test_fixtures.py +9 -9
  8. udata/core/access_type/api.py +1 -1
  9. udata/core/access_type/constants.py +12 -8
  10. udata/core/activity/api.py +5 -6
  11. udata/core/badges/tests/test_commands.py +6 -6
  12. udata/core/csv.py +5 -0
  13. udata/core/dataservices/models.py +1 -1
  14. udata/core/dataservices/tasks.py +7 -0
  15. udata/core/dataset/api.py +2 -0
  16. udata/core/dataset/models.py +2 -2
  17. udata/core/dataset/permissions.py +31 -0
  18. udata/core/dataset/tasks.py +17 -5
  19. udata/core/discussions/models.py +1 -0
  20. udata/core/organization/api.py +8 -5
  21. udata/core/organization/mails.py +1 -1
  22. udata/core/organization/models.py +9 -1
  23. udata/core/organization/notifications.py +84 -0
  24. udata/core/organization/permissions.py +1 -1
  25. udata/core/organization/tasks.py +3 -0
  26. udata/core/pages/tests/test_api.py +32 -0
  27. udata/core/post/api.py +24 -69
  28. udata/core/post/models.py +84 -16
  29. udata/core/post/tests/test_api.py +24 -1
  30. udata/core/reports/api.py +18 -0
  31. udata/core/reports/models.py +42 -2
  32. udata/core/reuse/models.py +1 -1
  33. udata/core/reuse/tasks.py +7 -0
  34. udata/core/spatial/forms.py +2 -2
  35. udata/core/user/models.py +5 -1
  36. udata/features/notifications/api.py +7 -18
  37. udata/features/notifications/models.py +56 -0
  38. udata/features/notifications/tasks.py +25 -0
  39. udata/flask_mongoengine/engine.py +0 -4
  40. udata/frontend/markdown.py +2 -1
  41. udata/harvest/actions.py +21 -1
  42. udata/harvest/api.py +25 -8
  43. udata/harvest/backends/base.py +27 -1
  44. udata/harvest/backends/ckan/harvesters.py +11 -2
  45. udata/harvest/commands.py +33 -0
  46. udata/harvest/filters.py +17 -6
  47. udata/harvest/models.py +16 -0
  48. udata/harvest/permissions.py +27 -0
  49. udata/harvest/tests/ckan/test_ckan_backend.py +33 -0
  50. udata/harvest/tests/test_actions.py +58 -5
  51. udata/harvest/tests/test_api.py +276 -122
  52. udata/harvest/tests/test_base_backend.py +86 -1
  53. udata/harvest/tests/test_dcat_backend.py +57 -10
  54. udata/harvest/tests/test_filters.py +6 -0
  55. udata/i18n.py +1 -4
  56. udata/mail.py +5 -1
  57. udata/migrations/2025-10-31-create-membership-request-notifications.py +55 -0
  58. udata/migrations/2025-12-04-add-uuid-to-discussion-messages.py +28 -0
  59. udata/mongo/slug_fields.py +1 -1
  60. udata/rdf.py +45 -6
  61. udata/routing.py +2 -2
  62. udata/settings.py +7 -0
  63. udata/tasks.py +1 -0
  64. udata/templates/mail/message.html +5 -31
  65. udata/tests/__init__.py +27 -2
  66. udata/tests/api/__init__.py +108 -21
  67. udata/tests/api/test_activities_api.py +36 -0
  68. udata/tests/api/test_auth_api.py +121 -95
  69. udata/tests/api/test_base_api.py +7 -4
  70. udata/tests/api/test_datasets_api.py +44 -19
  71. udata/tests/api/test_organizations_api.py +192 -197
  72. udata/tests/api/test_reports_api.py +157 -0
  73. udata/tests/api/test_reuses_api.py +147 -147
  74. udata/tests/api/test_security_api.py +12 -12
  75. udata/tests/api/test_swagger.py +4 -4
  76. udata/tests/api/test_tags_api.py +8 -8
  77. udata/tests/api/test_user_api.py +1 -1
  78. udata/tests/apiv2/test_swagger.py +4 -4
  79. udata/tests/cli/test_cli_base.py +8 -9
  80. udata/tests/dataset/test_dataset_commands.py +4 -4
  81. udata/tests/dataset/test_dataset_model.py +66 -26
  82. udata/tests/dataset/test_dataset_rdf.py +99 -5
  83. udata/tests/frontend/test_auth.py +24 -1
  84. udata/tests/frontend/test_csv.py +0 -3
  85. udata/tests/helpers.py +25 -27
  86. udata/tests/organization/test_notifications.py +67 -2
  87. udata/tests/plugin.py +6 -261
  88. udata/tests/site/test_site_csv_exports.py +22 -10
  89. udata/tests/test_activity.py +9 -9
  90. udata/tests/test_dcat_commands.py +2 -2
  91. udata/tests/test_discussions.py +5 -5
  92. udata/tests/test_migrations.py +21 -21
  93. udata/tests/test_notifications.py +15 -57
  94. udata/tests/test_notifications_task.py +43 -0
  95. udata/tests/test_owned.py +81 -1
  96. udata/tests/test_storages.py +25 -19
  97. udata/tests/test_topics.py +77 -61
  98. udata/tests/test_uris.py +33 -0
  99. udata/tests/workers/test_jobs_commands.py +23 -23
  100. udata/translations/ar/LC_MESSAGES/udata.mo +0 -0
  101. udata/translations/ar/LC_MESSAGES/udata.po +187 -108
  102. udata/translations/de/LC_MESSAGES/udata.mo +0 -0
  103. udata/translations/de/LC_MESSAGES/udata.po +187 -108
  104. udata/translations/es/LC_MESSAGES/udata.mo +0 -0
  105. udata/translations/es/LC_MESSAGES/udata.po +187 -108
  106. udata/translations/fr/LC_MESSAGES/udata.mo +0 -0
  107. udata/translations/fr/LC_MESSAGES/udata.po +188 -109
  108. udata/translations/it/LC_MESSAGES/udata.mo +0 -0
  109. udata/translations/it/LC_MESSAGES/udata.po +187 -108
  110. udata/translations/pt/LC_MESSAGES/udata.mo +0 -0
  111. udata/translations/pt/LC_MESSAGES/udata.po +187 -108
  112. udata/translations/sr/LC_MESSAGES/udata.mo +0 -0
  113. udata/translations/sr/LC_MESSAGES/udata.po +187 -108
  114. udata/translations/udata.pot +215 -106
  115. udata/uris.py +0 -2
  116. udata-14.4.1.dev7.dist-info/METADATA +109 -0
  117. {udata-14.0.0.dist-info → udata-14.4.1.dev7.dist-info}/RECORD +121 -123
  118. udata/core/post/forms.py +0 -30
  119. udata/flask_mongoengine/json.py +0 -38
  120. udata/templates/mail/base.html +0 -105
  121. udata/templates/mail/base.txt +0 -6
  122. udata/templates/mail/button.html +0 -3
  123. udata/templates/mail/layouts/1-column.html +0 -19
  124. udata/templates/mail/layouts/2-columns.html +0 -20
  125. udata/templates/mail/layouts/center-panel.html +0 -16
  126. udata-14.0.0.dist-info/METADATA +0 -132
  127. {udata-14.0.0.dist-info → udata-14.4.1.dev7.dist-info}/WHEEL +0 -0
  128. {udata-14.0.0.dist-info → udata-14.4.1.dev7.dist-info}/entry_points.txt +0 -0
  129. {udata-14.0.0.dist-info → udata-14.4.1.dev7.dist-info}/licenses/LICENSE +0 -0
  130. {udata-14.0.0.dist-info → udata-14.4.1.dev7.dist-info}/top_level.txt +0 -0
@@ -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.0
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/