diff -r 88c186556a80 -r f5fd65cc3bf3 thirdparty/google_appengine/google/appengine/ext/db/__init__.py --- a/thirdparty/google_appengine/google/appengine/ext/db/__init__.py Tue Jan 20 01:12:43 2009 +0000 +++ b/thirdparty/google_appengine/google/appengine/ext/db/__init__.py Tue Jan 20 13:19:45 2009 +0000 @@ -117,7 +117,7 @@ Rating = datastore_types.Rating Text = datastore_types.Text Blob = datastore_types.Blob - +ByteString = datastore_types.ByteString _kind_map = {} @@ -171,6 +171,7 @@ datetime.date, datetime.time, Blob, + ByteString, Text, users.User, Category, @@ -1554,8 +1555,8 @@ def order(self, property): """Set order of query result. - To use descending order, prepend '-' (minus) to the property name, e.g., - '-date' rather than 'date'. + To use descending order, prepend '-' (minus) to the property + name, e.g., '-date' rather than 'date'. Args: property: Property to sort on. @@ -1573,7 +1574,8 @@ order = datastore.Query.ASCENDING if not issubclass(self._model_class, Expando): - if property not in self._model_class.properties(): + if (property not in self._model_class.properties() and + property not in datastore_types._SPECIAL_PROPERTIES): raise PropertyError('Invalid property name \'%s\'' % property) self.__orderings.append((property, order)) @@ -1829,6 +1831,37 @@ data_type = Blob +class ByteStringProperty(Property): + """A short (<=500 bytes) byte string. + + This type should be used for short binary values that need to be indexed. If + you do not require indexing (regardless of length), use BlobProperty instead. + """ + + def validate(self, value): + """Validate ByteString property. + + Returns: + A valid value. + + Raises: + BadValueError if property is not instance of 'ByteString'. + """ + if value is not None and not isinstance(value, ByteString): + try: + value = ByteString(value) + except TypeError, err: + raise BadValueError('Property %s must be convertible ' + 'to a ByteString instance (%s)' % (self.name, err)) + value = super(ByteStringProperty, self).validate(value) + if value is not None and not isinstance(value, ByteString): + raise BadValueError('Property %s must be a ByteString instance' + % self.name) + return value + + data_type = ByteString + + class DateTimeProperty(Property): """The base class of all of our date/time properties. @@ -2149,24 +2182,31 @@ """A user property.""" def __init__(self, verbose_name=None, name=None, - required=False, validator=None, choices=None): + required=False, validator=None, choices=None, + auto_current_user=False, auto_current_user_add=False): """Initializes this Property with the given options. - Do not assign user properties a default value. + Note: this does *not* support the 'default' keyword argument. + Use auto_current_user_add=True instead. Args: verbose_name: User friendly name of property. name: Storage name for property. By default, uses attribute name as it is assigned in the Model sub-class. - default: Default value for property if none is assigned. required: Whether property is required. validator: User provided method used for validation. choices: User provided set of valid property values. + auto_current_user: If true, the value is set to the current user + each time the entity is written to the datastore. + auto_current_user_add: If true, the value is set to the current user + the first time the entity is written to the datastore. """ super(UserProperty, self).__init__(verbose_name, name, required=required, validator=validator, choices=choices) + self.auto_current_user = auto_current_user + self.auto_current_user_add = auto_current_user_add def validate(self, value): """Validate user. @@ -2182,6 +2222,30 @@ raise BadValueError('Property %s must be a User' % self.name) return value + def default_value(self): + """Default value for user. + + Returns: + Value of users.get_current_user() if auto_current_user or + auto_current_user_add is set; else None. (But *not* the default + implementation, since we don't support the 'default' keyword + argument.) + """ + if self.auto_current_user or self.auto_current_user_add: + return users.get_current_user() + return None + + def get_value_for_datastore(self, model_instance): + """Get value from property to send to datastore. + + Returns: + Value of users.get_current_user() if auto_current_user is set; + else the default implementation. + """ + if self.auto_current_user: + return users.get_current_user() + return super(UserProperty, self).get_value_for_datastore(model_instance) + data_type = users.User