from datetime import datetime as dt, timezone as tz from flask import request, render_template, session, current_app from sqlalchemy import desc, asc, or_, and_, cast, Integer from common.models.document import Document, Catalog from common.utils.filtered_list_view import FilteredListView from common.utils.view_assistants import prepare_table_for_macro class DocumentListView(FilteredListView): allowed_filters = ['validity'] allowed_sorts = ['id', 'name', 'valid_from', 'valid_to'] def get_query(self): catalog_id = session.get('catalog_id') current_app.logger.debug(f"Catalog ID: {catalog_id}") return Document.query.filter_by(catalog_id=catalog_id) def apply_filters(self, query): filters = request.args.to_dict(flat=False) if 'validity' in filters: now = dt.now(tz.utc).date() if 'valid' in filters['validity']: query = query.filter( and_( or_(Document.valid_from.is_(None), Document.valid_from <= now), or_(Document.valid_to.is_(None), Document.valid_to >= now) ) ) return query def apply_sorting(self, query): sort_by = request.args.get('sort_by', 'id') sort_order = request.args.get('sort_order', 'asc') if sort_by in self.allowed_sorts: column = getattr(Document, sort_by) if sort_order == 'asc': query = query.order_by(asc(column)) elif sort_order == 'desc': query = query.order_by(desc(column)) return query def get(self): query = self.get_query() # query = self.apply_filters(query) # query = self.apply_sorting(query) pagination = self.paginate(query) def format_date(date): if isinstance(date, dt): return date.strftime('%Y-%m-%d') elif isinstance(date, str): return date else: return '' current_app.logger.debug(f"Items retrieved: {pagination.items}") rows = [ [ {'value': item.id, 'class': '', 'type': 'text'}, {'value': item.name, 'class': '', 'type': 'text'}, {'value': format_date(item.valid_from), 'class': '', 'type': 'text'}, {'value': format_date(item.valid_to), 'class': '', 'type': 'text'} ] for item in pagination.items ] context = { 'rows': rows, 'pagination': pagination, 'filters': request.args.to_dict(flat=False), 'sort_by': request.args.get('sort_by', 'id'), 'sort_order': request.args.get('sort_order', 'asc'), 'filter_options': self.get_filter_options() } return render_template(self.template, **context) def get_filter_options(self): return { 'validity': [('valid', 'Valid'), ('all', 'All')] }