コード例 #1
0
ファイル: api.py プロジェクト: tylervz/calvinwebprint
def deletejob(job_id):
    '''API endpoint to delete a print job.

    Response body is empty.
    Response codes:
        200 - print job deleted successfully
        400 - invalid request - missing print job id
        401 - invalid credentials
        504 - database error
        502 - scraping error
    '''
    if job_id is None:
        abort(400, 'Missing print job id.')

    try:
        email, password = util.get_current_user_credentials()
    except ValueError:
        abort(401)
    username = email.split('@')[0]

    try:
        uniflow = printstatus.get_uniflow_client(username, password)
        uniflow.delete_print_jobs([job_id])
    except printstatus.InvalidCredentialsError:
        abort(401)
    except printstatus.NetworkError:
        abort(504)
    except printstatus.ScrapingError:
        abort(502)
    return '', 200
コード例 #2
0
ファイル: api.py プロジェクト: tylervz/calvinwebprint
def cloudprintstatus():
    """API endpoint with status concerning whether printing with cloudprint is possible.

    Response body is a JSON string.
    Response codes:
        200 - successful
        401 - invalid credentials
        504 - database error
    """
    try:
        email, password = util.get_current_user_credentials()
    except ValueError:
        abort(401)
    oauth_url = oauthcredentials.get_authentication_prompt_url(email)
    token_found = False
    printer_installed = None
    try:
        token = oauthcredentials.get_token(email)
    except oauthcredentials.WebServiceError:
        abort(504)

    if token is not None:
        token_found = True
        printer_installed = cloudprint.has_uniflow_printer(token)

    return flask.jsonify(haveCloudPrintPermission=token_found,
                         isPrinterInstalled=printer_installed,
                         cloudPrintPermissionUrl=oauth_url), 200
コード例 #3
0
ファイル: api.py プロジェクト: ThomasWo/calvinwebprint
def cloudprintstatus():
    """API endpoint with status concerning whether printing with cloudprint is possible.

    Response body is a JSON string.
    Response codes:
        200 - successful
        401 - invalid credentials
        504 - database error
    """
    try:
        email, password = util.get_current_user_credentials()
    except ValueError:
        abort(401)
    oauth_url = oauthcredentials.get_authentication_prompt_url(email)
    token_found = False
    printer_installed = None
    try:
        token = oauthcredentials.get_token(email)
    except oauthcredentials.WebServiceError:
        abort(504)

    if token is not None:
        token_found = True
        printer_installed = cloudprint.has_uniflow_printer(token)

    return flask.jsonify(haveCloudPrintPermission=token_found, 
                         isPrinterInstalled=printer_installed, 
                         cloudPrintPermissionUrl=oauth_url), 200
コード例 #4
0
ファイル: api.py プロジェクト: tylervz/calvinwebprint
def upload_file():
    '''API endpoint to upload a file to be printed.

    Expects file as POST data.
    Response body is the file_id of the saved file.
    Response codes:
        201 - upload successful
        400 - invalid request - missing file parameter or invalid file name
        401 - invalid credentials
        504 - database error
    '''
    try:
        email, password = util.get_current_user_credentials()
    except ValueError:
        abort(401)

    file_handle = request.files['file']
    if file_handle is None:
        abort(400)

    document_name = werkzeug.secure_filename(file_handle.filename)
    if not _has_supported_filetype(document_name):
        abort(400)
    try:
        document_id = document.save_document(file_handle, document_name, email)
    except document.DatabaseError:
        abort(504)

    return flask.jsonify(file_id=document_id), 201
コード例 #5
0
ファイル: api.py プロジェクト: ThomasWo/calvinwebprint
def deletejob(job_id):
    '''API endpoint to delete a print job.

    Response body is empty.
    Response codes:
        200 - print job deleted successfully
        400 - invalid request - missing print job id
        401 - invalid credentials
        504 - database error
        502 - scraping error
    '''
    if job_id is None:
        abort(400, 'Missing print job id.')

    try:
        email, password = util.get_current_user_credentials()
    except ValueError:
        abort(401)
    username = email.split('@')[0]
    
    try:
        uniflow = printstatus.get_uniflow_client(username, password)
        uniflow.delete_print_jobs([job_id])
    except printstatus.InvalidCredentialsError:
        abort(401)
    except printstatus.NetworkError:
        abort(504)
    except printstatus.ScrapingError:
        abort(502)
    return '', 200
コード例 #6
0
ファイル: api.py プロジェクト: ThomasWo/calvinwebprint
def upload_file():
    '''API endpoint to upload a file to be printed.

    Expects file as POST data.
    Response body is the file_id of the saved file.
    Response codes:
        201 - upload successful
        400 - invalid request - missing file parameter or invalid file name
        401 - invalid credentials
        504 - database error
    '''
    try:
        email, password = util.get_current_user_credentials()
    except ValueError:
        abort(401)

    file_handle = request.files['file']
    if file_handle is None:
        abort(400)
    
    document_name = werkzeug.secure_filename(file_handle.filename)
    if not _has_supported_filetype(document_name):
        abort(400)
    try:
        document_id = document.save_document(file_handle, 
                                             document_name, email)
    except document.DatabaseError:
        abort(504)

    return flask.jsonify(file_id=document_id), 201
コード例 #7
0
ファイル: api.py プロジェクト: tylervz/calvinwebprint
def revoke_cloudprint():
    '''API endpoint to revoke cloud print oauth token.

    Response codes:
        401 - invalid credentials
        504 - database error
        200  - success
    '''
    try:
        email, password = util.get_current_user_credentials()
    except ValueError:
        abort(401)

    try:
        token = oauthcredentials.delete_credentials(email, revoke=True)
    except oauthcredentials.WebServiceError:
        abort(504)

    return '', 200
コード例 #8
0
ファイル: api.py プロジェクト: ThomasWo/calvinwebprint
def revoke_cloudprint():
    '''API endpoint to revoke cloud print oauth token.

    Response codes:
        401 - invalid credentials
        504 - database error
        200  - success
    '''
    try:
        email, password = util.get_current_user_credentials()
    except ValueError:
        abort(401)

    try:
        token = oauthcredentials.delete_credentials(email, revoke=True)
    except oauthcredentials.WebServiceError:
        abort(504)

    return '', 200
コード例 #9
0
def index():
    """Route for index.html.

    Also sets various cookies which the front end uses.
    """
    response = make_response(render_template('index.html'))

    # Set status cookies used by the front end.
    signed_in = True
    try:
        email, password = util.get_current_user_credentials()
    except ValueError:
        signed_in = False

    if signed_in:
        response.set_cookie('email', value=email)
        response.set_cookie('isAuthenticated', value='true')
    else:
        response.set_cookie('email')
        response.set_cookie('isAuthenticated')

    return response
コード例 #10
0
ファイル: routes.py プロジェクト: tylervz/calvinwebprint
def index():
    """Route for index.html.

    Also sets various cookies which the front end uses.
    """
    response = make_response(render_template('index.html'))

    # Set status cookies used by the front end.
    signed_in = True
    try:
        email, password = util.get_current_user_credentials()
    except ValueError:
        signed_in = False

    if signed_in:
        response.set_cookie('email', value=email)
        response.set_cookie('isAuthenticated', value='true')
    else:
        response.set_cookie('email')
        response.set_cookie('isAuthenticated')

    return response
コード例 #11
0
ファイル: api.py プロジェクト: tylervz/calvinwebprint
def uniflowstatus():
    """API endpoint to get a user's print budget and print queue.

    Response body is JSON.
    Response codes:
        200 - budget and print queue retrieved successfully
        401 - invalid credentials
        504 - error connecting to uniflow
        502 - unexpected response from uniflow; the scraper is broken
    """
    try:
        email, password = util.get_current_user_credentials()
    except ValueError:
        abort(401)
    username = email.split('@')[0]

    try:
        uniflow = printstatus.get_uniflow_client(username, password)
        queue = uniflow.get_print_queue()
        budget = uniflow.get_budget()
    except printstatus.InvalidCredentialsError:
        abort(401)
    except printstatus.NetworkError:
        abort(504)
    except printstatus.ScrapingError:
        abort(502)

    jobs = []
    for job in queue:
        parsed_job = job._asdict()
        parsed_job['color'] = _is_color_job(job)
        jobs.append(parsed_job)

    response = {}
    response['queue'] = jobs
    response['budget'] = budget

    return flask.jsonify(**response), 200
コード例 #12
0
ファイル: api.py プロジェクト: ThomasWo/calvinwebprint
def uniflowstatus():
    """API endpoint to get a user's print budget and print queue.

    Response body is JSON.
    Response codes:
        200 - budget and print queue retrieved successfully
        401 - invalid credentials
        504 - error connecting to uniflow
        502 - unexpected response from uniflow; the scraper is broken
    """
    try:
        email, password = util.get_current_user_credentials()
    except ValueError:
        abort(401)
    username = email.split('@')[0]
    
    try:
        uniflow = printstatus.get_uniflow_client(username, password)
        queue = uniflow.get_print_queue()
        budget = uniflow.get_budget()
    except printstatus.InvalidCredentialsError:
        abort(401)
    except printstatus.NetworkError:
        abort(504)
    except printstatus.ScrapingError:
        abort(502)

    jobs = []
    for job in queue:
        parsed_job = job._asdict()
        parsed_job['color'] = _is_color_job(job)
        jobs.append(parsed_job)
    
    response = {}
    response['queue'] = jobs
    response['budget'] = budget

    return flask.jsonify(**response), 200
コード例 #13
0
def oauthredirect():
    """Callback route to receive an authorization code for cloud print.

    The code is used to request and save an oauth token for the current user.

    See `oauthcredentials.py` for details.
    """
    try:
        email, _ = util.get_current_user_credentials()
    except ValueError:
        return redirect('/')

    try:
        authorization_code = oauthcredentials.get_code_from_url(request.url)
    except ValueError:
        return redirect('/')

    try:
        oauthcredentials.authorize_user_by_code(authorization_code, email)
    except ValueError:
        return redirect('/')
    except oauthcredentials.WebServiceError:
        return redirect('/')
    return redirect('/')
コード例 #14
0
ファイル: routes.py プロジェクト: tylervz/calvinwebprint
def oauthredirect():
    """Callback route to receive an authorization code for cloud print.

    The code is used to request and save an oauth token for the current user.

    See `oauthcredentials.py` for details.
    """
    try:
        email, _ = util.get_current_user_credentials()
    except ValueError:
        return redirect('/')

    try:
        authorization_code = oauthcredentials.get_code_from_url(request.url)
    except ValueError:
        return redirect('/')

    try:
        oauthcredentials.authorize_user_by_code(authorization_code, email)
    except ValueError:
        return redirect('/')
    except oauthcredentials.WebServiceError:
        return redirect('/')
    return redirect('/')
コード例 #15
0
ファイル: api.py プロジェクト: tylervz/calvinwebprint
def printjob():
    '''API endpoint to submit a print job.

    Example of JSON expected as POST data:
    {
        file_id: oid
        color: True
        double_sided: False
        collate: True
        copies: 3,
        staple: True
    }
    where oid is the string representation of the objectid returned by Mongo.

    Response body is empty.
    Response codes:
        201 - print job submission successful
        400 - invalid request - missing parameter(s) or file not found in database
        401 - invalid credentials
        409 - token not found
        504 - database error
        502 - error submitting job to Google
    '''
    try:
        file_id = request.form.get('file_id')
        copies = int(request.form.get('copies'))
        color = _parse_bool(request.form.get('color'))
        collate = _parse_bool(request.form.get('collate'))
        double_sided = _parse_bool(request.form.get('double_sided'))
        staple = _parse_bool(request.form.get('staple'))
    except ValueError:
        abort(400)
    if None in (file_id, copies, color, collate, double_sided, staple):
        abort(400, 'Missing required argument.')
    if copies < 1:
        abort(400, 'Cannot print fewer than 1 copy.')

    try:
        email, password = util.get_current_user_credentials()
    except ValueError:
        abort(401)

    try:
        token = oauthcredentials.get_token(email)
    except oauthcredentials.WebServiceError:
        abort(504)
    if token is None:
        abort(409)

    try:
        file_handle = document.get_document(file_id, email)
    except document.DatabaseError:
        abort(504)
    if file_handle is None:
        abort(400)

    try:
        cloudprint.submit_job(token,
                              file_handle,
                              color=color,
                              duplex=double_sided,
                              copies=copies,
                              collate=collate,
                              staple=staple)
    except cloudprint.JobSubmissionError:
        abort(502)
    finally:
        document.delete_document(file_id, email)

    file_handle.close()
    return '', 201
コード例 #16
0
ファイル: api.py プロジェクト: ThomasWo/calvinwebprint
def printjob():
    '''API endpoint to submit a print job.

    Example of JSON expected as POST data:
    {
        file_id: oid
        color: True
        double_sided: False
        collate: True
        copies: 3,
        staple: True
    }
    where oid is the string representation of the objectid returned by Mongo.

    Response body is empty.
    Response codes:
        201 - print job submission successful
        400 - invalid request - missing parameter(s) or file not found in database
        401 - invalid credentials
        409 - token not found
        504 - database error
        502 - error submitting job to Google
    '''
    try:
        file_id = request.form.get('file_id')
        copies = int(request.form.get('copies'))
        color = _parse_bool(request.form.get('color'))
        collate = _parse_bool(request.form.get('collate'))
        double_sided = _parse_bool(request.form.get('double_sided'))
        staple = _parse_bool(request.form.get('staple'))
    except ValueError:
        abort(400)
    if None in (file_id, copies, color, collate, double_sided, staple):
        abort(400, 'Missing required argument.')
    if copies < 1:
        abort(400, 'Cannot print fewer than 1 copy.')

    try:
        email, password = util.get_current_user_credentials()
    except ValueError:
        abort(401)

    try:
        token = oauthcredentials.get_token(email)
    except oauthcredentials.WebServiceError:
        abort(504)
    if token is None:
        abort(409)

    try:
        file_handle = document.get_document(file_id, email)
    except document.DatabaseError:
        abort(504)
    if file_handle is None:
        abort(400)

    try: 
        cloudprint.submit_job(token, file_handle, color=color, duplex=double_sided,
                              copies=copies, collate=collate, staple=staple)
    except cloudprint.JobSubmissionError:
        abort(502)
    finally:
        document.delete_document(file_id, email)

    file_handle.close()
    return '', 201