- Translation Service improvement - Enable activation / deactivation of Processors - Renew API-keys for Mistral (leading to workspaces) - Align all Document views to use of a session catalog - Allow for different processors for the same file type
85 lines
3.0 KiB
Python
85 lines
3.0 KiB
Python
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')]
|
|
}
|