udata 11.1.2.dev7__py3-none-any.whl → 11.1.2.dev8__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/commands/db.py CHANGED
@@ -5,7 +5,6 @@ import os
5
5
  import sys
6
6
  import traceback
7
7
  from itertools import groupby
8
- from typing import Optional
9
8
  from uuid import uuid4
10
9
 
11
10
  import click
@@ -434,8 +433,8 @@ def check_integrity(models):
434
433
  def check_duplicate_resources_ids(
435
434
  skip_duplicates_inside_dataset: bool,
436
435
  skip_duplicates_outside_dataset: bool,
437
- exclude_org: Optional[str],
438
- only_org: Optional[str],
436
+ exclude_org: str | None,
437
+ only_org: str | None,
439
438
  fix: bool,
440
439
  ):
441
440
  resources = {}
@@ -1,5 +1,4 @@
1
1
  from datetime import datetime
2
- from typing import List
3
2
 
4
3
  import mongoengine
5
4
  from bson import ObjectId
@@ -63,7 +62,7 @@ class DataservicesAtomFeedAPI(API):
63
62
  _("Latest APIs"), description=None, feed_url=request.url, link=request.url_root
64
63
  )
65
64
 
66
- dataservices: List[Dataservice] = (
65
+ dataservices: list[Dataservice] = (
67
66
  Dataservice.objects.visible().order_by("-created_at").limit(current_site.feed_size)
68
67
  )
69
68
  for dataservice in dataservices:
udata/core/dataset/api.py CHANGED
@@ -20,7 +20,6 @@ These changes might lead to backward compatibility breakage meaning:
20
20
  import logging
21
21
  import os
22
22
  from datetime import datetime
23
- from typing import List
24
23
 
25
24
  import mongoengine
26
25
  from bson.objectid import ObjectId
@@ -332,7 +331,7 @@ class DatasetsAtomFeedAPI(API):
332
331
  link=request.url_root,
333
332
  )
334
333
 
335
- datasets: List[Dataset] = (
334
+ datasets: list[Dataset] = (
336
335
  Dataset.objects.visible().order_by("-created_at_internal").limit(current_site.feed_size)
337
336
  )
338
337
  for dataset in datasets:
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from abc import ABC, abstractmethod
4
- from typing import TYPE_CHECKING, Optional
4
+ from typing import TYPE_CHECKING
5
5
 
6
6
  from flask import current_app
7
7
 
@@ -12,12 +12,12 @@ if TYPE_CHECKING:
12
12
  # Define an abstract class
13
13
  class Preview(ABC):
14
14
  @abstractmethod
15
- def preview_url(self, resource: Resource) -> Optional[str]:
15
+ def preview_url(self, resource: Resource) -> str | None:
16
16
  return None
17
17
 
18
18
 
19
19
  class TabularAPIPreview(Preview):
20
- def preview_url(self, resource: Resource) -> Optional[str]:
20
+ def preview_url(self, resource: Resource) -> str | None:
21
21
  preview_base_url = current_app.config["TABULAR_EXPLORE_URL"]
22
22
  if not preview_base_url:
23
23
  return None
udata/core/dataset/rdf.py CHANGED
@@ -6,7 +6,6 @@ import calendar
6
6
  import json
7
7
  import logging
8
8
  from datetime import date, datetime
9
- from typing import Optional
10
9
 
11
10
  from dateutil.parser import parse as parse_dt
12
11
  from flask import current_app
@@ -102,9 +101,7 @@ EU_RDF_REQUENCIES = {
102
101
  }
103
102
 
104
103
 
105
- def temporal_to_rdf(
106
- daterange: db.DateRange, graph: Optional[Graph] = None
107
- ) -> Optional[RdfResource]:
104
+ def temporal_to_rdf(daterange: db.DateRange, graph: Graph | None = None) -> RdfResource | None:
108
105
  if not daterange:
109
106
  return
110
107
  graph = graph or Graph(namespace_manager=namespace_manager)
@@ -117,13 +114,13 @@ def temporal_to_rdf(
117
114
  return pot
118
115
 
119
116
 
120
- def frequency_to_rdf(frequency: str, graph: Optional[Graph] = None) -> Optional[str]:
117
+ def frequency_to_rdf(frequency: str, graph: Graph | None = None) -> str | None:
121
118
  if not frequency:
122
119
  return
123
120
  return RDF_FREQUENCIES.get(frequency, getattr(FREQ, frequency))
124
121
 
125
122
 
126
- def owner_to_rdf(dataset: Dataset, graph: Optional[Graph] = None) -> Optional[RdfResource]:
123
+ def owner_to_rdf(dataset: Dataset, graph: Graph | None = None) -> RdfResource | None:
127
124
  from udata.core.organization.rdf import organization_to_rdf
128
125
  from udata.core.user.rdf import user_to_rdf
129
126
 
@@ -134,7 +131,7 @@ def owner_to_rdf(dataset: Dataset, graph: Optional[Graph] = None) -> Optional[Rd
134
131
  return
135
132
 
136
133
 
137
- def detect_ogc_service(resource: Resource) -> Optional[str]:
134
+ def detect_ogc_service(resource: Resource) -> str | None:
138
135
  """
139
136
  Detect if the resource points towards an OGC Service based on either
140
137
  * a known OGC Service format
@@ -153,8 +150,8 @@ def detect_ogc_service(resource: Resource) -> Optional[str]:
153
150
  def ogc_service_to_rdf(
154
151
  dataset: Dataset,
155
152
  resource: Resource,
156
- ogc_service_type: Optional[str] = None,
157
- graph: Optional[Graph] = None,
153
+ ogc_service_type: str | None = None,
154
+ graph: Graph | None = None,
158
155
  is_hvd: bool = False,
159
156
  ) -> RdfResource:
160
157
  """
@@ -196,8 +193,8 @@ def ogc_service_to_rdf(
196
193
 
197
194
  def resource_to_rdf(
198
195
  resource: Resource,
199
- dataset: Optional[Dataset] = None,
200
- graph: Optional[Graph] = None,
196
+ dataset: Dataset | None = None,
197
+ graph: Graph | None = None,
201
198
  is_hvd: bool = False,
202
199
  ) -> RdfResource:
203
200
  """
@@ -261,7 +258,7 @@ def dataset_to_graph_id(dataset: Dataset) -> URIRef | BNode:
261
258
  return BNode()
262
259
 
263
260
 
264
- def dataset_to_rdf(dataset: Dataset, graph: Optional[Graph] = None) -> RdfResource:
261
+ def dataset_to_rdf(dataset: Dataset, graph: Graph | None = None) -> RdfResource:
265
262
  """
266
263
  Map a dataset domain model to a DCAT/RDF graph
267
264
  """
@@ -1,7 +1,6 @@
1
1
  import logging
2
2
  from collections import OrderedDict
3
3
  from datetime import datetime, timedelta
4
- from typing import Dict, List, Union
5
4
  from urllib.parse import urlencode
6
5
 
7
6
  import requests
@@ -14,13 +13,13 @@ from pymongo.command_cursor import CommandCursor
14
13
  log = logging.getLogger(__name__)
15
14
 
16
15
 
17
- def get_last_13_months() -> List[str]:
16
+ def get_last_13_months() -> list[str]:
18
17
  dstart = datetime.today().replace(day=1) - timedelta(days=365)
19
18
  months = rrule(freq=MONTHLY, count=13, dtstart=dstart)
20
19
  return [month.strftime("%Y-%m") for month in months]
21
20
 
22
21
 
23
- def compute_monthly_metrics(metrics_data: List[Dict], metrics_labels: List[str]) -> OrderedDict:
22
+ def compute_monthly_metrics(metrics_data: list[dict], metrics_labels: list[str]) -> OrderedDict:
24
23
  # Initialize default monthly_metrics
25
24
  monthly_metrics = OrderedDict(
26
25
  (month, {label: 0 for label in metrics_labels}) for month in get_last_13_months()
@@ -35,7 +34,7 @@ def compute_monthly_metrics(metrics_data: List[Dict], metrics_labels: List[str])
35
34
  return monthly_metrics
36
35
 
37
36
 
38
- def metrics_by_label(monthly_metrics: Dict, metrics_labels: List[str]) -> List[OrderedDict]:
37
+ def metrics_by_label(monthly_metrics: dict, metrics_labels: list[str]) -> list[OrderedDict]:
39
38
  metrics_by_label = []
40
39
  for label in metrics_labels:
41
40
  metrics_by_label.append(
@@ -45,8 +44,8 @@ def metrics_by_label(monthly_metrics: Dict, metrics_labels: List[str]) -> List[O
45
44
 
46
45
 
47
46
  def get_metrics_for_model(
48
- model: str, id: Union[str, ObjectId, None], metrics_labels: List[str]
49
- ) -> List[OrderedDict]:
47
+ model: str, id: str | ObjectId | None, metrics_labels: list[str]
48
+ ) -> list[OrderedDict]:
50
49
  """
51
50
  Get distant metrics for a particular model object
52
51
  """
@@ -69,7 +68,7 @@ def get_metrics_for_model(
69
68
  return [{} for _ in range(len(metrics_labels))]
70
69
 
71
70
 
72
- def get_download_url(model: str, id: Union[str, ObjectId, None]) -> str:
71
+ def get_download_url(model: str, id: str | ObjectId | None) -> str:
73
72
  api_namespace = model + "s" if model != "site" else model
74
73
  base_url = f"{current_app.config['METRICS_API']}/{api_namespace}/data/csv/"
75
74
  args = {"metric_month__sort": "asc"}
@@ -1,7 +1,6 @@
1
1
  import logging
2
2
  import time
3
3
  from functools import wraps
4
- from typing import Dict, List
5
4
 
6
5
  import requests
7
6
  from flask import current_app
@@ -17,9 +16,7 @@ log = logging.getLogger(__name__)
17
16
  def log_timing(func):
18
17
  @wraps(func)
19
18
  def timeit_wrapper(*args, **kwargs):
20
- # Better log if we're using Python 3.9
21
- name = func.__name__
22
- model = name.removeprefix("update_") if hasattr(name, "removeprefix") else name
19
+ model = func.__name__.removeprefix("update_")
23
20
 
24
21
  log.info(f"Processing {model}…")
25
22
  start_time = time.perf_counter()
@@ -31,7 +28,7 @@ def log_timing(func):
31
28
  return timeit_wrapper
32
29
 
33
30
 
34
- def save_model(model: db.Document, model_id: str, metrics: Dict[str, int]) -> None:
31
+ def save_model(model: db.Document, model_id: str, metrics: dict[str, int]) -> None:
35
32
  try:
36
33
  result = model.objects(id=model_id).update(
37
34
  **{f"set__metrics__{key}": value for key, value in metrics.items()}
@@ -43,7 +40,7 @@ def save_model(model: db.Document, model_id: str, metrics: Dict[str, int]) -> No
43
40
  log.exception(e)
44
41
 
45
42
 
46
- def iterate_on_metrics(target: str, value_keys: List[str], page_size: int = 50) -> dict:
43
+ def iterate_on_metrics(target: str, value_keys: list[str], page_size: int = 50) -> dict:
47
44
  """
48
45
  Yield all elements with not zero values for the keys inside `value_keys`.
49
46
  If you pass ['visit', 'download_resource'], it will do a `OR` and get
udata/core/post/api.py CHANGED
@@ -1,5 +1,4 @@
1
1
  from datetime import datetime
2
- from typing import List
3
2
 
4
3
  from feedgenerator.django.utils.feedgenerator import Atom1Feed
5
4
  from flask import make_response, request
@@ -122,7 +121,7 @@ class PostsAtomFeedAPI(API):
122
121
  link=request.url_root,
123
122
  )
124
123
 
125
- posts: List[Post] = Post.objects().published().order_by("-published").limit(15)
124
+ posts: list[Post] = Post.objects().published().order_by("-published").limit(15)
126
125
  for post in posts:
127
126
  feed.add_item(
128
127
  post.name,
udata/core/reuse/api.py CHANGED
@@ -1,5 +1,4 @@
1
1
  from datetime import datetime
2
- from typing import List
3
2
 
4
3
  import mongoengine
5
4
  from bson.objectid import ObjectId
@@ -144,7 +143,7 @@ class ReusesAtomFeedAPI(API):
144
143
  link=request.url_root,
145
144
  )
146
145
 
147
- reuses: List[Reuse] = Reuse.objects.visible().order_by("-created_at").limit(15)
146
+ reuses: list[Reuse] = Reuse.objects.visible().order_by("-created_at").limit(15)
148
147
  for reuse in reuses:
149
148
  author_name = None
150
149
  author_uri = None
udata/core/user/api.py CHANGED
@@ -1,5 +1,3 @@
1
- from typing import Optional
2
-
3
1
  from flask_security import current_user, logout_user
4
2
  from slugify import slugify
5
3
 
@@ -370,7 +368,7 @@ suggest_parser.add_argument(
370
368
  )
371
369
 
372
370
 
373
- def suggest_size(value: str) -> Optional[int]:
371
+ def suggest_size(value: str) -> int | None:
374
372
  """Parse an integer that must be between 1 and 20."""
375
373
  help_message = "The size must be an integer between 1 and 20."
376
374
  try:
@@ -3,7 +3,6 @@ This migration keeps only the "Local authority" badge if the organization also h
3
3
  """
4
4
 
5
5
  import logging
6
- from typing import List
7
6
 
8
7
  from mongoengine.connection import get_db
9
8
 
@@ -84,7 +83,7 @@ def migrate(db):
84
83
  )
85
84
  log.info(f"\t{count.modified_count} open dataservices to DATASERVICE_ACCESS_TYPE_OPEN")
86
85
 
87
- dataservices: List[Dataservice] = get_db().dataservice.find()
86
+ dataservices: list[Dataservice] = get_db().dataservice.find()
88
87
  for dataservice in dataservices:
89
88
  if (
90
89
  "endpoint_description_url" not in dataservice
udata/uris.py CHANGED
@@ -1,5 +1,4 @@
1
1
  import re
2
- from typing import Optional
3
2
  from urllib.parse import urlencode, urljoin, urlparse, urlunparse
4
3
 
5
4
  from flask import current_app, url_for
@@ -78,7 +77,7 @@ def homepage_url(**kwargs) -> str:
78
77
  return "/"
79
78
 
80
79
 
81
- def cdata_url(uri: str, **kwargs) -> Optional[str]:
80
+ def cdata_url(uri: str, **kwargs) -> str | None:
82
81
  base_url = current_app.config["CDATA_BASE_URL"]
83
82
  if not base_url:
84
83
  return None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: udata
3
- Version: 11.1.2.dev7
3
+ Version: 11.1.2.dev8
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>
@@ -17,13 +17,12 @@ Classifier: Operating System :: OS Independent
17
17
  Classifier: Intended Audience :: Developers
18
18
  Classifier: Topic :: System :: Software Distribution
19
19
  Classifier: Programming Language :: Python :: 3
20
- Classifier: Programming Language :: Python :: 3.9
21
- Classifier: Programming Language :: Python :: 3.10
22
20
  Classifier: Programming Language :: Python :: 3.11
23
21
  Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
24
23
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
25
24
  Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
26
- Requires-Python: <3.14,>=3.9
25
+ Requires-Python: <3.14,>=3.11
27
26
  Description-Content-Type: text/markdown
28
27
  License-File: LICENSE
29
28
  Requires-Dist: amqp==5.3.1
@@ -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=eIu41ZvHg124fL2aBZ49ye4gMmBSChrLBDZMdz-MbLg,4471
20
+ udata/uris.py,sha256=u05ltyLv4ZolaNMbq58kcLizMXWC10mRpJFYzChUHJU,4440
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
@@ -38,7 +38,7 @@ udata/auth/password_validation.py,sha256=ODVdEsiXbtq_8ws4Yf3hs5Sq7jz-IDa1RxAm_WP
38
38
  udata/auth/views.py,sha256=5YfDJ28aJBVIep0nf1WhoboL4J3QEW-QqeLo6Zcp_d8,5742
39
39
  udata/commands/__init__.py,sha256=Won_rW_hIU9TA3o4oNe6kI46l1fnDBM_oW0Hc1XS9F8,7711
40
40
  udata/commands/cache.py,sha256=bLdrf_fCWFYX9ULlL2ADsZRwijkI4pArsJxfx24OivM,341
41
- udata/commands/db.py,sha256=-Hjjm4aqr8CJQr7Gy3tHDYrKkmITOZKlAeTJu95iHFQ,20460
41
+ udata/commands/db.py,sha256=OyVBcuSIqYqNywlZAi19F2yRJCAIdFKKyQ9H9alqbfI,20426
42
42
  udata/commands/dcat.py,sha256=f6jT2AGZem-w1CaRH_ahfWB9A4oCDvjG13tPmBpeCqw,3910
43
43
  udata/commands/fixtures.py,sha256=Mo_Q0tARawiUK3ZidWlJLrO8uvqnSYcg_OeWMzCwkvk,11376
44
44
  udata/commands/images.py,sha256=0rVojLik5DYgJ6W4uNEfMP2g2QUU2V761tj3z6lo8no,2050
@@ -81,7 +81,7 @@ udata/core/contact_point/forms.py,sha256=oBe1agSJFyx2QRgYzPRg2A7qVscaBTaKG4V-AyI
81
81
  udata/core/contact_point/models.py,sha256=Xqmqg7S13gcaKxiQT52WHeQEHTaUDDGIXInXyqNh4Po,854
82
82
  udata/core/dataservices/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
83
  udata/core/dataservices/activities.py,sha256=wcYQCyYpKciCz99VqQqKti72a5Fyhc-AvDZBWdF0KUc,1763
84
- udata/core/dataservices/api.py,sha256=ePUW34ZVlVM6Rv-4xB9o7l2gWx1Lj3igSr8AeBcTN5Y,10053
84
+ udata/core/dataservices/api.py,sha256=DCtrn9MiJWJ6w9R-mTlVURZWH77JG2VIcWTvxaIteyg,10029
85
85
  udata/core/dataservices/apiv2.py,sha256=pd4UWF6m7pQ5nmBRFmeiDyedhZSngz211to6qTscVsA,1205
86
86
  udata/core/dataservices/constants.py,sha256=SxetyqvbWQlb-T9Bqn7mdfzV3vS-is7s56rzmGzTXY0,1029
87
87
  udata/core/dataservices/csv.py,sha256=HWI2JrN_Vuw0te9FHlJ6eyqcRcKHOKXuzg45D4Ti6F0,1106
@@ -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=jnMaDcFTmm0Wod0ff7qlichwAf87tmUXK02I5H7ai_E,35880
97
+ udata/core/dataset/api.py,sha256=7l0g8r11i08JJ8t25TsHTC_NISSFg6lujaKmhM51rew,35856
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
@@ -107,8 +107,8 @@ udata/core/dataset/forms.py,sha256=Hf5IEViazhxSTAXoZb5IfQ_AGJqlEjQyh8n4QVh3PPs,6
107
107
  udata/core/dataset/metrics.py,sha256=s8Xs_rqRXfNWsErkiJTuRMG5o_cU5iSK8mUJFKVSc7w,1204
108
108
  udata/core/dataset/models.py,sha256=h-r2hDybxtvpuozlh8mEQncjRbWyrMUNjqHZUhHnKMU,44338
109
109
  udata/core/dataset/permissions.py,sha256=zXQ6kU-Ni3Pl5tDtat-ZPupug9InsNeCN7xRLc2Vcrc,1097
110
- udata/core/dataset/preview.py,sha256=qXmd4-nKvIPtcKLrMqC-aJne4-vMIiq_NubpX39D6I0,855
111
- udata/core/dataset/rdf.py,sha256=zMKiN_PNT2DafREi1rbTY5VZOLdtpPrmp8Rs7DS-Ehw,31336
110
+ udata/core/dataset/preview.py,sha256=uFEpK-p5nIAlY8hVOMhd7mtkwFt6C_PQRMNxPvAyoo4,839
111
+ udata/core/dataset/rdf.py,sha256=YaqPkCDYCk8YUaqX4ir7MkDnW07SrHCKib1bwnEBf5o,31266
112
112
  udata/core/dataset/recommendations.py,sha256=DlGSLU8D0nW6Ds1rjBav1WxC-0VW5yOCjkO5w-ltFcI,7171
113
113
  udata/core/dataset/search.py,sha256=0reOKadjjqeL9ujOAGfiVBFBX5lx7vHotDbvaWPaUN0,6068
114
114
  udata/core/dataset/signals.py,sha256=WN4sV-lJlNsRkhcnhoy0SYJvCoYmK_5QFYZd1u-h4gs,161
@@ -141,10 +141,10 @@ udata/core/jobs/forms.py,sha256=B-B6jXHZsYV-PWAkD8DLoOlh6trv4l1hGZ4HOPm-PD4,1495
141
141
  udata/core/jobs/models.py,sha256=xK8T3FCmhtERNbZmh1Tq_ZTO6vojM172tTc0oplNoQ0,1358
142
142
  udata/core/metrics/__init__.py,sha256=eCmFPBR01Np6iEoz5n8dkfkCPGeCpPGTBT0kJ0SfpTw,444
143
143
  udata/core/metrics/commands.py,sha256=JmEBsjmvQl0W32g4m_n7OdtB3zcAvcMCvlzJa0DzZJ4,6191
144
- udata/core/metrics/helpers.py,sha256=AJJouc5QLd6dtHXltGQPxTOYg7IqkgBfU3Kcpb9KwKU,4418
144
+ udata/core/metrics/helpers.py,sha256=DRefxJfpePuDcWmV7b-gaNE6tjEcttQaWmKpYNBSECM,4370
145
145
  udata/core/metrics/models.py,sha256=Sv2Qhmqdug_atfDc_pyOJCb-8ACpvU-_0FFVPVOFDGk,353
146
146
  udata/core/metrics/signals.py,sha256=9mdJW__gR2GJT3huBr6HN2SDhKYJRgNbW9dnh48cAnU,176
147
- udata/core/metrics/tasks.py,sha256=jpO8gDY6Z7puMeuaCKEdsU_I8V_6JDeoX2UimOQyl74,5103
147
+ udata/core/metrics/tasks.py,sha256=5hVSvBFF2-k_MZGn1XrzEWLgRp3TlrZJtPjX1Y_niS4,4963
148
148
  udata/core/organization/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
149
149
  udata/core/organization/activities.py,sha256=Mw4-R8Q6G745IZnCDgrj7h2ax2crGYRhZtcewSK6_Ok,1213
150
150
  udata/core/organization/api.py,sha256=rfEGVsr64cfUEEN8zFA6xvDod8Chh-GOqRbuJ8cbaIM,22139
@@ -169,7 +169,7 @@ udata/core/pages/models.py,sha256=oRZFNsyHnsqFBXOJCgJah5MKL29Nh9Wm4FELtwsWuMM,26
169
169
  udata/core/pages/permissions.py,sha256=TK3DKBxacwhn6gLc70JzUN9OsVwInxTvz6GWxrKBeEY,155
170
170
  udata/core/pages/tests/test_api.py,sha256=dMhsfoqGsNpW30X7gKSeP0GyhQzptVkwoKq8WqO98-A,3289
171
171
  udata/core/post/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
172
- udata/core/post/api.py,sha256=vZ83TXbD3sOmaXF9yKXaSIJjdhpvs0kicBe_P63c6IA,7251
172
+ udata/core/post/api.py,sha256=fb971D2vOtMzBB8QwufoxJ0nY6mVMfo0vGmIdBGksec,7227
173
173
  udata/core/post/constants.py,sha256=W-xjOTv0lorD-RCV0YGtK0cT_RwgYmfrC8Ff6ywH7bM,215
174
174
  udata/core/post/factories.py,sha256=lcFe3zIadG7bc1jsydkOT7GfQX53V0x09Flpclyl6gI,619
175
175
  udata/core/post/forms.py,sha256=gY4HhteFkZr3u4EoQ5QNEHMOTtNNiEKHyehVXKYcm3Y,963
@@ -183,7 +183,7 @@ udata/core/reports/constants.py,sha256=LRZSX3unyqZeB4yQjK3ws_hGbJcXYk4bu1Rhnhi5D
183
183
  udata/core/reports/models.py,sha256=xT6zSXJx8vG0c8cu4VWUQvENUwajusFlPQmenslR3lQ,2662
184
184
  udata/core/reuse/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
185
185
  udata/core/reuse/activities.py,sha256=5D7cV-hGZnzHsp8hohZqqgK3RSGQpfAqJ_Wfq_AYfM8,1420
186
- udata/core/reuse/api.py,sha256=FlR4RC1RH8BGcoyLcXX1NgOqSp2ZK4GdlN2O-6-v07M,12443
186
+ udata/core/reuse/api.py,sha256=AdmgVR8dThM1kbiiutfOjdec7kuaH7aR7vSIq_hTAks,12419
187
187
  udata/core/reuse/api_fields.py,sha256=ccym6v9Ap68PlHZmIMMtHQFnEyV7Gbxrfdw0b6rj51A,1232
188
188
  udata/core/reuse/apiv2.py,sha256=mgvL1ZBts872zNSo0Wh3AkNAh2ldzP9yQkRY3WfzGPM,944
189
189
  udata/core/reuse/constants.py,sha256=JgDBrjOKSt9q0auv9rjzbGsch83H-Oi8YXAKeI5hO4o,1215
@@ -247,7 +247,7 @@ udata/core/topic/permissions.py,sha256=RtFPPlxuU_Bv7ip6LDO4AoPrKFnIOEs9cCMXaSSmE
247
247
  udata/core/topic/tasks.py,sha256=_OrPfuZ9rKENp4p4IkoyV-Yqp9bxI3nNxhpfKrbgl-w,357
248
248
  udata/core/user/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
249
249
  udata/core/user/activities.py,sha256=d91G45XEgoxYUJetkSjVolSM-nqmNSuM5b-6geayGE4,3338
250
- udata/core/user/api.py,sha256=Ld0o7ERMYNNTT6wQu9QEQgEng3CmwikyZj9YVj7DTgU,13474
250
+ udata/core/user/api.py,sha256=DhbjrK2bote_QX45evTHWJICZ9g0vog9RXUW3S6bv1o,13442
251
251
  udata/core/user/api_fields.py,sha256=fx3rv8YmovIKJpZ8ldtcUOAWuJHEELDYa4HwdaQOAnA,5986
252
252
  udata/core/user/apiv2.py,sha256=4eNsvJjb4ChJQFrXtVbkOtAvXEcQcQpZf8vkEbriXRA,1125
253
253
  udata/core/user/commands.py,sha256=8dyowvylgYqdScgzVGgr61MWLshlS6-UopZGAMvp4zA,3539
@@ -382,7 +382,7 @@ udata/migrations/2024-10-09-remove-extras-harvest.py,sha256=cCuuUMZXcmTVhUle-sdE
382
382
  udata/migrations/2024-10-30-rename-organization-badges.py,sha256=Yu8PTayYY0m4YJJ3W7JLsQwC-PDoC6BELqFfDhG66bE,695
383
383
  udata/migrations/2024-11-19-keep-only-local_authority-if-also-public_service-organization-badges.py,sha256=xFn0nVqAh8Vee9-s8YFZHg5F-kukOr5B4fyz62G40eA,658
384
384
  udata/migrations/2024-12-05-contact-point-is-now-a-list.py,sha256=il2qSFhOTq-YhqhFaq_5OwysUlKXaK_En-qGP6v9rf0,1065
385
- udata/migrations/2025-01-05-dataservices-fields-changes.py,sha256=HlqHg3sG3rk3sYVrOwAlXMNhTmTKd1YT82P-gXOqmZM,4647
385
+ udata/migrations/2025-01-05-dataservices-fields-changes.py,sha256=Pc6vZoMwWuG_vBXL0h77Y_MxppRdzVeDdVtMbGMqXtc,4623
386
386
  udata/migrations/2025-03-20-save-quality-for-datasets.py,sha256=FPTfGVByXSHr18V4RFlktC7t-H-5rgEcZQMTRpMrGqo,607
387
387
  udata/migrations/2025-04-24-topic-featured-default-false.py,sha256=t4OyhehtPQiosKtAo9SWRWm3ObGUHvqD_roXQ34vIH4,369
388
388
  udata/migrations/2025-05-22-purge-duplicate-activities.py,sha256=iemQwEWtbxedtpkeTFIeoNP7WcY7ntnDrjUClPzzWfg,4212
@@ -766,9 +766,9 @@ udata/translations/pt/LC_MESSAGES/udata.mo,sha256=U0abG-nBwCIoYxRZNsc4KOLeIRSqTV
766
766
  udata/translations/pt/LC_MESSAGES/udata.po,sha256=eCG35rMzYLHXyLbsnLSexS1g0N_K-WpNHqrt_8y6I4E,48590
767
767
  udata/translations/sr/LC_MESSAGES/udata.mo,sha256=IBcCAdmcvkeK7ZeRBNRI-wJ0jzWNM0eXM5VXAc1frWI,28692
768
768
  udata/translations/sr/LC_MESSAGES/udata.po,sha256=yFxHEEB4behNwQ7JnyoYheiCKLNnMS_NV4guzgyzWcE,55332
769
- udata-11.1.2.dev7.dist-info/licenses/LICENSE,sha256=V8j_M8nAz8PvAOZQocyRDX7keai8UJ9skgmnwqETmdY,34520
770
- udata-11.1.2.dev7.dist-info/METADATA,sha256=aT2BW8U7BbL6ddAAw9OiOqkWBwxXcb_-11_rcllWBQ4,6723
771
- udata-11.1.2.dev7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
772
- udata-11.1.2.dev7.dist-info/entry_points.txt,sha256=v2u12qO11i2lyLNIp136WmLJ-NHT-Kew3Duu8J-AXPM,614
773
- udata-11.1.2.dev7.dist-info/top_level.txt,sha256=EF6CE6YSHd_og-8LCEA4q25ALUpWVe8D0okOLdMAE3A,6
774
- udata-11.1.2.dev7.dist-info/RECORD,,
769
+ udata-11.1.2.dev8.dist-info/licenses/LICENSE,sha256=V8j_M8nAz8PvAOZQocyRDX7keai8UJ9skgmnwqETmdY,34520
770
+ udata-11.1.2.dev8.dist-info/METADATA,sha256=3CuzRXhLp2TcLH99rdB5yBxqgckScNjqU03hvCBZCSw,6674
771
+ udata-11.1.2.dev8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
772
+ udata-11.1.2.dev8.dist-info/entry_points.txt,sha256=v2u12qO11i2lyLNIp136WmLJ-NHT-Kew3Duu8J-AXPM,614
773
+ udata-11.1.2.dev8.dist-info/top_level.txt,sha256=EF6CE6YSHd_og-8LCEA4q25ALUpWVe8D0okOLdMAE3A,6
774
+ udata-11.1.2.dev8.dist-info/RECORD,,