Beispiel #1
0
def put_languoid(request):
    glottocode = request.matchdict['glottocode']
    languoid = query_languoid(DBSession, glottocode)
    if languoid is None:
        request.response.status = 404
        return {'error': 'Not a valid languoid ID'}

    json_data = request.json_body
    try:
        data, errors = LanguoidSchema(partial=True).load(json_data)
    except ValueError:
        request.response.status = 400
        return {'error': 'Not a valid languoid level'}
    if errors:
        request.response.status = 400
        return {'error': errors}

    try:
        for key, value in data.items():
            setattr(languoid, key, value)
        DBSession.flush()
    except exc.SQLAlchemyError as e:
        request.response.status = 400
        DBSession.rollback()
        return {'error': "{}".format(e)}

    return LanguoidSchema().dump(languoid).data
Beispiel #2
0
def delete_languoid(request):
    glottocode = request.matchdict['glottocode']
    languoid = query_languoid(DBSession, glottocode)
    if languoid is None:
        request.response.status = 404
        return {'error': 'Not a valid languoid ID'}

    try:
        languoid.active = False
        DBSession.flush()
    except exc.SQLAlchemyError as e:
        request.response.status = 400
        DBSession.rollback()
        return {'error': "{}".format(e)}

    request.response.status = 204
    return LanguoidSchema().dump(languoid).data
Beispiel #3
0
def put_identifier(request):
    REQ_FIELDS = ['name', 'type']
    OPT_FIELDS = ['description', 'lang']
    is_partial = False
    new_identifier = request.json_body
    id_query, errors = query_identifier(request.matchdict['type'],
                                        request.matchdict['name'])
    if errors:
        request.response.status = 404
        return {'error': errors}

    identifier = id_query.first()

    if not any (k in new_identifier for k in REQ_FIELDS):
        is_partial = True
    else:
        all_fields = REQ_FIELDS + OPT_FIELDS
        update_fields = (k for k in all_fields if k not in new_identifier)
        for field in update_fields:
            new_identifier[field] = getattr(identifier, field)

    try:
        data, errors = IdentifierSchema(partial=is_partial).load(new_identifier)
    except (ValueError, ValidationError) as e:
        request.response.status = 400
        return {'error': '{}'.format(e)}
    if errors:
        request.response.status = 400
        return {'error': errors}

    try:
        for key in new_identifier:
            # Cannot direct lookup on identifier object
            setattr(identifier, key, getattr(data, key))

        DBSession.flush()
        result = json.dumps(IdentifierSchema().dump(identifier))
    except exc.SQLAlchemyError as e:
        request.response.status = 400
        DBSession.rollback()
        return { 'error': '{}'.format(e) }

    # Commit if no errors
    transaction.commit()

    return result
Beispiel #4
0
def add_languoid(request):
    json_data = request.json_body

    try:
        data, errors = LanguoidSchema().load(json_data)
    except ValueError:
        request.response.status = 400
        return {'error': 'Not a valid languoid level'}
    if errors:
        request.response.status = 400
        return {'error': errors}

    try:
        DBSession.add(Languoid(**data))
        DBSession.flush()
    except exc.SQLAlchemyError as e:
        request.response.status = 400
        DBSession.rollback()
        return {'error': "{}".format(e)}

    request.response.status = 201
    return LanguoidSchema().dump(Languoid(**data)).data
Beispiel #5
0
def add_child(request):
    glottocode = request.matchdict['glottocode']
    languoid = query_languoid(DBSession, glottocode)
    if languoid is None:
        request.response.status = 404
        return {'error': 'Not a valid languoid ID'}

    c_glottocode = request.json_body.get('child')
    child = query_languoid(DBSession, c_glottocode)
    if not child:
        request.response.status = 404
        return {'error': 'child specified in payload does not exist'}

    try:
        children = languoid.children
        children.append(child)
        setattr(languoid, 'children', children)
        DBSession.flush()
    except exc.SQLAlchemyError as e:
        DBSession.rollback()
        return { 'error': '{}'.format(e) }

    return LanguoidSchema().dump(languoid).data
Beispiel #6
0
def add_descendant(request):
    glottocode = request.matchdict['glottocode']
    languoid = query_languoid(DBSession, glottocode)
    if languoid is None:
        request.response.status = 404
        return {'error': 'Not a valid languoid ID'}

    d_glottocode = request.json_body.get('descendant')
    descendant = query_languoid(DBSession, d_glottocode)
    if not descendant:
        request.response.status = 404
        return {'error': 'descendant specified in payload does not exist'}

    try:
        descendants = languoid.descendants
        descendants.append(descendant)
        setattr(languoid, 'descendants', descendants)
        DBSession.flush()
    except exc.SQLAlchemyError as e:
        DBSession.rollback()
        return { 'error': '{}'.format(e) }

    return LanguoidSchema().dump(languoid).data
Beispiel #7
0
def delete_identifier(request):
    id_query, errors = query_identifier(request.matchdict['type'],
                                        request.matchdict['name'])
    if errors:
        request.response.status = 404
        return {'error': errors}

    try:
        DBSession.query(LanguageIdentifier) \
                 .filter(LanguageIdentifier.identifier == id_query.first()) \
                 .delete()
        id_query.delete()
        DBSession.flush()
    except exc.SQLAlchemyError as e:
        request.response.status = 400
        DBSession.rollback()
        return { 'error': '{}'.format(e) }

    # Commit if no errors
    transaction.commit()

    # Return empty body for success
    return {}
Beispiel #8
0
def add_identifier(request):
    gcode = request.matchdict['glottocode'].lower()

    languoid = DBSession.query(Language) \
                        .filter_by(id='{0}'.format(gcode)) \
                        .filter(Language.active == True) \
                        .first()

    if languoid == None:
        request.response.status = 404
        return {'error': 'No language found with glottocode: {}'.format(gcode)}

    try:
        identifier, errors = IdentifierSchema().load(request.json_body)
    except (ValueError, ValidationError) as e:
        request.response.status = 400
        return {'error': '{}'.format(e)}
    if errors:
        request.response.status = 400
        return {'error': errors}

    try:
        DBSession.add(identifier)
        DBSession.add(
            LanguageIdentifier(language=languoid, identifier=identifier))
        DBSession.flush()
        result = json.dumps(IdentifierSchema().dump(identifier))
    except exc.SQLAlchemyError as e:
        request.response.status = 400
        DBSession.rollback()
        return { 'error': '{}'.format(e) }

    # So we can use identifier object without session
    transaction.commit()

    return result
Beispiel #9
0
def db(db):
    try:
        yield db
    finally:
        DBSession.rollback()
        VersionedDBSession.rollback()
Beispiel #10
0
def db(db):
    try:
        yield db
    finally:
        DBSession.rollback()
        VersionedDBSession.rollback()