@@ -98,6 +98,7 @@ class BaseMixin(object):
9898 authenticated users.
9999 _public_fields: String names of fields meant to be displayed to
100100 non-authenticated users.
101+ _hidden_fields: String names of fields meant to be hidden but editable.
101102 _nested_relationships: String names of reference/relationship fields
102103 that should be included in JSON data of an object as full
103104 included documents. If reference/relationship field is not
@@ -109,6 +110,7 @@ class BaseMixin(object):
109110 """
110111 _public_fields = None
111112 _auth_fields = None
113+ _hidden_fields = None
112114 _nested_relationships = ()
113115 _backref_hooks = ()
114116 _nesting_depth = 1
@@ -251,7 +253,7 @@ def filter_objects(cls, objects, first=False, **params):
251253 params [key ] = ids
252254
253255 if first :
254- return cls .get_resource (** params )
256+ return cls .get_item (** params )
255257 else :
256258 return cls .get_collection (** params )
257259
@@ -358,18 +360,13 @@ def fields_to_query(cls):
358360 return query_fields + list (cls ._fields .keys ())
359361
360362 @classmethod
361- def get_resource (cls , ** params ):
363+ def get_item (cls , ** params ):
362364 params .setdefault ('_raise_on_empty' , True )
363365 params ['_limit' ] = 1
364366 params ['_item_request' ] = True
365367 query_set = cls .get_collection (** params )
366368 return query_set .first ()
367369
368- @classmethod
369- def get (cls , ** kw ):
370- return cls .get_resource (
371- _raise_on_empty = kw .pop ('__raise' , False ), ** kw )
372-
373370 def unique_fields (self ):
374371 pk_field = [self .pk_field ()]
375372 uniques = [e ['fields' ][0 ][0 ] for e in self ._unique_with_indexes ()]
@@ -643,6 +640,19 @@ def _is_modified(self):
643640 def _is_created (self ):
644641 return self ._created
645642
643+ def _to_python_fields (self ):
644+ """ Call to_python on non-relation fields. """
645+ from .utils import relationship_fields
646+ for name , field in self ._fields .items ():
647+ rel_field = isinstance (field , relationship_fields )
648+ if name not in self ._data or rel_field :
649+ continue
650+ value = self ._data [name ]
651+ try :
652+ self ._data [name ] = field .to_python (value )
653+ except :
654+ continue
655+
646656
647657class BaseDocument (six .with_metaclass (DocumentMetaclass ,
648658 BaseMixin , mongo .Document )):
@@ -720,9 +730,9 @@ def update(self, params, request=None, **kw):
720730 kw ['request' ] = request
721731 # request are passed to _update and then to save
722732 try :
723- updated_obj = self ._update (params , ** kw )
724- updated_obj . reload ()
725- return updated_obj
733+ self ._update (params , ** kw )
734+ self . _to_python_fields ()
735+ return self
726736 except (mongo .NotUniqueError , mongo .OperationError ) as e :
727737 if (e .__class__ is mongo .OperationError
728738 and 'E11000' not in e .message ):
0 commit comments