def update_from_dict(self, data, user, force=False, fields=None): logging.info("updating {0} with {1} for {2}".format( self.__class__.__name__, data, user )) if fields is None: fields = set(self._get_fieldnames_to_serialize()) if self.consistency_token and not force: try: consistency_token = data.pop('consistency_token') except KeyError: msg = 'Missing field (consistency_token) for {}' raise exceptions.MissingConsistencyTokenError( msg.format(self.__class__.__name__) ) if consistency_token != self.consistency_token: raise exceptions.ConsistencyError post_save = [] unknown_fields = set(data.keys()) - fields if unknown_fields: raise exceptions.APIError( 'Unexpected fieldname(s): %s' % list(unknown_fields)) for name in fields: value = data.get(name, None) if name == 'consistency_token': continue # shouldn't be needed - Javascripts bug? setter = getattr(self, 'set_' + name, None) if setter is not None: setter(value, user, data) else: if name in data: field_type = self._get_field_type(name) if field_type == models.fields.related.ManyToManyField: post_save.append( functools.partial(self.save_many_to_many, name, value, field_type)) else: DateTimeField = models.fields.DateTimeField if value and field_type == models.fields.DateField: value = serialization.deserialize_date(value) elif value and field_type == DateTimeField: value = serialization.deserialize_datetime(value) elif value and field_type == models.fields.TimeField: value = serialization.deserialize_time(value) setattr(self, name, value) self.set_consistency_token() self.save() for some_func in post_save: some_func()
def set_when(self, incoming_value, user, *args, **kwargs): if incoming_value: self.when = serialization.deserialize_datetime(incoming_value) else: self.when = timezone.make_aware(datetime.datetime.now())
def test_deserialize_invalid_datetime(self): with self.assertRaises(ValueError): value = '22-04-1959 21:20:22' dt = serialization.deserialize_datetime(value)
def test_deserialize_already_a_datetime(self): value = timezone.make_aware(datetime.datetime(1959, 4, 22, 21, 20, 22)) expected = timezone.make_aware(datetime.datetime(1959, 4, 22, 21, 20, 22)) self.assertEqual(expected, serialization.deserialize_datetime(value))
def test_deserialize_datetime(self): value = '22/04/1959 21:20:22' dt = serialization.deserialize_datetime(value) self.assertEqual(timezone.make_aware(datetime.datetime(1959, 4, 22, 21, 20, 22)), dt)