Example #1
0
class ReportsView(utils.Resource):
    @use_kwargs(args.paging)
    @use_kwargs(args.reports)
    @use_kwargs(args.make_multi_sort_args(default=['-coverage_end_date']))
    @marshal_with(schemas.CommitteeReportsPageSchema(), apply=False)
    def get(self, committee_type=None, **kwargs):
        committee_id = kwargs.get('committee_id')
        query, reports_class, reports_schema = self.build_query(
            committee_type=committee_type, **kwargs)
        if kwargs['sort']:
            validator = args.IndicesValidator(reports_class)
            validator(kwargs['sort'])
        page = utils.fetch_page(query, kwargs, model=reports_class, multi=True)
        return reports_schema().dump(page).data

    def build_query(self, committee_type=None, **kwargs):
        #For this endpoint we now enforce the enpoint specified to map the right model.
        reports_class, reports_schema = reports_schema_map.get(
            reports_type_map.get(committee_type),
            default_schemas,
        )
        query = reports_class.query

        filter_multi_fields = [
            ('amendment_indicator',
             models.CommitteeReports.amendment_indicator),
            ('report_type', reports_class.report_type),
        ]

        if hasattr(reports_class, 'committee'):
            query = reports_class.query.outerjoin(
                reports_class.committee).options(
                    sa.orm.contains_eager(reports_class.committee))

        if kwargs.get('committee_id'):
            query = query.filter(
                reports_class.committee_id.in_(kwargs['committee_id']))
        if kwargs.get('candidate_id'):
            query = query.filter(
                models.CommitteeHistory.candidate_ids.overlap(
                    [kwargs.get('candidate_id')]))
        if kwargs.get('type'):
            query = query.filter(
                models.CommitteeHistory.committee_type.in_(kwargs.get('type')))
        if kwargs.get('year'):
            query = query.filter(reports_class.report_year.in_(kwargs['year']))
        if kwargs.get('cycle'):
            query = query.filter(reports_class.cycle.in_(kwargs['cycle']))
        if kwargs.get('beginning_image_number'):
            query = query.filter(
                reports_class.beginning_image_number.in_(
                    kwargs['beginning_image_number']))
        if kwargs.get('is_amended') is not None:
            query = query.filter(
                reports_class.is_amended == kwargs['is_amended'])

        query = filters.filter_range(query, kwargs, get_range_filters())
        query = filters.filter_match(query, kwargs, get_match_filters())
        query = filters.filter_multi(query, kwargs, filter_multi_fields)
        return query, reports_class, reports_schema
Example #2
0
 def args(self):
     default_sort = ['-report_year']
     return utils.extend(
         args.paging,
         args.operations_log,
         args.make_multi_sort_args(default=default_sort, ),
     )
Example #3
0
class CommitteeReportsView(views.ApiResource):
    @use_kwargs(args.paging)
    @use_kwargs(args.committee_reports)
    @use_kwargs(args.make_multi_sort_args(default=['-coverage_end_date']))
    @marshal_with(schemas.CommitteeReportsPageSchema(), apply=False)
    def get(self, committee_id=None, committee_type=None, **kwargs):
        query, reports_class, reports_schema = self.build_query(
            committee_id=committee_id.upper(), committee_type=committee_type, **kwargs
        )
        if kwargs['sort']:
            validator = args.IndicesValidator(reports_class)
            validator(kwargs['sort'])
        page = utils.fetch_page(query, kwargs, model=reports_class, multi=True)
        return reports_schema().dump(page).data

    def build_query(self, committee_id=None, committee_type=None, **kwargs):
        reports_class, reports_schema = reports_schema_map.get(
            self._resolve_committee_type(
                committee_id=committee_id.upper(), committee_type=committee_type, **kwargs
            ),
            default_schemas,
        )
        query = reports_class.query

        filter_multi_fields = [
            ('amendment_indicator', models.CommitteeReports.amendment_indicator),
            ('report_type', reports_class.report_type),
            ('year', reports_class.report_year),
            ('cycle', reports_class.cycle),
            ('beginning_image_number', reports_class.beginning_image_number),
        ]
        # Eagerly load committees if applicable
        if hasattr(reports_class, 'committee'):
            query = reports_class.query.options(
                sa.orm.joinedload(reports_class.committee)
            )
        if committee_id is not None:
            query = query.filter_by(committee_id=committee_id.upper())

        query = filters.filter_range(query, kwargs, get_range_filters())
        query = filters.filter_match(query, kwargs, get_match_filters())
        query = filters.filter_multi(query, kwargs, filter_multi_fields)
        return query, reports_class, reports_schema

    def _resolve_committee_type(self, committee_id=None, committee_type=None, **kwargs):
        if committee_id is not None:
            query = models.CommitteeHistory.query.filter_by(committee_id=committee_id.upper())

            if kwargs.get('cycle'):
                query = query.filter(models.CommitteeHistory.cycle.in_(kwargs['cycle']))
            if kwargs.get('year'):
                cycle_list = [(year + year % 2) for year in kwargs['year']]
                query = query.filter(models.CommitteeHistory.cycle.in_(cycle_list))

            query = query.order_by(sa.desc(models.CommitteeHistory.cycle))
            committee = query.first_or_404()
            return committee.committee_type
        elif committee_type is not None:
            return reports_type_map.get(committee_type)
Example #4
0
File: audit.py Project: 18F/openFEC
 def args(self):
     return utils.extend(
         args.paging,
         args.AuditCase,
         args.make_multi_sort_args(
             default=['-cycle', 'committee_name', ]
         ),
     )
Example #5
0
 def args(self):
     return utils.extend(
         args.paging,
         args.auditCase,
         args.make_multi_sort_args(default=[
             '-cycle',
             'committee_name',
         ]),
     )
 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)),
     )
Example #7
0
 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)
         ),
     )
Example #8
0
class ElectionsListView(utils.Resource):

    model = ElectionsList
    schema = schemas.ElectionsListSchema
    page_schema = schemas.ElectionsListPageSchema

    filter_multi_fields = [
        ('cycle', ElectionsList.cycle),
    ]

    @use_kwargs(args.paging)
    @use_kwargs(args.elections_list)
    @use_kwargs(args.make_multi_sort_args(default=[
        'sort_order',
        'district',
    ]))
    @marshal_with(schemas.ElectionsListPageSchema())
    def get(self, **kwargs):
        query = self._get_elections(kwargs)
        return utils.fetch_page(query, kwargs, model=ElectionsList, multi=True)

    def _get_elections(self, kwargs):
        """Get elections from ElectionsList model."""
        query = db.session.query(ElectionsList)
        if kwargs.get('office'):
            values = [each[0].upper() for each in kwargs['office']]
            query = query.filter(ElectionsList.office.in_(values))
        if kwargs.get('state'):
            query = query.filter(
                sa.or_(
                    ElectionsList.state.in_(kwargs['state']),
                    ElectionsList.office == 'P',
                ))
        if kwargs.get('district'):
            query = query.filter(
                sa.or_(
                    ElectionsList.district.in_(kwargs['district']),
                    ElectionsList.office.in_(['P', 'S']),
                ), )
        if kwargs.get('zip'):
            query = self._filter_zip(query, kwargs)

        return filters.filter_multi(query, kwargs, self.filter_multi_fields)

    def _filter_zip(self, query, kwargs):
        """Filter query by zip codes."""
        districts = db.session.query(ZipsDistricts).filter(
            cast(ZipsDistricts.zip_code, Integer).in_(kwargs['zip']),
            ZipsDistricts.active == 'Y').subquery()
        return query.join(
            districts,
            sa.or_(
                # House races from matching states and districts
                sa.and_(
                    ElectionsList.district == districts.c['district'],
                    ElectionsList.state == districts.c['state_abbrevation'],
                ),
                # Senate and presidential races from matching states
                sa.and_(
                    sa.or_(ElectionsList.district == '00'),
                    ElectionsList.state.in_(
                        [districts.c['state_abbrevation'], 'US'])),
            ))
Example #9
0
class CommitteeReportsView(utils.Resource):
    @use_kwargs(args.paging)
    @use_kwargs(args.committee_reports)
    @use_kwargs(args.make_multi_sort_args(default=['-coverage_end_date']))
    @marshal_with(schemas.CommitteeReportsPageSchema(), apply=False)
    def get(self, committee_id=None, committee_type=None, **kwargs):
        query, reports_class, reports_schema = self.build_query(
            committee_id=committee_id, committee_type=committee_type, **kwargs)
        if kwargs['sort']:
            validator = args.IndicesValidator(reports_class)
            validator(kwargs['sort'])
        page = utils.fetch_page(query, kwargs, model=reports_class, multi=True)
        return reports_schema().dump(page).data

    def build_query(self, committee_id=None, committee_type=None, **kwargs):
        reports_class, reports_schema = reports_schema_map.get(
            self._resolve_committee_type(committee_id=committee_id,
                                         committee_type=committee_type,
                                         **kwargs),
            default_schemas,
        )
        query = reports_class.query
        # Eagerly load committees if applicable

        if hasattr(reports_class, 'committee'):
            query = reports_class.query.options(
                sa.orm.joinedload(reports_class.committee))

        if committee_id is not None:
            query = query.filter_by(committee_id=committee_id)
        if kwargs.get('year'):
            query = query.filter(reports_class.report_year.in_(kwargs['year']))
        if kwargs.get('cycle'):
            query = query.filter(reports_class.cycle.in_(kwargs['cycle']))
        if kwargs.get('beginning_image_number'):
            query = query.filter(
                reports_class.beginning_image_number.in_(
                    kwargs['beginning_image_number']))
        if kwargs.get('report_type'):
            include, exclude = parse_types(kwargs['report_type'])
            if include:
                query = query.filter(reports_class.report_type.in_(include))
            elif exclude:
                query = query.filter(
                    sa.not_(reports_class.report_type.in_(exclude)))

        if kwargs.get('is_amended') is not None:
            query = query.filter(
                reports_class.is_amended == kwargs['is_amended'])

        query = filters.filter_range(query, kwargs, get_range_filters())
        query = filters.filter_match(query, kwargs, get_match_filters())
        query = filters.filter_multi(query, kwargs, get_multi_filters())
        return query, reports_class, reports_schema

    def _resolve_committee_type(self,
                                committee_id=None,
                                committee_type=None,
                                **kwargs):
        if committee_id is not None:
            query = models.CommitteeHistory.query.filter_by(
                committee_id=committee_id)
            if kwargs.get('cycle'):
                query = query.filter(
                    models.CommitteeHistory.cycle.in_(kwargs['cycle']))
            query = query.order_by(sa.desc(models.CommitteeHistory.cycle))
            committee = query.first_or_404()
            return committee.committee_type
        elif committee_type is not None:
            return reports_type_map.get(committee_type)