diff --git a/guillotina/api/service.py b/guillotina/api/service.py index 9c894cc50..b42f062a8 100644 --- a/guillotina/api/service.py +++ b/guillotina/api/service.py @@ -4,7 +4,6 @@ from guillotina.browser import View from guillotina.component import query_utility from guillotina.component.interfaces import IFactory -from guillotina.contrib.image.behaviors import IMultiImageOrderedAttachment from guillotina.fields import CloudFileField from guillotina.interfaces import IAsyncBehavior from guillotina.interfaces import ICloudFileField @@ -254,7 +253,7 @@ async def prepare(self): if key is not None: self.field = CloudFileField(__name__=name).bind(DictFieldProxy(key, ctx, name)) else: - self.field = field + self.field = field.bind(ctx) elif ICloudFileField.providedBy(field): self.field = field.bind(ctx) diff --git a/guillotina/contrib/image/api.py b/guillotina/contrib/image/api.py index b04417466..e71b1df58 100644 --- a/guillotina/contrib/image/api.py +++ b/guillotina/contrib/image/api.py @@ -150,5 +150,4 @@ async def __call__(self): class OrderMultiImage(TraversableFieldService): async def __call__(self): data = await self.request.json() - __import__("pdb").set_trace() self.field.reorder_images(data) diff --git a/guillotina/contrib/image/behaviors.py b/guillotina/contrib/image/behaviors.py index 81709fd62..57efcaa67 100644 --- a/guillotina/contrib/image/behaviors.py +++ b/guillotina/contrib/image/behaviors.py @@ -1,8 +1,8 @@ from collections import OrderedDict as NativeOrderedDict -from guillotina.schema import OrderedDict -from guillotina.schema import Dict from guillotina import configure from guillotina.contrib.image.image import CloudImageFileField +from guillotina.schema import Dict +from guillotina.schema import OrderedDict from guillotina.schema import TextLine from zope.interface import Interface @@ -48,5 +48,5 @@ class IMultiImageOrderedAttachment(Interface): value_type=CloudImageFileField(), default=NativeOrderedDict(), missing_value=NativeOrderedDict(), - max_length=1000 + max_length=1000, ) diff --git a/guillotina/json/serialize_value.py b/guillotina/json/serialize_value.py index a7d3cf5e6..ea5105dd9 100644 --- a/guillotina/json/serialize_value.py +++ b/guillotina/json/serialize_value.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +from collections import OrderedDict from datetime import date from datetime import datetime from datetime import time @@ -10,7 +11,6 @@ from guillotina.interfaces import IValueToJson from guillotina.profile import profilable from guillotina.schema.vocabulary import SimpleVocabulary -from collections import OrderedDict _MISSING = object() diff --git a/guillotina/schema/__init__.py b/guillotina/schema/__init__.py index b1343195d..17c3e0e74 100644 --- a/guillotina/schema/__init__.py +++ b/guillotina/schema/__init__.py @@ -26,7 +26,6 @@ from guillotina.schema._field import Datetime from guillotina.schema._field import Decimal from guillotina.schema._field import Dict -from guillotina.schema._field import OrderedDict from guillotina.schema._field import DottedName from guillotina.schema._field import Field from guillotina.schema._field import Float @@ -43,6 +42,7 @@ from guillotina.schema._field import NativeStringLine from guillotina.schema._field import Object from guillotina.schema._field import Orderable +from guillotina.schema._field import OrderedDict from guillotina.schema._field import Password from guillotina.schema._field import Set from guillotina.schema._field import SourceText @@ -72,7 +72,7 @@ Iterable, List, MaskTextLine, MinMaxLen, NativeString, NativeStringLine, Object, Orderable Password, Set, SourceText, Text, TextLine, Time, Timedelta, Tuple, URI, UnionField get_fields, get_fields_in_order, getFieldNames, getFieldNamesInOrder, -getValidationErrors, getSchemaValidationErrors, JSONField +getValidationErrors, getSchemaValidationErrors, JSONField, OrderedDict accessors ValidationError NO_VALUE diff --git a/guillotina/schema/_field.py b/guillotina/schema/_field.py index ae6c29c80..0f10fb5cc 100644 --- a/guillotina/schema/_field.py +++ b/guillotina/schema/_field.py @@ -12,6 +12,7 @@ # ############################################################################## from collections import namedtuple +from collections import OrderedDict as NativeOrderedDict from datetime import date from datetime import datetime from datetime import time @@ -51,7 +52,6 @@ from guillotina.schema.interfaces import IDatetime from guillotina.schema.interfaces import IDecimal from guillotina.schema.interfaces import IDict -from guillotina.schema.interfaces import IOrderedDict from guillotina.schema.interfaces import IDottedName from guillotina.schema.interfaces import IField from guillotina.schema.interfaces import IFloat @@ -66,6 +66,7 @@ from guillotina.schema.interfaces import IMinMaxLen from guillotina.schema.interfaces import IObject from guillotina.schema.interfaces import IObjectJSONField +from guillotina.schema.interfaces import IOrderedDict from guillotina.schema.interfaces import IPassword from guillotina.schema.interfaces import ISet from guillotina.schema.interfaces import ISource @@ -87,7 +88,6 @@ from zope.interface import Interface from zope.interface.interfaces import IInterface from zope.interface.interfaces import IMethod -from collections import OrderedDict as NativeOrderedDict import decimal import json @@ -669,20 +669,21 @@ def bind(self, object): @implementer(IOrderedDict) class OrderedDict(Dict): - """A field representing a Dict.""" + """A field representing an OrderedDict.""" + _type = NativeOrderedDict def reorder_images(self, payload): + data_field = self.get(self.context) # payload is an ordered list of the keys - __import__("pdb").set_trace() if isinstance(payload, list): - if len(payload) != len(self.images): + if len(payload) != len(data_field): raise ValueError("Length of the payload must be equal to the field") for key in payload: - if key not in self.images: - raise ValueError() - self.images.move_to_end(key) - self.register() + if key not in data_field: + raise ValueError("Key not found") + data_field.move_to_end(key) + self.set(self.context, data_field) DEFAULT_JSON_SCHMEA = json.dumps({"type": "object", "properties": {}}) diff --git a/guillotina/tests/image/test_field.py b/guillotina/tests/image/test_field.py index 2de60e914..1fbc849ec 100644 --- a/guillotina/tests/image/test_field.py +++ b/guillotina/tests/image/test_field.py @@ -198,7 +198,6 @@ async def test_multiimage_ordered_field_with_behavior(redis_container, container assert status == 200 response, status = await requester("GET", "/db/guillotina/foobar") - __import__("pdb").set_trace() behavior = response["guillotina.contrib.image.behaviors.IMultiImageOrderedAttachment"] # First in first keys_ordered = {"key2": 0, "key1": 1, "key0": 2, "key3": 3}