from datetime import date, datetime from typing import Any, List from flask import current_app, redirect, request from flask import session as flask_session from flask import url_for from flask_admin.contrib.sqla import ModelView from flask_admin.contrib.sqla.filters import BaseSQLAFilter from sqlalchemy.orm import Query from werkzeug import Response from delphi_slz_admin.services.config import Config class BaseModelView(ModelView): can_edit = False can_create = False can_delete = False column_default_sort = [('created_at', True)] def is_accessible(self) -> bool: config: Config = current_app.config['CONFIG'] if config.fake_login_enabled: return True return 'profile' in flask_session def inaccessible_callback(self, name: str, **kwargs: Any) -> Response: return redirect(url_for('login', next=request.url)) def handle_view_exception(self, exc: Exception) -> bool: return True class BaseFilterById(BaseSQLAFilter): def clean(self, value: str) -> List[int]: return [int(v.strip()) for v in value.split(',') if v.strip()] def apply(self, query: Query, value: List[int], alias: Any = None) -> Query: return query.filter(self.column.in_(value)) def operation(self) -> str: return 'in' class BaseFilterByIdReversed(BaseSQLAFilter): def clean(self, value: str) -> List[int]: return [int(v.strip()) for v in value.split(',') if v.strip()] def apply(self, query: Query, value: List[int], alias: Any = None) -> Query: return query.filter(self.column.notin_(value)) def operation(self) -> str: return 'not in' class BaseFilterByDateLaterThan(BaseSQLAFilter): def clean(self, value: str) -> date: return datetime.strptime(value, '%Y-%m-%d').date() def apply(self, query: Query, value: date, alias: Any = None) -> Query: return query.filter(self.column >= value) def operation(self) -> str: return 'later than' class BaseFilterByDateEarlierThan(BaseSQLAFilter): def clean(self, value: str) -> date: return datetime.strptime(value, '%Y-%m-%d').date() def apply(self, query: Query, value: date, alias: Any = None) -> Query: return query.filter(self.column <= value) def operation(self) -> str: return 'earlier than' class BaseFilterByDateEquals(BaseSQLAFilter): def clean(self, value: str) -> date: return datetime.strptime(value, '%Y-%m-%d').date() def apply(self, query: Query, value: date, alias: Any = None) -> Query: return query.filter(self.column == value) def operation(self) -> str: return 'equals'