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
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
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
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
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
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
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 {}
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
def db(db): try: yield db finally: DBSession.rollback() VersionedDBSession.rollback()
def db(db): try: yield db finally: DBSession.rollback() VersionedDBSession.rollback()