diff -r b02dd2a5f329 -r 35211afcd563 thirdparty/google_appengine/google/appengine/api/datastore_types.py --- a/thirdparty/google_appengine/google/appengine/api/datastore_types.py Fri Oct 10 06:56:56 2008 +0000 +++ b/thirdparty/google_appengine/google/appengine/api/datastore_types.py Fri Oct 10 13:14:24 2008 +0000 @@ -1018,10 +1018,9 @@ Raises: BadPropertyError if the property name is invalid. BadValueError if the - property did not validate correctly, a list property did not have values - all of the same type, or the value was an empty list. Other exception types - (like OverflowError) if the property value does not meet type-specific - criteria. + property did not validate correctly or the value was an empty list. Other + exception types (like OverflowError) if the property value does not meet + type-specific criteria. """ ValidateString(name, 'property name', datastore_errors.BadPropertyError) if RESERVED_PROPERTY_NAME.match(name): @@ -1047,21 +1046,13 @@ (name, repr(values))) try: - proptype = values[0].__class__ - prop_validator = _VALIDATE_PROPERTY_VALUES.get(proptype) - if prop_validator is None: - raise datastore_errors.BadValueError( - 'Unsupported type for property %s: %s' % (name, proptype)) + for v in values: + prop_validator = _VALIDATE_PROPERTY_VALUES.get(v.__class__) + if prop_validator is None: + raise datastore_errors.BadValueError( + 'Unsupported type for property %s: %s' % (name, v.__class__)) + prop_validator(name, v) - for v in values: - if v is not None: - if (v.__class__ is not proptype and not - (v.__class__ in _STRING_TYPES and proptype in _STRING_TYPES)): - raise datastore_errors.BadValueError( - 'Values for property %s have mismatched types: %s (a %s) and ' - '%s (a %s).' % (name, values[0], proptype, v, typename(v))) - - prop_validator(name, v) except (KeyError, ValueError, TypeError, IndexError, AttributeError), msg: raise datastore_errors.BadValueError( 'Error type checking values for property %s: %s' % (name, msg)) @@ -1100,10 +1091,19 @@ value: A datetime.datetime instance. pbvalue: The entity_pb.PropertyValue to pack this value into. """ + pbvalue.set_int64value(DatetimeToTimestamp(value)) + + +def DatetimeToTimestamp(value): + """Converts a datetime.datetime to seconds since the epoch, as a float. + Args: + value: datetime.datetime + + Returns: value as a long + """ if value.tzinfo: value = value.astimezone(UTC) - pbvalue.set_int64value( - long(calendar.timegm(value.timetuple()) * 1000000L) + value.microsecond) + return long(calendar.timegm(value.timetuple()) * 1000000L) + value.microsecond def PackGeoPt(name, value, pbvalue): @@ -1226,21 +1226,21 @@ values_type = type(values) if values_type is list: multiple = True - proptype = type(values[0]) else: multiple = False - proptype = type(values) values = [values] - pack_prop = _PACK_PROPERTY_VALUES[proptype] pbs = [] for v in values: pb = entity_pb.Property() pb.set_name(encoded_name) pb.set_multiple(multiple) - meaning = _PROPERTY_MEANINGS.get(proptype) + + meaning = _PROPERTY_MEANINGS.get(v.__class__) if meaning is not None: pb.set_meaning(meaning) + + pack_prop = _PACK_PROPERTY_VALUES[v.__class__] pbvalue = pack_prop(name, v, pb.mutable_value()) pbs.append(pb) @@ -1328,11 +1328,7 @@ auth_domain = unicode(pbval.uservalue().auth_domain().decode('utf-8')) value = users.User(email=email, _auth_domain=auth_domain) else: - if pb.multiple(): - raise datastore_errors.BadValueError( - 'Record indicated as multiple, but has no values.') - else: - value = None + value = None try: if pb.has_meaning():