udata 7.0.6__py2.py3-none-any.whl → 7.0.6.dev28180__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.

Files changed (60) hide show
  1. udata/__init__.py +1 -1
  2. udata/commands/__init__.py +3 -0
  3. udata/commands/dcat.py +4 -7
  4. udata/core/activity/api.py +1 -1
  5. udata/core/activity/models.py +3 -4
  6. udata/core/activity/tasks.py +5 -6
  7. udata/core/dataset/factories.py +4 -2
  8. udata/core/dataset/models.py +5 -2
  9. udata/core/dataset/rdf.py +25 -65
  10. udata/core/dataset/search.py +1 -0
  11. udata/core/spatial/tests/test_api.py +10 -7
  12. udata/core/topic/factories.py +2 -2
  13. udata/harvest/backends/dcat.py +24 -128
  14. udata/harvest/tests/dcat/bnodes.xml +1 -7
  15. udata/harvest/tests/test_dcat_backend.py +9 -82
  16. udata/rdf.py +1 -22
  17. udata/search/__init__.py +2 -2
  18. udata/static/chunks/{11.a23c110811a9ac943478.js → 11.c0ccea08914b6b41568e.js} +3 -3
  19. udata/static/chunks/{11.a23c110811a9ac943478.js.map → 11.c0ccea08914b6b41568e.js.map} +1 -1
  20. udata/static/chunks/{13.0889e093f8664e38568c.js → 13.526a25163ababaa44409.js} +2 -2
  21. udata/static/chunks/{13.0889e093f8664e38568c.js.map → 13.526a25163ababaa44409.js.map} +1 -1
  22. udata/static/chunks/{16.f41599478d3e97ad9a30.js → 16.7901839b4227881947f6.js} +2 -2
  23. udata/static/chunks/{16.f41599478d3e97ad9a30.js.map → 16.7901839b4227881947f6.js.map} +1 -1
  24. udata/static/chunks/{19.2b534a26af8b17e9170b.js → 19.471d5a2a08eef6e5338a.js} +3 -3
  25. udata/static/chunks/{19.2b534a26af8b17e9170b.js.map → 19.471d5a2a08eef6e5338a.js.map} +1 -1
  26. udata/static/chunks/{5.7115454a1183e5c12eef.js → 5.534e0531d0e2b150146f.js} +3 -3
  27. udata/static/chunks/{5.7115454a1183e5c12eef.js.map → 5.534e0531d0e2b150146f.js.map} +1 -1
  28. udata/static/chunks/{6.16bb24fb8240f2746488.js → 6.e56975229e6065f68d2a.js} +3 -3
  29. udata/static/chunks/{6.16bb24fb8240f2746488.js.map → 6.e56975229e6065f68d2a.js.map} +1 -1
  30. udata/static/chunks/{9.3e752966ff14e47e11f2.js → 9.534426728626f11f4571.js} +2 -2
  31. udata/static/chunks/{9.3e752966ff14e47e11f2.js.map → 9.534426728626f11f4571.js.map} +1 -1
  32. udata/static/common.js +1 -1
  33. udata/static/common.js.map +1 -1
  34. udata/tests/api/test_datasets_api.py +45 -45
  35. udata/tests/api/test_me_api.py +14 -13
  36. udata/tests/dataset/test_dataset_actions.py +2 -2
  37. udata/tests/dataset/test_dataset_commands.py +3 -3
  38. udata/tests/dataset/test_dataset_model.py +1 -2
  39. udata/tests/organization/test_organization_model.py +3 -3
  40. udata/tests/organization/test_organization_rdf.py +3 -3
  41. udata/tests/reuse/test_reuse_model.py +2 -2
  42. udata/tests/search/test_adapter.py +12 -12
  43. udata/tests/search/test_results.py +4 -4
  44. udata/tests/site/test_site_api.py +3 -3
  45. udata/tests/site/test_site_metrics.py +3 -3
  46. udata/tests/site/test_site_rdf.py +6 -6
  47. udata/tests/test_activity.py +0 -12
  48. udata/tests/test_transfer.py +17 -18
  49. {udata-7.0.6.dist-info → udata-7.0.6.dev28180.dist-info}/METADATA +4 -10
  50. {udata-7.0.6.dist-info → udata-7.0.6.dev28180.dist-info}/RECORD +54 -60
  51. {udata-7.0.6.dist-info → udata-7.0.6.dev28180.dist-info}/entry_points.txt +0 -1
  52. udata/harvest/tests/csw_dcat/XSLT.xml +0 -4298
  53. udata/harvest/tests/csw_dcat/geonetwork-iso-page-1.xml +0 -1291
  54. udata/harvest/tests/csw_dcat/geonetwork-iso-page-3.xml +0 -1139
  55. udata/harvest/tests/csw_dcat/geonetwork-iso-page-5.xml +0 -1266
  56. udata/harvest/tests/dcat/evian.json +0 -464
  57. udata/migrations/2024-03-22-migrate-activity-kwargs-to-extras.py +0 -16
  58. {udata-7.0.6.dist-info → udata-7.0.6.dev28180.dist-info}/LICENSE +0 -0
  59. {udata-7.0.6.dist-info → udata-7.0.6.dev28180.dist-info}/WHEEL +0 -0
  60. {udata-7.0.6.dist-info → udata-7.0.6.dev28180.dist-info}/top_level.txt +0 -0
@@ -14,7 +14,7 @@ from udata.utils import clean_string
14
14
  from udata.search import reindex, as_task_param
15
15
  from udata.search.commands import index_model
16
16
  from udata.core.dataset.search import DatasetSearch
17
- from udata.core.dataset.factories import DatasetFactory, ResourceFactory, HiddenDatasetFactory
17
+ from udata.core.dataset.factories import DatasetFactory, ResourceFactory, VisibleDatasetFactory
18
18
  from udata.tests.api import APITestCase
19
19
 
20
20
  from . import FakeSearch
@@ -104,35 +104,35 @@ class SearchAdaptorTest:
104
104
  assertHasArgument(parser, 'page_size', int)
105
105
 
106
106
 
107
- @pytest.mark.options(SEARCH_SERVICE_API_URL="smtg/")
107
+ @pytest.mark.options(SEARCH_SERVICE_API_URL="smtg")
108
108
  class IndexingLifecycleTest(APITestCase):
109
109
 
110
110
  @patch('requests.delete')
111
111
  def test_producer_should_send_a_message_without_payload_if_not_indexable(self, mock_req):
112
- fake_data = HiddenDatasetFactory(id='61fd30cb29ea95c7bc0e1211')
112
+ fake_data = DatasetFactory(id='61fd30cb29ea95c7bc0e1211')
113
113
 
114
114
  reindex.run(*as_task_param(fake_data))
115
115
 
116
116
  search_service_url = current_app.config['SEARCH_SERVICE_API_URL']
117
- url = f'{search_service_url}{DatasetSearch.search_url}{str(fake_data.id)}/unindex'
117
+ url = f'{search_service_url}{DatasetSearch.search_url}/{str(fake_data.id)}/unindex'
118
118
  mock_req.assert_called_with(url)
119
119
 
120
120
  @patch('requests.post')
121
121
  def test_producer_should_send_a_message_with_payload_if_indexable(self, mock_req):
122
122
  resource = ResourceFactory(schema=Schema(url="http://localhost/my-schema"))
123
- fake_data = DatasetFactory(id='61fd30cb29ea95c7bc0e1211', resources=[resource])
123
+ fake_data = VisibleDatasetFactory(id='61fd30cb29ea95c7bc0e1211', resources=[resource])
124
124
 
125
125
  reindex.run(*as_task_param(fake_data))
126
126
 
127
127
  expected_value = {
128
128
  'document': DatasetSearch.serialize(fake_data)
129
129
  }
130
- url = f"{current_app.config['SEARCH_SERVICE_API_URL']}{DatasetSearch.search_url}index"
130
+ url = f"{current_app.config['SEARCH_SERVICE_API_URL']}{DatasetSearch.search_url}/index"
131
131
  mock_req.assert_called_with(url, json=expected_value)
132
132
 
133
133
  @patch('requests.Session.post')
134
134
  def test_index_model(self, mock_req):
135
- fake_data = DatasetFactory(id='61fd30cb29ea95c7bc0e1211')
135
+ fake_data = VisibleDatasetFactory(id='61fd30cb29ea95c7bc0e1211')
136
136
 
137
137
  index_model(DatasetSearch, start=None, reindex=False, from_datetime=None)
138
138
 
@@ -146,7 +146,7 @@ class IndexingLifecycleTest(APITestCase):
146
146
  @patch('requests.post')
147
147
  @patch('requests.Session.post')
148
148
  def test_reindex_model(self, mock_session, mock_req):
149
- fake_data = DatasetFactory(id='61fd30cb29ea95c7bc0e1211')
149
+ fake_data = VisibleDatasetFactory(id='61fd30cb29ea95c7bc0e1211')
150
150
 
151
151
  index_model(DatasetSearch, start=datetime.datetime(2022, 2, 20, 20, 2), reindex=True)
152
152
 
@@ -167,10 +167,10 @@ class IndexingLifecycleTest(APITestCase):
167
167
 
168
168
  @patch('requests.Session.post')
169
169
  def test_index_model_from_datetime(self, mock_req):
170
- DatasetFactory(id='61fd30cb29ea95c7bc0e1211',
171
- last_modified_internal=datetime.datetime(2020, 1, 1))
172
- fake_data = DatasetFactory(id='61fd30cb29ea95c7bc0e1212',
173
- last_modified_internal=datetime.datetime(2022, 1, 1))
170
+ VisibleDatasetFactory(id='61fd30cb29ea95c7bc0e1211',
171
+ last_modified_internal=datetime.datetime(2020, 1, 1))
172
+ fake_data = VisibleDatasetFactory(id='61fd30cb29ea95c7bc0e1212',
173
+ last_modified_internal=datetime.datetime(2022, 1, 1))
174
174
 
175
175
  index_model(DatasetSearch, start=None, from_datetime=datetime.datetime(2023, 1, 1))
176
176
  mock_req.assert_not_called()
@@ -1,6 +1,6 @@
1
1
  from udata.tests.api import APITestCase
2
2
  from udata.search.result import SearchResult
3
- from udata.core.dataset.factories import DatasetFactory
3
+ from udata.core.dataset.factories import VisibleDatasetFactory
4
4
  from udata.core.dataset.search import DatasetSearch
5
5
  from udata.models import Dataset
6
6
 
@@ -9,7 +9,7 @@ class ResultTest(APITestCase):
9
9
  def test_results_get_objects(self):
10
10
  data = []
11
11
  for _ in range(3):
12
- random_dataset = DatasetFactory()
12
+ random_dataset = VisibleDatasetFactory()
13
13
  data.append(DatasetSearch.serialize(random_dataset))
14
14
 
15
15
  search_class = DatasetSearch.temp_search()
@@ -30,10 +30,10 @@ class ResultTest(APITestCase):
30
30
  def test_results_should_not_fail_on_missing_objects(self):
31
31
  data = []
32
32
  for _ in range(3):
33
- random_dataset = DatasetFactory()
33
+ random_dataset = VisibleDatasetFactory()
34
34
  data.append(DatasetSearch.serialize(random_dataset))
35
35
 
36
- to_delete_random_dataset = DatasetFactory()
36
+ to_delete_random_dataset = VisibleDatasetFactory()
37
37
  data.append(DatasetSearch.serialize(to_delete_random_dataset))
38
38
 
39
39
  search_class = DatasetSearch.temp_search()
@@ -5,7 +5,7 @@ from flask import url_for
5
5
  from udata.core.site.models import Site
6
6
  from udata.core.site.models import current_site
7
7
  from udata.core.site.factories import SiteFactory
8
- from udata.core.dataset.factories import DatasetFactory
8
+ from udata.core.dataset.factories import VisibleDatasetFactory
9
9
  from udata.core.reuse.factories import VisibleReuseFactory
10
10
  from udata.core.user.factories import AdminFactory
11
11
 
@@ -22,7 +22,7 @@ class SiteAPITest(APITestCase):
22
22
  def test_get_home_datasets(self):
23
23
  site = SiteFactory.create(
24
24
  id=self.app.config['SITE_ID'],
25
- settings__home_datasets=DatasetFactory.create_batch(3)
25
+ settings__home_datasets=VisibleDatasetFactory.create_batch(3)
26
26
  )
27
27
  current_site.reload()
28
28
 
@@ -46,7 +46,7 @@ class SiteAPITest(APITestCase):
46
46
  self.assertEqual(len(response.json), len(site.settings.home_reuses))
47
47
 
48
48
  def test_set_home_datasets(self):
49
- ids = [d.id for d in DatasetFactory.create_batch(3)]
49
+ ids = [d.id for d in VisibleDatasetFactory.create_batch(3)]
50
50
 
51
51
  self.login(AdminFactory())
52
52
  response = self.put(url_for('api.home_datasets'), ids)
@@ -1,6 +1,6 @@
1
1
  import pytest
2
2
 
3
- from udata.core.dataset.factories import DatasetFactory, HiddenDatasetFactory, OrganizationFactory
3
+ from udata.core.dataset.factories import DatasetFactory, VisibleDatasetFactory, OrganizationFactory
4
4
  from udata.core.reuse.factories import VisibleReuseFactory
5
5
  from udata.harvest.tests.factories import HarvestSourceFactory
6
6
  from udata.core.site.factories import SiteFactory
@@ -34,11 +34,11 @@ class SiteMetricTest:
34
34
  id=app.config['SITE_ID']
35
35
  )
36
36
  DatasetFactory.create_batch(2)
37
- HiddenDatasetFactory.create_batch(3)
37
+ VisibleDatasetFactory.create_batch(3)
38
38
 
39
39
  site.count_datasets()
40
40
 
41
- assert site.get_metrics()['datasets'] == 2
41
+ assert site.get_metrics()['datasets'] == 3
42
42
 
43
43
  def test_resources_metric(self, app):
44
44
  site = SiteFactory.create(
@@ -6,7 +6,7 @@ from rdflib import URIRef, Literal, Graph
6
6
  from rdflib.namespace import RDF, FOAF
7
7
  from rdflib.resource import Resource
8
8
 
9
- from udata.core.dataset.factories import DatasetFactory
9
+ from udata.core.dataset.factories import VisibleDatasetFactory
10
10
  from udata.core.dataset.models import Dataset
11
11
  from udata.core.organization.factories import OrganizationFactory
12
12
  from udata.core.site.factories import SiteFactory
@@ -26,7 +26,7 @@ class CatalogTest:
26
26
  site = SiteFactory()
27
27
  home_url = url_for('api.site', _external=True)
28
28
  uri = url_for('api.site_rdf_catalog', _external=True)
29
- datasets = DatasetFactory.create_batch(3)
29
+ datasets = VisibleDatasetFactory.create_batch(3)
30
30
  catalog = build_catalog(site, datasets)
31
31
  graph = catalog.graph
32
32
 
@@ -59,8 +59,8 @@ class CatalogTest:
59
59
  site = SiteFactory()
60
60
  org = OrganizationFactory()
61
61
  user = UserFactory()
62
- datasets = DatasetFactory.create_batch(2, owner=user)
63
- datasets += DatasetFactory.create_batch(2, organization=org)
62
+ datasets = VisibleDatasetFactory.create_batch(2, owner=user)
63
+ datasets += VisibleDatasetFactory.create_batch(2, organization=org)
64
64
  catalog = build_catalog(site, datasets)
65
65
  graph = catalog.graph
66
66
 
@@ -82,7 +82,7 @@ class CatalogTest:
82
82
  page=1, page_size=page_size, _external=True)
83
83
  uri_last = url_for('api.site_rdf_catalog_format', format='json',
84
84
  page=2, page_size=page_size, _external=True)
85
- DatasetFactory.create_batch(total)
85
+ VisibleDatasetFactory.create_batch(total)
86
86
 
87
87
  # First page
88
88
  datasets = Dataset.objects.paginate(1, page_size)
@@ -208,7 +208,7 @@ class SiteRdfViewsTest:
208
208
  assert_redirects(response, expected_url)
209
209
 
210
210
  def test_catalog_rdf_paginate(self, client):
211
- DatasetFactory.create_batch(4)
211
+ VisibleDatasetFactory.create_batch(4)
212
212
  url = url_for('api.site_rdf_catalog_format', format='n3', page_size=3)
213
213
  next_url = url_for('api.site_rdf_catalog_format', format='n3',
214
214
  page=2, page_size=3, _external=True)
@@ -27,18 +27,6 @@ class ActivityTest(WebTestMixin, DBTestMixin, TestCase):
27
27
  self.assertEqual(len(activities), 1)
28
28
  self.assertIsInstance(activities[0], FakeActivity)
29
29
 
30
- def test_create_and_retrieve_with_extras(self):
31
- FakeActivity.objects.create(actor=self.user, related_to=self.fake, extras={'some_key': 'some_value',
32
- 'other_key': 'other_value'})
33
-
34
- activities = Activity.objects(actor=self.user)
35
-
36
- self.assertEqual(len(activities), 1)
37
- self.assertEqual(activities[0].extras['some_key'], 'some_value')
38
- self.assertEqual(activities[0].extras['other_key'], 'other_value')
39
- self.assertIsInstance(activities[0], FakeActivity)
40
-
41
-
42
30
  def test_create_and_retrieve_for_org(self):
43
31
  org = OrganizationFactory()
44
32
  FakeActivity.objects.create(
@@ -7,15 +7,14 @@ from udata.features.transfer.actions import request_transfer, accept_transfer
7
7
  from udata.features.transfer.notifications import (
8
8
  transfer_request_notifications
9
9
  )
10
- from udata.models import Member, Dataset
10
+ from udata.models import Member
11
+ from udata.core.user.metrics import update_owner_metrics
12
+ from udata.core.organization.metrics import update_org_metrics
11
13
 
12
14
  from udata.utils import faker
13
- from udata.core.dataset.factories import DatasetFactory
15
+ from udata.core.dataset.factories import VisibleDatasetFactory
14
16
  from udata.core.organization.factories import OrganizationFactory
15
- from udata.core.organization.metrics import update_org_metrics # noqa needed to register signals
16
- from udata.core.user.factories import UserFactory
17
- from udata.core.user.metrics import update_owner_metrics # noqa needed to register signals
18
- from udata.tests.helpers import assert_emit
17
+ from udata.core.user.factories import UserFactory
19
18
 
20
19
 
21
20
  pytestmark = pytest.mark.usefixtures('clean_db')
@@ -33,7 +32,7 @@ class TransferStartTest:
33
32
 
34
33
  def test_request_transfer_owner_to_user(self):
35
34
  user = UserFactory()
36
- dataset = DatasetFactory(owner=user)
35
+ dataset = VisibleDatasetFactory(owner=user)
37
36
  recipient = UserFactory()
38
37
  comment = faker.sentence()
39
38
 
@@ -44,7 +43,7 @@ class TransferStartTest:
44
43
  user = UserFactory()
45
44
  member = Member(user=user, role='admin')
46
45
  org = OrganizationFactory(members=[member])
47
- dataset = DatasetFactory(owner=user, organization=org)
46
+ dataset = VisibleDatasetFactory(owner=user, organization=org)
48
47
  recipient = UserFactory()
49
48
  comment = faker.sentence()
50
49
 
@@ -53,7 +52,7 @@ class TransferStartTest:
53
52
 
54
53
  def test_request_transfer_user_to_organization(self):
55
54
  user = UserFactory()
56
- dataset = DatasetFactory(owner=user)
55
+ dataset = VisibleDatasetFactory(owner=user)
57
56
  recipient = OrganizationFactory()
58
57
  comment = faker.sentence()
59
58
 
@@ -62,7 +61,7 @@ class TransferStartTest:
62
61
 
63
62
  def test_request_transfer_not_authorized_not_owner(self):
64
63
  user = UserFactory()
65
- dataset = DatasetFactory(owner=UserFactory())
64
+ dataset = VisibleDatasetFactory(owner=UserFactory())
66
65
  recipient = UserFactory()
67
66
  comment = faker.sentence()
68
67
 
@@ -74,7 +73,7 @@ class TransferStartTest:
74
73
  user = UserFactory()
75
74
  member = Member(user=user, role='editor')
76
75
  org = OrganizationFactory(members=[member])
77
- dataset = DatasetFactory(organization=org)
76
+ dataset = VisibleDatasetFactory(organization=org)
78
77
  recipient = UserFactory()
79
78
  comment = faker.sentence()
80
79
 
@@ -84,7 +83,7 @@ class TransferStartTest:
84
83
 
85
84
  def test_request_transfer_to_self(self):
86
85
  user = UserFactory()
87
- dataset = DatasetFactory(owner=user)
86
+ dataset = VisibleDatasetFactory(owner=user)
88
87
  comment = faker.sentence()
89
88
 
90
89
  login_user(user)
@@ -95,7 +94,7 @@ class TransferStartTest:
95
94
  user = UserFactory()
96
95
  member = Member(user=user, role='admin')
97
96
  org = OrganizationFactory(members=[member])
98
- dataset = DatasetFactory(owner=user, organization=org)
97
+ dataset = VisibleDatasetFactory(owner=user, organization=org)
99
98
  comment = faker.sentence()
100
99
 
101
100
  login_user(user)
@@ -108,7 +107,7 @@ class TransferAcceptTest:
108
107
  def test_recipient_user_can_accept_transfer(self):
109
108
  owner = UserFactory()
110
109
  recipient = UserFactory()
111
- subject = DatasetFactory(owner=owner)
110
+ subject = VisibleDatasetFactory(owner=owner)
112
111
  transfer = TransferFactory(owner=owner,
113
112
  recipient=recipient,
114
113
  subject=subject)
@@ -137,7 +136,7 @@ class TransferAcceptTest:
137
136
  owner = UserFactory()
138
137
  admin = UserFactory()
139
138
  org = OrganizationFactory(members=[Member(user=admin, role='admin')])
140
- subject = DatasetFactory(owner=owner)
139
+ subject = VisibleDatasetFactory(owner=owner)
141
140
  transfer = TransferFactory(owner=owner,
142
141
  recipient=org,
143
142
  subject=subject)
@@ -173,7 +172,7 @@ class TransferAcceptTest:
173
172
  owner = UserFactory()
174
173
  editor = UserFactory()
175
174
  org = OrganizationFactory(members=[Member(user=editor, role='editor')])
176
- subject = DatasetFactory(organization=org)
175
+ subject = VisibleDatasetFactory(organization=org)
177
176
  transfer = TransferFactory(owner=owner,
178
177
  recipient=org,
179
178
  subject=subject)
@@ -186,7 +185,7 @@ class TransferAcceptTest:
186
185
  class TransferNotificationsTest:
187
186
  def test_pending_transfer_request_for_user(self):
188
187
  user = UserFactory()
189
- datasets = DatasetFactory.create_batch(2, owner=user)
188
+ datasets = VisibleDatasetFactory.create_batch(2, owner=user)
190
189
  recipient = UserFactory()
191
190
  comment = faker.sentence()
192
191
  transfers = {}
@@ -207,7 +206,7 @@ class TransferNotificationsTest:
207
206
 
208
207
  def test_pending_transfer_request_for_org(self):
209
208
  user = UserFactory()
210
- datasets = DatasetFactory.create_batch(2, owner=user)
209
+ datasets = VisibleDatasetFactory.create_batch(2, owner=user)
211
210
  recipient = UserFactory()
212
211
  member = Member(user=recipient, role='editor')
213
212
  org = OrganizationFactory(members=[member])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: udata
3
- Version: 7.0.6
3
+ Version: 7.0.6.dev28180
4
4
  Summary: Open data portal
5
5
  Home-page: https://github.com/opendatateam/udata
6
6
  Author: Opendata Team
@@ -132,18 +132,13 @@ for publishing udata's roadmap and for building consensus around it.
132
132
  It is collectively taken care of by members of the
133
133
  [OpenDataTeam](https://github.com/opendatateam).
134
134
 
135
- [readthedocs-url]: https://udata.readthedocs.io/en/v7.0.6/
135
+ [readthedocs-url]: https://udata.readthedocs.io/en/latest/
136
136
 
137
137
  # Changelog
138
138
 
139
- ## 7.0.6 (2024-03-29)
139
+ ## Current (in progress)
140
140
 
141
- - Add new harvester for ISO DCAT with XSLT transform [#2982](https://github.com/opendatateam/udata/pull/2982)
142
- - Fix, do not fail on spatial coverage harvesting exception and allow literal spatial BBOX from Arcgis [2998](https://github.com/opendatateam/udata/pull/2998)
143
- - Mock calls to example.com [#3000](https://github.com/opendatateam/udata/pull/3000)
144
- - Fix duplicate logs in console commands [#2996](https://github.com/opendatateam/udata/pull/2996)
145
- - Refactor `Activity.kwargs` into `Activity.extras` to facilitate its usage [#2999](https://github.com/opendatateam/udata/pull/2999)
146
- - :warning: Datasets without resources are now visible and indexable [#2997](https://github.com/opendatateam/udata/pull/2997)
141
+ - Nothing yet
147
142
 
148
143
  ## 7.0.5 (2024-03-20)
149
144
 
@@ -158,7 +153,6 @@ It is collectively taken care of by members of the
158
153
  - Topic: add spatial field [#2988](https://github.com/opendatateam/udata/pull/2988)
159
154
  - Topic: add last_modified field [#2987](https://github.com/opendatateam/udata/pull/2987)
160
155
  - Add stacktraces to CSV errors [#2990](https://github.com/opendatateam/udata/pull/2990)
161
- - Fix harvesting of DCT.conformsTo for complex inner information [#2994](https://github.com/opendatateam/udata/pull/2994)
162
156
 
163
157
  ## 7.0.4 (2024-02-27)
164
158