def landing(): """Landing page for the application If the request is `GET`, render the landing page. If `POST`, then store the visualization in the session and render the visualization settings page (if applicable) or render file selection. """ if request.method == 'POST': session['vis_name'] = request.form.get('choice') vis = get_visualizations()[session['vis_name']] if vis.ALLOWED_SETTINGS: return visualization_settings() return select_files() # otherwise, on GET request visualizations = get_visualizations() vis_desc = [{'name': vis, 'description': visualizations[vis].DESCRIPTION} for vis in visualizations] session.clear() return render_template('select_visualization.html', app_state=get_app_state(), visualizations=sorted(vis_desc, key=itemgetter('name')))
def visualize(): """Trigger a visualization via the REST API Takes a single image and generates the visualization data, returning the output exactly as given by the target visualization. """ session['settings'] = {} image_uid = request.args.get('image') vis_name = request.args.get('visualizer') vis = get_visualizations()[vis_name] if hasattr(vis, 'settings'): for key in vis.settings.keys(): if request.args.get(key) is not None: session['settings'][key] = request.args.get(key) else: session['settings'][key] = vis.settings[key][0] inputs = [] for image in session['image_list']: if image['uid'] == int(image_uid): full_path = os.path.join(session['img_input_dir'], image['filename']) entry = {} entry['filename'] = image['filename'] entry['data'] = Image.open(full_path) inputs.append(entry) if 'settings' in session: vis.update_settings(session['settings']) output = vis.make_visualization(inputs, output_dir=session['img_output_dir']) return jsonify(output[0])
def visualize(): """Trigger a visualization via the REST API Takes a single image and generates the visualization data, returning the output exactly as given by the target visualization. """ session['settings'] = {} image_uid = request.args.get('image') vis_name = request.args.get('visualizer') vis = get_visualizations()[vis_name] if vis.ALLOWED_SETTINGS: for key in vis.ALLOWED_SETTINGS.keys(): if request.args.get(key) is not None: session['settings'][key] = request.args.get(key) else: session['settings'][key] = vis.ALLOWED_SETTINGS[key][0] else: logger.debug( 'Selected Visualizer {0} has no settings.'.format(vis_name)) inputs = [] for image in session['image_list']: if image['uid'] == int(image_uid): full_path = os.path.join(session['img_input_dir'], image['filename']) entry = dict() entry['filename'] = image['filename'] entry['data'] = Image.open(full_path) inputs.append(entry) vis.update_settings(session['settings']) output = vis.make_visualization(inputs, output_dir=session['img_output_dir']) return jsonify(output[0])
def visualize(): """Trigger a visualization via the REST API Takes a single image and generates the visualization data, returning the output exactly as given by the target visualization. """ session['settings'] = {} image_uid = request.args.get('image') vis_name = request.args.get('visualizer') vis = get_visualizations()[vis_name] if hasattr(vis, 'settings'): for key in vis.settings.keys(): if request.args.get(key) is not None: session['settings'][key] = request.args.get(key) else: session['settings'][key] = vis.settings[key][0] inputs = [] for image in session['image_list']: if image['uid'] == int(image_uid): full_path = os.path.join(session['img_input_dir'], image['filename']) entry = {} entry['filename'] = image['filename'] entry['data'] = Image.open(full_path) inputs.append(entry) if 'settings' in session: vis.update_settings(session['settings']) output = vis.make_visualization( inputs, output_dir=session['img_output_dir']) return jsonify(output[0])
def visualizers_information(vis_name): vis = get_visualizations()[vis_name] if hasattr(vis, 'ALLOWED_SETTINGS'): settings = vis.ALLOWED_SETTINGS else: settings = {} return jsonify(settings=settings)
def visualizers(): """Get a list of available visualizers Responses with a JSON list of available visualizers """ list_of_visualizers = [] for visualizer in get_visualizations(): list_of_visualizers.append({'name': visualizer}) return jsonify(visualizers=list_of_visualizers)
def visualization_settings(): """Visualization settings page Will only render if the visualization object has a non-null `ALLOWED_SETTINGS` attribute. """ if request.method == 'POST': vis = get_visualizations()[session['vis_name']] return render_template('settings.html', app_state=get_app_state(), current_vis=session['vis_name'], settings=vis.ALLOWED_SETTINGS)
def select_files(): """File selection and final display of visualization If the request contains no files, then render the file selection page. Otherwise render the visualization. Todo: Logically, this route should be split into `select_files` and `result`. """ if 'file[]' in request.files: vis = get_visualizations()[session['vis_name']] inputs = [] for file_obj in request.files.getlist('file[]'): entry = {} entry.update({'filename': file_obj.filename}) # Why is this necessary? Unsure why Flask sometimes # sends the files as bytestreams vs. strings. try: entry.update({'data': Image.open( io.BytesIO(file_obj.stream.getvalue()) )}) except AttributeError: entry.update({'data': Image.open( io.BytesIO(file_obj.stream.read()) )}) inputs.append(entry) start_time = time.time() if 'settings' in session: vis.update_settings(session['settings']) output = vis.make_visualization(inputs, output_dir=session['img_output_dir']) duration = '{:.2f}'.format(time.time() - start_time, 2) for i, file_obj in enumerate(request.files.getlist('file[]')): output[i].update({'filename': file_obj.filename}) for entry in inputs: path = os.path.join(session['img_input_dir'], entry['filename']) entry['data'].save(path, 'PNG') kwargs = {} if vis.REFERENCE_LINK: kwargs['reference_link'] = vis.REFERENCE_LINK return render_template('{}.html'.format(session['vis_name']), inputs=inputs, results=output, current_vis=session['vis_name'], app_state=get_app_state(), duration=duration, **kwargs) # otherwise, if no files in request session['settings'] = request.form.to_dict() if 'choice' in session['settings']: session['settings'].pop('choice') return render_template('select_files.html', app_state=get_app_state(), current_vis=session['vis_name'], settings=session['settings'])
def visualizers_information(vis_name): vis = get_visualizations()[vis_name] return jsonify(settings=vis.ALLOWED_SETTINGS)