udata 10.0.8.dev33663__py2.py3-none-any.whl → 10.0.8.dev33678__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/api_fields.py +27 -6
- udata/core/owned.py +9 -4
- udata/core/reuse/models.py +2 -2
- udata/forms/fields.py +21 -1
- udata/tests/api/test_dataservices_api.py +17 -0
- udata/tests/api/test_datasets_api.py +17 -0
- udata/tests/api/test_reuses_api.py +1 -1
- udata/tests/forms/test_publish_as_field.py +7 -5
- udata/tests/test_api_fields.py +2 -2
- {udata-10.0.8.dev33663.dist-info → udata-10.0.8.dev33678.dist-info}/METADATA +2 -1
- {udata-10.0.8.dev33663.dist-info → udata-10.0.8.dev33678.dist-info}/RECORD +15 -15
- {udata-10.0.8.dev33663.dist-info → udata-10.0.8.dev33678.dist-info}/LICENSE +0 -0
- {udata-10.0.8.dev33663.dist-info → udata-10.0.8.dev33678.dist-info}/WHEEL +0 -0
- {udata-10.0.8.dev33663.dist-info → udata-10.0.8.dev33678.dist-info}/entry_points.txt +0 -0
- {udata-10.0.8.dev33663.dist-info → udata-10.0.8.dev33678.dist-info}/top_level.txt +0 -0
udata/api_fields.py
CHANGED
|
@@ -42,7 +42,7 @@ from typing import Any, Callable, Iterable
|
|
|
42
42
|
import flask_restx.fields as restx_fields
|
|
43
43
|
import mongoengine
|
|
44
44
|
import mongoengine.fields as mongo_fields
|
|
45
|
-
from bson import ObjectId
|
|
45
|
+
from bson import DBRef, ObjectId
|
|
46
46
|
from flask_restx.inputs import boolean
|
|
47
47
|
from flask_restx.reqparse import RequestParser
|
|
48
48
|
from flask_storage.mongo import ImageField as FlaskStorageImageField
|
|
@@ -446,7 +446,7 @@ def generate_fields(**kwargs) -> Callable:
|
|
|
446
446
|
if constraint == "objectid" and not ObjectId.is_valid(
|
|
447
447
|
args[filterable["key"]]
|
|
448
448
|
):
|
|
449
|
-
api.abort(400, f
|
|
449
|
+
api.abort(400, f"`{filterable['key']}` must be an identifier")
|
|
450
450
|
|
|
451
451
|
query = filterable.get("query", None)
|
|
452
452
|
if query:
|
|
@@ -534,17 +534,37 @@ def patch(obj, request) -> type:
|
|
|
534
534
|
|
|
535
535
|
info = getattr(model_attribute, "__additional_field_info__", {})
|
|
536
536
|
|
|
537
|
-
# `
|
|
537
|
+
# `checks` field attribute allows to do validation from the request before setting
|
|
538
538
|
# the attribute
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
539
|
+
checks = info.get("checks", [])
|
|
540
|
+
|
|
541
|
+
if is_value_modified(getattr(obj, key), value):
|
|
542
|
+
for check in checks:
|
|
543
|
+
check(
|
|
544
|
+
value,
|
|
545
|
+
**{
|
|
546
|
+
"is_creation": obj._created,
|
|
547
|
+
"is_update": not obj._created,
|
|
548
|
+
"field": key,
|
|
549
|
+
},
|
|
550
|
+
) # TODO add other model attributes in function parameters
|
|
542
551
|
|
|
543
552
|
setattr(obj, key, value)
|
|
544
553
|
|
|
545
554
|
return obj
|
|
546
555
|
|
|
547
556
|
|
|
557
|
+
def is_value_modified(old_value, new_value) -> bool:
|
|
558
|
+
# If we want to modify a reference, the new_value may be a DBRef.
|
|
559
|
+
# `wrap_primary_key` can also return the `foreign_document` (see :WrapToForeignDocument)
|
|
560
|
+
# and it is not currently taken into account here…
|
|
561
|
+
# Maybe we can do another type of check to check if the reference changes in the future…
|
|
562
|
+
if isinstance(new_value, DBRef):
|
|
563
|
+
return not old_value or new_value.id != old_value.id
|
|
564
|
+
|
|
565
|
+
return new_value != old_value
|
|
566
|
+
|
|
567
|
+
|
|
548
568
|
def patch_and_save(obj, request) -> type:
|
|
549
569
|
obj = patch(obj, request)
|
|
550
570
|
|
|
@@ -587,6 +607,7 @@ def wrap_primary_key(
|
|
|
587
607
|
raise FieldValidationError(field=field_name, message=f"Unknown reference '{value}'")
|
|
588
608
|
|
|
589
609
|
# GenericReferenceField only accepts document (not dbref / objectid)
|
|
610
|
+
# :WrapToForeignDocument
|
|
590
611
|
if isinstance(
|
|
591
612
|
foreign_field,
|
|
592
613
|
(
|
udata/core/owned.py
CHANGED
|
@@ -41,7 +41,12 @@ class OwnedQuerySet(UDataQuerySet):
|
|
|
41
41
|
return self(visible_query | owned_qs._query_obj)
|
|
42
42
|
|
|
43
43
|
|
|
44
|
-
def
|
|
44
|
+
def only_creation(_value, is_update, field, **_kwargs):
|
|
45
|
+
if is_update:
|
|
46
|
+
raise FieldValidationError(_(f"Cannot modify {field} after creation"), field=field)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def check_owner_is_current_user(owner, **_kwargs):
|
|
45
50
|
from udata.auth import admin_permission, current_user
|
|
46
51
|
|
|
47
52
|
if (
|
|
@@ -53,7 +58,7 @@ def check_owner_is_current_user(owner):
|
|
|
53
58
|
raise FieldValidationError(_("You can only set yourself as owner"), field="owner")
|
|
54
59
|
|
|
55
60
|
|
|
56
|
-
def check_organization_is_valid_for_current_user(organization):
|
|
61
|
+
def check_organization_is_valid_for_current_user(organization, **_kwargs):
|
|
57
62
|
from udata.auth import current_user
|
|
58
63
|
from udata.models import Organization
|
|
59
64
|
|
|
@@ -76,7 +81,7 @@ class Owned(object):
|
|
|
76
81
|
ReferenceField(User, reverse_delete_rule=NULLIFY),
|
|
77
82
|
nested_fields=user_ref_fields,
|
|
78
83
|
description="Only present if organization is not set. Can only be set to the current authenticated user.",
|
|
79
|
-
|
|
84
|
+
checks=[check_owner_is_current_user, only_creation],
|
|
80
85
|
allow_null=True,
|
|
81
86
|
filterable={},
|
|
82
87
|
)
|
|
@@ -84,7 +89,7 @@ class Owned(object):
|
|
|
84
89
|
ReferenceField(Organization, reverse_delete_rule=NULLIFY),
|
|
85
90
|
nested_fields=org_ref_fields,
|
|
86
91
|
description="Only present if owner is not set. Can only be set to an organization of the current authenticated user.",
|
|
87
|
-
|
|
92
|
+
checks=[check_organization_is_valid_for_current_user, only_creation],
|
|
88
93
|
allow_null=True,
|
|
89
94
|
filterable={},
|
|
90
95
|
)
|
udata/core/reuse/models.py
CHANGED
|
@@ -30,7 +30,7 @@ class ReuseQuerySet(OwnedQuerySet):
|
|
|
30
30
|
return self(db.Q(private=True) | db.Q(datasets__0__exists=False) | db.Q(deleted__ne=None))
|
|
31
31
|
|
|
32
32
|
|
|
33
|
-
def check_url_does_not_exists(url):
|
|
33
|
+
def check_url_does_not_exists(url, **_kwargs):
|
|
34
34
|
"""Ensure a reuse URL is not yet registered"""
|
|
35
35
|
if url and Reuse.url_exists(url):
|
|
36
36
|
raise FieldValidationError(_("This URL is already registered"), field="url")
|
|
@@ -82,7 +82,7 @@ class Reuse(db.Datetimed, WithMetrics, ReuseBadgeMixin, Owned, db.Document):
|
|
|
82
82
|
url = field(
|
|
83
83
|
db.URLField(required=True),
|
|
84
84
|
description="The remote URL (website)",
|
|
85
|
-
|
|
85
|
+
checks=[check_url_does_not_exists],
|
|
86
86
|
)
|
|
87
87
|
urlhash = db.StringField(required=True, unique=True)
|
|
88
88
|
image_url = db.StringField()
|
udata/forms/fields.py
CHANGED
|
@@ -418,7 +418,7 @@ class TagField(Field):
|
|
|
418
418
|
for tag in self.data:
|
|
419
419
|
if not tags.MIN_TAG_LENGTH <= len(tag) <= tags.MAX_TAG_LENGTH:
|
|
420
420
|
message = _(
|
|
421
|
-
'Tag "%(tag)s" must be between %(min)d
|
|
421
|
+
'Tag "%(tag)s" must be between %(min)d and %(max)d characters long.',
|
|
422
422
|
min=tags.MIN_TAG_LENGTH,
|
|
423
423
|
max=tags.MAX_TAG_LENGTH,
|
|
424
424
|
tag=tag,
|
|
@@ -728,6 +728,16 @@ class CurrentUserField(ModelFieldMixin, Field):
|
|
|
728
728
|
return super(CurrentUserField, self).process(formdata, data, **kwargs)
|
|
729
729
|
|
|
730
730
|
def pre_validate(self, form):
|
|
731
|
+
if (
|
|
732
|
+
isinstance(form, ModelForm) # Some forms (like HarvestSourceForm) are not model forms
|
|
733
|
+
and form.instance
|
|
734
|
+
and self.name in form.instance
|
|
735
|
+
and getattr(form.instance, self.name).id != self.data.id
|
|
736
|
+
):
|
|
737
|
+
raise validators.ValidationError(
|
|
738
|
+
_("Cannot change owner after creation. Please use transfer feature.")
|
|
739
|
+
)
|
|
740
|
+
|
|
731
741
|
if self.data:
|
|
732
742
|
if current_user.is_anonymous:
|
|
733
743
|
raise validators.ValidationError(_("You must be authenticated"))
|
|
@@ -749,6 +759,16 @@ class PublishAsField(ModelFieldMixin, Field):
|
|
|
749
759
|
return len(current_user.organizations) <= 0
|
|
750
760
|
|
|
751
761
|
def pre_validate(self, form):
|
|
762
|
+
if (
|
|
763
|
+
isinstance(form, ModelForm) # Some forms (like HarvestSourceForm) are not model forms
|
|
764
|
+
and form.instance
|
|
765
|
+
and self.name in form.instance
|
|
766
|
+
and getattr(form.instance, self.name).id != self.data.id
|
|
767
|
+
):
|
|
768
|
+
raise validators.ValidationError(
|
|
769
|
+
_("Cannot change owner after creation. Please use transfer feature.")
|
|
770
|
+
)
|
|
771
|
+
|
|
752
772
|
if self.data:
|
|
753
773
|
if not current_user.is_authenticated:
|
|
754
774
|
raise validators.ValidationError(_("You must be authenticated"))
|
|
@@ -478,6 +478,23 @@ class DataserviceAPITest(APITestCase):
|
|
|
478
478
|
self.assertEqual(dataservice.owner, None)
|
|
479
479
|
self.assertEqual(dataservice.organization.id, me_org.id)
|
|
480
480
|
|
|
481
|
+
def test_dataservice_api_update_org(self):
|
|
482
|
+
"""It shouldn't update the dataservice org"""
|
|
483
|
+
user = self.login()
|
|
484
|
+
original_member = Member(user=user, role="editor")
|
|
485
|
+
original_org = OrganizationFactory(members=[original_member])
|
|
486
|
+
dataservice = DataserviceFactory(owner=user, organization=original_org)
|
|
487
|
+
|
|
488
|
+
new_member = Member(user=self.user, role="admin")
|
|
489
|
+
new_org = OrganizationFactory(members=[new_member])
|
|
490
|
+
|
|
491
|
+
data = dataservice.to_dict()
|
|
492
|
+
data["organization"] = {"id": new_org.id}
|
|
493
|
+
response = self.patch(url_for("api.dataservice", dataservice=dataservice), data)
|
|
494
|
+
self.assert400(response)
|
|
495
|
+
self.assertEqual(Dataservice.objects.count(), 1)
|
|
496
|
+
self.assertNotEqual(Dataservice.objects.first().organization.id, new_org.id)
|
|
497
|
+
|
|
481
498
|
|
|
482
499
|
@pytest.mark.frontend
|
|
483
500
|
class DataserviceRdfViewsTest:
|
|
@@ -558,6 +558,23 @@ class DatasetAPITest(APITestCase):
|
|
|
558
558
|
self.assertEqual(Dataset.objects.count(), 1)
|
|
559
559
|
self.assertEqual(Dataset.objects.first().description, "new description")
|
|
560
560
|
|
|
561
|
+
def test_dataset_api_update_org(self):
|
|
562
|
+
"""It shouldn't update the dataset org"""
|
|
563
|
+
user = self.login()
|
|
564
|
+
original_member = Member(user=user, role="editor")
|
|
565
|
+
original_org = OrganizationFactory(members=[original_member])
|
|
566
|
+
dataset = DatasetFactory(owner=user, organization=original_org)
|
|
567
|
+
|
|
568
|
+
new_member = Member(user=self.user, role="admin")
|
|
569
|
+
new_org = OrganizationFactory(members=[new_member])
|
|
570
|
+
|
|
571
|
+
data = dataset.to_dict()
|
|
572
|
+
data["organization"] = {"id": new_org.id}
|
|
573
|
+
response = self.put(url_for("api.dataset", dataset=dataset), data)
|
|
574
|
+
self.assert400(response)
|
|
575
|
+
self.assertEqual(Dataset.objects.count(), 1)
|
|
576
|
+
self.assertNotEqual(Dataset.objects.first().organization.id, new_org.id)
|
|
577
|
+
|
|
561
578
|
def test_dataset_api_update_with_resources(self):
|
|
562
579
|
"""It should update a dataset from the API with resources parameters"""
|
|
563
580
|
user = self.login()
|
|
@@ -321,9 +321,9 @@ class ReuseAPITest:
|
|
|
321
321
|
def test_reuse_api_update_org_with_full_object(self, api):
|
|
322
322
|
"""We can send the full org object (not only the ID) to update to an org"""
|
|
323
323
|
user = api.login()
|
|
324
|
-
reuse = ReuseFactory(owner=user)
|
|
325
324
|
member = Member(user=user, role="admin")
|
|
326
325
|
org = OrganizationFactory(members=[member])
|
|
326
|
+
reuse = ReuseFactory(organization=org)
|
|
327
327
|
|
|
328
328
|
data = reuse.to_dict()
|
|
329
329
|
data["owner"] = None
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import pytest
|
|
1
2
|
from bson import ObjectId
|
|
2
3
|
from werkzeug.datastructures import MultiDict
|
|
3
4
|
|
|
@@ -192,6 +193,7 @@ class PublishFieldTest(TestCase):
|
|
|
192
193
|
self.assertIn("organization", form.errors)
|
|
193
194
|
self.assertEqual(len(form.errors["organization"]), 1)
|
|
194
195
|
|
|
196
|
+
@pytest.mark.usefixtures("clean_db")
|
|
195
197
|
def test_with_initial_and_both_member(self):
|
|
196
198
|
Ownable, OwnableForm = self.factory()
|
|
197
199
|
user = UserFactory()
|
|
@@ -205,11 +207,11 @@ class PublishFieldTest(TestCase):
|
|
|
205
207
|
|
|
206
208
|
login_user(user)
|
|
207
209
|
form.validate()
|
|
208
|
-
self.
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
210
|
+
self.assertIn("organization", form.errors)
|
|
211
|
+
self.assertEqual(
|
|
212
|
+
form.errors["organization"],
|
|
213
|
+
["Cannot change owner after creation. Please use transfer feature."],
|
|
214
|
+
)
|
|
213
215
|
|
|
214
216
|
def test_with_initial_and_not_member(self):
|
|
215
217
|
Ownable, OwnableForm = self.factory()
|
udata/tests/test_api_fields.py
CHANGED
|
@@ -30,7 +30,7 @@ URL_RAISE_ERROR: str = "/raise/validation/error"
|
|
|
30
30
|
URL_EXISTS_ERROR_MESSAGE: str = "Url exists"
|
|
31
31
|
|
|
32
32
|
|
|
33
|
-
def check_url(url: str = "") -> None:
|
|
33
|
+
def check_url(url: str = "", **_kwargs) -> None:
|
|
34
34
|
if url == URL_RAISE_ERROR:
|
|
35
35
|
raise ValueError(URL_EXISTS_ERROR_MESSAGE)
|
|
36
36
|
return
|
|
@@ -74,7 +74,7 @@ class Fake(WithMetrics, FakeBadgeMixin, Owned, db.Document):
|
|
|
74
74
|
url = field(
|
|
75
75
|
db.StringField(required=True),
|
|
76
76
|
description="The remote URL (website)",
|
|
77
|
-
|
|
77
|
+
checks=[check_url],
|
|
78
78
|
)
|
|
79
79
|
image_url = db.StringField()
|
|
80
80
|
image = field(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: udata
|
|
3
|
-
Version: 10.0.8.
|
|
3
|
+
Version: 10.0.8.dev33678
|
|
4
4
|
Summary: Open data portal
|
|
5
5
|
Home-page: https://github.com/opendatateam/udata
|
|
6
6
|
Author: Opendata Team
|
|
@@ -140,6 +140,7 @@ It is collectively taken care of by members of the
|
|
|
140
140
|
|
|
141
141
|
## Current (in progress)
|
|
142
142
|
|
|
143
|
+
- Force the usage of transfers request to change the owner of a model [#3249](https://github.com/opendatateam/udata/pull/3249)
|
|
143
144
|
- Add report of duplicates resources ids [#3247](https://github.com/opendatateam/udata/pull/3247)
|
|
144
145
|
- Add search to posts [#3248](https://github.com/opendatateam/udata/pull/3248)
|
|
145
146
|
- Resource catalog: fix preview_url and add extras [#3188](https://github.com/opendatateam/udata/pull/3188)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
tasks/__init__.py,sha256=nubUI6ljumym4uv6NvAJEkWHtsdurFpEGSq-AxDWYDM,8153
|
|
2
2
|
tasks/helpers.py,sha256=70fS9tI_m0DTWmKx9Zl5-LG-nxdz_ZaPyvvsFkN2r48,1091
|
|
3
3
|
udata/__init__.py,sha256=Qgwzar-8hSuXwBzSAJw3zrCGFYIpAhKtf8K-NUq0j1k,102
|
|
4
|
-
udata/api_fields.py,sha256=
|
|
4
|
+
udata/api_fields.py,sha256=pgx0Ipa9R2sWZwTIBxMVvURwq9aEWAJR-dXdpb0qqHQ,30779
|
|
5
5
|
udata/app.py,sha256=xjk2D3EgboYBpTwBwdIxd2klt2yMoWMyCrkry5fz0LA,7292
|
|
6
6
|
udata/assets.py,sha256=H5Hrc2vnKM0IFLyWfLXmJ2Kj35w1i8W1D8Cgy8_cUj4,657
|
|
7
7
|
udata/cors.py,sha256=gPTIXnO5nWziCKAHqU9GNuBKaIzr7RRtbjZBd2RdE2k,3155
|
|
@@ -54,7 +54,7 @@ udata/commands/worker.py,sha256=bjXQGCwkbZxkcxLMPA2Lr0nkNjXLpGNDMkkQXjwBLPI,3976
|
|
|
54
54
|
udata/commands/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
55
55
|
udata/commands/tests/test_fixtures.py,sha256=ZDps7ao6r86SV1Gv0Aftq4Ly1sdDnrUQGMNUz6LMTIo,5012
|
|
56
56
|
udata/core/__init__.py,sha256=O7C9WWCXiLWnWPnPbFRszWhOmvRQiI4gD-5qkWvPGRo,385
|
|
57
|
-
udata/core/owned.py,sha256=
|
|
57
|
+
udata/core/owned.py,sha256=OVP0BukdlHczzWfYb7Jrii8VOlB8Lx9sIgQcI-Vwdjo,5376
|
|
58
58
|
udata/core/activity/__init__.py,sha256=OaiFyq7HB4xL4SuMPD1N8IFNpntwx9ZayVzelciOieI,298
|
|
59
59
|
udata/core/activity/api.py,sha256=QFSLSVf65f-jz0dyVuMqaXm6qB4m-YlGnjqK33suwI8,3854
|
|
60
60
|
udata/core/activity/models.py,sha256=Ln9YUsdCBMFmUlw5GA2gIJ50sMorMFzZGo8u8sy7pIE,2072
|
|
@@ -179,7 +179,7 @@ udata/core/reuse/constants.py,sha256=JgDBrjOKSt9q0auv9rjzbGsch83H-Oi8YXAKeI5hO4o
|
|
|
179
179
|
udata/core/reuse/csv.py,sha256=4TcQbk4kWN_HbnpEUfgfW9_x7ZqNDk5s4YuJ839p3EE,896
|
|
180
180
|
udata/core/reuse/factories.py,sha256=GrQqYTIvwQrwkvJrbTr38-2faFW_PC99gn3yOVpgFec,850
|
|
181
181
|
udata/core/reuse/metrics.py,sha256=sVh7BlW3OKRvFDHFyD4pPUV91jOOhj8qeWbBkLPn5Gg,176
|
|
182
|
-
udata/core/reuse/models.py,sha256=
|
|
182
|
+
udata/core/reuse/models.py,sha256=G9YaMItKedazlUJfyFDKTC_3zGBEIAPZNyJGc6jPGWY,8627
|
|
183
183
|
udata/core/reuse/permissions.py,sha256=j-ancS7gvLl5vJu0TNYqpYD-2So-UzoDE4IHLxRoMGg,621
|
|
184
184
|
udata/core/reuse/search.py,sha256=y1DwXYkBMBwuhn62CULkU1NNo89IYp0Ae7U01jcnjBY,3137
|
|
185
185
|
udata/core/reuse/signals.py,sha256=nDrEUpYKN0AdYiEbrR0z3nzXzjaRcD8SAMutwIDsQPM,155
|
|
@@ -272,7 +272,7 @@ udata/features/transfer/models.py,sha256=sFmdbEHL7eUxYe2XdtjZ2zhrUWOW_ryP_5T_8N1
|
|
|
272
272
|
udata/features/transfer/notifications.py,sha256=jeH5buqTuWcokgXfEj-EZ7C3YCrtw-NikfrH2bqFyHM,1121
|
|
273
273
|
udata/features/transfer/permissions.py,sha256=0Iwt_I3S3QACpq4Ba6Ovb8RUBuozj2pbXDtFFp9jdLI,953
|
|
274
274
|
udata/forms/__init__.py,sha256=OXNShgt05tADLYQ-cXPdB16qQtj2i48GxSsCVdR6cfI,843
|
|
275
|
-
udata/forms/fields.py,sha256=
|
|
275
|
+
udata/forms/fields.py,sha256=1MGbL6kcpE03EA5fOBFy7PFngzdB_gAwznNmebKMZDs,29397
|
|
276
276
|
udata/forms/validators.py,sha256=CRgmB6oow5O8LDR45LajlJJ9HX3RBCI08fapoWMH1vo,2727
|
|
277
277
|
udata/forms/widgets.py,sha256=XMVxBlQMGfb0nQvqwLMsAVcEdsBdaZGQZ82F81FdmlM,1332
|
|
278
278
|
udata/frontend/__init__.py,sha256=Aa5BX19jTAcjGiGKszPabbOju5thvA7XFz4aYvxwXQw,3567
|
|
@@ -588,7 +588,7 @@ udata/tests/models.py,sha256=5oTC-cgKSL0sUdlqjUiJ6U8-YZBQanObb-MhZhQIV3M,238
|
|
|
588
588
|
udata/tests/plugin.py,sha256=QDY6fqjozck1_KrNGqN4wkIUAdACpAnUDOW6GTjKmqQ,12480
|
|
589
589
|
udata/tests/schemas.json,sha256=szM1jDpkogfOG4xWbjIGjLgG8l9-ZyE3JKQtecJyD1E,4990
|
|
590
590
|
udata/tests/test_activity.py,sha256=x-pDK6VW9wAG0uxYRZQ3DWTRjfCU729iaMGMJb1rWYU,3195
|
|
591
|
-
udata/tests/test_api_fields.py,sha256=
|
|
591
|
+
udata/tests/test_api_fields.py,sha256=TMUBDBBfAUiaul01b45KeTxP-vjF3TQa0PoTuKhZgLQ,11307
|
|
592
592
|
udata/tests/test_cors.py,sha256=b_pyxKeIyqhnsXxXryPf4d0V0QxaLQ1P_VjY89Q_j3g,3233
|
|
593
593
|
udata/tests/test_dcat_commands.py,sha256=fDAnAjkja8AXw_qzaAWnVTgglkBAvK2mjPMHUCtqrrU,919
|
|
594
594
|
udata/tests/test_discussions.py,sha256=Qo7nhIUY7YAATZfWl5Mgo0XhngGwFULgqEoMhsHZtFE,33587
|
|
@@ -612,14 +612,14 @@ udata/tests/api/test_activities_api.py,sha256=RjDDeNle3T-ydVnh6BRypqxAE_244-DXaK
|
|
|
612
612
|
udata/tests/api/test_auth_api.py,sha256=OMRlY0OQt60j5N4A-N3HdWTuffOjRlFHkz5a3jJFieI,25987
|
|
613
613
|
udata/tests/api/test_base_api.py,sha256=2w_vz0eEuq3P3aN-ByvxGc3VZAo7XtgatFfcrzf2uEU,2244
|
|
614
614
|
udata/tests/api/test_contact_points.py,sha256=jumil3faYa11KmSZgZgl592IrDqKcthHUjRv1zqWWn8,2702
|
|
615
|
-
udata/tests/api/test_dataservices_api.py,sha256=
|
|
616
|
-
udata/tests/api/test_datasets_api.py,sha256
|
|
615
|
+
udata/tests/api/test_dataservices_api.py,sha256=HYvN9Comv6iJJAwnlpeP1WJruC_rWoF75MAfhSz4UpQ,22423
|
|
616
|
+
udata/tests/api/test_datasets_api.py,sha256=8Ft6EwsISSb6akXng1Lim4vNkgxsmJXCNyB9EzVCvdw,84923
|
|
617
617
|
udata/tests/api/test_fields.py,sha256=OW85Z5MES5HeWOpapeem8OvR1cIcrqW-xMWpdZO4LZ8,1033
|
|
618
618
|
udata/tests/api/test_follow_api.py,sha256=fccgVNfcqET221PPS3p7qzb9hpvbBBUGhV-l4UeOpyk,3352
|
|
619
619
|
udata/tests/api/test_me_api.py,sha256=ZJKGH9fFv-4cSGcYAGd6IJA_PwPjVGIqWNy_DhFA8ms,13827
|
|
620
620
|
udata/tests/api/test_organizations_api.py,sha256=MwvxkU7Q0NzEwZ1sPfWUh697sm4Ge61uAO1GgYrUSLc,36198
|
|
621
621
|
udata/tests/api/test_reports_api.py,sha256=fCSz9NwMXBs6cxdXBVVI6y564AtovmZYw3xkgxQ9KE8,6217
|
|
622
|
-
udata/tests/api/test_reuses_api.py,sha256=
|
|
622
|
+
udata/tests/api/test_reuses_api.py,sha256=d8mtUrDURIfnUK-sLogvAP-rOID2FDJ0UVTM0ravQ-Q,24642
|
|
623
623
|
udata/tests/api/test_swagger.py,sha256=eE6La9qdTYTIUFevRVPJgtj17Jq_8uOlsDwzCNR0LL8,760
|
|
624
624
|
udata/tests/api/test_tags_api.py,sha256=36zEBgthVEn6pctJ0kDgPmEaUr-iqRAHeZRcRG2LEXQ,2425
|
|
625
625
|
udata/tests/api/test_topics_api.py,sha256=ihE2qUBzKBhux8cY7JJECQ6Io0u5v_mE3E95cQ9BkHA,10276
|
|
@@ -661,7 +661,7 @@ udata/tests/forms/test_image_field.py,sha256=41fdD_gf0qTWYbscQUp2w4cmY3u2GtGQF70
|
|
|
661
661
|
udata/tests/forms/test_model_field.py,sha256=qlJZdYdcZAwa1ry9ijqc97WB6oVdr0Y7Rgo49Twm94U,9717
|
|
662
662
|
udata/tests/forms/test_model_list_field.py,sha256=4-ocxwXL6Nji0OdHuKAvhG72k05lwl2lZ0hsiLob8NA,3570
|
|
663
663
|
udata/tests/forms/test_nested_model_list_field.py,sha256=EeuATo2xf00rBjGHBXTVk0PsZfStyqNrfMlY0RPc3zs,10420
|
|
664
|
-
udata/tests/forms/test_publish_as_field.py,sha256=
|
|
664
|
+
udata/tests/forms/test_publish_as_field.py,sha256=Kp1voLjMRSXT3Q5yc9MHicivq5pOKF-tI4gIoH-YSQI,11596
|
|
665
665
|
udata/tests/forms/test_reference_field.py,sha256=oa57TatMG9Ul5Z_ehCsLK0Zau31n3xaRU0gLAmZlg9w,6290
|
|
666
666
|
udata/tests/forms/test_user_forms.py,sha256=qmk6ZBqDrVBtwAugkWUATeBDechhL2JGXhUldBBNqGg,1014
|
|
667
667
|
udata/tests/forms/test_uuid_field.py,sha256=256hFDZSWBeoRQuKIAF5RBt4hAKssSHFVAqMMHz8rcc,1788
|
|
@@ -710,9 +710,9 @@ udata/translations/pt/LC_MESSAGES/udata.mo,sha256=18Y5YtzVKInDejw-R-45HNzsB3OVwJ
|
|
|
710
710
|
udata/translations/pt/LC_MESSAGES/udata.po,sha256=6IQvFk0NTDV5Jq-kLkkzpioWfrMaLDa1oQSevKFbxKQ,44943
|
|
711
711
|
udata/translations/sr/LC_MESSAGES/udata.mo,sha256=O4zKHNkiX-2GUfLLa0kwbxIA5M1jxiqkHzaMh1t2wKs,29169
|
|
712
712
|
udata/translations/sr/LC_MESSAGES/udata.po,sha256=W9C447pW0O-Q28ji8wGLgPNrnqlPYXaMD0AOWJPcpZc,51918
|
|
713
|
-
udata-10.0.8.
|
|
714
|
-
udata-10.0.8.
|
|
715
|
-
udata-10.0.8.
|
|
716
|
-
udata-10.0.8.
|
|
717
|
-
udata-10.0.8.
|
|
718
|
-
udata-10.0.8.
|
|
713
|
+
udata-10.0.8.dev33678.dist-info/LICENSE,sha256=V8j_M8nAz8PvAOZQocyRDX7keai8UJ9skgmnwqETmdY,34520
|
|
714
|
+
udata-10.0.8.dev33678.dist-info/METADATA,sha256=x4Y0ALzcZYdtW1eP2rY4cRRzgZRhE2wPARfbPiYfyjk,139627
|
|
715
|
+
udata-10.0.8.dev33678.dist-info/WHEEL,sha256=DZajD4pwLWue70CAfc7YaxT1wLUciNBvN_TTcvXpltE,110
|
|
716
|
+
udata-10.0.8.dev33678.dist-info/entry_points.txt,sha256=3SKiqVy4HUqxf6iWspgMqH8d88Htk6KoLbG1BU-UddQ,451
|
|
717
|
+
udata-10.0.8.dev33678.dist-info/top_level.txt,sha256=39OCg-VWFWOq4gCKnjKNu-s3OwFlZIu_dVH8Gl6ndHw,12
|
|
718
|
+
udata-10.0.8.dev33678.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|