udata 12.0.2.dev15__py3-none-any.whl → 12.0.2.dev17__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.

@@ -17,6 +17,7 @@ from udata.core.discussions.factories import DiscussionFactory, MessageDiscussio
17
17
  from udata.core.organization.factories import OrganizationFactory
18
18
  from udata.core.organization.models import Member
19
19
  from udata.core.reuse.factories import ReuseFactory
20
+ from udata.core.spam.models import SpamMixin
20
21
  from udata.core.user.factories import UserFactory
21
22
 
22
23
 
@@ -108,7 +109,10 @@ class FixturesTest:
108
109
 
109
110
  def test_import_fixtures_from_default_file(self, cli):
110
111
  """Test importing fixtures from udata.commands.fixture.DEFAULT_FIXTURE_FILE."""
112
+ # Deactivate spam detection when testing import fixtures
113
+ SpamMixin.detect_spam_enabled = False
111
114
  cli("import-fixtures")
115
+ SpamMixin.detect_spam_enabled = True
112
116
  assert models.Organization.objects.count() > 0
113
117
  assert models.Dataset.objects.count() > 0
114
118
  assert models.Reuse.objects.count() > 0
@@ -116,6 +116,8 @@ class CommunityResourceForm(BaseResourceForm):
116
116
 
117
117
 
118
118
  def unmarshal_frequency(form, field):
119
+ if field.data is None:
120
+ return
119
121
  # We don't need to worry about invalid field.data being fed to UpdateFrequency here,
120
122
  # since the API will already have ensured incoming data matches the field definition,
121
123
  # which in our case is an enum of valid UpdateFrequency values.
udata/forms/fields.py CHANGED
@@ -416,11 +416,11 @@ class TagField(Field):
416
416
  if not self.data:
417
417
  return
418
418
  for tag in self.data:
419
- if not tags.MIN_TAG_LENGTH <= len(tag) <= tags.MAX_TAG_LENGTH:
419
+ if not tags.TAG_MIN_LENGTH <= len(tag) <= tags.TAG_MAX_LENGTH:
420
420
  message = _(
421
421
  'Tag "%(tag)s" must be between %(min)d and %(max)d characters long.',
422
- min=tags.MIN_TAG_LENGTH,
423
- max=tags.MAX_TAG_LENGTH,
422
+ min=tags.TAG_MIN_LENGTH,
423
+ max=tags.TAG_MAX_LENGTH,
424
424
  tag=tag,
425
425
  )
426
426
  raise validators.ValidationError(message)
udata/forms/widgets.py CHANGED
@@ -1,7 +1,7 @@
1
1
  from wtforms import widgets
2
2
 
3
- MIN_TAG_LENGTH = 2
4
- MAX_TAG_LENGTH = 50
3
+ TAG_MIN_LENGTH = 2
4
+ TAG_MAX_LENGTH = 50
5
5
 
6
6
 
7
7
  class WidgetHelper(object):
@@ -191,7 +191,6 @@ class DcatBackendTest:
191
191
 
192
192
  def test_harvest_dataservices_keep_attached_associated_datasets(self, rmock):
193
193
  """It should update the existing list of dataservice.datasets and not overwrite existing ones"""
194
- rmock.get("https://example.com/schemas", json=ResourceSchemaMockData.get_mock_data())
195
194
 
196
195
  filename = "bnodes.xml"
197
196
  url = mock_dcat(rmock, filename)
@@ -359,10 +358,8 @@ class DcatBackendTest:
359
358
  is None
360
359
  )
361
360
 
362
- @pytest.mark.options(SCHEMA_CATALOG_URL="https://example.com/schemas", HARVEST_MAX_ITEMS=2)
361
+ @pytest.mark.options(HARVEST_MAX_ITEMS=2)
363
362
  def test_harvest_max_items(self, rmock):
364
- rmock.get("https://example.com/schemas", json=ResourceSchemaMockData.get_mock_data())
365
-
366
363
  filename = "bnodes.xml"
367
364
  url = mock_dcat(rmock, filename)
368
365
  org = OrganizationFactory()
@@ -373,10 +370,7 @@ class DcatBackendTest:
373
370
  assert Dataset.objects.count() == 2
374
371
  assert HarvestJob.objects.first().status == "done"
375
372
 
376
- @pytest.mark.options(SCHEMA_CATALOG_URL="https://example.com/schemas")
377
373
  def test_harvest_spatial(self, rmock):
378
- rmock.get("https://example.com/schemas", json=ResourceSchemaMockData.get_mock_data())
379
-
380
374
  filename = "bnodes.xml"
381
375
  url = mock_dcat(rmock, filename)
382
376
  org = OrganizationFactory()
@@ -445,10 +439,7 @@ class DcatBackendTest:
445
439
  assert resources_by_title["Resource 3-1"].schema.url is None
446
440
  assert resources_by_title["Resource 3-1"].schema.version == "2.2.0"
447
441
 
448
- @pytest.mark.options(SCHEMA_CATALOG_URL="https://example.com/schemas")
449
442
  def test_harvest_inspire_themese(self, rmock):
450
- rmock.get("https://example.com/schemas", json=ResourceSchemaMockData.get_mock_data())
451
-
452
443
  filename = "bnodes.xml"
453
444
  url = mock_dcat(rmock, filename)
454
445
  org = OrganizationFactory()
@@ -32,12 +32,12 @@ class TagListField(ListField):
32
32
  super(TagListField, self).validate(values)
33
33
 
34
34
  for tag in values:
35
- if not tags.MIN_TAG_LENGTH <= len(tag) <= tags.MAX_TAG_LENGTH:
35
+ if not tags.TAG_MIN_LENGTH <= len(tag) <= tags.TAG_MAX_LENGTH:
36
36
  self.error(
37
37
  _(
38
38
  'Tag "%(tag)s" must be between %(min)d and %(max)d characters long.',
39
- min=tags.MIN_TAG_LENGTH,
40
- max=tags.MAX_TAG_LENGTH,
39
+ min=tags.TAG_MIN_LENGTH,
40
+ max=tags.TAG_MAX_LENGTH,
41
41
  tag=tag,
42
42
  )
43
43
  )
udata/settings.py CHANGED
@@ -658,6 +658,9 @@ class Testing(object):
658
658
  } # Disables deliverability for email domain name
659
659
  PUBLISH_ON_RESOURCE_EVENTS = False
660
660
  HARVEST_ACTIVITY_USER_ID = None
661
+ SEARCH_SERVICE_API_URL = None
662
+ CDATA_BASE_URL = None
663
+ SCHEMA_CATALOG_URL = None
661
664
 
662
665
 
663
666
  class Debug(Defaults):
udata/tags.py CHANGED
@@ -2,8 +2,8 @@ from flask import current_app
2
2
  from slugify import slugify
3
3
  from werkzeug.local import LocalProxy
4
4
 
5
- MIN_TAG_LENGTH = LocalProxy(lambda: current_app.config["TAG_MIN_LENGTH"])
6
- MAX_TAG_LENGTH = LocalProxy(lambda: current_app.config["TAG_MAX_LENGTH"])
5
+ TAG_MIN_LENGTH = LocalProxy(lambda: current_app.config["TAG_MIN_LENGTH"])
6
+ TAG_MAX_LENGTH = LocalProxy(lambda: current_app.config["TAG_MAX_LENGTH"])
7
7
 
8
8
 
9
9
  def slug(value: str) -> str:
@@ -12,10 +12,10 @@ def slug(value: str) -> str:
12
12
 
13
13
  def normalize(value: str) -> str:
14
14
  value = slug(value)
15
- if len(value) < MIN_TAG_LENGTH:
15
+ if len(value) < TAG_MIN_LENGTH:
16
16
  value = ""
17
- elif len(value) > MAX_TAG_LENGTH:
18
- value = value[:MAX_TAG_LENGTH]
17
+ elif len(value) > TAG_MAX_LENGTH:
18
+ value = value[:TAG_MAX_LENGTH]
19
19
  return value
20
20
 
21
21
 
@@ -42,7 +42,7 @@ from udata.core.topic.factories import TopicElementDatasetFactory, TopicFactory
42
42
  from udata.core.user.factories import AdminFactory, UserFactory
43
43
  from udata.i18n import gettext as _
44
44
  from udata.models import CommunityResource, Dataset, Follow, Member, db
45
- from udata.tags import MAX_TAG_LENGTH, MIN_TAG_LENGTH
45
+ from udata.tags import TAG_MAX_LENGTH, TAG_MIN_LENGTH
46
46
  from udata.tests.features.territories import create_geozones_fixtures
47
47
  from udata.tests.helpers import assert200, assert404
48
48
  from udata.utils import faker, unique_string
@@ -632,19 +632,21 @@ class DatasetAPITest(APITestCase):
632
632
  dataset = Dataset.objects.first()
633
633
  self.assertEqual(dataset.tags, sorted(data["tags"]))
634
634
 
635
+ @pytest.mark.options(TAG_MIN_LENGTH=3, TAG_MAX_LENGTH=10)
635
636
  def test_dataset_api_fail_to_create_too_short_tags(self):
636
637
  """It should fail to create a dataset from the API because
637
638
  the tag is too short"""
638
639
  data = DatasetFactory.as_dict()
639
- data["tags"] = [unique_string(MIN_TAG_LENGTH - 1)]
640
+ data["tags"] = [unique_string(TAG_MIN_LENGTH - 1)]
640
641
  with self.api_user():
641
642
  response = self.post(url_for("api.datasets"), data)
642
643
  self.assertStatus(response, 400)
643
644
 
645
+ @pytest.mark.options(TAG_MIN_LENGTH=3, TAG_MAX_LENGTH=10)
644
646
  def test_dataset_api_fail_to_create_too_long_tags(self):
645
647
  """Should fail creating a dataset with a tag long"""
646
648
  data = DatasetFactory.as_dict()
647
- data["tags"] = [unique_string(MAX_TAG_LENGTH + 1)]
649
+ data["tags"] = [unique_string(TAG_MAX_LENGTH + 1)]
648
650
  with self.api_user():
649
651
  response = self.post(url_for("api.datasets"), data)
650
652
  self.assertStatus(response, 400)
@@ -741,6 +743,18 @@ class DatasetAPITest(APITestCase):
741
743
  self.assertEqual(Dataset.objects.count(), 1)
742
744
  self.assertEqual(Dataset.objects.first().description, "new description")
743
745
 
746
+ def test_dataset_api_update_with_null_frequency(self):
747
+ """It should update the item even though internal frequency is null"""
748
+ user = self.login()
749
+ dataset = DatasetFactory(owner=user, frequency=None)
750
+ data = dataset.to_dict()
751
+ # Update doesn't matter as long as we don't touch `frequency`
752
+ data["tags"] = ["test"]
753
+ response = self.put(url_for("api.dataset", dataset=dataset), data)
754
+ self.assert200(response)
755
+ self.assertEqual(Dataset.objects.count(), 1)
756
+ self.assertEqual(Dataset.objects.first().frequency, None)
757
+
744
758
  def test_dataset_api_update_valid_frequency(self):
745
759
  """It should update a dataset from the API"""
746
760
  user = self.login()
@@ -1411,7 +1425,7 @@ class DatasetsFeedAPItest(APITestCase):
1411
1425
  assert "&lt;h1&gt;" in response.text
1412
1426
  assert "&lt;ul&gt;" in response.text
1413
1427
 
1414
- @pytest.mark.options(DELAY_BEFORE_APPEARING_IN_RSS_FEED=0)
1428
+ @pytest.mark.options(DELAY_BEFORE_APPEARING_IN_RSS_FEED=0, CDATA_BASE_URL="http://example.org")
1415
1429
  def test_feed_id_uri_is_valid(self):
1416
1430
  DatasetFactory()
1417
1431
 
@@ -1941,35 +1955,25 @@ class DatasetResourceAPITest(APITestCase):
1941
1955
  self.assertEqual(Follow.objects.following(user).count(), 0)
1942
1956
  self.assertEqual(Follow.objects.followers(user).count(), 0)
1943
1957
 
1958
+ @pytest.mark.options(ALLOWED_RESOURCES_EXTENSIONS=["txt", "html", "kml", "kml-1", "qml", "xml"])
1944
1959
  def test_suggest_formats_api(self):
1945
- """It should suggest formats"""
1946
- DatasetFactory(
1947
- resources=[
1948
- ResourceFactory(format=f) for f in (faker.word(), faker.word(), "kml", "kml-1")
1949
- ]
1950
- )
1951
-
1952
1960
  response = self.get(url_for("api.suggest_formats"), qs={"q": "km", "size": "5"})
1953
1961
  self.assert200(response)
1954
1962
 
1955
- self.assertLessEqual(len(response.json), 5)
1956
- self.assertGreater(len(response.json), 1)
1957
-
1958
- for suggestion in response.json:
1959
- self.assertIn("text", suggestion)
1960
- self.assertIn("km", suggestion["text"])
1963
+ self.assertEqual(len(response.json), 2)
1964
+ self.assertEqual(response.json[0]["text"], "kml")
1965
+ self.assertEqual(response.json[1]["text"], "kml-1")
1961
1966
 
1967
+ @pytest.mark.options(ALLOWED_RESOURCES_EXTENSIONS=["txt", "html", "kml", "kml-1", "qml", "xml"])
1962
1968
  def test_suggest_format_api_no_match(self):
1963
- """It should not provide format suggestion if no match"""
1964
- DatasetFactory(resources=[ResourceFactory(format=faker.word()) for _ in range(3)])
1965
-
1966
1969
  response = self.get(url_for("api.suggest_formats"), qs={"q": "test", "size": "5"})
1967
1970
  self.assert200(response)
1968
1971
  self.assertEqual(len(response.json), 0)
1969
1972
 
1973
+ @pytest.mark.options(ALLOWED_RESOURCES_EXTENSIONS=[])
1970
1974
  def test_suggest_format_api_empty(self):
1971
1975
  """It should not provide format suggestion if no data"""
1972
- response = self.get(url_for("api.suggest_formats"), qs={"q": "test", "size": "5"})
1976
+ response = self.get(url_for("api.suggest_formats"), qs={"q": "txt", "size": "5"})
1973
1977
  self.assert200(response)
1974
1978
  self.assertEqual(len(response.json), 0)
1975
1979
 
udata/tests/test_tags.py CHANGED
@@ -15,9 +15,6 @@ from udata.tests.helpers import assert200
15
15
  log = logging.getLogger(__name__)
16
16
 
17
17
 
18
- MAX_TAG_LENGTH = 32
19
-
20
-
21
18
  class TagsTests:
22
19
  def test_csv(self, client):
23
20
  Tag.objects.create(name="datasets-only", counts={"datasets": 15})
udata/utils.py CHANGED
@@ -333,7 +333,7 @@ def generate_tags(nb=3) -> [str]:
333
333
 
334
334
  def generate_tag() -> str:
335
335
  fake_tag: str = faker.word()
336
- while len(fake_tag) < tags.MIN_TAG_LENGTH:
336
+ while len(fake_tag) < tags.TAG_MIN_LENGTH:
337
337
  fake_tag = faker.word()
338
338
  return fake_tag
339
339
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: udata
3
- Version: 12.0.2.dev15
3
+ Version: 12.0.2.dev17
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>
@@ -10,14 +10,14 @@ udata/mail.py,sha256=Huhx_1QthJkLvuRUuP6jqb5Qq5R4iSmqeEpLVO9ZkQ4,2671
10
10
  udata/rdf.py,sha256=dQSYVS2NrMRE6fsrbGwXl_roM0k6jtt1JPtMhHxeVGg,20970
11
11
  udata/routing.py,sha256=Hnc1ktmKVS-RUHNKw2zYTft2HJ903FhjtlcenQ9igwI,8044
12
12
  udata/sentry.py,sha256=ekcxqUSqxfM98TtvCsPaOoX5i2l6PEcYt7kb4l3od-Q,3223
13
- udata/settings.py,sha256=A6CRPN99_EMK7bXTf4bdZI7NZEuAHECUkxChz7FWUkw,21904
13
+ udata/settings.py,sha256=pH56WVRNg4GJkuqIX6gMtEDLNoQh6d5Bpd-ekVMXcOo,21994
14
14
  udata/sitemap.py,sha256=oRRWoPI7ZsFFnUAOqGT1YuXFFKHBe8EcRnUCNHD7xjM,979
15
- udata/tags.py,sha256=ydq4uokd6bzdeGVSpEXASVtGvDfO2LfQs9mptvvKJCM,631
15
+ udata/tags.py,sha256=8R2gJieQtHgj7ZWIckMCkQu39fqzEUehxlYRfSD6bYQ,631
16
16
  udata/tasks.py,sha256=Sv01dhvATtq_oHOBp3J1j1VT1HQe0Pab7zxwIeIdKoo,5122
17
17
  udata/terms.md,sha256=nFx978tUQ3vTEv6POykXaZvcQ5e_gcvmO4ZgcfbSWXo,187
18
18
  udata/tracking.py,sha256=WOcqA1RlHN8EPFuEc2kNau54mec4-pvi-wUFrMXevzg,345
19
19
  udata/uris.py,sha256=u05ltyLv4ZolaNMbq58kcLizMXWC10mRpJFYzChUHJU,4440
20
- udata/utils.py,sha256=43-q1yZ8Phd6VTCNn7a4sIx1qs_oqVvIFg-RQb0qvgQ,13243
20
+ udata/utils.py,sha256=MiDmUlKtllTtJQo09aez2DsE3iH6CaahBMEDGMgsV70,13243
21
21
  udata/worker.py,sha256=K-Wafye5-uXP4kQlffRKws2J9YbJ6m6n2QjcVsY8Nsg,118
22
22
  udata/wsgi.py,sha256=MY8en9K9eDluvJYUxTdzqSDoYaDgCVZ69ZcUvxAvgqA,77
23
23
  udata/api/__init__.py,sha256=Rs1V6KqWUcZliZnoIrVKtq15Bfb8ZaOVOFuGhcv0SK8,11948
@@ -47,7 +47,7 @@ udata/commands/serve.py,sha256=dl1ktePSKPPGr-byGDoYQtPScgHibYH8YdV8MHnxVIM,2498
47
47
  udata/commands/test.py,sha256=0snHTDolowQK-DmAKnhF_mBuDOBMApAbEc35GEiwH0M,893
48
48
  udata/commands/worker.py,sha256=bjXQGCwkbZxkcxLMPA2Lr0nkNjXLpGNDMkkQXjwBLPI,3976
49
49
  udata/commands/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
- udata/commands/tests/test_fixtures.py,sha256=acFmE08S4B0GHJP4nN1dfRNcKjcsE88XusyW_HT12SE,5554
50
+ udata/commands/tests/test_fixtures.py,sha256=92__mnJ9kSARLnIR64d1C6dYA4hmcvJXuD7DXjIrTxw,5755
51
51
  udata/core/__init__.py,sha256=rPkzAmhURfV4x9v2iY_vOakNd75xseYW2jWNIoh-aRg,423
52
52
  udata/core/captchetat.py,sha256=PNobWeJiYSgpSZQ9vJpuEvk5xSkAD5sgrWhKcVPbncg,2953
53
53
  udata/core/csv.py,sha256=qeRtSQXPT5n5EoWZ3_XfnOTW7ITnEzzHctODPeX63Uk,8543
@@ -101,7 +101,7 @@ udata/core/dataset/csv.py,sha256=mNU5cuuNzrMgFF7Z0AKN8clsv458tpJHX1_pzAjpd-4,365
101
101
  udata/core/dataset/events.py,sha256=bSM0nFEX14r4JHc-bAM-7OOuD3JAxUIpw9GgXbOsUyw,4078
102
102
  udata/core/dataset/exceptions.py,sha256=uKiayLSpSzsnLvClObS6hOO0qXEqvURKN7_w8eimQNU,498
103
103
  udata/core/dataset/factories.py,sha256=tb18axsk8Tx5iUIqWM9IELdt-2Ryp2UN0-iY4fdea4U,9059
104
- udata/core/dataset/forms.py,sha256=gGXOqy3WXFNvWMXngDq3TEqMM18-9DBpy2V7msrOsTw,7084
104
+ udata/core/dataset/forms.py,sha256=rd4M86QtRFa9laxJGAszgzzrcg4EBGrf-p3HwrxO80I,7126
105
105
  udata/core/dataset/metrics.py,sha256=s8Xs_rqRXfNWsErkiJTuRMG5o_cU5iSK8mUJFKVSc7w,1204
106
106
  udata/core/dataset/models.py,sha256=1iXf6l0wjNv04if6gAq-NXSPLub2Mx2KOyCg2RQtids,41617
107
107
  udata/core/dataset/permissions.py,sha256=zXQ6kU-Ni3Pl5tDtat-ZPupug9InsNeCN7xRLc2Vcrc,1097
@@ -291,9 +291,9 @@ udata/flask_mongoengine/model_form.py,sha256=LI6eqd2zykhron29U280mjt0uZlBpM8GP9N
291
291
  udata/flask_mongoengine/pagination.py,sha256=AmKZqC6Pe4K8Y2TF1kj5O4gM5_m1NVthtJQVvoayX2M,5592
292
292
  udata/flask_mongoengine/wtf.py,sha256=BU2ahk6xkUmM18oaUf539RXFTP04O8S2CvEniYGJ1co,1226
293
293
  udata/forms/__init__.py,sha256=WdBOu40HijJi0A6kjUkuT-WEP2YNW3k_ftSzQS_Zl9Y,789
294
- udata/forms/fields.py,sha256=UgC7NQvVAvs5dULUJA9T_MWUADhhwzXTJ509owKZNnc,30042
294
+ udata/forms/fields.py,sha256=7zPxvgvUG4X3Yt1nm1NvksY9RcgUtNsgPTHiZ8J_rVY,30042
295
295
  udata/forms/validators.py,sha256=CRgmB6oow5O8LDR45LajlJJ9HX3RBCI08fapoWMH1vo,2727
296
- udata/forms/widgets.py,sha256=XMVxBlQMGfb0nQvqwLMsAVcEdsBdaZGQZ82F81FdmlM,1332
296
+ udata/forms/widgets.py,sha256=7qymIpynrQmNlA8hrkcF0RB8eLwOJFkjca_KOZ0zqtE,1332
297
297
  udata/frontend/__init__.py,sha256=DkqncR72V9TRlA3QEcpVtCIkUMUlnTytBlJFQ4HfEiA,6454
298
298
  udata/frontend/markdown.py,sha256=5kNMVOMLlGvJfpIVONaQv4JT1pi6qWNcnb_BVV_VNJQ,4324
299
299
  udata/harvest/__init__.py,sha256=C4y5w4vGb_F9Opy62lzV3eHo4DkNyRgPCq-wsarPXiQ,28
@@ -324,7 +324,7 @@ udata/harvest/tests/person.jsonld,sha256=I7Ynh-PQlNeD51I1LrCgYOEjhL-WBeb65xzIE_s
324
324
  udata/harvest/tests/test_actions.py,sha256=d5TTFTbs4PdBydWICqDtfoeo3zLyzcNDzv4aMH9spxo,25881
325
325
  udata/harvest/tests/test_api.py,sha256=gSuICkPy3KVRUhHAyudXVf_gLwiB7SoriUp3DLXWDdA,21611
326
326
  udata/harvest/tests/test_base_backend.py,sha256=ow8ecGtD836mUqyPWYjkS5nx0STyT5RMLgBdDyOhts4,19233
327
- udata/harvest/tests/test_dcat_backend.py,sha256=WB7jSjRuFvSAjskKVhW5lUfiJHomL3hwebSJ3f8ubEI,51842
327
+ udata/harvest/tests/test_dcat_backend.py,sha256=oyAfCLQcxZaBy97gt8hbMI1TJt8cXgsSpvF5_3XUmME,51263
328
328
  udata/harvest/tests/test_filters.py,sha256=PT2qopEIoXsqi8MsNDRuhNH7jGXiQo8r0uJrCOUd4aM,2465
329
329
  udata/harvest/tests/test_models.py,sha256=f9NRR2_S4oZFgF8qOumg0vv-lpnEBJbI5vNtcwFdSqM,831
330
330
  udata/harvest/tests/test_notifications.py,sha256=MMzTzkv-GXMNFeOwAi31rdTsAXyLCLOSna41zOtaJG0,816
@@ -407,7 +407,7 @@ udata/mongo/errors.py,sha256=SpTMAc_aNIfGkqyXGCbTlIAmYxU86rGM_NtIYaB642c,472
407
407
  udata/mongo/extras_fields.py,sha256=knb0fwt8eIEOA0jjeUAs9Gmn_cfUNVPuRdGEVcJzE2Y,4218
408
408
  udata/mongo/queryset.py,sha256=fXfYkUHsCWAUoub3OR7v825USPv-PQQIHkv4U5FnjYg,3954
409
409
  udata/mongo/slug_fields.py,sha256=tEUlwozrdQfF42KR5dxk5PUNSX7zISTIXsSgHxR4YMg,7522
410
- udata/mongo/taglist_field.py,sha256=RPi8DlgMEMK1wk8hbQDLAyH2GnzZCfNpWXQsllxPB6g,1371
410
+ udata/mongo/taglist_field.py,sha256=d4xUzXNaNgOlhllKNaTIhAiyjPhfOuXU99fYv3ds1u4,1371
411
411
  udata/mongo/url_field.py,sha256=UmUr9c5SxDFDpS5QsRTq2pKcCTOr1SoB4UITwNjtuaI,1345
412
412
  udata/mongo/uuid_fields.py,sha256=tuQ3zs_BnQHjaiKSIYv43jxvYtOvRLw9nP5CQ3fcMks,482
413
413
  udata/notifications/__init__.py,sha256=ZrSpV2zI9bZ0oz8tGsnA8hjDdGeU7YDdgvOLo70aohg,54
@@ -506,7 +506,7 @@ udata/tests/test_owned.py,sha256=3WGtAGT15RQPf2Swme8xPmflelI3I9rqTkVhSV-wf6E,970
506
506
  udata/tests/test_rdf.py,sha256=XlUjRFcvTeZx1DTwwHL4pHQTcFDcAuQzaGOY_jJMDL4,4863
507
507
  udata/tests/test_routing.py,sha256=jtCZuT229WhGvJU843DtzIrdUXN5f7dym-hwz5dOFLo,10844
508
508
  udata/tests/test_storages.py,sha256=OG_PnKtPlZmmhKnbbLrvL-EMEg35wAMsTC76jVEAOLU,9602
509
- udata/tests/test_tags.py,sha256=Ow-1hQ2Yv5h9yzLNE6KS1dU_e5k3YScLb92IYYKolBU,3691
509
+ udata/tests/test_tags.py,sha256=F32v_BjtlrWy2Z6RSKHIBDjPeEak1qsFT4KnAYU4JN8,3669
510
510
  udata/tests/test_topics.py,sha256=jbqhlEk-qgfJ8qFegGcfLGP2BTadjeCaza77Lmra9n8,5546
511
511
  udata/tests/test_transfer.py,sha256=_0pBwYs3T7OSZ7bO3KmQ81SjwCJyT4EVf8YYHXOkwdk,7779
512
512
  udata/tests/test_uris.py,sha256=MxafZ0SyzSNRomVpZnH1ChzWaHOi1MQiXe1gmKnBc6o,8517
@@ -517,7 +517,7 @@ udata/tests/api/test_auth_api.py,sha256=Mue5EneRp3MbD-ahcXI3YaRNYPcxzHMw-hYpY0Rt
517
517
  udata/tests/api/test_base_api.py,sha256=2w_vz0eEuq3P3aN-ByvxGc3VZAo7XtgatFfcrzf2uEU,2244
518
518
  udata/tests/api/test_contact_points.py,sha256=Sbb486RTN7HVycna_XB60OnURPSNc7xUity26XsYA4k,8766
519
519
  udata/tests/api/test_dataservices_api.py,sha256=pB7Kpf0qLhsX4z5hYj3BykYKauEMpESWmrlLlxTOmWw,29221
520
- udata/tests/api/test_datasets_api.py,sha256=Qlnitk2WmLDJJ7m7ULfV0UX8ml9VXev8Bd1PMv7v6_A,105949
520
+ udata/tests/api/test_datasets_api.py,sha256=wbGH3g-QYcQOU7-yK4uaNUvCxHNVzncdxlkEbBm1IE4,106516
521
521
  udata/tests/api/test_fields.py,sha256=OW85Z5MES5HeWOpapeem8OvR1cIcrqW-xMWpdZO4LZ8,1033
522
522
  udata/tests/api/test_follow_api.py,sha256=4nFXG5pZ_Hf2PJ4KEdHJX_uggjc9RpB8v0fidkAcw9I,5792
523
523
  udata/tests/api/test_me_api.py,sha256=YPd8zmR3zwJKtpSqz8nY1nOOMyXs66INeBwyhg5D0Us,13846
@@ -625,9 +625,9 @@ udata/translations/pt/LC_MESSAGES/udata.mo,sha256=nv80xZLfIfUsSOMBcr29L268FDc_Gt
625
625
  udata/translations/pt/LC_MESSAGES/udata.po,sha256=bUp-7Ray8t8ALgJk3Icw1jmiGIc9_pEJQHiGw_2EU2o,50989
626
626
  udata/translations/sr/LC_MESSAGES/udata.mo,sha256=Y_XpUxD074wXc63oJTnoVOyOQ2lmBxl-MrgluZ0Qdw4,27961
627
627
  udata/translations/sr/LC_MESSAGES/udata.po,sha256=qh8mrz9AFuVQtXYSSP4QWsXLM_Lv3EHVifHT1NflWXY,57529
628
- udata-12.0.2.dev15.dist-info/licenses/LICENSE,sha256=V8j_M8nAz8PvAOZQocyRDX7keai8UJ9skgmnwqETmdY,34520
629
- udata-12.0.2.dev15.dist-info/METADATA,sha256=FbfUH9JcbjqFCQjt6f5RbgVob95aMfPdRE7L6jSSCTU,5174
630
- udata-12.0.2.dev15.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
631
- udata-12.0.2.dev15.dist-info/entry_points.txt,sha256=v2u12qO11i2lyLNIp136WmLJ-NHT-Kew3Duu8J-AXPM,614
632
- udata-12.0.2.dev15.dist-info/top_level.txt,sha256=EF6CE6YSHd_og-8LCEA4q25ALUpWVe8D0okOLdMAE3A,6
633
- udata-12.0.2.dev15.dist-info/RECORD,,
628
+ udata-12.0.2.dev17.dist-info/licenses/LICENSE,sha256=V8j_M8nAz8PvAOZQocyRDX7keai8UJ9skgmnwqETmdY,34520
629
+ udata-12.0.2.dev17.dist-info/METADATA,sha256=W7NRlC87KSDeJWJvqiNH6Pex_qw_bGjjEkkWymXsSgw,5174
630
+ udata-12.0.2.dev17.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
631
+ udata-12.0.2.dev17.dist-info/entry_points.txt,sha256=v2u12qO11i2lyLNIp136WmLJ-NHT-Kew3Duu8J-AXPM,614
632
+ udata-12.0.2.dev17.dist-info/top_level.txt,sha256=EF6CE6YSHd_og-8LCEA4q25ALUpWVe8D0okOLdMAE3A,6
633
+ udata-12.0.2.dev17.dist-info/RECORD,,