Пример #1
0
def display_difference():
    '''
    Given a number through GET, returns json with following attrs:

    - number: the number given through GET
    - value: calculated value from number (see models.NumberRecord)
    - last_requested: datetime in isoformat of when record is updated
    - occurences: number of times this number has been queried

    If any errors occur, a JSON with the following content will return:
    - message: explanation of error
    - code: associated error code
    '''
    try:
        number = int(request.args.get('number'))
    except (TypeError, ValueError):
        return jsonify(**{
            'message': 'Please provide a number',
            'code': ErrorCode.NO_NUMBER
            }
        )

    if not (1 <= number <= 100):
        return jsonify(**{
            'message': 'Number must be in the range of 1 to 100',
            'code': ErrorCode.OUT_OF_RANGE
            }
        )

    record = db.session.query(NumberRecord).filter(
        NumberRecord.number==number).first()
    if not record:
        record = NumberRecord(number=number, occurences=0)
        record.set_value()
        db.session.add(record)

    record.last_requested = datetime.datetime.now()
    record.occurences += 1
    # This feels dirty
    # Would be better to incorporate something like ZopeTransactionManager...
    db.session.commit()

    return jsonify(**record.to_json())