summaryrefslogtreecommitdiffstats
path: root/google-appengine/google/appengine/ext/admin/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'google-appengine/google/appengine/ext/admin/__init__.py')
-rwxr-xr-xgoogle-appengine/google/appengine/ext/admin/__init__.py52
1 files changed, 38 insertions, 14 deletions
diff --git a/google-appengine/google/appengine/ext/admin/__init__.py b/google-appengine/google/appengine/ext/admin/__init__.py
index f69173e..ab9a5dd 100755
--- a/google-appengine/google/appengine/ext/admin/__init__.py
+++ b/google-appengine/google/appengine/ext/admin/__init__.py
@@ -64,6 +64,14 @@ from google.appengine.ext.webapp import template
_DEBUG = True
+def ustr(value):
+ """Like str(), but UTF-8-encodes Unicode instead of failing."""
+ try:
+ return str(value)
+ except UnicodeError:
+ return unicode(value).encode('UTF-8')
+
+
class ImageHandler(webapp.RequestHandler):
"""Serves a static image.
@@ -578,9 +586,12 @@ class DatastoreRequestHandler(BaseRequestHandler):
set of results and 0 for the entity count.
"""
kind = self.request.get('kind')
+ namespace = self.request.get('namespace')
+ if not namespace:
+ namespace = None
if not kind:
return ([], 0)
- query = datastore.Query(kind)
+ query = datastore.Query(kind, _namespace=namespace)
order = self.request.get('order')
order_type = self.request.get('order_type')
@@ -724,6 +735,7 @@ class DatastoreQueryHandler(DatastoreRequestHandler):
'message': self.request.get('msg'),
'pages': pages,
'current_page': current_page,
+ 'namespace': self.request.get('namespace'),
'num': num,
'next_start': -1,
'prev_start': -1,
@@ -846,6 +858,7 @@ class DatastoreEditHandler(DatastoreRequestHandler):
'key_id': entity_key_id,
'fields': fields,
'focus': self.request.get('focus'),
+ 'namespace': self.request.get('namespace'),
'next': self.request.get('next'),
'parent_key': parent_key,
'parent_kind': parent_kind,
@@ -862,7 +875,10 @@ class DatastoreEditHandler(DatastoreRequestHandler):
return
entity = datastore.Get(datastore.Key(entity_key))
else:
- entity = datastore.Entity(kind)
+ namespace = self.request.get('namespace')
+ if not namespace:
+ namespace = None
+ entity = datastore.Entity(kind, _namespace=namespace)
args = self.request.arguments()
for arg in args:
@@ -874,7 +890,7 @@ class DatastoreEditHandler(DatastoreRequestHandler):
data_type = DataType.get_by_name(data_type_name)
if entity and entity.has_key(field_name):
old_formatted_value = data_type.format(entity[field_name])
- if old_formatted_value == form_value:
+ if old_formatted_value == ustr(form_value):
continue
if len(form_value) > 0:
@@ -912,7 +928,7 @@ class DataType(object):
return _NAMED_DATA_TYPES[name]
def format(self, value):
- return str(value)
+ return ustr(value)
def short_format(self, value):
return self.format(value)
@@ -922,7 +938,8 @@ class DataType(object):
string_value = self.format(value)
else:
string_value = ''
- return '<input class="%s" name="%s" type="text" size="%d" value="%s"/>' % (cgi.escape(self.name()), cgi.escape(name), self.input_field_size(),
+ return '<input class="%s" name="%s" type="text" size="%d" value="%s"/>' % (cgi.escape(ustr(self.name())), cgi.escape(ustr(name)),
+ self.input_field_size(),
cgi.escape(string_value, True))
def input_field_size(self):
@@ -934,11 +951,11 @@ class DataType(object):
class StringType(DataType):
def format(self, value):
- return value
+ return ustr(value)
def input_field(self, name, value, sample_values):
- value = str(value)
- sample_values = [str(s) for s in sample_values]
+ value = ustr(value)
+ sample_values = [ustr(s) for s in sample_values]
multiline = False
if value:
multiline = len(value) > 255 or value.find('\n') >= 0
@@ -973,7 +990,7 @@ class TextType(StringType):
return 'Text'
def input_field(self, name, value, sample_values):
- return '<textarea name="%s" rows="5" cols="50">%s</textarea>' % (cgi.escape(name), cgi.escape(str(value)))
+ return '<textarea name="%s" rows="5" cols="50">%s</textarea>' % (cgi.escape(ustr(name)), cgi.escape(ustr(value)))
def parse(self, value):
return datastore_types.Text(value)
@@ -1006,7 +1023,8 @@ class TimeType(DataType):
return 'datetime'
def parse(self, value):
- return datetime.datetime(*(time.strptime(value, TimeType._FORMAT)[0:6]))
+ return datetime.datetime(*(time.strptime(ustr(value),
+ TimeType._FORMAT)[0:6]))
def python_type(self):
return datetime.datetime
@@ -1017,8 +1035,8 @@ class ListType(DataType):
value_file = cStringIO.StringIO()
try:
writer = csv.writer(value_file)
- writer.writerow(value)
- return value_file.getvalue()
+ writer.writerow(map(ustr, value))
+ return ustr(value_file.getvalue())
finally:
value_file.close()
@@ -1026,10 +1044,15 @@ class ListType(DataType):
return 'list'
def parse(self, value):
- value_file = cStringIO.StringIO(value)
+ value_file = cStringIO.StringIO(ustr(value))
try:
reader = csv.reader(value_file)
- return reader.next()
+ fields = []
+ for field in reader.next():
+ if isinstance(field, str):
+ field = field.decode('utf-8')
+ fields.append(field)
+ return fields
finally:
value_file.close()
@@ -1284,6 +1307,7 @@ _DATA_TYPES = {
datastore_types.PostalAddress: PostalAddressType(),
datastore_types.Rating: RatingType(),
datastore_types.BlobKey: BlobKeyType(),
+ datastore_types.ByteString: StringType(),
}
_NAMED_DATA_TYPES = {}