def add(request_format): tag_names = request.form['tags'].split(' ') url = request.form['url'] if url: print 'fetching from remote url' truck = ImageTruck.new_from_url(url) elif request.files['file']: image = request.files['file'] truck = ImageTruck.new_from_stream(image.stream, image.mimetype) else: abort(400) metadata = ImageMetadata.image_metadata(truck.contents) print 'potentially reorienting' truck.contents = ReorientImage.reorient_image(truck.contents) print 'uploading to s3' truck.upload() session = Client().session() image = Image(filename=truck.calculate_filename(), source_url=url, description=request.form.get('description'), title=request.form.get('title'), **metadata) album_id = request.form['album'] if album_id: image.album_id = album_id session.add(image) image.add_tags(tag_names) ResizeImage.make_resizes(image, truck) if request_format == 'html': return redirect(url_for('show_image', image_id=image.image_id)) elif request_format == 'json': return {'url': truck.url()}
def add(request_format): url = request.form.get("url") if url: try: trucks = [ImageTruck.new_from_url(url)] except RequestException: abort(request_format, 400, "That url is no good.") except TryHTTPError: abort( request_format, 400, "Catsnap couldn't establish an HTTPS connection to that " "image. An HTTP connection may succeed (this is a problem " "on Catsnap's end, not something you did wrong).", ) elif request.files.get("file[]"): trucks = [ImageTruck.new_from_stream(data.stream) for data in request.files.getlist("file[]")] elif request.files.get("file"): data = request.files["file"] trucks = [ImageTruck.new_from_stream(data.stream)] else: abort(request_format, 400, "Please submit either a file or a url.") # These loops are sorta awkwardly phrased to avoid lots of round-tripping # to the database. I hope you don't consider the optimization premature. session = Client().session() images = [] for truck in trucks: image = Image(filename=truck.filename, source_url=url) album_id = request.form.get("album_id") if album_id: image.album_id = int(album_id) session.add(image) images.append(image) session.flush() contentses = [] for i in xrange(0, len(images)): (truck, image) = trucks[i], images[i] contents = ImageContents(image_id=image.image_id, contents=truck.contents, content_type=truck.content_type) session.add(contents) contentses.append(contents) session.flush() task_ids = [] # Hey, this is a loop around a round-trip to redis. Although the Python # Redis library offers a way to send multiple requests in one thwack, # Celery doesn't appear to offer a way to use it. Nothing to be done. for contents in contentses: task_ids.append(delay(g.queued_tasks, process_image, contents.image_contents_id)) if request_format == "html": return redirect(url_for("show_image", image_id=image.image_id)) elif request_format == "json": return [ {"url": trucks[i].url(), "image_id": images[i].image_id, "task_id": task_ids[i]} for i in xrange(0, len(trucks)) ]
def add(request_format): url = request.form.get('url') if url: try: trucks = [ImageTruck.new_from_url(url)] except RequestException: abort(request_format, 400, "That url is no good.") elif request.files.get('file[]'): trucks = [ImageTruck.new_from_stream(data.stream) for data in request.files.getlist('file[]')] elif request.files.get('file'): data = request.files['file'] trucks = [ImageTruck.new_from_stream(data.stream)] else: abort(request_format, 400, "Please submit either a file or a url.") # These loops are sorta awkwardly phrased to avoid lots of round-tripping # to the database. I hope you don't consider the optimization premature. session = Client().session() images = [] for truck in trucks: image = Image(filename=truck.filename, source_url=url) album_id = request.form.get('album_id') if album_id: image.album_id = int(album_id) session.add(image) images.append(image) session.flush() contentses = [] for i in xrange(0, len(images)): (truck, image) = trucks[i], images[i] contents = ImageContents(image_id=image.image_id, contents=truck.contents, content_type=truck.content_type) session.add(contents) contentses.append(contents) session.flush() task_ids = [] # Hey, this is a loop around a round-trip to redis. Although the Python # Redis library offers a way to send multiple requests in one thwack, # Celery doesn't appear to offer a way to use it. Nothing to be done. for contents in contentses: task_ids.append(delay(g.queued_tasks, process_image, contents.image_contents_id)) if request_format == 'html': return redirect(url_for('show_image', image_id=image.image_id)) elif request_format == 'json': return [{ 'url': trucks[i].url(), 'image_id': images[i].image_id, 'task_id': task_ids[i], } for i in xrange(0, len(trucks))]