webservices/resources/filings.py

Summary

Maintainability
A
45 mins
Test Coverage
from flask_apispec import doc

from webservices import args
from webservices import docs
from webservices import utils
from webservices import schemas
from webservices.common import views
from webservices.common import counts
from webservices.common import models


@doc(
    tags=['filings'],
    description=docs.FILINGS,
    params={
        'candidate_id': {'description': docs.CANDIDATE_ID},
        'committee_id': {'description': docs.COMMITTEE_ID},
    },
)
class BaseFilings(views.ApiResource):

    model = models.Filings
    schema = schemas.FilingsSchema
    page_schema = schemas.FilingsPageSchema

    filter_multi_fields = [
        ('beginning_image_number', models.Filings.beginning_image_number),
        ('report_type', models.Filings.report_type),
        ('document_type', models.Filings.document_type),
        ('report_year', models.Filings.report_year),
        ('form_type', models.Filings.form_type),
        ('request_type', models.Filings.request_type),
        ('file_number', models.Filings.file_number),
        ('primary_general_indicator', models.Filings.primary_general_indicator),
        ('amendment_indicator', models.Filings.amendment_indicator),
        ('cycle', models.Filings.cycle),
        ('state', models.Filings.state),
        ('party', models.Filings.party),
        ('office', models.Filings.office),
        ('committe_type', models.Filings.cmte_tp),
    ]

    filter_range_fields = [
        (('min_receipt_date', 'max_receipt_date'), models.Filings.receipt_date),
    ]

    filter_match_fields = [
        ('filer_type', models.Filings.means_filed),
        ('is_amended', models.Filings.is_amended),
        ('most_recent', models.Filings.most_recent),
    ]

    @property
    def args(self):
        #Place the sort argument in a list, as the api will return a 422 status code if it's not in a list
        #list is needed because multisort is used
        default_sort = ['-receipt_date']
        return utils.extend(
            args.paging,
            args.filings,
            args.make_multi_sort_args(
                default=default_sort,
                validator=args.IndicesValidator(self.model)
            ),
        )

    def get(self, **kwargs):
        if kwargs.get('form_type') and 'RFAI' in kwargs.get('form_type'):
            #Adds FRQ types if RFAI was requested
            kwargs.get('form_type').append('FRQ')
        query = self.build_query(**kwargs)
        count = counts.count_estimate(query, models.db.session, threshold=5000)
        return utils.fetch_page(query, kwargs, model=models.Filings, count=count, multi=True)


class FilingsView(BaseFilings):

    def build_query(self, committee_id=None, candidate_id=None, **kwargs):
        query = super().build_query(**kwargs)
        if committee_id:
            query = query.filter(models.Filings.committee_id == committee_id)
        if candidate_id:
            query = query.filter(models.Filings.candidate_id == candidate_id)
        return query


class FilingsList(BaseFilings):

    filter_multi_fields = BaseFilings.filter_multi_fields + [
        ('committee_id', models.Filings.committee_id),
        ('candidate_id', models.Filings.candidate_id),
    ]

    @property
    def args(self):
        return utils.extend(super().args, args.entities)


@doc(
    tags=['efiling'],
    description=docs.EFILE_FILES,
)
class EFilingsView(views.ApiResource):

    model = models.EFilings
    schema = schemas.EFilingsSchema
    page_schema = schemas.EFilingsPageSchema

    filter_multi_fields = [
        ('file_number', models.EFilings.file_number),
        ('committee_id', models.EFilings.committee_id),
    ]
    filter_range_fields = [
        (('min_receipt_date', 'max_receipt_date'), models.EFilings.receipt_date),
    ]

    @property
    def args(self):
        return utils.extend(
            args.paging,
            args.efilings,
            args.make_sort_args(
                default='-receipt_date',
                # validator=args.IndexValidator(self.model)
            ),
        )

    def get(self, **kwargs):
        query = self.build_query(**kwargs)
        count = counts.count_estimate(query, models.db.session, threshold=5000)
        return utils.fetch_page(query, kwargs, model=models.EFilings, count=count)

    @property
    def index_column(self):
        return self.model.file_number