from flask import current_app
from flask_admin import model
from wtforms import fields, form
from ..expression.Expression import Expression
from . import Views
from .MyBaseView import MyBaseView
[docs]@Views.register("ExpressionsView")
def setup(admin):
section = "webadmin"
config = admin.app.config["SHARED"].config.config
webadmin_settings_on = config(section, "expressions_on", 1)
if webadmin_settings_on:
admin.add_view(ExpressionsModelView(ExpressionsModel, name="Expressions"))
[docs]class ExpressionsModel:
def __init__(self, expression):
self._expression = expression
@property
def module_filename(self):
return self._expression.filename
@property
def function_name(self):
return self._expression.expression.__name__
@property
def function_arguments(self):
return ", ".join(
"{}({})".format(arg.source, arg.key) for arg in self._expression.args
)
[docs]class ExpressionsModelView(MyBaseView, model.BaseModelView):
can_create = False
can_edit = False
can_delete = False
column_list = ("module_filename", "function_name", "function_arguments")
column_sortable_list = ()
column_searchable_list = ("module_filename", "function_name", "function_arguments")
form = ExpressionsModelForm
[docs] def get_list(self, page, sort_field, sort_desc, search, filters, page_size=None):
shared = current_app.config["SHARED"]
if search:
search = search.lower()
expressions = (
self.model(item)
for item in shared.expressions.instances.items
if str(item).lower().find(search) >= 0
)
expressions = list(expressions)
else:
expressions = list(
self.model(item) for item in shared.expressions.instances.items
)
total = len(expressions)
if not page_size:
page_size = self.page_size
results = self.sampling(expressions, page * page_size, page_size)
# print(len(results), total, page, page_size, search)
return total, results
[docs] def init_search(self):
return True
[docs] def get_pk_value(self, model_):
return "key"
[docs] @staticmethod
def sampling(selection, offset=0, limit=None):
return selection[offset : (limit + offset if limit is not None else None)]
[docs] def is_accessible(self):
return self.has_role("admin")