Source code for pacifica.metadata.rest.transaction_queries.transactions_multi_search

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""CherryPy Status Metadata object class."""
import datetime
from calendar import monthrange
from cherrypy import tools
from dateutil.parser import parse
from peewee import Expression, OP
from pacifica.metadata.rest.transaction_queries.query_base import QueryBase
from pacifica.metadata.orm import TransSIP, InstrumentGroup
from pacifica.metadata.orm.base import db_connection_decorator
from pacifica.metadata.rest.reporting_queries.detailed_transactions_list import DetailedTransactionList


[docs]class TransactionsMultiSearch(QueryBase): """Retrieves a list of all transactions matching the search criteria.""" exposed = True
[docs] @staticmethod def _get_transactions_from_group(instrument_group_id, project_id, start_time, end_time): instrument_list = TransactionsMultiSearch._get_instruments_from_group_id( instrument_group_id) where_clause = Expression(1, OP.EQ, 1) # now get the approjriate transactions where_clause &= TransSIP().where_clause( {'updated': start_time, 'updated_operator': 'gte'}) where_clause &= TransSIP().where_clause( {'updated': end_time, 'updated_operator': 'lte'}) if instrument_list: where_clause &= (TransSIP.instrument << instrument_list) if project_id: where_clause &= (TransSIP.project == project_id) transactions_list_query = TransSIP.select( TransSIP.id).where(where_clause) transactions_list = [t['id'] for t in transactions_list_query.dicts()] return transactions_list
[docs] @staticmethod def _get_instruments_from_group_id(group_id): instrument_list_query = (InstrumentGroup .select(InstrumentGroup.instrument) .where(InstrumentGroup.group == group_id).dicts()) instrument_list = [i['instrument'] for i in instrument_list_query] return instrument_list
[docs] @staticmethod def _get_first_last_day(): today = datetime.datetime.today() last_day = monthrange(today.year, today.month)[1] return (today.replace(day=1).date(), today.replace(day=last_day).date())
[docs] @staticmethod def _check_keywords(kwargs): valid_keywords = ['project_id', 'instrument_group_id', 'start_time', 'end_time'] return {k: v for (k, v) in kwargs.items() if k in valid_keywords}
# Cherrypy requires these named methods. # pylint: disable=invalid-name @staticmethod @tools.json_out() @db_connection_decorator def GET(**kwargs): """Return Transactions for a project_id and instrument_group_id.""" first_day_of_month, last_day_of_month = TransactionsMultiSearch._get_first_last_day() kwargs = TransactionsMultiSearch._check_keywords(kwargs) instrument_group_id = kwargs['instrument_group_id'] if 'instrument_group_id' in kwargs else None project_id = kwargs['project_id'] if 'project_id' in kwargs else None start_time = parse( kwargs['start_time']) if 'start_time' in kwargs else first_day_of_month end_time = parse( kwargs['end_time']) if 'end_time' in kwargs else last_day_of_month transaction_list = TransactionsMultiSearch._get_transactions_from_group( instrument_group_id, project_id, start_time.strftime('%Y-%m-%d'), end_time.strftime('%Y-%m-%d')) return DetailedTransactionList.get_transaction_list_details(transaction_list)