udata 11.1.2.dev4__py3-none-any.whl → 11.1.2.dev6__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.

udata/app.py CHANGED
@@ -7,10 +7,21 @@ from os.path import abspath, dirname, exists, isfile, join
7
7
 
8
8
  import bson
9
9
  from flask import Blueprint as BaseBlueprint
10
- from flask import Flask, abort, g, json, make_response, send_from_directory
10
+ from flask import (
11
+ Flask,
12
+ abort,
13
+ g,
14
+ json,
15
+ jsonify,
16
+ make_response,
17
+ render_template,
18
+ request,
19
+ send_from_directory,
20
+ )
11
21
  from flask_caching import Cache
12
22
  from flask_wtf.csrf import CSRFProtect
13
23
  from speaklater import is_lazy_string
24
+ from werkzeug.exceptions import NotFound
14
25
  from werkzeug.middleware.proxy_fix import ProxyFix
15
26
 
16
27
  from udata import cors, entrypoints
@@ -225,9 +236,47 @@ def register_extensions(app):
225
236
  mail.init_app(app)
226
237
  search.init_app(app)
227
238
  sentry.init_app(app)
239
+ app.after_request(return_404_html_if_requested)
240
+ app.register_error_handler(NotFound, page_not_found)
228
241
  return app
229
242
 
230
243
 
244
+ def return_404_html_if_requested(response):
245
+ # It's impossible to return an HTML page from an error handler of
246
+ # the API with Fask-RestX because the error handler is expected to
247
+ # return a JSON `dict` and not an HTML string.
248
+ # The only way to return the correct HTML response from a client
249
+ # that require HTML (for exemple by requesting /api/1/datasets/r/some-uuid with
250
+ # a non-existant resource) is to hook an `after_request` middleware.
251
+
252
+ if response.status_code != 404:
253
+ return response
254
+
255
+ # Return an HTML response if the user prefers HTML over JSON
256
+ if request.accept_mimetypes.best_match(["application/json", "text/html"]) == "text/html":
257
+ from udata.uris import homepage_url
258
+
259
+ html_content = render_template("404.html", homepage_url=homepage_url())
260
+ response = make_response(html_content, 404)
261
+ response.headers["Content-Type"] = "text/html; charset=utf-8"
262
+
263
+ return response
264
+
265
+
266
+ def page_not_found(e: NotFound):
267
+ """
268
+ This handler is only called for non existing pages,
269
+ for example "/api/1/oups", see `return_404_html_if_requested`
270
+ for calling `abort(404)` inside the API.
271
+ """
272
+ from udata.uris import homepage_url
273
+
274
+ if request.accept_mimetypes.best_match(["application/json", "text/html"]) == "text/html":
275
+ return render_template("404.html", homepage_url=homepage_url()), 404
276
+
277
+ return jsonify({"error": e.description, "status": 404}), 404
278
+
279
+
231
280
  def register_features(app):
232
281
  from udata.features import notifications
233
282
 
udata/core/dataset/api.py CHANGED
@@ -492,7 +492,7 @@ class ResourceRedirectAPI(API):
492
492
  Redirect to the latest version of a resource given its identifier.
493
493
  """
494
494
  resource = get_resource(id)
495
- return redirect(resource.url.strip()) if resource else abort(404)
495
+ return redirect(resource.url.strip()) if resource else abort(404, "Resource not found")
496
496
 
497
497
 
498
498
  @ns.route("/<dataset:dataset>/resources/", endpoint="resources")
@@ -85,8 +85,11 @@ def on_user_updated_topic_element(topic_element, **kwargs):
85
85
 
86
86
  @TopicElement.on_delete.connect
87
87
  def on_user_deleted_topic_element(topic_element):
88
- if current_user and current_user.is_authenticated and topic_element.topic:
88
+ try:
89
+ topic = topic_element.topic
90
+ except db.DoesNotExist:
91
+ # Topic was already deleted, skip activity creation
92
+ return
93
+ if current_user and current_user.is_authenticated and topic:
89
94
  extras = {"element_id": str(topic_element.id)}
90
- UserDeletedTopicElement.emit(
91
- topic_element.topic, topic_element.topic.organization, extras=extras
92
- )
95
+ UserDeletedTopicElement.emit(topic, topic.organization, extras=extras)
@@ -0,0 +1,43 @@
1
+ <!DOCTYPE html>
2
+ <html lang="fr">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>404 - {{ _('Page not found') }}</title>
7
+ <style>
8
+ body {
9
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
10
+ margin: 0;
11
+ padding: 2rem;
12
+ min-height: 100vh;
13
+ display: flex;
14
+ align-items: center;
15
+ justify-content: center;
16
+ }
17
+ .container {
18
+ max-width: 600px;
19
+ }
20
+ h1 {
21
+ font-size: 3rem;
22
+ font-weight: 600;
23
+ margin: 0 0 0.5rem 0;
24
+ }
25
+ p {
26
+ color: #666;
27
+ line-height: 1.5;
28
+ margin: 0 0 1.5rem 0;
29
+ }
30
+ a {
31
+ color: #000;
32
+ text-decoration: underline;
33
+ }
34
+ </style>
35
+ </head>
36
+ <body>
37
+ <div class="container">
38
+ <h1>404</h1>
39
+ <p>{{ _('The page you are looking for does not exist.') }}</p>
40
+ <a href="{{ homepage_url }}">{{ _('Back to home') }}</a>
41
+ </div>
42
+ </body>
43
+ </html>
@@ -1822,6 +1822,17 @@ class DatasetResourceAPITest(APITestCase):
1822
1822
  )
1823
1823
  self.assert404(response)
1824
1824
 
1825
+ def test_resource_redirect_success(self):
1826
+ """It should redirect to the resource URL"""
1827
+ resource = ResourceFactory(url="https://example.com/data.csv")
1828
+ DatasetFactory(resources=[resource])
1829
+
1830
+ response = self.get(
1831
+ url_for("api.resource_redirect", id=resource.id), follow_redirects=False
1832
+ )
1833
+ self.assertEqual(response.status_code, 302)
1834
+ self.assertEqual(response.location, "https://example.com/data.csv")
1835
+
1825
1836
  def test_follow_dataset(self):
1826
1837
  """It should follow a dataset on POST"""
1827
1838
  user = self.login()
@@ -437,6 +437,19 @@ class TopicAPITest(APITestCase):
437
437
  self.assertEqual(Topic.objects.count(), 0)
438
438
  self.assertEqual(Discussion.objects.count(), 0)
439
439
 
440
+ def test_topic_api_delete_with_elements(self):
441
+ """It should delete a topic with elements without raising DoesNotExist error"""
442
+ owner = self.login()
443
+ topic = TopicWithElementsFactory(owner=owner)
444
+
445
+ with self.api_user():
446
+ response = self.delete(url_for("apiv2.topic", topic=topic))
447
+ self.assertStatus(response, 204)
448
+
449
+ # Verify both topic and elements are deleted
450
+ self.assertEqual(Topic.objects.count(), 0)
451
+ self.assertEqual(TopicElement.objects.count(), 0)
452
+
440
453
  def test_topic_api_delete_perm(self):
441
454
  """It should not delete a topic from the API"""
442
455
  owner = UserFactory()
@@ -0,0 +1,77 @@
1
+ from uuid import uuid4
2
+
3
+ from flask import url_for
4
+
5
+ from . import FrontTestCase
6
+
7
+
8
+ class ErrorHandlersTest(FrontTestCase):
9
+ def test_404_in_flask_routing_requesting_html(self):
10
+ """Test that a 404 error displays the custom 404 HTML page"""
11
+ # Request a non-existent page
12
+ response = self.get("/this-page-does-not-exist", headers={"Accept": "text/html"})
13
+
14
+ # Check that we get a 404 status code
15
+ assert response.status_code == 404
16
+
17
+ # Check that the custom 404 template is rendered
18
+ html = response.data.decode("utf-8")
19
+ assert "404" in html
20
+ assert "Page not found" in html or "page you are looking for does not exist" in html.lower()
21
+
22
+ # Check that there's a link back to the homepage
23
+ assert "Back to home" in html or "home" in html.lower()
24
+
25
+ def test_404_with_abort_function_requesting_html(self):
26
+ """Test that resource redirect returns HTML 404 when HTML is requested"""
27
+ # Use a UUID that doesn't exist
28
+ non_existent_uuid = uuid4()
29
+
30
+ # Request the resource redirect endpoint with HTML accept header
31
+ response = self.get(
32
+ url_for("api.resource_redirect", id=non_existent_uuid), headers={"Accept": "text/html"}
33
+ )
34
+
35
+ # Check that we get a 404 status code
36
+ assert response.status_code == 404
37
+
38
+ # Check that the response is HTML (not JSON)
39
+ assert "text/html" in response.content_type
40
+
41
+ # Check that the custom 404 template is rendered
42
+ html = response.data.decode("utf-8")
43
+ assert "404" in html
44
+ assert "Page not found" in html or "page you are looking for does not exist" in html.lower()
45
+
46
+ def test_404_in_flask_routing(self):
47
+ """Test that a 404 error returns JSON when requested"""
48
+ # Request a non-existent page with JSON accept header
49
+ response = self.get("/this-page-does-not-exist")
50
+
51
+ # Check that we get a 404 status code
52
+ assert response.status_code == 404
53
+
54
+ # Check that the response is JSON
55
+ assert response.content_type == "application/json"
56
+
57
+ # Check the JSON response content
58
+ data = response.json
59
+ assert (
60
+ data["error"]
61
+ == "The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again."
62
+ )
63
+ assert data["status"] == 404
64
+
65
+ def test_404_with_abort_function_and_custom_message(self):
66
+ """Test that API resource redirect returns 404 JSON when resource doesn't exist"""
67
+ # Use a UUID that doesn't exist
68
+ non_existent_uuid = uuid4()
69
+
70
+ response = self.get(url_for("api.resource_redirect", id=non_existent_uuid))
71
+ assert response.status_code == 404
72
+
73
+ # Check that the response is JSON (Flask-RESTX returns JSON by default for API routes)
74
+ assert response.content_type == "application/json"
75
+
76
+ # Custom message
77
+ assert response.json["message"] == "Resource not found"
@@ -1,15 +1,15 @@
1
- # English translations for udata.
1
+ # English translations for PROJECT.
2
2
  # Copyright (C) 2025 Open Data Team
3
- # This file is distributed under the same license as the udata project.
3
+ # This file is distributed under the same license as the PROJECT project.
4
4
  # FIRST AUTHOR <EMAIL@ADDRESS>, 2025.
5
5
  #
6
6
  #, fuzzy
7
7
  msgid ""
8
8
  msgstr ""
9
- "Project-Id-Version: udata 10.8.3.dev0\n"
9
+ "Project-Id-Version: PROJECT VERSION\n"
10
10
  "Report-Msgid-Bugs-To: i18n@opendata.team\n"
11
- "POT-Creation-Date: 2025-08-20 12:14+0200\n"
12
- "PO-Revision-Date: 2025-08-20 12:14+0200\n"
11
+ "POT-Creation-Date: 2025-10-06 17:05+0200\n"
12
+ "PO-Revision-Date: 2025-10-06 17:05+0200\n"
13
13
  "Last-Translator: Open Data Team <i18n@opendata.team>\n"
14
14
  "Language: en\n"
15
15
  "Language-Team: Open Data Team <i18n@opendata.team>\n"
@@ -43,7 +43,7 @@ msgstr ""
43
43
  msgid "Password reset instructions"
44
44
  msgstr ""
45
45
 
46
- #: udata/settings.py:513
46
+ #: udata/settings.py:520
47
47
  msgid "This dataset has been archived"
48
48
  msgstr ""
49
49
 
@@ -52,41 +52,41 @@ msgstr ""
52
52
  msgid "Invalid URL \"{url}\": {reason}"
53
53
  msgstr ""
54
54
 
55
- #: udata/tests/api/test_datasets_api.py:1125 udata/tests/test_model.py:403
55
+ #: udata/tests/api/test_datasets_api.py:1126 udata/tests/test_model.py:403
56
56
  #: udata/uris.py:57
57
57
  #, python-brace-format
58
58
  msgid "Invalid URL \"{url}\""
59
59
  msgstr ""
60
60
 
61
- #: udata/uris.py:125
61
+ #: udata/uris.py:131
62
62
  #, python-brace-format
63
63
  msgid "Invalid scheme {0}, allowed schemes: {1}"
64
64
  msgstr ""
65
65
 
66
- #: udata/uris.py:128
66
+ #: udata/uris.py:134
67
67
  msgid "Credentials in URL are not allowed"
68
68
  msgstr ""
69
69
 
70
- #: udata/uris.py:132
70
+ #: udata/uris.py:138
71
71
  #, python-brace-format
72
72
  msgid "Invalid TLD {0}"
73
73
  msgstr ""
74
74
 
75
- #: udata/uris.py:141
75
+ #: udata/uris.py:147
76
76
  #, python-brace-format
77
77
  msgid "{0} is a multicast IP"
78
78
  msgstr ""
79
79
 
80
- #: udata/uris.py:143
80
+ #: udata/uris.py:149
81
81
  #, python-brace-format
82
82
  msgid "{0} is a mask IP"
83
83
  msgstr ""
84
84
 
85
- #: udata/uris.py:147
85
+ #: udata/uris.py:153
86
86
  msgid "is a local URL"
87
87
  msgstr ""
88
88
 
89
- #: udata/tests/test_model.py:421 udata/uris.py:154
89
+ #: udata/tests/test_model.py:421 udata/uris.py:160
90
90
  msgid "is a private URL"
91
91
  msgstr ""
92
92
 
@@ -196,8 +196,8 @@ msgstr ""
196
196
  msgid "Your udata instance is ready!"
197
197
  msgstr ""
198
198
 
199
- #: udata/core/owned.py:64 udata/forms/fields.py:752
200
- #: udata/tests/api/test_dataservices_api.py:540
199
+ #: udata/core/owned.py:64 udata/forms/fields.py:759
200
+ #: udata/tests/api/test_dataservices_api.py:550
201
201
  msgid "You can only set yourself as owner"
202
202
  msgstr ""
203
203
 
@@ -205,8 +205,8 @@ msgstr ""
205
205
  msgid "Unknown organization"
206
206
  msgstr ""
207
207
 
208
- #: udata/core/owned.py:77 udata/forms/fields.py:784
209
- #: udata/tests/api/test_dataservices_api.py:553
208
+ #: udata/core/owned.py:77 udata/forms/fields.py:791
209
+ #: udata/tests/api/test_dataservices_api.py:563
210
210
  msgid "Permission denied for this organization"
211
211
  msgstr ""
212
212
 
@@ -224,7 +224,7 @@ msgstr ""
224
224
 
225
225
  #: udata/core/contact_point/forms.py:12 udata/core/jobs/forms.py:27
226
226
  #: udata/core/organization/forms.py:46 udata/core/post/forms.py:15
227
- #: udata/core/topic/forms.py:16 udata/harvest/forms.py:78
227
+ #: udata/core/topic/forms.py:37 udata/harvest/forms.py:78
228
228
  #: udata/templates/api/admin.html:10
229
229
  msgid "Name"
230
230
  msgstr ""
@@ -243,7 +243,7 @@ msgstr ""
243
243
 
244
244
  #: udata/core/contact_point/forms.py:20 udata/core/dataset/forms.py:117
245
245
  #: udata/core/dataset/forms.py:185 udata/core/discussions/forms.py:13
246
- #: udata/core/discussions/forms.py:29 udata/core/topic/forms.py:14
246
+ #: udata/core/discussions/forms.py:29 udata/core/topic/forms.py:35
247
247
  #: udata/harvest/forms.py:87
248
248
  msgid "Publish as"
249
249
  msgstr ""
@@ -268,65 +268,65 @@ msgstr ""
268
268
  msgid "At least an email or a contact form is required for a contact point"
269
269
  msgstr ""
270
270
 
271
- #: udata/core/dataservices/activities.py:21
271
+ #: udata/core/dataservices/activities.py:23
272
272
  msgid "created a dataservice"
273
273
  msgstr ""
274
274
 
275
- #: udata/core/dataservices/activities.py:27
275
+ #: udata/core/dataservices/activities.py:29
276
276
  msgid "updated a dataservice"
277
277
  msgstr ""
278
278
 
279
- #: udata/core/dataservices/activities.py:34
279
+ #: udata/core/dataservices/activities.py:36
280
280
  msgid "deleted a dataservice"
281
281
  msgstr ""
282
282
 
283
- #: udata/core/dataservices/api.py:62
283
+ #: udata/core/dataservices/api.py:63
284
284
  msgid "Latest APIs"
285
285
  msgstr ""
286
286
 
287
- #: udata/core/dataservices/models.py:129
287
+ #: udata/core/dataservices/models.py:132
288
288
  msgid "You can only set one condition for a given access audience role"
289
289
  msgstr ""
290
290
 
291
- #: udata/core/dataservices/models.py:159
291
+ #: udata/core/dataservices/models.py:182
292
292
  msgid "dataservice"
293
293
  msgstr ""
294
294
 
295
- #: udata/core/dataservices/models.py:241 udata/core/dataset/models.py:593
295
+ #: udata/core/dataservices/models.py:271 udata/core/dataset/models.py:605
296
296
  #: udata/mongo/datetime_fields.py:60
297
297
  msgid "Creation date"
298
298
  msgstr ""
299
299
 
300
- #: udata/core/dataservices/models.py:247 udata/core/dataset/models.py:598
300
+ #: udata/core/dataservices/models.py:277 udata/core/dataset/models.py:610
301
301
  #: udata/mongo/datetime_fields.py:66
302
302
  msgid "Last modification date"
303
303
  msgstr ""
304
304
 
305
- #: udata/core/dataset/activities.py:22
305
+ #: udata/core/dataset/activities.py:24
306
306
  msgid "created a dataset"
307
307
  msgstr ""
308
308
 
309
- #: udata/core/dataset/activities.py:28
309
+ #: udata/core/dataset/activities.py:30
310
310
  msgid "updated a dataset"
311
311
  msgstr ""
312
312
 
313
- #: udata/core/dataset/activities.py:35
313
+ #: udata/core/dataset/activities.py:37
314
314
  msgid "deleted a dataset"
315
315
  msgstr ""
316
316
 
317
- #: udata/core/dataset/activities.py:41
317
+ #: udata/core/dataset/activities.py:43
318
318
  msgid "added a resource to a dataset"
319
319
  msgstr ""
320
320
 
321
- #: udata/core/dataset/activities.py:47
321
+ #: udata/core/dataset/activities.py:49
322
322
  msgid "updated a resource"
323
323
  msgstr ""
324
324
 
325
- #: udata/core/dataset/activities.py:53
325
+ #: udata/core/dataset/activities.py:55
326
326
  msgid "removed a resource from a dataset"
327
327
  msgstr ""
328
328
 
329
- #: udata/core/dataset/api.py:321
329
+ #: udata/core/dataset/api.py:329
330
330
  msgid "Latest datasets"
331
331
  msgstr ""
332
332
 
@@ -480,7 +480,8 @@ msgstr ""
480
480
 
481
481
  #: udata/core/dataset/forms.py:66 udata/core/dataset/forms.py:147
482
482
  #: udata/core/discussions/forms.py:14 udata/core/discussions/forms.py:25
483
- #: udata/core/site/forms.py:12 udata/templates/mail/discussion_closed.html:26
483
+ #: udata/core/site/forms.py:12 udata/core/topic/forms.py:13
484
+ #: udata/templates/mail/discussion_closed.html:26
484
485
  #: udata/templates/mail/new_discussion.html:25
485
486
  #: udata/templates/mail/new_discussion_comment.html:26
486
487
  msgid "Title"
@@ -488,7 +489,8 @@ msgstr ""
488
489
 
489
490
  #: udata/core/dataset/forms.py:69 udata/core/dataset/forms.py:151
490
491
  #: udata/core/jobs/forms.py:28 udata/core/organization/forms.py:50
491
- #: udata/core/topic/forms.py:17 udata/harvest/forms.py:80
492
+ #: udata/core/topic/forms.py:14 udata/core/topic/forms.py:38
493
+ #: udata/harvest/forms.py:80
492
494
  msgid "Description"
493
495
  msgstr ""
494
496
 
@@ -536,7 +538,7 @@ msgstr ""
536
538
  msgid "Related dataset"
537
539
  msgstr ""
538
540
 
539
- #: udata/core/dataset/forms.py:139 udata/tests/api/test_datasets_api.py:1037
541
+ #: udata/core/dataset/forms.py:139 udata/tests/api/test_datasets_api.py:1038
540
542
  msgid "Wrong contact point id or contact point ownership mismatch"
541
543
  msgstr ""
542
544
 
@@ -585,16 +587,17 @@ msgid "The period covered by the data"
585
587
  msgstr ""
586
588
 
587
589
  #: udata/core/dataset/forms.py:176 udata/core/spatial/forms.py:85
588
- #: udata/core/topic/forms.py:23
590
+ #: udata/core/topic/forms.py:86
589
591
  msgid "Spatial coverage"
590
592
  msgstr ""
591
593
 
592
- #: udata/core/dataset/forms.py:176 udata/core/topic/forms.py:23
594
+ #: udata/core/dataset/forms.py:176 udata/core/topic/forms.py:86
593
595
  msgid "The geographical area covered by the data."
594
596
  msgstr ""
595
597
 
596
598
  #: udata/core/dataset/forms.py:178 udata/core/post/forms.py:26
597
- #: udata/core/site/forms.py:13 udata/core/topic/forms.py:26
599
+ #: udata/core/site/forms.py:13 udata/core/topic/forms.py:15
600
+ #: udata/core/topic/forms.py:89
598
601
  msgid "Tags"
599
602
  msgstr ""
600
603
 
@@ -602,7 +605,7 @@ msgstr ""
602
605
  msgid "Some taxonomy keywords"
603
606
  msgstr ""
604
607
 
605
- #: udata/core/dataset/forms.py:180 udata/core/topic/forms.py:27
608
+ #: udata/core/dataset/forms.py:180 udata/core/topic/forms.py:90
606
609
  msgid "Private"
607
610
  msgstr ""
608
611
 
@@ -610,52 +613,72 @@ msgstr ""
610
613
  msgid "Restrict the dataset visibility to you or your organization only."
611
614
  msgstr ""
612
615
 
613
- #: udata/core/dataset/models.py:63
616
+ #: udata/core/dataset/models.py:68
614
617
  msgid "Pivotal data"
615
618
  msgstr ""
616
619
 
617
- #: udata/core/dataset/models.py:142
620
+ #: udata/core/dataset/models.py:69
621
+ msgid "Reference data public service"
622
+ msgstr ""
623
+
624
+ #: udata/core/dataset/models.py:70
625
+ msgid "Inspire"
626
+ msgstr ""
627
+
628
+ #: udata/core/dataset/models.py:71
629
+ msgid "High value datasets"
630
+ msgstr ""
631
+
632
+ #: udata/core/dataset/models.py:72
633
+ msgid "Certified statistic series"
634
+ msgstr ""
635
+
636
+ #: udata/core/dataset/models.py:73
637
+ msgid "Statistical series of general interest"
638
+ msgstr ""
639
+
640
+ #: udata/core/dataset/models.py:153
618
641
  msgid "A schema must contains a name or an URL when a version is provided."
619
642
  msgstr ""
620
643
 
621
- #: udata/core/dataset/models.py:174 udata/tests/api/test_datasets_api.py:1133
622
- #: udata/tests/api/test_datasets_api.py:1144
644
+ #: udata/core/dataset/models.py:185 udata/tests/api/test_datasets_api.py:1134
645
+ #: udata/tests/api/test_datasets_api.py:1145
623
646
  #, python-brace-format
624
647
  msgid "Schema name \"{schema}\" is not an allowed value. Allowed values: {values}"
625
648
  msgstr ""
626
649
 
627
- #: udata/core/dataset/models.py:193 udata/tests/api/test_datasets_api.py:1156
650
+ #: udata/core/dataset/models.py:204 udata/tests/api/test_datasets_api.py:1157
628
651
  #, python-brace-format
629
652
  msgid ""
630
653
  "Version \"{version}\" is not an allowed value for the schema \"{name}\". "
631
654
  "Allowed versions: {values}"
632
655
  msgstr ""
633
656
 
634
- #: udata/core/dataset/models.py:470 udata/core/dataset/rdf.py:567
635
- #: udata/tests/dataset/test_dataset_rdf.py:709
636
- #: udata/tests/dataset/test_dataset_rdf.py:722
657
+ #: udata/core/dataset/models.py:482 udata/core/dataset/rdf.py:576
658
+ #: udata/tests/dataset/test_dataset_rdf.py:723
659
+ #: udata/tests/dataset/test_dataset_rdf.py:736
637
660
  msgid "Nameless resource"
638
661
  msgstr ""
639
662
 
640
- #: udata/core/dataset/models.py:572
663
+ #: udata/core/dataset/models.py:584
641
664
  msgid "Future date of update"
642
665
  msgstr ""
643
666
 
644
- #: udata/core/dataset/models.py:604
667
+ #: udata/core/dataset/models.py:616
645
668
  msgid "Last update of the dataset resources"
646
669
  msgstr ""
647
670
 
648
- #: udata/core/dataset/models.py:659
671
+ #: udata/core/dataset/models.py:671
649
672
  msgid "dataset"
650
673
  msgstr ""
651
674
 
652
- #: udata/core/dataset/rdf.py:565 udata/tests/dataset/test_dataset_rdf.py:679
653
- #: udata/tests/dataset/test_dataset_rdf.py:696
675
+ #: udata/core/dataset/rdf.py:574 udata/tests/dataset/test_dataset_rdf.py:693
676
+ #: udata/tests/dataset/test_dataset_rdf.py:710
654
677
  #, python-brace-format
655
678
  msgid "{format} resource"
656
679
  msgstr ""
657
680
 
658
- #: udata/core/dataset/tasks.py:112
681
+ #: udata/core/dataset/tasks.py:109
659
682
  msgid "You need to update some frequency-based datasets"
660
683
  msgstr ""
661
684
 
@@ -853,11 +876,11 @@ msgstr ""
853
876
  msgid "Content"
854
877
  msgstr ""
855
878
 
856
- #: udata/core/post/forms.py:19 udata/core/topic/forms.py:19
879
+ #: udata/core/post/forms.py:19
857
880
  msgid "Associated datasets"
858
881
  msgstr ""
859
882
 
860
- #: udata/core/post/forms.py:20 udata/core/topic/forms.py:20
883
+ #: udata/core/post/forms.py:20
861
884
  msgid "Associated reuses"
862
885
  msgstr ""
863
886
 
@@ -1017,7 +1040,7 @@ msgstr ""
1017
1040
  msgid "reuse"
1018
1041
  msgstr ""
1019
1042
 
1020
- #: udata/core/reuse/tasks.py:45
1043
+ #: udata/core/reuse/tasks.py:48
1021
1044
  msgid "New reuse"
1022
1045
  msgstr ""
1023
1046
 
@@ -1122,15 +1145,35 @@ msgstr ""
1122
1145
  msgid "French arrondissement"
1123
1146
  msgstr ""
1124
1147
 
1125
- #: udata/core/topic/activities.py:17
1148
+ #: udata/core/topic/activities.py:25
1126
1149
  msgid "created a topic"
1127
1150
  msgstr ""
1128
1151
 
1129
- #: udata/core/topic/activities.py:23
1152
+ #: udata/core/topic/activities.py:31
1130
1153
  msgid "updated a topic"
1131
1154
  msgstr ""
1132
1155
 
1133
- #: udata/core/topic/forms.py:28
1156
+ #: udata/core/topic/activities.py:38
1157
+ msgid "added an element to a topic"
1158
+ msgstr ""
1159
+
1160
+ #: udata/core/topic/activities.py:44
1161
+ msgid "updated an element in a topic"
1162
+ msgstr ""
1163
+
1164
+ #: udata/core/topic/activities.py:51
1165
+ msgid "removed an element from a topic"
1166
+ msgstr ""
1167
+
1168
+ #: udata/core/topic/forms.py:17
1169
+ msgid "Element"
1170
+ msgstr ""
1171
+
1172
+ #: udata/core/topic/forms.py:26
1173
+ msgid "A topic element must have a title or an element."
1174
+ msgstr ""
1175
+
1176
+ #: udata/core/topic/forms.py:91
1134
1177
  msgid "Featured"
1135
1178
  msgstr ""
1136
1179
 
@@ -1230,46 +1273,46 @@ msgstr ""
1230
1273
  msgid "Tag \"%(tag)s\" must be between %(min)d and %(max)d characters long."
1231
1274
  msgstr ""
1232
1275
 
1233
- #: udata/forms/fields.py:461 udata/forms/fields.py:513
1276
+ #: udata/forms/fields.py:461 udata/forms/fields.py:520
1234
1277
  #, python-brace-format
1235
1278
  msgid "{0} does not exists"
1236
1279
  msgstr ""
1237
1280
 
1238
- #: udata/forms/fields.py:487 udata/tests/forms/test_model_field.py:333
1281
+ #: udata/forms/fields.py:494 udata/tests/forms/test_model_field.py:333
1239
1282
  #: udata/tests/forms/test_model_field.py:349
1240
1283
  msgid "Missing \"id\" field"
1241
1284
  msgstr ""
1242
1285
 
1243
- #: udata/forms/fields.py:494
1286
+ #: udata/forms/fields.py:501
1244
1287
  #, python-brace-format
1245
1288
  msgid "Expect a \"{0}\" class but \"{1}\" was found"
1246
1289
  msgstr ""
1247
1290
 
1248
- #: udata/forms/fields.py:500 udata/tests/forms/test_model_field.py:41
1291
+ #: udata/forms/fields.py:507 udata/tests/forms/test_model_field.py:41
1249
1292
  #: udata/tests/forms/test_model_field.py:56
1250
1293
  msgid "Expect both class and identifier"
1251
1294
  msgstr ""
1252
1295
 
1253
- #: udata/forms/fields.py:545
1296
+ #: udata/forms/fields.py:552
1254
1297
  #, python-brace-format
1255
1298
  msgid "Model for {0} not found"
1256
1299
  msgstr ""
1257
1300
 
1258
- #: udata/forms/fields.py:579
1301
+ #: udata/forms/fields.py:586
1259
1302
  #, python-brace-format
1260
1303
  msgid "Unknown identifiers: {identifiers}"
1261
1304
  msgstr ""
1262
1305
 
1263
- #: udata/forms/fields.py:713
1306
+ #: udata/forms/fields.py:720
1264
1307
  msgid "Unable to parse date range"
1265
1308
  msgstr ""
1266
1309
 
1267
- #: udata/forms/fields.py:745 udata/forms/fields.py:777
1310
+ #: udata/forms/fields.py:752 udata/forms/fields.py:784
1268
1311
  #: udata/tests/forms/test_publish_as_field.py:214
1269
1312
  msgid "Cannot change owner after creation. Please use transfer feature."
1270
1313
  msgstr ""
1271
1314
 
1272
- #: udata/forms/fields.py:750 udata/forms/fields.py:782
1315
+ #: udata/forms/fields.py:757 udata/forms/fields.py:789
1273
1316
  msgid "You must be authenticated"
1274
1317
  msgstr ""
1275
1318
 
@@ -1330,11 +1373,11 @@ msgstr ""
1330
1373
  msgid "Archived"
1331
1374
  msgstr ""
1332
1375
 
1333
- #: udata/harvest/backends/dcat.py:414
1376
+ #: udata/harvest/backends/dcat.py:431
1334
1377
  msgid "Remote URL prefix"
1335
1378
  msgstr ""
1336
1379
 
1337
- #: udata/harvest/backends/dcat.py:417
1380
+ #: udata/harvest/backends/dcat.py:434
1338
1381
  msgid "A prefix used to build the remote URL of the harvested items."
1339
1382
  msgstr ""
1340
1383
 
@@ -1354,6 +1397,18 @@ msgstr ""
1354
1397
  msgid "A CKAN tag name"
1355
1398
  msgstr ""
1356
1399
 
1400
+ #: udata/templates/404.html:6
1401
+ msgid "Page not found"
1402
+ msgstr ""
1403
+
1404
+ #: udata/templates/404.html:39
1405
+ msgid "The page you are looking for does not exist."
1406
+ msgstr ""
1407
+
1408
+ #: udata/templates/404.html:40
1409
+ msgid "Back to home"
1410
+ msgstr ""
1411
+
1357
1412
  #: udata/templates/admin.html:7
1358
1413
  msgid "Admin"
1359
1414
  msgstr ""
@@ -1777,18 +1832,19 @@ msgstr ""
1777
1832
  msgid "Expect a \"Target\" class but \"Wrong\" was found"
1778
1833
  msgstr ""
1779
1834
 
1780
- #: udata/tests/search/test_adapter.py:30
1835
+ #: udata/tests/search/test_adapter.py:31
1781
1836
  msgid "Never reused"
1782
1837
  msgstr ""
1783
1838
 
1784
- #: udata/tests/search/test_adapter.py:31
1839
+ #: udata/tests/search/test_adapter.py:32
1785
1840
  msgid "Little reused"
1786
1841
  msgstr ""
1787
1842
 
1788
- #: udata/tests/search/test_adapter.py:32
1843
+ #: udata/tests/search/test_adapter.py:33
1789
1844
  msgid "Quite reused"
1790
1845
  msgstr ""
1791
1846
 
1792
- #: udata/tests/search/test_adapter.py:33
1847
+ #: udata/tests/search/test_adapter.py:34
1793
1848
  msgid "Heavily reused"
1794
1849
  msgstr ""
1850
+
udata/uris.py CHANGED
@@ -69,7 +69,13 @@ def config_for(value, key):
69
69
 
70
70
 
71
71
  def homepage_url(**kwargs) -> str:
72
- return cdata_url("/", **kwargs) or url_for("api.site", **kwargs)
72
+ # Some tests were crashing not finding the route for api.site
73
+ # while rendering a 404… Not sure why but try/except seems to fix
74
+ # this :-(
75
+ try:
76
+ return cdata_url("/", **kwargs) or url_for("api.site", **kwargs)
77
+ except Exception:
78
+ return "/"
73
79
 
74
80
 
75
81
  def cdata_url(uri: str, **kwargs) -> Optional[str]:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: udata
3
- Version: 11.1.2.dev4
3
+ Version: 11.1.2.dev6
4
4
  Summary: Open data portal
5
5
  Author-email: Opendata Team <opendatateam@data.gouv.fr>
6
6
  Maintainer-email: Opendata Team <opendatateam@data.gouv.fr>
@@ -1,6 +1,6 @@
1
1
  udata/__init__.py,sha256=U0HEYqKCLOY43O1UCVeuAb3b3SSX1pPhsJGpHJmK67k,75
2
2
  udata/api_fields.py,sha256=XI0XoM1fxO4DEzxGptOAB5SL_fJr-u58-bfQVAvzgBg,36549
3
- udata/app.py,sha256=gRQSi4Scqu6rj0czVsmBRkNM4wNRkBhY7y7NWbqY8UM,7249
3
+ udata/app.py,sha256=YSIzBCfgtqu0Ttde10rtMvavjE9qqSJhL_jy5jAdDFs,8924
4
4
  udata/assets.py,sha256=H5Hrc2vnKM0IFLyWfLXmJ2Kj35w1i8W1D8Cgy8_cUj4,657
5
5
  udata/cors.py,sha256=gPTIXnO5nWziCKAHqU9GNuBKaIzr7RRtbjZBd2RdE2k,3155
6
6
  udata/entrypoints.py,sha256=mbAAUVT8ZenzSYdang2PbAwZcK1pENtA3axBmPRiWCw,2717
@@ -17,7 +17,7 @@ udata/tags.py,sha256=ydq4uokd6bzdeGVSpEXASVtGvDfO2LfQs9mptvvKJCM,631
17
17
  udata/tasks.py,sha256=Sv01dhvATtq_oHOBp3J1j1VT1HQe0Pab7zxwIeIdKoo,5122
18
18
  udata/terms.md,sha256=nFx978tUQ3vTEv6POykXaZvcQ5e_gcvmO4ZgcfbSWXo,187
19
19
  udata/tracking.py,sha256=WOcqA1RlHN8EPFuEc2kNau54mec4-pvi-wUFrMXevzg,345
20
- udata/uris.py,sha256=1wOrsxu6lmZJ1h4634kNHjqOjaOO0D5cIWKF_v_Gtn4,4264
20
+ udata/uris.py,sha256=eIu41ZvHg124fL2aBZ49ye4gMmBSChrLBDZMdz-MbLg,4471
21
21
  udata/utils.py,sha256=mtosjF91SPuSM-63EyxjLLnxs5DT0iSBdz-ECNeTYGU,11128
22
22
  udata/worker.py,sha256=K-Wafye5-uXP4kQlffRKws2J9YbJ6m6n2QjcVsY8Nsg,118
23
23
  udata/wsgi.py,sha256=MY8en9K9eDluvJYUxTdzqSDoYaDgCVZ69ZcUvxAvgqA,77
@@ -94,7 +94,7 @@ udata/core/dataservices/tasks.py,sha256=fHG1r5ymfJRXJ_Lug6je3VKZoK30XKXE2rQ8x0R-
94
94
  udata/core/dataset/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
95
95
  udata/core/dataset/actions.py,sha256=mX6xox0PiMrbcAPZ3VZsI26rfM-ciYfEXxN6sqqImKA,1222
96
96
  udata/core/dataset/activities.py,sha256=eGxMUnC47YHxTgcls6igQ3qP7cYgwFtPfj0asCylGsI,3315
97
- udata/core/dataset/api.py,sha256=0ozz7GNRD8JjIr55UkC474sQ9oV3v5hpO2EX98xSxlI,35858
97
+ udata/core/dataset/api.py,sha256=jnMaDcFTmm0Wod0ff7qlichwAf87tmUXK02I5H7ai_E,35880
98
98
  udata/core/dataset/api_fields.py,sha256=FaLANuLCtD5Q8-QXs-r7kG5iDTDL7UA4ZFML-e9rCk4,18055
99
99
  udata/core/dataset/apiv2.py,sha256=ZRKYnF9QCv2cHEHea6JYbbwwCzvzA8csrFOMHNN4PAk,21019
100
100
  udata/core/dataset/commands.py,sha256=__hPAk_6iHtgMnEG51ux0vbNWJHxUjXhi1ukH4hF5jY,3714
@@ -236,7 +236,7 @@ udata/core/tags/csv.py,sha256=lfFGt596-f_rdBedhVqZLZHdW69pDfcU2_YTFcXjmWM,290
236
236
  udata/core/tags/models.py,sha256=xzBoNwqBG5A5Ou83DWT858ccbTCkNnim_xBWgy1oyz4,550
237
237
  udata/core/tags/tasks.py,sha256=QBIhdubFxTzYgKxR2BdpD7yAEvaemOpt_G19OuzQvZE,952
238
238
  udata/core/topic/__init__.py,sha256=ukZuuCjuQNEPxiw1jkphohAVJtdDqWGDi-cAb2QdpRo,23
239
- udata/core/topic/activities.py,sha256=tkZ9Njskm7KF0PPBwQlktv90o6MSkmLRwLBOr-Txn_0,2866
239
+ udata/core/topic/activities.py,sha256=jMGm8ke0y0bbis3sQWhfqVLgxmTL9A2EpHDie8VQ_oU,2950
240
240
  udata/core/topic/api_fields.py,sha256=zMjoTSoe7-Q8F-i7Ry5EAUv-ds4Lzao3jfETZq-Vg00,3343
241
241
  udata/core/topic/apiv2.py,sha256=WVyZDNew8m0qVFn9RLKW0SeLQHuUwWIcGAfomzua7sw,6449
242
242
  udata/core/topic/factories.py,sha256=Rhx12aTrYFZScu53IhYNP0zJKfiVZPba34ybZ7gGSwo,3010
@@ -551,6 +551,7 @@ udata/static/chunks/9.033d7e190ca9e226a5d0.js,sha256=NmyhScUINZKQbc3A-zIZr9vEGy5
551
551
  udata/static/chunks/9.033d7e190ca9e226a5d0.js.map,sha256=n08Lnx4NZFACwgehhaZfstLOnqDam_IUQhNLlUjMEVo,2746303
552
552
  udata/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
553
553
  udata/storage/s3.py,sha256=enxbTm1IZksiKLkbafASrO2bqO44OTCn4F7_FeMjhgg,1557
554
+ udata/templates/404.html,sha256=1N3gFGvwhUgBzwx4_e946T0aAsBwtg3cvbClViuFuVI,1140
554
555
  udata/templates/admin.html,sha256=RfX03rUOW7NIlgMYNhFfx0pL-p2j8BtAKvEFUadaIIs,787
555
556
  udata/templates/base.html,sha256=koUdFLRXLhjBZEfjkotrgmoz_L5tJm1KXBwPPaYlmMs,570
556
557
  udata/templates/raw.html,sha256=DJZUq9CP_8ky20fialo5w_-zjfEwczLbkcrfQdlqb9E,560
@@ -657,7 +658,7 @@ udata/tests/api/test_auth_api.py,sha256=OMRlY0OQt60j5N4A-N3HdWTuffOjRlFHkz5a3jJF
657
658
  udata/tests/api/test_base_api.py,sha256=2w_vz0eEuq3P3aN-ByvxGc3VZAo7XtgatFfcrzf2uEU,2244
658
659
  udata/tests/api/test_contact_points.py,sha256=Sbb486RTN7HVycna_XB60OnURPSNc7xUity26XsYA4k,8766
659
660
  udata/tests/api/test_dataservices_api.py,sha256=vQZc8gey1zTckaWuqodXHJ95jp0O5ksVLllE1n3iqoE,31496
660
- udata/tests/api/test_datasets_api.py,sha256=21Wr5KfWMi0hoQgT00pqSPrmzR3LiT5K-lUJLoVu4Y8,102077
661
+ udata/tests/api/test_datasets_api.py,sha256=K4X2jXmmCF2BLz9oQmJE1PtQkpghFfzx2cb67MA5cn0,102546
661
662
  udata/tests/api/test_fields.py,sha256=OW85Z5MES5HeWOpapeem8OvR1cIcrqW-xMWpdZO4LZ8,1033
662
663
  udata/tests/api/test_follow_api.py,sha256=4nFXG5pZ_Hf2PJ4KEdHJX_uggjc9RpB8v0fidkAcw9I,5792
663
664
  udata/tests/api/test_me_api.py,sha256=YPd8zmR3zwJKtpSqz8nY1nOOMyXs66INeBwyhg5D0Us,13846
@@ -673,7 +674,7 @@ udata/tests/apiv2/test_datasets.py,sha256=-DhQUE895P0YS3zNgsSSmA-fcfeKJIxxHmQFS4
673
674
  udata/tests/apiv2/test_me_api.py,sha256=WgUjujSnIlISUkM5t-lfg-D0mmz-eX1hSsSwjuxqbJg,1417
674
675
  udata/tests/apiv2/test_organizations.py,sha256=os_43s-coSRqjgY-5fAjSiRlB3g2685u7d-Es0aOhks,6390
675
676
  udata/tests/apiv2/test_swagger.py,sha256=RKedaq-2UeyEuxlmUaAN7pmEe-lQYYmpDUVc8HF3CH4,785
676
- udata/tests/apiv2/test_topics.py,sha256=AclDo8q6bT7MZZqMP9Y16TDCYcLnU1tHz4j78DVJ18c,37457
677
+ udata/tests/apiv2/test_topics.py,sha256=xp_PMDecuTDDDOHVjX--GrnTNr76VFcZg_3sYdZlXuI,37987
677
678
  udata/tests/cli/test_cli_base.py,sha256=0a3U_5ROp1lCTG8d6TpCjF4nbKVNerAeLO0VxU-NTUk,321
678
679
  udata/tests/cli/test_db_cli.py,sha256=xFVHQAk2bmQQzFr31TK2JThOP6p0wvxzexMhM_IcdME,2219
679
680
  udata/tests/contact_point/test_contact_point_models.py,sha256=b8vraZPPrs9LeQMWLnOCrpI02sXMEM_BcMJXKTeAuAw,923
@@ -714,6 +715,7 @@ udata/tests/forms/test_uuid_field.py,sha256=256hFDZSWBeoRQuKIAF5RBt4hAKssSHFVAqM
714
715
  udata/tests/frontend/__init__.py,sha256=mFRcaFV6kFGorzrBzfm5Idx9l94XWY41r6j8r4AkmWA,787
715
716
  udata/tests/frontend/test_auth.py,sha256=zFnzTKtE0LJ4I4al7TTvlroDe2P7rgWisRE-LNAA9O0,785
716
717
  udata/tests/frontend/test_csv.py,sha256=GK893EnLXtRJr8h8L-50ZxkpvOfLXcrUyHHj3mMMnQk,11769
718
+ udata/tests/frontend/test_error_handlers.py,sha256=OkbMEPv9uyR9MYVHs86Qqom6uY-7L7yAOeamdwsV3XE,3003
717
719
  udata/tests/frontend/test_hooks.py,sha256=rPDzxWDz6Ryv3RkRLm37F4Zp9xdcbgq0OyzCCInaG2I,4077
718
720
  udata/tests/frontend/test_markdown.py,sha256=RKbSdQxQBgzxmG6KUXc1KcEo5aybp4uQQn1oDr-zKWU,13823
719
721
  udata/tests/metrics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -749,7 +751,7 @@ udata/tests/workers/test_jobs_commands.py,sha256=tGJp9zRxKaGszNhKAVe-xY86v6NhLmF
749
751
  udata/tests/workers/test_tasks_routing.py,sha256=m7Zu9X7GW3oKkSDcHM-dC20Vba3Fruui44bMBVU1dcc,2228
750
752
  udata/tests/workers/test_workers_api.py,sha256=x8EkULR9G5TKl5WwjdVwfFEttbudpiWIYN2umETrCzY,8805
751
753
  udata/tests/workers/test_workers_helpers.py,sha256=_983ChRxas3gsjykaEpXWQUbk2qTMJgeFZpIAHTuhLk,647
752
- udata/translations/udata.pot,sha256=yOnLOOMuG4Qfxr-pSluErAz-cZ5LegWwX6Oigl03R6w,40769
754
+ udata/translations/udata.pot,sha256=mdcYOb4Rfhc9QmrTdag-or1Jhku-RSu69LgY9KLCyY8,41843
753
755
  udata/translations/ar/LC_MESSAGES/udata.mo,sha256=FVeIEIB96zq7LinTAM6pic31XgYQxYystYohOEz3Wk0,12512
754
756
  udata/translations/ar/LC_MESSAGES/udata.po,sha256=KP-dbL_etPy22mRF3NPBZ86NJxERiL0a6IbHvy3a2cE,46091
755
757
  udata/translations/de/LC_MESSAGES/udata.mo,sha256=JR1CmYE46yXQcp3EoETqSZe4ut59-u_KgkBr24PBhAw,15180
@@ -764,9 +766,9 @@ udata/translations/pt/LC_MESSAGES/udata.mo,sha256=U0abG-nBwCIoYxRZNsc4KOLeIRSqTV
764
766
  udata/translations/pt/LC_MESSAGES/udata.po,sha256=eCG35rMzYLHXyLbsnLSexS1g0N_K-WpNHqrt_8y6I4E,48590
765
767
  udata/translations/sr/LC_MESSAGES/udata.mo,sha256=IBcCAdmcvkeK7ZeRBNRI-wJ0jzWNM0eXM5VXAc1frWI,28692
766
768
  udata/translations/sr/LC_MESSAGES/udata.po,sha256=yFxHEEB4behNwQ7JnyoYheiCKLNnMS_NV4guzgyzWcE,55332
767
- udata-11.1.2.dev4.dist-info/licenses/LICENSE,sha256=V8j_M8nAz8PvAOZQocyRDX7keai8UJ9skgmnwqETmdY,34520
768
- udata-11.1.2.dev4.dist-info/METADATA,sha256=otLwcD2xvy8hSbTggtRO9uNnTvSeLpJJTm-GDL1I8tk,6723
769
- udata-11.1.2.dev4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
770
- udata-11.1.2.dev4.dist-info/entry_points.txt,sha256=v2u12qO11i2lyLNIp136WmLJ-NHT-Kew3Duu8J-AXPM,614
771
- udata-11.1.2.dev4.dist-info/top_level.txt,sha256=EF6CE6YSHd_og-8LCEA4q25ALUpWVe8D0okOLdMAE3A,6
772
- udata-11.1.2.dev4.dist-info/RECORD,,
769
+ udata-11.1.2.dev6.dist-info/licenses/LICENSE,sha256=V8j_M8nAz8PvAOZQocyRDX7keai8UJ9skgmnwqETmdY,34520
770
+ udata-11.1.2.dev6.dist-info/METADATA,sha256=Qdq5oqIISLFUZBclFMsKdj01YyJrSy6vZ_38OfOhjJQ,6723
771
+ udata-11.1.2.dev6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
772
+ udata-11.1.2.dev6.dist-info/entry_points.txt,sha256=v2u12qO11i2lyLNIp136WmLJ-NHT-Kew3Duu8J-AXPM,614
773
+ udata-11.1.2.dev6.dist-info/top_level.txt,sha256=EF6CE6YSHd_og-8LCEA4q25ALUpWVe8D0okOLdMAE3A,6
774
+ udata-11.1.2.dev6.dist-info/RECORD,,