"""A generic view for listing objects.""" from flask import request from flask.views import MethodView from owsresponse import response from owsresponse.adaptors.flask import flaskify class ListView(MethodView): """A generic view for listing objects.""" def custom_order(self): """Override to specify a custom ordering.""" pass def get(self): """Convert parameters and retrieve a page of results.""" offset = max(request.args.get('offset', default=0, type=int), 0) limit = max(request.args.get('limit', default=100, type=int), 1) query = request.args.get('query') results = self.list_entry_schema.dump( self.get_page( offset=offset, limit=limit, query=query, custom_order=self.custom_order() ), many=True) count = self.model_class.count(query) return flaskify( response.Response({'items': results, 'total_count': count})) def get_page(self, offset, limit, query=None, custom_order=None): """Get a page of objects. Filters by the query, if provided. Orders by a custom order, if provided, or the default order, which is alphabetically by name. """ return self.base_list_query() \ .filter(*self.model_class.filter_for(query)) \ .order_by(custom_order or self.model_class.default_order()) \ .offset(offset) \ .limit(limit) \ .all() def base_list_query(self): """Override to customize pagination results.""" return self.model_class.query