def image_manager(page): """ GET --> The main image manager page POST --> Delete requested file(s) :param page: The requested page """ if request.method == 'POST': img_ref_key = request.get_json() # Delete the img from ndb for img_ref in img_ref_key['objects']: img_inst = ndb.Key(ImageReference, int(img_ref)) img = img_inst.get() blob_key = img.blob # Delete img and blob img_inst.delete() BlobInfo.get(blob_key).delete() logging.info("Delete image: {}".format(img_ref)) return "true" offset = (page - 1) * IMAGES_PER_PAGE images = ImageReference.query().order(-ImageReference.date) pagination = Pagination(page, IMAGES_PER_PAGE, images.count()) query = images.fetch(IMAGES_PER_PAGE, offset=offset) return render_template('image-manager/admin-manager-images.html', keys=query, pagination=pagination)
def image_manager(page): """ GET --> The main image manager page POST --> Delete requested file(s) :param page: The requested page """ if request.method == 'POST': img_ref_key = request.get_json() # Delete the img from ndb for img_ref in img_ref_key['objects']: img_inst = ndb.Key(ImageReference, int(img_ref)) img = img_inst.get() blob_key = img.blob # Delete img and blob img_inst.delete() BlobInfo.get(blob_key).delete() logging.info("Delete image: {}".format(img_ref)) return "true" offset = (page-1)*IMAGES_PER_PAGE images = ImageReference.query().order(-ImageReference.date) pagination = Pagination(page, IMAGES_PER_PAGE, images.count()) query = images.fetch(IMAGES_PER_PAGE, offset=offset) return render_template('image-manager/admin-manager-images.html', keys=query, pagination=pagination)
def start_batch(key, bid): try: reader = BlobReader(BlobKey(key)) except: return 'failed to find key: please re-upload.' newest_date = branch_newest_date(bid) dic = {} for line in reader: line = line.strip() try: game_date = valid(line) if game_date < newest_date: game_date = newest_date except: continue if util.tomorrow(util.today()) < game_date: continue if game_date not in dic: dic[game_date] = [] dic[game_date].append(','.join(line.split(',')[:8])) for key_date in sorted(dic.keys()): qs = QueueScore( bid=bid, game_date=key_date, body=( '\n'.join(reversed(dic[key_date])) )) qs.put() BlobInfo.get(key).delete() return 'upload succeeded!'
def delete(self, **kwargs): if self.imageid: b = BlobInfo.get(self.imageid.split('.')[0]) if b: b.delete() if self.apkkey: b = BlobInfo.get(self.apkkey) if b: b.delete() for imguri in self.imagelist: b = BlobInfo.get(imguri.split('.')[0]) if b: b.delete() super(Plugin, self).delete(**kwargs) pluginCount = PluginCount.get_or_insert('plugin_count') pluginCount.num -= 1 pluginCount.put() memcache.delete('allplugincount') memcache.delete('appnamelist') memcache.delete('pluginid%s' % self.key().id()) memcache.delete('user_applist_%s' % (self.username)) l = [] for i in range(0, pluginCount.num % 30): l.append('applist__%s' % i) l.append('applist__%s' % len(l)) memcache.delete_multi(l)
def action_edit(self): if self.section.handler.request.get('submit'): self.SITE_HEADER = self.section.handler.request.get('SITE_HEADER') self.SITE_SUB_HEADER = self.section.handler.request.get('SITE_SUB_HEADER') self.DEFAULT_THEME = self.section.handler.request.get('DEFAULT_THEME') self.GOOGLE_ANALYTICS_UA = self.section.handler.request.get('GOOGLE_ANALYTICS_UA') self.ROBOTS_TXT = self.section.handler.request.get('ROBOTS_TXT') if self.section.handler.request.get('FAVICON_ICO'): if self.FAVICON_ICO: BlobInfo.get(self.FAVICON_ICO).delete() data = self.section.handler.request.get('FAVICON_ICO') handle = files.blobstore.create(mime_type='image/x-icon', _blobinfo_uploaded_filename='favicon.ico') with files.open(handle, 'a') as f: f.write(data) files.finalize(handle) self.FAVICON_ICO = files.blobstore.get_blob_key(handle) self.ENABLE_THEME_PREVIEW = self.section.handler.request.get('ENABLE_THEME_PREVIEW') != '' self.DEBUG_MODE = self.section.handler.request.get('DEBUG_MODE') != '' cache.delete(CACHE_KEY) self.update() raise Exception('Redirect', self.section.action_redirect_path) f = form(self.section, self.section.full_path) f.add_control(control(self.section, 'text', 'SITE_HEADER', self.SITE_HEADER, 'Site header', 50)) f.add_control(control(self.section, 'text', 'SITE_SUB_HEADER', self.SITE_SUB_HEADER, 'Site sub-header', 50)) combined_themes = get_local_theme_namespaces() + get_custom_theme_namespaces() f.add_control(selectcontrol(self.section, 'DEFAULT_THEME', combined_themes, self.DEFAULT_THEME if self.DEFAULT_THEME else DEFAULT_LOCAL_THEME_TEMPLATE, 'Default theme')) f.add_control(control(self.section, 'text', 'GOOGLE_ANALYTICS_UA', self.GOOGLE_ANALYTICS_UA, 'Google analytics UA')) f.add_control(control(self.section, 'file', 'FAVICON_ICO', label='favicon.ico')) f.add_control(textareacontrol(self.section, 'ROBOTS_TXT', self.ROBOTS_TXT, 'robots.txt', 90, 5)) f.add_control(checkboxcontrol(self.section, 'ENABLE_THEME_PREVIEW', self.ENABLE_THEME_PREVIEW, 'Enable theme preview')) f.add_control(checkboxcontrol(self.section, 'DEBUG_MODE', self.DEBUG_MODE, 'Debug mode')) f.add_control(control(self.section, 'submit', 'submit', 'Submit')) return '<h2>Edit configuration</h2>%s' % unicode(f)
def delete_blob(key): try: BlobInfo.get(key).delete() except: return 'failed' else: return 'succeeded'
def update_background(self, full, thumb): station = self.station old_full_blob_key = None old_thumb_blob_key = None m1 = re.match(r"/picture/([^/]+)?/view", station.full) m2 = re.match(r"/picture/([^/]+)?/view", station.thumb) if m1 and m2: logging.info("Background is a blob") old_full_blob_key = m1.group(1) old_thumb_blob_key = m2.group(1) else: logging.info("Background is a static file") station.full = full station.thumb = thumb station.put() logging.info("Station updated in datastore") memcache.set(self._memcache_station_id, station) logging.info("Station updated in memcache") # Update in runtime self._station = station if old_full_blob_key and old_thumb_blob_key: old_full = BlobInfo.get(old_full_blob_key) old_full.delete() logging.info("Old full size background removed from blobstore") old_thumb = BlobInfo.get(old_thumb_blob_key) old_thumb.delete() logging.info("Old thumbnail removed from blobstore")
def delete_all_images(): k = ndb.Key('Firm', 'frl') for img in Image.query(ancestor=k).iter(): print img.key.id() for bk in [img.small_blob_key, img.large_blob_key]: if BlobInfo.get(bk): BlobInfo.get(bk).delete() img.key.delete()
def delete_all_images(): k = ndb.Key("Firm", "frl") for img in Image.query(ancestor=k).iter(): print img.key.id() for bk in [img.small_blob_key, img.large_blob_key]: if BlobInfo.get(bk): BlobInfo.get(bk).delete() img.key.delete()
def action_edit(self): if self.section.handler.request.get('submit'): self.SITE_HEADER = self.section.handler.request.get('SITE_HEADER') self.SITE_SUB_HEADER = self.section.handler.request.get( 'SITE_SUB_HEADER') self.DEFAULT_THEME = self.section.handler.request.get( 'DEFAULT_THEME') self.GOOGLE_ANALYTICS_UA = self.section.handler.request.get( 'GOOGLE_ANALYTICS_UA') self.ROBOTS_TXT = self.section.handler.request.get('ROBOTS_TXT') if self.section.handler.request.get('FAVICON_ICO'): if self.FAVICON_ICO: BlobInfo.get(self.FAVICON_ICO).delete() data = self.section.handler.request.get('FAVICON_ICO') handle = files.blobstore.create( mime_type='image/x-icon', _blobinfo_uploaded_filename='favicon.ico') with files.open(handle, 'a') as f: f.write(data) files.finalize(handle) self.FAVICON_ICO = files.blobstore.get_blob_key(handle) self.ENABLE_THEME_PREVIEW = self.section.handler.request.get( 'ENABLE_THEME_PREVIEW') != '' self.DEBUG_MODE = self.section.handler.request.get( 'DEBUG_MODE') != '' cache.delete(CACHE_KEY) self.update() raise Exception('Redirect', self.section.action_redirect_path) f = form(self.section, self.section.full_path) f.add_control( control(self.section, 'text', 'SITE_HEADER', self.SITE_HEADER, 'Site header', 50)) f.add_control( control(self.section, 'text', 'SITE_SUB_HEADER', self.SITE_SUB_HEADER, 'Site sub-header', 50)) combined_themes = get_local_theme_namespaces( ) + get_custom_theme_namespaces() f.add_control( selectcontrol( self.section, 'DEFAULT_THEME', combined_themes, self.DEFAULT_THEME if self.DEFAULT_THEME else DEFAULT_LOCAL_THEME_TEMPLATE, 'Default theme')) f.add_control( control(self.section, 'text', 'GOOGLE_ANALYTICS_UA', self.GOOGLE_ANALYTICS_UA, 'Google analytics UA')) f.add_control( control(self.section, 'file', 'FAVICON_ICO', label='favicon.ico')) f.add_control( textareacontrol(self.section, 'ROBOTS_TXT', self.ROBOTS_TXT, 'robots.txt', 90, 5)) f.add_control( checkboxcontrol(self.section, 'ENABLE_THEME_PREVIEW', self.ENABLE_THEME_PREVIEW, 'Enable theme preview')) f.add_control( checkboxcontrol(self.section, 'DEBUG_MODE', self.DEBUG_MODE, 'Debug mode')) f.add_control(control(self.section, 'submit', 'submit', 'Submit')) return '<h2>Edit configuration</h2>%s' % unicode(f)
def test_remove_image_with_only_original_blob(self): content_type = 'image/jpeg' blob_key = self.make_blob(content_type, 'dummy') self.assertTrue(BlobInfo.get(blob_key), 'Should be able to load BlobInfo for key.') image = ae_image.core.Image(blob_key, content_type) image.remove() self.assertFalse(BlobInfo.get(blob_key), 'Should no longer be able to load BlobInfo for key.')
def serve_file(request, blob_key_or_info, as_download=False, content_type=None, filename=None, offset=None, size=None): """ Serves a file from the blobstore, reads most of the data from the blobinfo by default but you can override stuff by passing kwargs. You can also pass a Google Cloud Storage filename as `blob_key_or_info` to use Blobstore API to serve the file: https://cloud.google.com/appengine/docs/python/blobstore/#Python_Using_the_Blobstore_API_with_Google_Cloud_Storage """ if isinstance(blob_key_or_info, BlobKey): info = BlobInfo.get(blob_key_or_info) blob_key = blob_key_or_info elif isinstance(blob_key_or_info, basestring): info = BlobInfo.get(BlobKey(blob_key_or_info)) blob_key = BlobKey(blob_key_or_info) elif isinstance(blob_key_or_info, BlobInfo): info = blob_key_or_info blob_key = info.key() else: raise ValueError("Invalid type %s" % blob_key_or_info.__class__) if info == None: # Lack of blobstore_info means this is a Google Cloud Storage file if has_cloudstorage: info = cloudstorage.stat(blob_key_or_info) info.size = info.st_size blob_key = create_gs_key('/gs{0}'.format(blob_key_or_info)) else: raise ImportError("To serve a Cloud Storage file you need to install cloudstorage") response = HttpResponse(content_type=content_type or info.content_type) response[BLOB_KEY_HEADER] = str(blob_key) response['Accept-Ranges'] = 'bytes' http_range = request.META.get('HTTP_RANGE') if offset or size: # Looks a little bonkers, but basically create the HTTP range string, we cast to int first to make sure # nothing funky gets into the headers http_range = "{}-{}".format( str(int(offset)) if offset else "", str(int(offset or 0) + size) if size else "" ) if http_range is not None: response[BLOB_RANGE_HEADER] = http_range if as_download: response['Content-Disposition'] = smart_str( u'attachment; filename="%s"' % (filename or info.filename) ) elif filename: raise ValueError("You can't specify a filename without also specifying as_download") if info.size is not None: response['Content-Length'] = info.size return response
def on_remove(self): for i in range(len(self.theme_namespaces)): # This can be done more efficiently via GQL theme = self.get_theme(self.theme_namespaces[i]) cache.delete(CACHE_KEY_PREPEND + self.theme_namespaces[i]) for key in theme.image_keys: cache.delete(CACHE_KEY_PREPEND + str(key)) BlobInfo.get(key).delete() theme.key.delete() del self.theme_keys[i] del self.theme_namespaces[i] self.update()
def action_get(self): if not self.section.path_params or len(self.section.path_params) != 3: raise Exception('NotFound') theme = self.get_theme(self.section.path_params[0]) resource = self.section.path_params[1] filename = self.section.path_params[2] if resource == 'css': filenames, contents = theme.css_filenames, theme.css_contents content_type = 'text/css' elif resource == 'js': filenames, contents = theme.js_filenames, theme.js_contents content_type = 'text/javascript' elif resource == 'image': data = None try: key = theme.image_keys[theme.image_filenames.index(filename)] data = cache.get(CACHE_KEY_PREPEND + str(key)) if not data: data = BlobInfo.get(key) cache.set(CACHE_KEY_PREPEND + str(key), data) finally: if not data: raise Exception('NotFound') raise Exception('SendFileBlob', data.open().read(), data.content_type) else: raise Exception('NotFound') try: index = filenames.index(filename) except: raise Exception('NotFound') else: raise Exception('SendFileBlob', str(contents[index]), content_type)
def updatevideo(self, dish_id, video): dish = Dish.get_by_id(int(dish_id)) if dish.video: blob_info = BlobInfo.get(dish.video) blob_info.delete() dish.video = video dish.put()
def test_remove_with_single_image(self): blob_key = self.make_blob('image/jpeg', 'dummy') self.assertTrue(BlobInfo.get(blob_key), 'Should be able to load BlobInfo for key.') collection = ae_image.core.Collection( [ae_image.core.Style('big', 500)]) collection.append_from_blob_info(BlobInfo.get(blob_key)) self.assertTrue( collection.get_url('big', blob_key), 'Expect URL back.') collection.remove(blob_key) self.assertFalse(BlobInfo.get(blob_key), 'Should no longer be able to load BlobInfo for key.') self.assertRaises(ae_image.core.UnknownImage, collection.get_url, 'big', blob_key) self.assertRaises(ae_image.core.UnknownImage, collection.remove, blob_key)
def test_append_from_blob_info(self): blob_key = self.make_blob('image/jpeg', 'dummy') collection = ae_image.core.Collection( [ae_image.core.Style('big', 500)]) collection.append_from_blob_info(BlobInfo.get(blob_key)) self.assertTrue( collection.get_url('big', blob_key), 'Expect URL back.')
def _get_info(self, name): if name.startswith('/gs/'): assert cloudstorage, 'cloudstorage module is not available.' return CloudStorageInfo(name) else: key = BlobKey(name.split('/', 1)[0]) return BlobInfo.get(key)
def updatephoto(self, dish_id, photo): dish = Dish.get_by_id(int(dish_id)) if dish.photo: blob_info = BlobInfo.get(dish.photo) blob_info.delete() dish.photo = photo dish.put()
def updateaudio(self, dish_id, audio): dish = Dish.get_by_id(int(dish_id)) if dish.audio: blob_info = BlobInfo.get(dish.audio) blob_info.delete() dish.audio = audio dish.put()
class ShowRecipeHandler(webapp2.RequestHandler): def post(self): # Recipe Stuff # recipeID = self.request.get('recipeID') recipe_key = ndb.Key(urlsafe=recipeID) recipe = recipe_key.get() # IMAGES image_list = [] for image in recipe.img: try: img = BlobInfo.get(image) url = models.getServingURL(blobkey=img, size=200, shape=False) image_list.append( dict(filename=img.filename, url=url, urlkey=str(image))) except Exception, e: print e # AVATAR avatar = dict(filename='No Avatar', url='img/no_image.png', urlkey='NoAvatarInBlobstore') try: img = BlobInfo.get(recipe.avatar) url = models.getServingURL(blobkey=img, size=200, shape=False) avatar = dict(filename=img.filename, url=url, urlkey=str(recipe.avatar)) except Exception, e: print e
def post(self): try: if not db.WRITE_CAPABILITY.is_enabled(): raise utils.CapabilityUnavailable('Datastore unavailable') if 'user_uuid' not in self.context['request_args'] or self.context['request_args']['user_uuid'] == '': raise Exception('No user_uuid provided') if 'serving_url' not in self.context['request_args'] or self.context['request_args']['serving_url'] == '': raise Exception('No serving_url provided') if 'short_url' not in self.context['request_args'] or self.context['request_args']['short_url'] == '': raise Exception('No short_url provided') if 'blob_key_name' not in self.context['request_args'] or self.context['request_args']['blob_key_name'] == '': raise Exception('No blob_key_name provided') blob_key = BlobKey(self.context['request_args']['blob_key_name']) blob_info = BlobInfo.get(blob_key) user_image = photo_module.Photo( user_uuid=self.context['request_args']['user_uuid'], serving_url=self.context['request_args']['serving_url'], short_url=self.context['request_args']['short_url'], blob=blob_info ) user_image.save() except modules_base.CapabilityUnavailable, cu: logging.exception(cu) self.response.set_status(503)
def post(self): upload_files = self.get_uploads('file') blob_info = upload_files[0] # Resize the image image = images.Image(blob_key=blob_info.key()) image.resize(width=WOOF_FEED_ITEM_IMAGE_MAX_WIDTH, height=WOOF_FEED_ITEM_IMAGE_MAX_HEIGHT) thumbnail = image.execute_transforms(output_encoding=images.JPEG) # Save Resized Image back to blobstore file_name = files.blobstore.create(mime_type='image/jpeg') with files.open(file_name, 'a') as f: f.write(thumbnail) files.finalize(file_name) # Remove the original image blobstore.delete(blob_info.key()) blob_key = files.blobstore.get_blob_key(file_name) # New FeedImage feed_image = FeedImage() feed_image.data = BlobInfo.get(blob_key) feed_image.width = image.width feed_image.height = image.height feed_image.put() # Create new FeedItem feed_item = FeedItem() feed_item.text = self.request.get("text") feed_item.image = feed_image feed_item.put() self.redirect('/')
def post(self): key = self.request.get("key") value = self.request.get("value") filename = urllib.unquote(key) # Clean up current file query = DataFile.all().filter("f_key", filename) for data_file in query: data_file.delete() # Create a file writable_file_name = files.blobstore.create(mime_type="application/octect-stream") with files.open(writable_file_name, "a") as f: f.write(value) files.finalize(writable_file_name) blob_key = files.blobstore.get_blob_key(writable_file_name) data_file = DataFile(f_key=filename, f_value=blob_key) data_file.put() if memcache.get(key="turn") == "on": if BlobInfo.get(blob_key).size <= 100000: memcache.set(key=filename, value=value, time=3600) write_boolean(self, True)
def post(self): try: recipeID = self.request.get('recipe_id') print("rID: " + recipeID) recipe = ndb.Key(urlsafe=recipeID) recipe_key = recipe.get() # Image Elements recipe_key.img = [] deletable = [] # Get Deletable Elements try: removedImages = self.request.get('removed_images') images = removedImages.split(',') for image in images: if image != '': print('Deletable: ' + image) deletable.append(BlobInfo.get(image).key()) except Exception, e: print e # Avatar Model try: avi = self.get_uploads('avatar_file') recipe_key.avatar = avi[0].key() try: oldAvi = self.request.get('existing_avatar') recipe_key.img.append(BlobInfo.get(oldAvi).key()) except Exception, e: print(e) except Exception, e: print('No new Avatar Image Uploaded') # Existing Avatar Model try: aviKey = self.request.get_all('existing_avatar') recipe_key.avatar = BlobInfo.get(aviKey[0]).key() except Exception, e: # Pull old avatar that was deleted out of the trash if recipe_key.avatar in deletable: deletable.remove(recipe_key.avatar) print( 'No Existing Image Chosen as Avatar. Keeping Same Avatar' )
def presentation_download(request, key, name): blob = BlobInfo.get(key) if not blob: return Response(status=304) headers = Headers() headers['Content-Type'] = blob.content_type.encode('utf-8') headers['Last-Modified'] = blob.creation.strftime(HTTP_DATE_FMT) return Response(blob.open().read(), headers=headers)
def action_delete(self): if not self.section.path_params or len(self.section.path_params) != 1: raise Exception('NotFound') theme = self.get_theme(self.section.path_params[0]) if self.section.handler.request.get('submit'): for key in theme.image_keys: cache.delete(CACHE_KEY_PREPEND + str(key)) BlobInfo.get(key).delete() self.theme_keys.remove(theme.key) self.theme_namespaces.remove(theme.namespace) theme.key.delete() self.update() cache.flush_all() # Flush all cached resources for this theme which is important for sections where it is active raise Exception('Redirect', self.section.action_redirect_path) f = form(self.section, self.section.full_path) f.add_control(control(self.section, 'submit', 'submit', 'Confirm')) return '<div class="status warning">Are you sure you wish to delete theme "%s" and all associated resources?</div>%s' % (theme.namespace, unicode(f))
def get(self, resource): blob_key = str(urllib.unquote(resource)) blob_info = BlobInfo.get(blob_key) if not blob_info: self.error(404) else: self.send_blob(blob_info)
def serve_file(request, blob_key_or_info, as_download=False, content_type=None, filename=None, offset=None, size=None): """ Serves a file from the blobstore, reads most of the data from the blobinfo by default but you can override stuff by passing kwargs. """ if isinstance(blob_key_or_info, BlobKey): info = BlobInfo.get(blob_key_or_info) elif isinstance(blob_key_or_info, basestring): info = BlobInfo.get(BlobKey(blob_key_or_info)) elif isinstance(blob_key_or_info, BlobInfo): info = blob_key_or_info else: raise ValueError("Invalid type %s" % blob_key_or_info.__class__) response = HttpResponse(content_type=content_type or info.content_type) response[BLOB_KEY_HEADER] = str(info.key()) response['Accept-Ranges'] = 'bytes' http_range = request.META.get('HTTP_RANGE') if offset or size: # Looks a little bonkers, but basically create the HTTP range string, we cast to int first to make sure # nothing funky gets into the headers http_range = "{}-{}".format( str(int(offset)) if offset else "", str(int(offset or 0) + size) if size else "") if http_range is not None: response[BLOB_RANGE_HEADER] = http_range if as_download: response['Content-Disposition'] = smart_str( u'attachment; filename="%s"' % filename or info.filename) elif filename: raise ValueError( "You can't specify a filename without also specifying as_download") if info.size is not None: response['Content-Length'] = info.size return response
def post(self): try: recipeID = self.request.get('recipe_id') print("rID: " + recipeID) recipe = ndb.Key(urlsafe=recipeID) recipe_key = recipe.get() # Image Elements recipe_key.img = [] deletable = [] # Get Deletable Elements try: removedImages = self.request.get('removed_images') images = removedImages.split(',') for image in images: if image != '': print('Deletable: ' + image) deletable.append(BlobInfo.get(image).key()) except Exception, e: print e # Avatar Model try: avi = self.get_uploads('avatar_file') recipe_key.avatar = avi[0].key() try: oldAvi = self.request.get('existing_avatar') recipe_key.img.append(BlobInfo.get(oldAvi).key()) except Exception, e: print(e) except Exception, e: print('No new Avatar Image Uploaded') # Existing Avatar Model try: aviKey = self.request.get_all('existing_avatar') recipe_key.avatar = BlobInfo.get(aviKey[0]).key() except Exception, e: # Pull old avatar that was deleted out of the trash if recipe_key.avatar in deletable: deletable.remove(recipe_key.avatar) print('No Existing Image Chosen as Avatar. Keeping Same Avatar')
def get(self, resource="", finlenME=""): logging.info(resource) # print resource # return resource = str(urllib.unquote(resource)) logging.info(resource) blob_info = BlobInfo.get(resource) logging.info(blob_info) self.send_blob(blob_info)
def updatephotogallery(self, dish_id, photogallery): dish = Dish.get_by_id(int(dish_id)) for photo in dish.photogallery: blob_info = BlobInfo.get(photo) blob_info.delete() dish.photogallery = [] for photo in photogallery: dish.photogallery.append(photo) dish.put()
def get_file(self, filename): item = None try: key = self.file_keys[self.filenames.index(filename)] item = cache.get(CACHE_KEY_PREPEND + str(key)) if not item: item = BlobInfo.get(key) cache.set(CACHE_KEY_PREPEND + str(key), item) finally: return item
def action_delete(self): if not self.section.path_params or len(self.section.path_params) != 1: raise Exception('NotFound') theme = self.get_theme(self.section.path_params[0]) if self.section.handler.request.get('submit'): for key in theme.image_keys: cache.delete(CACHE_KEY_PREPEND + str(key)) BlobInfo.get(key).delete() self.theme_keys.remove(theme.key) self.theme_namespaces.remove(theme.namespace) theme.key.delete() self.update() cache.flush_all( ) # Flush all cached resources for this theme which is important for sections where it is active raise Exception('Redirect', self.section.action_redirect_path) f = form(self.section, self.section.full_path) f.add_control(control(self.section, 'submit', 'submit', 'Confirm')) return '<div class="status warning">Are you sure you wish to delete theme "%s" and all associated resources?</div>%s' % ( theme.namespace, unicode(f))
def test_upload(self): handler = Mock() blob_key = self.save_blob('dados') blob_info = BlobInfo.get(blob_key) handler.get_uploads = lambda k: [blob_info] user = mommy.save_one(MainUser) upload.index(handler, user, None) blob_files = blob_facade.list_blob_files_cmd(user)() self.assertEqual(1, len(blob_files)) self.assertEqual(blob_key, blob_files[0].blob_key)
def get_favicon_ico(): item = get_configuration() if not item.FAVICON_ICO: data = file('framework/content/configuration/assets/images/favicon.ico', 'r').read() handle = files.blobstore.create(mime_type='image/x-icon', _blobinfo_uploaded_filename='favicon.ico') with files.open(handle, 'a') as f: f.write(data) files.finalize(handle) item.FAVICON_ICO = files.blobstore.get_blob_key(handle) item.update() cache.delete(CACHE_KEY) raise Exception('SendFileBlob', BlobInfo.get(item.FAVICON_ICO).open().read(), 'image/x-icon')
def price_uplader(request): upload_files = get_uploads(request, 'file') if not len(upload_files): return redirect(url_for('admin/add_price')) blob_info = upload_files[0] bl = BlobInfo.get(blob_info.key()) filename = os.path.basename(bl.filename.replace('\\','/')) price = Price(name=filename, file_key=str(blob_info.key()), length=blob_info.size) price.put() return redirect(url_for('admin/prices'))
def get_cached_url(self, force=False): if not self.blob_key: return '' if not self.url or force: blob_info = BlobInfo.get(self.blob_key) if blob_info: if blob_info.content_type in IMAGE_TYPES: cached_url = images.get_serving_url(self.blob_key) else: cached_url = url_for('file.get', file_key=self.uid) self.url = cached_url return self.url
def finish(self): """ Called when all shards have finished processing """ if self.error_csv_filename: files.finalize(self.error_csv_filename) blob_key = files.blobstore.get_blob_key(self.error_csv_filename) blob_info = BlobInfo.get(blob_key) blob_file = BlobstoreFile("errors.csv", 'rb', BlobstoreStorage()) blob_file.blobstore_info = blob_info self.error_csv = blob_file self.save()
def get(self, file_id): """ Respond to HTTP GET requests Download files from Blobstore that are referenced by file_id key Args: file_id a key that references some FileMetadata entity in the Datastore """ file_info = str(urllib.unquote(file_id)).strip() if not file_info: self.error(404) return self.send_blob(BlobInfo.get(file_id), save_as=False)
class UpdateAvatarHandler(blobstore_handlers.BlobstoreUploadHandler): def post(self): try: # Parse Student Favorite Recipes studentID = self.request.get('studentID') # Retrieve Student student_key = ndb.Key(urlsafe=studentID) student = student_key.get() # Get New Avatar avatar = self.get_uploads('avatar-input')[0] old_avatar = student.avatar safe = False # Save New Avatar try: student.avatar = avatar.key() student.put() safe = True except Exception, e: print e # Checking to See if Avatar was Never Uploaded Before try: CCLogo = models.StockImage.query(models.StockImage.image == old_avatar).fetch(1)[0] if (CCLogo): safe = False else: safe = True except Exception, e: print e # Delete Old Avatar if (safe): BlobInfo.get(BlobInfo.get(old_avatar).key()).delete() self.redirect('/profile')
def get_cached_url(self, force=False): if not self.blob_key: return '' if not self.url or force: blob_info = BlobInfo.get(self.blob_key) if blob_info: if blob_info.content_type in IMAGE_TYPES: cached_url = images.get_serving_url(self.blob_key) else: cached_url = url_for( 'file.get', file_key=self.uid, _external=True) self.url = cached_url return self.url
def append_from_request(collection, field_name): """ Appends new image(s) to the collection from the current Flask request. Returns the count of number of blobs that were added to the collection. """ blob_keys = [] for file_info in request.files.getlist(field_name): file_header = parse_options_header(file_info.headers['Content-Type']) blob_keys.append(file_header[1]['blob-key']) map(collection.append_from_blob_info, BlobInfo.get(blob_keys)) return len(blob_keys)
def post(self): studentID = self.request.get('studentID') student_key = ndb.Key(urlsafe=studentID) student = student_key.get() # AVATAR avatar = dict(filename='No Avatar', url='img/no_image.png', urlkey='NoAvatarInBlobstore') try: img = BlobInfo.get(student.avatar) url = models.getServingURL(blobkey=img, size=300, shape=False) avatar = dict(filename=img.filename, url=url, urlkey=str(student.avatar)) except Exception, e: print e
def post(self): recipeID = self.request.get('recipeID') print(recipeID) recipe_key = ndb.Key(urlsafe=recipeID) recipe = recipe_key.get() # IMAGES image_list = [] for image in recipe.img: try: img = BlobInfo.get(image) url = models.getServingURL(blobkey=img, size=200, shape=False) image_list.append( dict(filename=img.filename, url=url, urlkey=str(image))) except Exception, e: print e
def CreateBlob(path): # Initialize blob dictionary to return. blob = {} # Read sample file. blob['json_str'] = open(path, 'r').read() # Create file in blobstore according to sample file. file_name = files.blobstore.create(mime_type='text/plain') with files.open(file_name, 'a') as f: f.write(blob['json_str']) files.finalize(file_name) # Get BlobInfo of sample file. blob['blob_info'] = BlobInfo.get(files.blobstore.get_blob_key(file_name)) return blob
def get_favicon_ico(): item = get_configuration() if not item.FAVICON_ICO: data = file( 'framework/content/configuration/assets/images/favicon.ico', 'r').read() handle = files.blobstore.create( mime_type='image/x-icon', _blobinfo_uploaded_filename='favicon.ico') with files.open(handle, 'a') as f: f.write(data) files.finalize(handle) item.FAVICON_ICO = files.blobstore.get_blob_key(handle) item.update() cache.delete(CACHE_KEY) raise Exception('SendFileBlob', BlobInfo.get(item.FAVICON_ICO).open().read(), 'image/x-icon')
def action_delete_image(self): if not self.section.path_params or len(self.section.path_params) != 2: raise Exception('NotFound') theme = self.get_theme(self.section.path_params[0]) filename = self.section.path_params[1] if filename not in theme.image_filenames: raise Exception('NotFound') if self.section.handler.request.get('submit'): index = theme.image_filenames.index(filename) data = BlobInfo.get(theme.image_keys[index]) cache.delete(CACHE_KEY_PREPEND + str(theme.image_keys[index])) data.delete() del theme.image_keys[index] del theme.image_filenames[index] theme.put() cache.delete(CACHE_KEY_PREPEND + str(theme.key)) raise Exception('Redirect', self.section.action_redirect_path) f = form(self.section, self.section.full_path) f.add_control(control(self.section, 'submit', 'submit', 'Confirm')) return '<div class="status warning">Are you sure you wish to delete "%s"?</div>%s' % ( filename, unicode(f))
def setUp(self): super(TestRepositoryDocumentApi, self).setUp() self.admin = self.new_user(is_admin=True) self.student = Student.new_student( 'bob', 'bob smith', email='*****@*****.**', year=2015 ).key.get(use_cache=False) file_name = files.blobstore.create(mime_type='text/plain') with files.open(file_name, 'a') as f: f.write('test') files.finalize(file_name) blob_key = files.blobstore.get_blob_key(file_name) self.document = models.Document.new_file( self.student.key.id(), BlobInfo.get(blob_key), 'SHELF', sender=self.admin, name='test' ).key.get(use_cache=False)
def put_slot(key, iterable): db_key = make_db_key(key) filename = create(mime_type='text/xml') size = 0 with fopen(filename, 'ab') as f: for chunk in iterable: f.write(chunk) size += len(chunk) finalize(filename) blob_key = get_blob_key(filename) blob_info = BlobInfo.get(blob_key) assert blob_info.size == size, ( 'blob_info.size = {0!r}, size = {1!r}'.format(blob_info.size, size)) assert isinstance(blob_info, BlobInfo) now = datetime.datetime.utcnow() cache_key = make_cache_key(key) list_cache_key = make_cache_key(key[:-1]) def txn(): delete(cache_key, namespace='slot') delete(list_cache_key, namespace='list') slot = Slot.get(db_key) if slot is None: slot = Slot(depth=len(key), key=db_key, blob=blob_info, updated_at=now) else: assert isinstance(slot.blob, BlobInfo) slot.blob.delete() slot.blob = blob_info slot.updated_at = now slot.put() delete(list_cache_key, namespace='list') run_in_transaction_options(create_transaction_options(xg=True), txn) defer(push_to_dropbox, db_key, now)
def serve_file(request, file, save_as, content_type, **kwargs): if isinstance(file, BlobKey): blobkey = file elif hasattr(file, 'file') and hasattr(file.file, 'blobstore_info'): blobkey = file.file.blobstore_info.key() elif hasattr(file, 'blobstore_info'): blobkey = file.blobstore_info.key() else: raise ValueError("The provided file can't be served via the " "Google App Engine Blobstore.") response = HttpResponse(content_type=content_type) response[BLOB_KEY_HEADER] = str(blobkey) response['Accept-Ranges'] = 'bytes' http_range = request.META.get('HTTP_RANGE') if http_range is not None: response[BLOB_RANGE_HEADER] = http_range if save_as: response['Content-Disposition'] = smart_str( u'attachment; filename="%s"' % save_as) info = BlobInfo.get(blobkey) if info.size is not None: response['Content-Length'] = info.size return response
def on_remove(self): for key in self.file_keys: cache.delete(CACHE_KEY_PREPEND + str(key)) BlobInfo.get(key).delete() self.update()
def _get_blobinfo(self, name): return BlobInfo.get(self._get_key(name))
try: aviKey = self.request.get_all('existing_avatar') recipe_key.avatar = BlobInfo.get(aviKey[0]).key() except Exception, e: # Pull old avatar that was deleted out of the trash if recipe_key.avatar in deletable: deletable.remove(recipe_key.avatar) print( 'No Existing Image Chosen as Avatar. Keeping Same Avatar' ) # Existing Images Model try: urlKeys = self.request.get_all('existing_img') for keye in urlKeys: recipe_key.img.append(BlobInfo.get(keye).key()) except Exception, e: print e # New Images try: sm_images = self.get_uploads('sm_image') for image in sm_images: recipe_key.img.append(image.key()) except Exception, e: print e # Process Deletable try: for delete in deletable: BlobInfo.get(delete).delete()