udata 8.0.2.dev29304__py2.py3-none-any.whl → 8.0.2.dev29339__py2.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/core/dataset/rdf.py CHANGED
@@ -22,9 +22,10 @@ from udata.frontend.markdown import parse_html
22
22
  from udata.core.dataset.models import HarvestDatasetMetadata, HarvestResourceMetadata
23
23
  from udata.models import db, ContactPoint
24
24
  from udata.rdf import (
25
- DCAT, DCT, FREQ, SCV, SKOS, SPDX, SCHEMA, EUFREQ, EUFORMAT, IANAFORMAT, VCARD, RDFS,
26
- namespace_manager, schema_from_rdf, url_from_rdf
25
+ DCAT, DCATAP, DCT, FREQ, SCV, SKOS, SPDX, SCHEMA, EUFREQ, EUFORMAT, IANAFORMAT, VCARD, RDFS,
26
+ HVD_LEGISLATION, namespace_manager, schema_from_rdf, url_from_rdf
27
27
  )
28
+ from udata.tags import slug as slugify_tag
28
29
  from udata.utils import get_by, safe_unicode
29
30
  from udata.uris import endpoint_for
30
31
 
@@ -85,6 +86,7 @@ EU_HVD_CATEGORIES = {
85
86
  "http://data.europa.eu/bna/c_dd313021": "Observation de la terre et environnement",
86
87
  "http://data.europa.eu/bna/c_e1da4e07": "Statistiques"
87
88
  }
89
+ TAG_TO_EU_HVD_CATEGORIES = {slugify_tag(EU_HVD_CATEGORIES[uri]): uri for uri in EU_HVD_CATEGORIES}
88
90
 
89
91
 
90
92
  class HTMLDetector(HTMLParser):
@@ -141,7 +143,7 @@ def owner_to_rdf(dataset, graph=None):
141
143
  return
142
144
 
143
145
 
144
- def resource_to_rdf(resource, dataset=None, graph=None):
146
+ def resource_to_rdf(resource, dataset=None, graph=None, is_hvd=False):
145
147
  '''
146
148
  Map a Resource domain model to a DCAT/RDF graph
147
149
  '''
@@ -180,6 +182,9 @@ def resource_to_rdf(resource, dataset=None, graph=None):
180
182
  checksum.add(SPDX.algorithm, getattr(SPDX, algorithm))
181
183
  checksum.add(SPDX.checksumValue, Literal(resource.checksum.value))
182
184
  r.add(SPDX.checksum, checksum)
185
+ if is_hvd:
186
+ # DCAT-AP HVD applicable legislation is also expected at the distribution level
187
+ r.add(DCATAP.applicableLegislation, URIRef(HVD_LEGISLATION))
183
188
  return r
184
189
 
185
190
 
@@ -214,11 +219,20 @@ def dataset_to_rdf(dataset, graph=None):
214
219
  if dataset.acronym:
215
220
  d.set(SKOS.altLabel, Literal(dataset.acronym))
216
221
 
222
+ # Add DCAT-AP HVD properties if the dataset is tagged hvd.
223
+ # See https://semiceu.github.io/DCAT-AP/releases/2.2.0-hvd/
224
+ is_hvd = current_app.config['HVD_SUPPORT'] and 'hvd' in dataset.tags
225
+ if is_hvd:
226
+ d.add(DCATAP.applicableLegislation, URIRef(HVD_LEGISLATION))
227
+
217
228
  for tag in dataset.tags:
218
229
  d.add(DCAT.keyword, Literal(tag))
230
+ # Add HVD category if this dataset is tagged HVD
231
+ if is_hvd and tag in TAG_TO_EU_HVD_CATEGORIES:
232
+ d.add(DCATAP.hvdCategory, URIRef(TAG_TO_EU_HVD_CATEGORIES[tag]))
219
233
 
220
234
  for resource in dataset.resources:
221
- d.add(DCAT.distribution, resource_to_rdf(resource, dataset, graph))
235
+ d.add(DCAT.distribution, resource_to_rdf(resource, dataset, graph, is_hvd))
222
236
 
223
237
  if dataset.temporal_coverage:
224
238
  d.set(DCT.temporal, temporal_to_rdf(dataset.temporal_coverage, graph))
udata/core/site/api.py CHANGED
@@ -105,7 +105,10 @@ class SiteRdfCatalogFormat(API):
105
105
  params = multi_to_dict(request.args)
106
106
  page = int(params.get('page', 1))
107
107
  page_size = int(params.get('page_size', 100))
108
- datasets = Dataset.objects.visible().paginate(page, page_size)
108
+ datasets = Dataset.objects.visible()
109
+ if 'tag' in params:
110
+ datasets = datasets.filter(tags=params.get('tag', ''))
111
+ datasets = datasets.paginate(page, page_size)
109
112
  catalog = build_catalog(current_site, datasets, format=format)
110
113
  # bypass flask-restplus make_response, since graph_response
111
114
  # is handling the content negociation directly
udata/rdf.py CHANGED
@@ -21,6 +21,7 @@ log = logging.getLogger(__name__)
21
21
  # Extra Namespaces
22
22
  ADMS = Namespace('http://www.w3.org/ns/adms#')
23
23
  DCAT = Namespace('http://www.w3.org/ns/dcat#')
24
+ DCATAP = Namespace('http://data.europa.eu/r5r/')
24
25
  HYDRA = Namespace('http://www.w3.org/ns/hydra/core#')
25
26
  SCHEMA = Namespace('http://schema.org/')
26
27
  SCV = Namespace('http://purl.org/NET/scovo#')
@@ -35,6 +36,7 @@ VCARD = Namespace('http://www.w3.org/2006/vcard/ns#')
35
36
 
36
37
  namespace_manager = NamespaceManager(Graph())
37
38
  namespace_manager.bind('dcat', DCAT)
39
+ namespace_manager.bind('dcatap', DCATAP)
38
40
  namespace_manager.bind('dct', DCT)
39
41
  namespace_manager.bind('foaf', FOAF)
40
42
  namespace_manager.bind('foaf', FOAF)
@@ -98,6 +100,8 @@ RDF_EXTENSIONS = {
98
100
  # Includes control characters, unicode surrogate characters and unicode end-of-plane non-characters
99
101
  ILLEGAL_XML_CHARS = '[\x00-\x08\x0b\x0c\x0e-\x1F\uD800-\uDFFF\uFFFE\uFFFF]'
100
102
 
103
+ HVD_LEGISLATION = 'http://data.europa.eu/eli/reg_impl/2023/138/oj'
104
+
101
105
 
102
106
  def guess_format(string):
103
107
  '''Guess format given an extension or a mime-type'''
@@ -18,11 +18,11 @@ from udata.core.dataset.factories import (
18
18
  from udata.core.dataset.rdf import (
19
19
  dataset_to_rdf, dataset_from_rdf, resource_to_rdf, resource_from_rdf,
20
20
  temporal_from_rdf, frequency_to_rdf, frequency_from_rdf,
21
- EU_RDF_REQUENCIES
21
+ EU_RDF_REQUENCIES, TAG_TO_EU_HVD_CATEGORIES
22
22
  )
23
23
  from udata.core.organization.factories import OrganizationFactory
24
24
  from udata.i18n import gettext as _
25
- from udata.rdf import DCAT, DCT, FREQ, SPDX, SCHEMA, SKOS
25
+ from udata.rdf import DCAT, DCATAP, DCT, FREQ, SPDX, SCHEMA, SKOS, HVD_LEGISLATION
26
26
  from udata.utils import faker
27
27
  from udata.tests.helpers import assert200, assert_redirects
28
28
 
@@ -181,6 +181,21 @@ class DatasetToRdfTest:
181
181
  assert str(d.identifier) == 'https://somewhere.org/dataset'
182
182
  assert d.value(DCT.identifier) == Literal('an-identifier')
183
183
 
184
+ def test_hvd_dataset(self):
185
+ '''Test that a dataset tagged hvd has appropriate DCAT-AP HVD properties'''
186
+ dataset = DatasetFactory(
187
+ resources=ResourceFactory.build_batch(3),
188
+ tags=['hvd', 'mobilite', 'test']
189
+ )
190
+ d = dataset_to_rdf(dataset)
191
+
192
+ assert d.value(DCATAP.applicableLegislation).identifier == URIRef(HVD_LEGISLATION)
193
+ assert d.value(DCATAP.hvdCategory).identifier == URIRef(
194
+ TAG_TO_EU_HVD_CATEGORIES['mobilite']
195
+ )
196
+ for distrib in d.objects(DCAT.distribution):
197
+ assert distrib.value(DCATAP.applicableLegislation).identifier == URIRef(HVD_LEGISLATION)
198
+
184
199
 
185
200
  @pytest.mark.usefixtures('clean_db')
186
201
  class RdfToDatasetTest:
@@ -228,3 +228,19 @@ class SiteRdfViewsTest:
228
228
  url = url_for('api.site_rdf_catalog_format', format='unknown')
229
229
  response = client.get(url)
230
230
  assert404(response)
231
+
232
+ def test_catalog_rdf_filter_tag(self, client):
233
+ DatasetFactory.create_batch(4, tags=['my-tag'])
234
+ DatasetFactory.create_batch(3)
235
+ url = url_for('api.site_rdf_catalog_format', format='xml', tag='my-tag')
236
+
237
+ response = client.get(url, headers={'Accept': 'application/xml'})
238
+ assert200(response)
239
+
240
+ graph = Graph().parse(data=response.data, format='xml')
241
+
242
+ datasets = list(graph.subjects(RDF.type, DCAT.Dataset))
243
+ assert len(datasets) == 4
244
+
245
+ for dat in datasets:
246
+ assert graph.value(dat, DCAT.keyword) == Literal('my-tag')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: udata
3
- Version: 8.0.2.dev29304
3
+ Version: 8.0.2.dev29339
4
4
  Summary: Open data portal
5
5
  Home-page: https://github.com/opendatateam/udata
6
6
  Author: Opendata Team
@@ -138,6 +138,7 @@ It is collectively taken care of by members of the
138
138
  ## Current (in progress)
139
139
 
140
140
  - **breaking change** Harvest backend is now sync [#3030](https://github.com/opendatateam/udata/pull/3030)
141
+ - Add DCAT-AP HVD properties in RDF output if the dataset is tagged hvd [#3050](https://github.com/opendatateam/udata/pull/3050)
141
142
  - Allow dataservices to be discussed and followed [#3049](https://github.com/opendatateam/udata/pull/3049)
142
143
  - Add purge-dataservices job [#3049](https://github.com/opendatateam/udata/pull/3049)
143
144
  - Harvest all the available polygons from a spatial coverage [#3039](https://github.com/opendatateam/udata/pull/3039)
@@ -9,7 +9,7 @@ udata/errors.py,sha256=chc1880TPGteIL-Rfb9hdeAyZI4vdWZQU3JQ_5VF5t0,116
9
9
  udata/factories.py,sha256=6en2qdHHoR6rEvNEUeH_0-T-vR7x7GUBGgNEm9vuylE,492
10
10
  udata/i18n.py,sha256=E-JoY57Cv4vgPvChkWjpwZAbuYVI8e6BO6raeu_3_Pw,8352
11
11
  udata/mail.py,sha256=dAMcbEtk5e54alpQezvF5adDrRPgdaT36QEdHD_5v50,2145
12
- udata/rdf.py,sha256=QiHcK2iklbtPkl6UFdBxTj0oaiY41en9k-kmbIVJ8Xw,9893
12
+ udata/rdf.py,sha256=0G-orRN5L3E338iXWSih6yZqlj10r-rqBqQN3f38A1U,10051
13
13
  udata/routing.py,sha256=Qhpf5p97fs1SoJXtDctc1FPk0MeOKLn_C0Z1dP4ZNJA,7234
14
14
  udata/sentry.py,sha256=KiZz0PpmYpZMvykH9UAbHpF4xBY0Q-8DeiEbXEHDUdw,2683
15
15
  udata/settings.py,sha256=hoyo2YffL6eEKn90tjtraTMmEMRKfFxiIaDyMv69HMo,17390
@@ -99,7 +99,7 @@ udata/core/dataset/forms.py,sha256=VJCsGtgzhQgLW-M-J4ObpQ8o6c_saC3TTc1Js33m3sQ,6
99
99
  udata/core/dataset/models.py,sha256=q6AknSHYNjeUyVKoFgxEA0r9lSvMa_a4tJ3fLOzL03M,36053
100
100
  udata/core/dataset/permissions.py,sha256=3F2J7le3_rEYNhh88o3hSRWHAAt01_yHJM6RPmvCrRo,1090
101
101
  udata/core/dataset/preview.py,sha256=puPKT3fBD7ezAcT6owh0JK1_rGNDFZOqgT223qGn3LY,2597
102
- udata/core/dataset/rdf.py,sha256=KOIZLqQ085CiqaPds7CA0u481zJhQHmO527CaxNXEGA,25281
102
+ udata/core/dataset/rdf.py,sha256=KGYAyZSEuPh_rz2jRsRC0VlNFn_wSNyOOTLhxL1Rvvk,26116
103
103
  udata/core/dataset/search.py,sha256=Ca23ljX7TZiKZKiAZQIH5xwS2tjXQcTDzieAJd-E22c,5314
104
104
  udata/core/dataset/signals.py,sha256=TK6dfrOUitZZkGGOh6XmhYqYvIjzZpI70JTLV4k-JRM,161
105
105
  udata/core/dataset/tasks.py,sha256=UYdm_O9hA0yo7cCNQFvZE9pGzUshkc3Wr4Gpel2aupU,8434
@@ -175,7 +175,7 @@ udata/core/reuse/search.py,sha256=I3FX-9YP_cEqw5GFwFv2iqLZExeaQXsak13RMSCN7t8,28
175
175
  udata/core/reuse/signals.py,sha256=2vv668u8miJ9t6H-FwRgXcWwsYMQem3oLNXp36rKtno,155
176
176
  udata/core/reuse/tasks.py,sha256=FgkUN6s1uTDFQgiImiOEfIMYYW984bxxDtlGK0uZ0yY,1530
177
177
  udata/core/site/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
178
- udata/core/site/api.py,sha256=8sXpE_zRAe4LFYL-R58k4VwB-qQubrE9QhNselcq1HQ,4260
178
+ udata/core/site/api.py,sha256=UXsMV8klzP5wQJazk_HfQGpckvkYddbuF8UJ5u0OBc0,4383
179
179
  udata/core/site/factories.py,sha256=8-RwP6QRCxXqWF4UHIkm2NfWRP2p8Ktc5RSY-4jgnfk,378
180
180
  udata/core/site/forms.py,sha256=lPnxm0MDhK7_ORzPgJLcCAPMj59hDrJ80gwRSW-jtIo,469
181
181
  udata/core/site/models.py,sha256=96IZHtPaMio7VMNCdP1Km_SL1GlMErwBuDqgUXfzKVY,5981
@@ -617,7 +617,7 @@ udata/tests/dataset/test_dataset_actions.py,sha256=4_0F_TCSCfHpzqDt659c8hG4GpkWj
617
617
  udata/tests/dataset/test_dataset_commands.py,sha256=TAgVdimIcBVmcSNKXKXbhmCGYRo8Keh_InBNiS6UlkM,802
618
618
  udata/tests/dataset/test_dataset_events.py,sha256=zt6F4j_vOBfMxDW6vBVQ5PGwr0d4s6LGw0cGkt9BlvI,2835
619
619
  udata/tests/dataset/test_dataset_model.py,sha256=_rvlp3j8ItvF4Dsacx0ymtTbbulrTXBafUcTVo2-N0o,29959
620
- udata/tests/dataset/test_dataset_rdf.py,sha256=2Wt4TQsJcH4w1CAFSW8H2O40Fh8hO--r3H9eSC89z7o,29388
620
+ udata/tests/dataset/test_dataset_rdf.py,sha256=KgtljY7S55oJiBLYrHG6eMxPdNpDZik7M0z28Ec9Z0U,30105
621
621
  udata/tests/dataset/test_dataset_tasks.py,sha256=BN5qcvq6753WcpPOZd7vL1iIEW36ZBZrb2Lszb4eWEM,2283
622
622
  udata/tests/dataset/test_resource_preview.py,sha256=q1C9W9dO3nLWaR3-hpUOPYW17hCmQ3raty9Bl4FX3hg,3947
623
623
  udata/tests/features/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -661,7 +661,7 @@ udata/tests/site/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,
661
661
  udata/tests/site/test_site_api.py,sha256=XIjRH-iiwKdwmX145bQflxOatfIChi5RLikIMwJSbjQ,2276
662
662
  udata/tests/site/test_site_metrics.py,sha256=Sn9dQORwe-fvoyA7ZAnF63Cq5CwUGq1myH8Xe0EtfDA,2263
663
663
  udata/tests/site/test_site_model.py,sha256=nAx9JjEKdfjdw1Kj5Rs7P5FEePoATtCuOYPiSXEnVD0,1313
664
- udata/tests/site/test_site_rdf.py,sha256=M360uq2A6hl1WhmyRmRjvzuSqz_YFIUQNPR4vqWnYnE,9687
664
+ udata/tests/site/test_site_rdf.py,sha256=NR09qJo8vmyAmtn0qQb-_nat7OyNV2fvwZTqW12BvQA,10283
665
665
  udata/tests/user/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
666
666
  udata/tests/user/test_user_rdf.py,sha256=HrKirMURUXS9N3If_NMb8qnfJ4kE9IZymR1SPcNvlF0,1851
667
667
  udata/tests/workers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -684,9 +684,9 @@ udata/translations/pt/LC_MESSAGES/udata.mo,sha256=uttB2K8VsqzkEQG-5HfTtFms_3LtV9
684
684
  udata/translations/pt/LC_MESSAGES/udata.po,sha256=8Ql1Lp7Z9KLnvp-qRxw-NhFu1p35Xj-q6Jg9JHsYhcw,43733
685
685
  udata/translations/sr/LC_MESSAGES/udata.mo,sha256=US8beNIMPxP5h-zD_jfP1TheDDd4DdRVS5UIiY5XVZ8,28553
686
686
  udata/translations/sr/LC_MESSAGES/udata.po,sha256=TM0yMDvKRljyOzgZZMlTX6OfpF6OC4Ngf_9Zc8n6ayA,50313
687
- udata-8.0.2.dev29304.dist-info/LICENSE,sha256=V8j_M8nAz8PvAOZQocyRDX7keai8UJ9skgmnwqETmdY,34520
688
- udata-8.0.2.dev29304.dist-info/METADATA,sha256=rufDqdUYqfG6w_v_xL9iHJtWli-g988Tg3va4gAqY5o,123860
689
- udata-8.0.2.dev29304.dist-info/WHEEL,sha256=DZajD4pwLWue70CAfc7YaxT1wLUciNBvN_TTcvXpltE,110
690
- udata-8.0.2.dev29304.dist-info/entry_points.txt,sha256=3SKiqVy4HUqxf6iWspgMqH8d88Htk6KoLbG1BU-UddQ,451
691
- udata-8.0.2.dev29304.dist-info/top_level.txt,sha256=39OCg-VWFWOq4gCKnjKNu-s3OwFlZIu_dVH8Gl6ndHw,12
692
- udata-8.0.2.dev29304.dist-info/RECORD,,
687
+ udata-8.0.2.dev29339.dist-info/LICENSE,sha256=V8j_M8nAz8PvAOZQocyRDX7keai8UJ9skgmnwqETmdY,34520
688
+ udata-8.0.2.dev29339.dist-info/METADATA,sha256=Fhk0bn2S4psXBb_HgCnqhrcG6kTl9lXBYBoRNcu3kLA,123989
689
+ udata-8.0.2.dev29339.dist-info/WHEEL,sha256=DZajD4pwLWue70CAfc7YaxT1wLUciNBvN_TTcvXpltE,110
690
+ udata-8.0.2.dev29339.dist-info/entry_points.txt,sha256=3SKiqVy4HUqxf6iWspgMqH8d88Htk6KoLbG1BU-UddQ,451
691
+ udata-8.0.2.dev29339.dist-info/top_level.txt,sha256=39OCg-VWFWOq4gCKnjKNu-s3OwFlZIu_dVH8Gl6ndHw,12
692
+ udata-8.0.2.dev29339.dist-info/RECORD,,