Skip to content

Commit

Permalink
Admin-Upload auf Cloudstorage umgestellt
Browse files Browse the repository at this point in the history
Achtung, entweder muss es einen Default Bucket geben oder in der config.py
wird ein Bucket definiert, siehe
https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/activate
  • Loading branch information
Christian Klein committed May 21, 2015
1 parent f671d5f commit 1253430
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 24 deletions.
18 changes: 11 additions & 7 deletions gaetk/admin/options.py
Expand Up @@ -175,13 +175,13 @@ def get_object(self, encoded_key):
"""Ermittle die Instanz über den gegeben ID"""
return compat.xdb_get_instance(self.model, encoded_key)

def handle_blobstore_fields(self, handler, obj):
def handle_blobstore_fields(self, handler, obj, key_name):
"""Upload für Blobs"""
# Falls das Feld vom Typ cgi.FieldStorage ist, wurde eine Datei zum Upload übergeben
for blob_upload_field in self.blob_upload_fields:
blob = handler.request.params.get(blob_upload_field)
if blob.__class__ == cgi.FieldStorage:
blob_key = util.upload_to_blobstore(blob)
blob_key = util.upload_to_blobstore(obj, key_name, blob)
setattr(obj, blob_upload_field, blob_key)

def change_view(self, handler, object_id, extra_context=None):
Expand All @@ -198,9 +198,7 @@ def change_view(self, handler, object_id, extra_context=None):
# Der User hat gebeten, dieses Objekt zu löschen.
key = compat.xdb_key(obj)
data = compat.xdb_to_protobuf(obj)
dblayer = 'db'
if compat.xdb_is_ndb(obj):
dblayer = 'ndb'
dblayer = 'ndb' if compat.xdb_is_ndb(obj) else 'db'
archived = DeletedObject(key_name=str(key), model_class=model_class.__name__,
old_key=str(key), dblayer=dblayer, data=data)
archived.put()
Expand All @@ -225,7 +223,8 @@ def change_view(self, handler, object_id, extra_context=None):
if handler.request.method == 'POST':
form = form_class(handler.request.POST)
if form.validate():
self.handle_blobstore_fields(handler, obj)
key_name = compat.xdb_id_or_name(xdb_key(obj))
self.handle_blobstore_fields(handler, obj, key_name)
if hasattr(obj, 'update'):
obj.update(form.data)
else:
Expand Down Expand Up @@ -278,7 +277,12 @@ def add_view(self, handler, extra_context=None):
else:
obj = factory(key_name=key_name, **form_data)

self.handle_blobstore_fields(handler, obj)
# Beim Anlegen muss dann halt einmal gespeichert werden,
# ansonsten ist der ID unbekannt.
if self.self.blob_upload_fields and key_name is None:
key_name = compat.xdb_id_or_name(obj.put())

self.handle_blobstore_fields(handler, obj, key_name)
key = obj.put()
handler.add_message('success', u'<strong>%s</strong> wurde angelegt.' % obj)
# Indexierung für Admin-Volltextsuche
Expand Down
32 changes: 16 additions & 16 deletions gaetk/admin/util.py
Expand Up @@ -4,17 +4,19 @@
util.py
Created by Christian Klein on 2011-08-10.
Copyright (c) 2011 HUDORA GmbH. All rights reserved.
Copyright (c) 2011-2015 HUDORA GmbH. All rights reserved.
"""
from __future__ import with_statement
import config
config.imported = True

import cloudstorage
import mimetypes

from google.appengine.api import files
from gaetk.compat import xdb_kind
from google.appengine.api import app_identity
from google.appengine.ext import blobstore
from google.appengine.ext import db
from huTools.calendar.formats import convert_to_date, convert_to_datetime
from huTools.calendar.formats import convert_to_date
from huTools.calendar.formats import convert_to_datetime


def get_app_name(model):
Expand Down Expand Up @@ -84,21 +86,19 @@ def object_as_dict(obj):
return {'model': model, 'key': str(obj.key()), 'fields': fields}


def upload_to_blobstore(fileobj):
def upload_to_blobstore(obj, key_name, blob):
"""
Lade ein Datei-ähnliches Objekt in den Blobstore
Der Rückgabewert ist der Blob-Key des neuen Objekts.
"""
mime_type, _ = mimetypes.guess_type(fileobj.filename)
filename = files.blobstore.create(mime_type=mime_type, _blobinfo_uploaded_filename=fileobj.filename)

with files.open(filename, 'a') as blobstore_file:
# In den Blobstore kann nur in einer Blockgröße von 1 MB geschrieben werden
while fileobj.file:
data = fileobj.file.read(990000)
mime_type, _ = mimetypes.guess_type(blob.filename)
bucket = getattr(config, 'GCS_BUCKET_NAME', app_identity.get_default_gcs_bucket_name())
file_name = '/%s/admin/%s/%s/%s' % (bucket, xdb_kind(obj), key_name, blob.filename)
with cloudstorage.open(file_name, 'w', content_type=mime_type) as fileobj:
while blob.file:
data = blob.file.read(8192)
if not data:
break
blobstore_file.write(data)
files.finalize(filename)
return files.blobstore.get_blob_key(filename)
fileobj.write(data)
return blobstore.BlobKey(blobstore.create_gs_key('/gs' + file_name))
2 changes: 1 addition & 1 deletion include.mk
@@ -1,4 +1,4 @@
GAE_VERSION=1.9.18
GAE_VERSION=1.9.21
PRODUCTIONURL?= https://$(OPENAPPID).appspot.com/
PRODUCTIONNAME?= production
DEVPAGE?= /
Expand Down

0 comments on commit 1253430

Please sign in to comment.