Source code for pacifica.metadata.rest.instrument_queries.instrument_term_search

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""CherryPy Status Metadata object class."""
import re
import cherrypy
from cherrypy import tools
from peewee import OP, Expression, fn
from pacifica.metadata.orm import Instruments
from pacifica.metadata.rest.instrument_queries.query_base import QueryBase


[docs]class InstrumentTermSearch(QueryBase): """InstrumentTermSearch API.""" exposed = True
[docs] @staticmethod def search_for_instrument(search_term): """Return a dictionary containing information about a given instrument.""" terms = re.findall(r'[^+ ,;]+', search_term) if not terms: return [] keys = ['display_name', 'name_short', 'name', 'id'] where_clause = Expression(1, OP.EQ, 1) for item in terms: term = str(item) where_clause_part = Expression(1, OP.EQ, 0) for k in keys: field = getattr(Instruments, k) if k == 'id': if re.match('[0-9]+', term): where_clause_part |= ( field == int(term) ) where_clause_part |= ( fn.TO_CHAR(field, '99999999999').contains(term) ) else: where_clause_part |= ( field.contains(term)) where_clause &= (where_clause_part) objs = Instruments.select().where(where_clause).order_by(Instruments.name_short) if not objs: message = 'No instrument entries were retrieved using the terms: \'' message += '\' and \''.join(terms) + '\'' raise cherrypy.HTTPError( '404 No Valid Instruments Located', message) return [QueryBase.format_instrument_block(obj) for obj in objs]
# pylint: disable=invalid-name # pylint: disable=duplicate-code
[docs] @staticmethod @tools.json_out() def GET(search_term=''): """Return a set of instruments for a given user.""" return InstrumentTermSearch.search_for_instrument(search_term)