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) )
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, []
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, []