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 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'`{filterable["key"]}` must be an identifier')
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
- # `check` field attribute allows to do validation from the request before setting
537
+ # `checks` field attribute allows to do validation from the request before setting
538
538
  # the attribute
539
- check = info.get("check", None)
540
- if check is not None and value != getattr(obj, key):
541
- check(**{key: value}) # TODO add other model attributes in function parameters
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 check_owner_is_current_user(owner):
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
- check=check_owner_is_current_user,
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
- check=check_organization_is_valid_for_current_user,
92
+ checks=[check_organization_is_valid_for_current_user, only_creation],
88
93
  allow_null=True,
89
94
  filterable={},
90
95
  )
@@ -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
- check=check_url_does_not_exists,
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 ' "and %(max)d characters long.",
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.assertEqual(form.errors, {})
209
-
210
- form.populate_obj(ownable)
211
- self.assertIsNone(ownable.owner)
212
- self.assertEqual(ownable.organization, neworg)
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()
@@ -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
- check=check_url,
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.dev33663
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=EkWRn4nsBiWIgQvbSdDYf8Q5k8H1b5TJ6Vo_E7hw57g,29951
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=dFGY_DTiZYZ1gyRd6HqsNgAazQ-J7Q7ZbVDWyNjZnQw,5150
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=Kyelu2lDz5shRyBfjaLRC8PfByhxHxITqkVb01NMFFs,8613
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=9s8ywCD2LCtHnD5Z2fx9cxH6XI2nbHEj73kz17qZGHk,28576
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=4sDs40CtdarVQHzAdNIeRCOYughYsTlPehTY18jaq58,11293
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=U3EB8ffeeOhaSMm9Ra1f5tTRCpmKTl8RkDaRnVtWz6w,21613
616
- udata/tests/api/test_datasets_api.py,sha256=-nkRQAXtAc6M44Sd6xcgp5LPIYS4ZoVkBWL_Eqb8gm0,84155
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=VzKHtjTEcaTOItI19K_iH0S8RdGYKPbxss2yNag8quE,24636
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=OD-gB6RxMIYaZTMjlP6cxnap_urycP352MAJAfXAxqs,11505
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.dev33663.dist-info/LICENSE,sha256=V8j_M8nAz8PvAOZQocyRDX7keai8UJ9skgmnwqETmdY,34520
714
- udata-10.0.8.dev33663.dist-info/METADATA,sha256=xTvdXnfBy6ejDCTA2qs4IMCoqtBIOQG9rLaE0WNYnwo,139500
715
- udata-10.0.8.dev33663.dist-info/WHEEL,sha256=DZajD4pwLWue70CAfc7YaxT1wLUciNBvN_TTcvXpltE,110
716
- udata-10.0.8.dev33663.dist-info/entry_points.txt,sha256=3SKiqVy4HUqxf6iWspgMqH8d88Htk6KoLbG1BU-UddQ,451
717
- udata-10.0.8.dev33663.dist-info/top_level.txt,sha256=39OCg-VWFWOq4gCKnjKNu-s3OwFlZIu_dVH8Gl6ndHw,12
718
- udata-10.0.8.dev33663.dist-info/RECORD,,
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,,