コード例 #1
0
ファイル: raster.py プロジェクト: OpertusMundi/ipr-service
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)
コード例 #2
0
ファイル: raster.py プロジェクト: OpertusMundi/ipr-service
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)
コード例 #3
0
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)
コード例 #4
0
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)
コード例 #5
0
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)
コード例 #6
0
ファイル: raster.py プロジェクト: OpertusMundi/ipr-service
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)