def embed_message(): """**Flask POST rule**. Embed an invisible message. --- post: summary: Embed an invisible message. description: Embed an invisible message to raster. tags: - Raster parameters: - idempotencyKey requestBody: required: true content: application/json: schema: rasterEmbedMessageForm responses: 200: promptEmbedResponse 202: deferredResponse 400: validationErrorResponse """ logger.info('API request [endpoint: "%s"]', request.endpoint) form = RasterEmbedForm() if not form.validate_on_submit(): return make_response(form.errors, 400) g.session = get_session() raster = os.path.join(os.environ['INPUT_DIR'], form.raster.data) if form.response.data == 'prompt': session, export, success, error_msg = raster_embed_process( 'message', g.session, raster, form.message.data) if not success: db_update_queue_status(g.session['ticket'], completed=True, success=False, error_msg=error_msg) return make_response({'error': error_msg}, 500) path = copy_to_output(export, session['ticket']) db_update_queue_status(session['ticket'], completed=True, success=True, result=path) return make_response({'type': 'prompt', 'path': path}, 200) future = executor.submit(raster_embed_process, 'message', g.session, raster, form.message.data) future.add_done_callback(async_callback) return make_response( { 'type': 'deferred', 'ticket': g.session['ticket'], 'statusUri': "/jobs/status?ticket={ticket}".format(ticket=g.session['ticket']) }, 202)
def detect_message(): """**Flask POST rule**. Detect an invisible message. --- post: summary: Detect an invisible message. description: Detect an invisible message, previously embedded to the raster. tags: - Raster parameters: - idempotencyKey requestBody: required: true content: application/json: schema: rasterDetectForm responses: 200: promptDetectResponse 202: deferredResponse 400: validationErrorResponse """ logger.info('API request [endpoint: "%s"]', request.endpoint) form = RasterDetectForm() if not form.validate_on_submit(): return make_response(form.errors, 400) g.session = get_session() raster = os.path.join(os.environ['INPUT_DIR'], form.raster.data) watermarked = os.path.join(os.environ['INPUT_DIR'], form.watermarked.data) if form.response.data == 'prompt': session, message, success, error_msg = raster_detect_process( g.session, raster, watermarked) if not success: db_update_queue_status(g.session['ticket'], completed=True, success=False, error_msg=error_msg) return make_response({'error': error_msg}, 500) db_update_queue_status(session['ticket'], completed=True, success=True, result=message) return make_response({'type': 'prompt', 'key': message}, 200) future = executor.submit(raster_detect_process, g.session, raster, watermarked) future.add_done_callback(async_callback) return make_response( { 'type': 'deferred', 'ticket': g.session['ticket'], 'statusUri': "/jobs/status?ticket={ticket}".format(ticket=g.session['ticket']) }, 202)
def async_callback(future): """Generic callback for asynchronous operations. Updates database with the results. Arguments: future (obj): Future object. """ session, result, success, error_msg = future.result() ticket = session['ticket'] if success and os.path.isfile(result): result = copy_to_output(result, ticket) try: rmtree(session['working_path']) except: pass db_update_queue_status(ticket, completed=True, success=success, error_msg=error_msg, result=result)
def _vector_detect(action, **kwargs): """Check a vector dataset for embedded uuids. Arguments: action (str): How the watermark was embedded; one of 'fictitious', 'geometries'. **kwargs: Vector specific read parameters. Returns: (flask.response): Flask response. """ if g.form.response.data == 'prompt': session, uuid, success, error_msg = vector_detect_process( action, g.session, g.src_file, g.test_file, g.form.uuids.data, **kwargs) if not success: db_update_queue_status(g.session['ticket'], completed=True, success=False, error_msg=error_msg) return make_response({'error': error_msg}, 500) db_update_queue_status(session['ticket'], completed=True, success=True, result=uuid) return make_response({'type': 'prompt', 'key': uuid}, 200) future = executor.submit(vector_detect_process, action, g.session, g.src_file, g.test_file, g.form.uuids.data, **kwargs) future.add_done_callback(async_callback) ticket = g.session['ticket'] return make_response( { 'type': 'deferred', 'ticket': ticket, 'statusUri': "/jobs/status?ticket={ticket}".format(ticket=ticket) }, 202)
def _vector_embed(action, **kwargs): """Embed a watermark in vector. Arguments: action (str): How to embed the watermark; one of 'fictitious', 'geometries'. **kwargs: Vector specific read parameters. Returns: (flask.response): Flask response. """ if g.form.response.data == 'prompt': session, export, success, error_msg = vector_embed_process( action, g.session, g.src_file, g.form.uuid.data, **kwargs) if not success: db_update_queue_status(g.session['ticket'], completed=True, success=False, error_msg=error_msg) return make_response({'error': error_msg}, 500) path = copy_to_output(export, session['ticket']) db_update_queue_status(session['ticket'], completed=True, success=True, result=path) return make_response({'type': 'prompt', 'path': path}, 200) future = executor.submit(vector_embed_process, action, g.session, g.src_file, g.form.uuid.data, **kwargs) future.add_done_callback(async_callback) ticket = g.session['ticket'] return make_response( { 'type': 'deferred', 'ticket': ticket, 'statusUri': "/jobs/status?ticket={ticket}".format(ticket=ticket) }, 202)
def embed_watermark(): """**Flask POST rule**. Embed a visible watermark. --- post: summary: Embed a visible watermark. description: Embed a visible watermark, placed according to the given parameters. tags: - Raster parameters: - idempotencyKey requestBody: required: true content: application/json: schema: rasterEmbedWatermarkForm responses: 200: promptEmbedResponse 202: deferredResponse 400: validationErrorResponse """ logger.info('API request [endpoint: "%s"]', request.endpoint) form = RasterVisibleEmbedForm() if not form.validate_on_submit(): return make_response(form.errors, 400) g.session = get_session() raster = os.path.join(os.environ['INPUT_DIR'], form.raster.data) watermark = os.path.join(os.environ['INPUT_DIR'], form.watermark.data) params = { 'transparency': form.transparency.data, 'fit': form.fit.data, 'position': form.position.data } if params['fit'] == 'tile': params['distance'] = (form.distance_x.data, form.distance_y.data) if form.response.data == 'prompt': session, export, success, error_msg = raster_embed_process( 'watermark', g.session, raster, watermark, **params) if not success: db_update_queue_status(g.session['ticket'], completed=True, success=False, error_msg=error_msg) return make_response({'error': error_msg}, 500) path = copy_to_output(export, session['ticket']) db_update_queue_status(session['ticket'], completed=True, success=True, result=path) return make_response({'type': 'prompt', 'path': path}, 200) future = executor.submit(raster_embed_process, 'watermark', g.session, raster, watermark, **params) future.add_done_callback(async_callback) return make_response( { 'type': 'deferred', 'ticket': g.session['ticket'], 'statusUri': "/jobs/status?ticket={ticket}".format(ticket=g.session['ticket']) }, 202)