def most_recent_submissions(session, user_id, limit=None):
    """Get an administrator's surveys' most recent submissions."""
    return (
        session
        .query(Submission)
        .join(Survey.submissions)
        .outerjoin(_administrator_table)
        .filter(administrator_filter(user_id))
        .order_by(Submission.save_time.desc())
        .limit(limit)
    )
Exemple #2
0
    def list(self, where=None):
        """Return a list of instances of this model.

        Given a model class, build up the ORM query based on query params
        and return the query result.
        """
        self.session.flush()
        model_cls = self.resource_type
        query = self.session.query(model_cls, count().over())

        limit = self._query_arg('limit', int)
        offset = self._query_arg('offset', int)
        deleted = self._query_arg('show_deleted', bool, False)
        search_term = self._query_arg('search')
        regex = self._query_arg('regex', bool, False)
        search_fields = self._query_arg('search_fields',
                                        list,
                                        default=['title'])
        search_lang = self._query_arg('lang')

        default_sort = ['{}:ASC'.format(self.default_sort_column_name)]
        order_by_text = (element.split(':') for element in self._query_arg(
            'order_by', list, default=default_sort))

        type_constraint = self._query_arg('type')
        user_id = self._query_arg('user_id')

        num_total = self.session.query(func.count(self.resource_type.id))
        if user_id is not None:
            if model_cls is Submission:
                num_total = num_total.join(Survey.submissions)
            num_total = (num_total.outerjoin(_administrator_table).filter(
                administrator_filter(user_id)))
        num_total = num_total.scalar()

        if search_term is not None:
            for search_field in search_fields:
                query = column_search(
                    query,
                    model_cls=model_cls,
                    column_name=search_field,
                    search_term=search_term,
                    language=search_lang,
                    regex=regex,
                )

        if user_id is not None:
            if model_cls is Submission:
                query = query.join(Survey.submissions)
            query = (query.outerjoin(_administrator_table).filter(
                administrator_filter(user_id)))

        if not deleted:
            query = query.filter(~model_cls.deleted)

        if type_constraint is not None:
            query = query.filter(model_cls.type_constraint == type_constraint)

        if where is not None:
            query = query.filter(where)

        for attribute_name, direction in order_by_text:
            try:
                order = getattr(model_cls, attribute_name)
            except AttributeError:
                order = text('{} {} NULLS LAST'.format(attribute_name,
                                                       direction))
            else:
                directions = {'asc': order.asc, 'desc': order.desc}
                order = directions[direction.lower()]().nullslast()
            query = query.order_by(order)

        if limit is not None:
            query = query.limit(limit)

        if offset is not None:
            query = query.offset(offset)

        result = query.all()
        if result:
            num_filtered = result[0][1]
            models = [res[0] for res in result]
            result = self._specific_fields(models, is_detail=False)
            return num_filtered, num_total, result
        return 0, num_total, []
Exemple #3
0
    def list(self, where=None):
        """Return a list of instances of this model.

        Given a model class, build up the ORM query based on query params
        and return the query result.
        """
        self.session.flush()
        model_cls = self.resource_type
        query = self.session.query(model_cls, count().over())

        limit = self._query_arg('limit', int)
        offset = self._query_arg('offset', int)
        deleted = self._query_arg('show_deleted', bool, False)
        search_term = self._query_arg('search')
        regex = self._query_arg('regex', bool, False)
        search_fields = self._query_arg(
            'search_fields', list, default=['title']
        )
        search_lang = self._query_arg('lang')

        default_sort = ['{}:ASC'.format(self.default_sort_column_name)]
        order_by_text = (
            element.split(':') for element in self._query_arg(
                'order_by', list, default=default_sort
            )
        )

        type_constraint = self._query_arg('type')
        user_id = self._query_arg('user_id')

        num_total = self.session.query(func.count(self.resource_type.id))
        if user_id is not None:
            if model_cls is Submission:
                num_total = num_total.join(Survey.submissions)
            num_total = (
                num_total
                .outerjoin(_administrator_table)
                .filter(administrator_filter(user_id))
            )
        num_total = num_total.scalar()

        if search_term is not None:
            for search_field in search_fields:
                query = column_search(
                    query,
                    model_cls=model_cls,
                    column_name=search_field,
                    search_term=search_term,
                    language=search_lang,
                    regex=regex,
                )

        if user_id is not None:
            if model_cls is Submission:
                query = query.join(Survey.submissions)
            query = (
                query
                .outerjoin(_administrator_table)
                .filter(administrator_filter(user_id))
            )

        if not deleted:
            query = query.filter(~model_cls.deleted)

        if type_constraint is not None:
            query = query.filter(model_cls.type_constraint == type_constraint)

        if where is not None:
            query = query.filter(where)

        for attribute_name, direction in order_by_text:
            try:
                order = getattr(model_cls, attribute_name)
            except AttributeError:
                order = text(
                    '{} {} NULLS LAST'.format(attribute_name, direction)
                )
            else:
                directions = {'asc': order.asc, 'desc': order.desc}
                order = directions[direction.lower()]().nullslast()
            query = query.order_by(order)

        if limit is not None:
            query = query.limit(limit)

        if offset is not None:
            query = query.offset(offset)

        result = query.all()
        if result:
            num_filtered = result[0][1]
            models = [res[0] for res in result]
            result = self._specific_fields(models, is_detail=False)
            return num_filtered, num_total, result
        return 0, num_total, []