3
0
Fork 0

Compare commits

..

No commits in common. "c1a14b48691896ae22e9a1eecddb7f48668f1fb6" and "bb2bde5ecd2f1ab23c78f8bf642d56c5bbb4f8ac" have entirely different histories.

24 changed files with 191 additions and 210 deletions

View file

@ -3,10 +3,5 @@
[MESSAGES CONTROL] [MESSAGES CONTROL]
disable=all disable=all
enable= enable=
empty-docstring,
inconsistent-return-statements, inconsistent-return-statements,
no-else-return,
redefined-argument-from-local,
too-many-branches,
too-many-instance-attributes, too-many-instance-attributes,
too-many-return-statements,

View file

@ -2,7 +2,7 @@
################################################################################ ################################################################################
# #
# wuttaweb -- Web App for Wutta Framework # wuttaweb -- Web App for Wutta Framework
# Copyright © 2024-2025 Lance Edgar # Copyright © 2024 Lance Edgar
# #
# This file is part of Wutta Framework. # This file is part of Wutta Framework.
# #
@ -38,7 +38,7 @@ class WuttaWebConfigExtension(WuttaConfigExtension):
key = "wuttaweb" key = "wuttaweb"
def configure(self, config): # pylint: disable=empty-docstring def configure(self, config):
""" """ """ """
config.setdefault( config.setdefault(
"wutta_continuum.wutta_plugin_spec", "wutta_continuum.wutta_plugin_spec",

View file

@ -43,14 +43,14 @@ else:
# TODO: should find a better way, threadlocals are bad? # TODO: should find a better way, threadlocals are bad?
# https://docs.pylonsproject.org/projects/pyramid/en/latest/api/threadlocal.html#pyramid.threadlocal.get_current_request # https://docs.pylonsproject.org/projects/pyramid/en/latest/api/threadlocal.html#pyramid.threadlocal.get_current_request
def get_remote_addr(self, uow, session): # pylint: disable=empty-docstring def get_remote_addr(self, uow, session):
""" """ """ """
request = get_current_request() request = get_current_request()
if request: if request:
return request.client_addr return request.client_addr
return None return None
def get_user_id(self, uow, session): # pylint: disable=empty-docstring def get_user_id(self, uow, session):
""" """ """ """
request = get_current_request() request = get_current_request()
if request and request.user: if request and request.user:

View file

@ -2,7 +2,7 @@
################################################################################ ################################################################################
# #
# wuttaweb -- Web App for Wutta Framework # wuttaweb -- Web App for Wutta Framework
# Copyright © 2024-2025 Lance Edgar # Copyright © 2024 Lance Edgar
# #
# This file is part of Wutta Framework. # This file is part of Wutta Framework.
# #
@ -34,7 +34,7 @@ class feedback(EmailSetting):
default_subject = "User Feedback" default_subject = "User Feedback"
def sample_data(self): # pylint: disable=empty-docstring def sample_data(self):
""" """ """ """
model = self.app.model model = self.app.model
person = model.Person(full_name="Barney Rubble") person = model.Person(full_name="Barney Rubble")

View file

@ -592,7 +592,7 @@ class Form: # pylint: disable=too-many-instance-attributes
self.set_widget(key, widget) self.set_widget(key, widget)
self.add_grid_vue_context(grid) self.add_grid_vue_context(grid)
def add_grid_vue_context(self, grid): # pylint: disable=empty-docstring def add_grid_vue_context(self, grid):
""" """ """ """
if not grid.key: if not grid.key:
raise ValueError("grid must have a key!") raise ValueError("grid must have a key!")
@ -777,7 +777,7 @@ class Form: # pylint: disable=too-many-instance-attributes
self.config, model_class=model_class or self.model_class self.config, model_class=model_class or self.model_class
) )
def get_schema(self): # pylint: disable=too-many-branches def get_schema(self):
""" """
Return the :class:`colander:colander.Schema` object for the Return the :class:`colander:colander.Schema` object for the
form, generating it automatically if necessary. form, generating it automatically if necessary.
@ -1146,7 +1146,7 @@ class Form: # pylint: disable=too-many-instance-attributes
# TODO: for tailbone compat, should document? # TODO: for tailbone compat, should document?
# (ideally should remove this and find a better way) # (ideally should remove this and find a better way)
def get_vue_field_value(self, key): # pylint: disable=empty-docstring def get_vue_field_value(self, key):
""" """ """ """
if key not in self.fields: if key not in self.fields:
return None return None

View file

@ -49,7 +49,7 @@ class WuttaDateTime(colander.DateTime):
the Buefy datepicker + timepicker widgets. the Buefy datepicker + timepicker widgets.
""" """
def deserialize( # pylint: disable=inconsistent-return-statements,empty-docstring def deserialize( # pylint: disable=inconsistent-return-statements
self, node, cstruct self, node, cstruct
): ):
""" """ """ """
@ -147,7 +147,7 @@ class WuttaEnum(colander.Enum):
self.config = self.request.wutta_config self.config = self.request.wutta_config
self.app = self.config.get_app() self.app = self.config.get_app()
def widget_maker(self, **kwargs): # pylint: disable=empty-docstring def widget_maker(self, **kwargs):
""" """ """ """
if "values" not in kwargs: if "values" not in kwargs:
@ -181,7 +181,7 @@ class WuttaDictEnum(colander.String):
self.app = self.config.get_app() self.app = self.config.get_app()
self.enum_dct = enum_dct self.enum_dct = enum_dct
def widget_maker(self, **kwargs): # pylint: disable=empty-docstring def widget_maker(self, **kwargs):
""" """ """ """
if "values" not in kwargs: if "values" not in kwargs:
kwargs["values"] = [(k, v) for k, v in self.enum_dct.items()] kwargs["values"] = [(k, v) for k, v in self.enum_dct.items()]
@ -210,7 +210,7 @@ class WuttaMoney(colander.Money):
self.config = self.request.wutta_config self.config = self.request.wutta_config
self.app = self.config.get_app() self.app = self.config.get_app()
def widget_maker(self, **kwargs): # pylint: disable=empty-docstring def widget_maker(self, **kwargs):
""" """ """ """
if self.scale: if self.scale:
kwargs.setdefault("scale", self.scale) kwargs.setdefault("scale", self.scale)
@ -234,7 +234,7 @@ class WuttaQuantity(colander.Decimal):
self.config = self.request.wutta_config self.config = self.request.wutta_config
self.app = self.config.get_app() self.app = self.config.get_app()
def serialize(self, node, appstruct): # pylint: disable=empty-docstring def serialize(self, node, appstruct):
""" """ """ """
if appstruct in (colander.null, None): if appstruct in (colander.null, None):
return colander.null return colander.null
@ -324,7 +324,7 @@ class ObjectRef(colander.SchemaType):
class_name = self.__class__.__name__ class_name = self.__class__.__name__
raise NotImplementedError(f"you must define {class_name}.model_class") raise NotImplementedError(f"you must define {class_name}.model_class")
def serialize(self, node, appstruct): # pylint: disable=empty-docstring def serialize(self, node, appstruct):
""" """ """ """
# nb. normalize to empty option if no object ref, so that # nb. normalize to empty option if no object ref, so that
# works as expected # works as expected
@ -353,7 +353,7 @@ class ObjectRef(colander.SchemaType):
""" """
return obj.uuid.hex return obj.uuid.hex
def deserialize(self, node, cstruct): # pylint: disable=empty-docstring def deserialize(self, node, cstruct):
""" """ """ """
if not cstruct: if not cstruct:
return colander.null return colander.null
@ -361,7 +361,7 @@ class ObjectRef(colander.SchemaType):
# nb. use shortcut to fetch model instance from DB # nb. use shortcut to fetch model instance from DB
return self.objectify(cstruct) return self.objectify(cstruct)
def dictify(self, obj): # pylint: disable=empty-docstring def dictify(self, obj):
""" """ """ """
# TODO: would we ever need to do something else? # TODO: would we ever need to do something else?
@ -466,16 +466,16 @@ class PersonRef(ObjectRef):
""" """
@property @property
def model_class(self): # pylint: disable=empty-docstring def model_class(self):
""" """ """ """
model = self.app.model model = self.app.model
return model.Person return model.Person
def sort_query(self, query): # pylint: disable=empty-docstring def sort_query(self, query):
""" """ """ """
return query.order_by(self.model_class.full_name) return query.order_by(self.model_class.full_name)
def get_object_url(self, person): # pylint: disable=empty-docstring def get_object_url(self, person):
""" """ """ """
return self.request.route_url("people.view", uuid=person.uuid) return self.request.route_url("people.view", uuid=person.uuid)
@ -490,16 +490,16 @@ class RoleRef(ObjectRef):
""" """
@property @property
def model_class(self): # pylint: disable=empty-docstring def model_class(self):
""" """ """ """
model = self.app.model model = self.app.model
return model.Role return model.Role
def sort_query(self, query): # pylint: disable=empty-docstring def sort_query(self, query):
""" """ """ """
return query.order_by(self.model_class.name) return query.order_by(self.model_class.name)
def get_object_url(self, role): # pylint: disable=empty-docstring def get_object_url(self, role):
""" """ """ """
return self.request.route_url("roles.view", uuid=role.uuid) return self.request.route_url("roles.view", uuid=role.uuid)
@ -514,16 +514,16 @@ class UserRef(ObjectRef):
""" """
@property @property
def model_class(self): # pylint: disable=empty-docstring def model_class(self):
""" """ """ """
model = self.app.model model = self.app.model
return model.User return model.User
def sort_query(self, query): # pylint: disable=empty-docstring def sort_query(self, query):
""" """ """ """
return query.order_by(self.model_class.username) return query.order_by(self.model_class.username)
def get_object_url(self, user): # pylint: disable=empty-docstring def get_object_url(self, user):
""" """ """ """
return self.request.route_url("users.view", uuid=user.uuid) return self.request.route_url("users.view", uuid=user.uuid)
@ -641,7 +641,7 @@ class FileDownload(colander.String):
self.config = self.request.wutta_config self.config = self.request.wutta_config
self.app = self.config.get_app() self.app = self.config.get_app()
def widget_maker(self, **kwargs): # pylint: disable=empty-docstring def widget_maker(self, **kwargs):
""" """ """ """
kwargs.setdefault("url", self.url) kwargs.setdefault("url", self.url)
return widgets.FileDownloadWidget(self.request, **kwargs) return widgets.FileDownloadWidget(self.request, **kwargs)
@ -653,14 +653,13 @@ class EmailRecipients(colander.String):
(``To``, ``Cc``, ``Bcc``). (``To``, ``Cc``, ``Bcc``).
""" """
def serialize(self, node, appstruct): # pylint: disable=empty-docstring def serialize(self, node, appstruct):
""" """
if appstruct is colander.null: if appstruct is colander.null:
return colander.null return colander.null
return "\n".join(parse_list(appstruct)) return "\n".join(parse_list(appstruct))
def deserialize(self, node, cstruct): # pylint: disable=empty-docstring def deserialize(self, node, cstruct):
""" """ """ """
if cstruct is colander.null: if cstruct is colander.null:
return colander.null return colander.null

View file

@ -110,9 +110,7 @@ class ObjectRefWidget(SelectWidget):
self.request = request self.request = request
self.url = url self.url = url
def get_template_values( # pylint: disable=empty-docstring def get_template_values(self, field, cstruct, kw):
self, field, cstruct, kw
):
""" """ """ """
values = super().get_template_values(field, cstruct, kw) values = super().get_template_values(field, cstruct, kw)
@ -213,7 +211,7 @@ class WuttaDateWidget(DateInputWidget):
self.config = self.request.wutta_config self.config = self.request.wutta_config
self.app = self.config.get_app() self.app = self.config.get_app()
def serialize(self, field, cstruct, **kw): # pylint: disable=empty-docstring def serialize(self, field, cstruct, **kw):
""" """ """ """
readonly = kw.get("readonly", self.readonly) readonly = kw.get("readonly", self.readonly)
if readonly and cstruct: if readonly and cstruct:
@ -250,7 +248,7 @@ class WuttaDateTimeWidget(DateTimeInputWidget):
self.config = self.request.wutta_config self.config = self.request.wutta_config
self.app = self.config.get_app() self.app = self.config.get_app()
def serialize(self, field, cstruct, **kw): # pylint: disable=empty-docstring def serialize(self, field, cstruct, **kw):
""" """ """ """
readonly = kw.get("readonly", self.readonly) readonly = kw.get("readonly", self.readonly)
if readonly and cstruct: if readonly and cstruct:
@ -288,7 +286,7 @@ class WuttaMoneyInputWidget(MoneyInputWidget):
self.config = self.request.wutta_config self.config = self.request.wutta_config
self.app = self.config.get_app() self.app = self.config.get_app()
def serialize(self, field, cstruct, **kw): # pylint: disable=empty-docstring def serialize(self, field, cstruct, **kw):
""" """ """ """
readonly = kw.get("readonly", self.readonly) readonly = kw.get("readonly", self.readonly)
if readonly: if readonly:
@ -329,7 +327,7 @@ class FileDownloadWidget(Widget):
self.config = self.request.wutta_config self.config = self.request.wutta_config
self.app = self.config.get_app() self.app = self.config.get_app()
def serialize(self, field, cstruct, **kw): # pylint: disable=empty-docstring def serialize(self, field, cstruct, **kw):
""" """ """ """
# nb. readonly is the only way this rolls # nb. readonly is the only way this rolls
kw["readonly"] = True kw["readonly"] = True
@ -350,7 +348,7 @@ class FileDownloadWidget(Widget):
values = self.get_template_values(field, cstruct, kw) values = self.get_template_values(field, cstruct, kw)
return field.renderer(template, **values) return field.renderer(template, **values)
def readable_size(self, path): # pylint: disable=empty-docstring def readable_size(self, path):
""" """ """ """
try: try:
size = os.path.getsize(path) size = os.path.getsize(path)
@ -409,7 +407,7 @@ class RoleRefsWidget(WuttaCheckboxChoiceWidget):
readonly_template = "readonly/rolerefs" readonly_template = "readonly/rolerefs"
def serialize(self, field, cstruct, **kw): # pylint: disable=empty-docstring def serialize(self, field, cstruct, **kw):
""" """ """ """
model = self.app.model model = self.app.model
@ -463,7 +461,7 @@ class PermissionsWidget(WuttaCheckboxChoiceWidget):
template = "permissions" template = "permissions"
readonly_template = "readonly/permissions" readonly_template = "readonly/permissions"
def serialize(self, field, cstruct, **kw): # pylint: disable=empty-docstring def serialize(self, field, cstruct, **kw):
""" """ """ """
kw.setdefault("permissions", self.permissions) kw.setdefault("permissions", self.permissions)
@ -495,7 +493,7 @@ class EmailRecipientsWidget(TextAreaWidget):
readonly_template = "readonly/email_recips" readonly_template = "readonly/email_recips"
def serialize(self, field, cstruct, **kw): # pylint: disable=empty-docstring def serialize(self, field, cstruct, **kw):
""" """ """ """
readonly = kw.get("readonly", self.readonly) readonly = kw.get("readonly", self.readonly)
if readonly: if readonly:
@ -503,7 +501,7 @@ class EmailRecipientsWidget(TextAreaWidget):
return super().serialize(field, cstruct, **kw) return super().serialize(field, cstruct, **kw)
def deserialize(self, field, pstruct): # pylint: disable=empty-docstring def deserialize(self, field, pstruct):
""" """ """ """
if pstruct is colander.null: if pstruct is colander.null:
return colander.null return colander.null
@ -522,7 +520,7 @@ class BatchIdWidget(Widget):
zero-padded 8-char string zero-padded 8-char string
""" """
def serialize(self, field, cstruct, **kw): # pylint: disable=empty-docstring def serialize(self, field, cstruct, **kw):
""" """ """ """
if cstruct is colander.null: if cstruct is colander.null:
return colander.null return colander.null

View file

@ -426,8 +426,8 @@ class Grid: # pylint: disable=too-many-instance-attributes
self.set_columns(columns or self.get_columns()) self.set_columns(columns or self.get_columns())
self.renderers = {} self.renderers = {}
if renderers: if renderers:
for k, val in renderers.items(): for key, val in renderers.items():
self.set_renderer(k, val) self.set_renderer(key, val)
self.set_default_renderers() self.set_default_renderers()
self.set_tools(tools) self.set_tools(tools)
@ -470,8 +470,8 @@ class Grid: # pylint: disable=too-many-instance-attributes
# enums # enums
self.enums = {} self.enums = {}
for k in enums: for key in enums:
self.set_enum(k, enums[k]) self.set_enum(key, enums[key])
def get_columns(self): def get_columns(self):
""" """
@ -1462,7 +1462,7 @@ class Grid: # pylint: disable=too-many-instance-attributes
# configuration methods # configuration methods
############################## ##############################
def load_settings(self, persist=True): # pylint: disable=too-many-branches def load_settings(self, persist=True):
""" """
Load all effective settings for the grid. Load all effective settings for the grid.
@ -1594,7 +1594,7 @@ class Grid: # pylint: disable=too-many-instance-attributes
self.pagesize = settings["pagesize"] self.pagesize = settings["pagesize"]
self.page = settings["page"] self.page = settings["page"]
def request_has_settings(self, typ): # pylint: disable=empty-docstring def request_has_settings(self, typ):
""" """ """ """
if typ == "filter" and self.filterable: if typ == "filter" and self.filterable:
@ -1615,7 +1615,7 @@ class Grid: # pylint: disable=too-many-instance-attributes
return False return False
def get_setting( # pylint: disable=empty-docstring def get_setting(
self, settings, key, src="session", default=None, normalize=lambda v: v self, settings, key, src="session", default=None, normalize=lambda v: v
): ):
""" """ """ """
@ -1641,9 +1641,7 @@ class Grid: # pylint: disable=too-many-instance-attributes
# okay then, default it is # okay then, default it is
return default return default
def update_filter_settings( # pylint: disable=empty-docstring def update_filter_settings(self, settings, src=None):
self, settings, src=None
):
""" """ """ """
if not self.filterable: if not self.filterable:
return return
@ -1676,9 +1674,7 @@ class Grid: # pylint: disable=too-many-instance-attributes
settings, f"{prefix}.value", src="session", default="" settings, f"{prefix}.value", src="session", default=""
) )
def update_sort_settings( # pylint: disable=empty-docstring def update_sort_settings(self, settings, src=None):
self, settings, src=None
):
""" """ """ """
if not (self.sortable and self.sort_on_backend): if not (self.sortable and self.sort_on_backend):
return return
@ -1708,7 +1704,7 @@ class Grid: # pylint: disable=too-many-instance-attributes
skey = f"sorters.{i}.{key}" skey = f"sorters.{i}.{key}"
settings[skey] = self.get_setting(settings, skey, src="session") settings[skey] = self.get_setting(settings, skey, src="session")
def update_page_settings(self, settings): # pylint: disable=empty-docstring def update_page_settings(self, settings):
""" """ """ """
if not (self.paginated and self.paginate_on_backend): if not (self.paginated and self.paginate_on_backend):
return return
@ -1735,7 +1731,7 @@ class Grid: # pylint: disable=too-many-instance-attributes
if page is not None: if page is not None:
settings["page"] = int(page) settings["page"] = int(page)
def persist_settings(self, settings, dest=None): # pylint: disable=empty-docstring def persist_settings(self, settings, dest=None):
""" """ """ """
if dest not in ("session",): if dest not in ("session",):
raise ValueError(f"invalid dest identifier: {dest}") raise ValueError(f"invalid dest identifier: {dest}")
@ -2320,7 +2316,7 @@ class Grid: # pylint: disable=too-many-instance-attributes
) )
return filters return filters
def object_to_dict(self, obj): # pylint: disable=empty-docstring def object_to_dict(self, obj):
""" """ """ """
try: try:
dct = dict(obj) dct = dict(obj)
@ -2396,7 +2392,7 @@ class Grid: # pylint: disable=too-many-instance-attributes
"row_classes": row_classes, "row_classes": row_classes,
} }
def get_vue_data(self): # pylint: disable=empty-docstring def get_vue_data(self):
""" """ """ """
warnings.warn( warnings.warn(
"grid.get_vue_data() is deprecated; " "grid.get_vue_data() is deprecated; "

View file

@ -42,7 +42,7 @@ from wuttjamaican.util import UNSPECIFIED
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class VerbNotSupported(Exception): # pylint: disable=empty-docstring class VerbNotSupported(Exception):
""" """ """ """
def __init__(self, verb): def __init__(self, verb):
@ -510,7 +510,7 @@ class StringAlchemyFilter(AlchemyFilter):
default_verbs = ["contains", "does_not_contain", "equal", "not_equal"] default_verbs = ["contains", "does_not_contain", "equal", "not_equal"]
def coerce_value(self, value): # pylint: disable=empty-docstring def coerce_value(self, value):
""" """ """ """
if value is not None: if value is not None:
value = str(value) value = str(value)
@ -577,7 +577,7 @@ class IntegerAlchemyFilter(NumericAlchemyFilter):
Subclass of :class:`NumericAlchemyFilter`. Subclass of :class:`NumericAlchemyFilter`.
""" """
def coerce_value(self, value): # pylint: disable=empty-docstring def coerce_value(self, value):
""" """ """ """
if value: if value:
try: try:
@ -596,7 +596,7 @@ class BooleanAlchemyFilter(AlchemyFilter):
default_verbs = ["is_true", "is_false"] default_verbs = ["is_true", "is_false"]
def get_verbs(self): # pylint: disable=empty-docstring def get_verbs(self):
""" """ """ """
# get basic verbs from caller, or default list # get basic verbs from caller, or default list
@ -617,7 +617,7 @@ class BooleanAlchemyFilter(AlchemyFilter):
return verbs return verbs
def coerce_value(self, value): # pylint: disable=empty-docstring def coerce_value(self, value):
""" """ """ """
if value is not None: if value is not None:
return bool(value) return bool(value)
@ -676,7 +676,7 @@ class DateAlchemyFilter(AlchemyFilter):
# 'between': "between", # 'between': "between",
} }
def coerce_value(self, value): # pylint: disable=empty-docstring def coerce_value(self, value):
""" """ """ """
if value: if value:
if isinstance(value, datetime.date): if isinstance(value, datetime.date):

View file

@ -2,7 +2,7 @@
################################################################################ ################################################################################
# #
# wuttaweb -- Web App for Wutta Framework # wuttaweb -- Web App for Wutta Framework
# Copyright © 2024-2025 Lance Edgar # Copyright © 2024 Lance Edgar
# #
# This file is part of Wutta Framework. # This file is part of Wutta Framework.
# #
@ -213,7 +213,7 @@ class MenuHandler(GenericHandler):
# default internal logic # default internal logic
############################## ##############################
def do_make_menus(self, request, **kwargs): # pylint: disable=too-many-branches def do_make_menus(self, request, **kwargs):
""" """
This method is responsible for constructing the final menu This method is responsible for constructing the final menu
set. It first calls :meth:`make_menus()` to get the basic set. It first calls :meth:`make_menus()` to get the basic

View file

@ -113,14 +113,14 @@ class SessionProgress(ProgressBase): # pylint: disable=too-many-instance-attrib
self.session.save() self.session.save()
return self return self
def clear(self): # pylint: disable=empty-docstring def clear(self):
""" """ """ """
self.session.clear() self.session.clear()
self.session["complete"] = False self.session["complete"] = False
self.session["error"] = False self.session["error"] = False
self.session.save() self.session.save()
def update(self, value): # pylint: disable=empty-docstring def update(self, value):
""" """ """ """
self.session.load() self.session.load()
self.session["value"] = value self.session["value"] = value

View file

@ -141,7 +141,7 @@ def get_form_data(request):
return request.POST return request.POST
def get_libver( # pylint: disable=too-many-return-statements,too-many-branches def get_libver(
request, request,
key, key,
configured_only=False, configured_only=False,
@ -281,7 +281,7 @@ def get_libver( # pylint: disable=too-many-return-statements,too-many-branches
return None return None
def get_liburl( # pylint: disable=too-many-return-statements,too-many-branches def get_liburl(
request, request,
key, key,
configured_only=False, configured_only=False,
@ -401,57 +401,57 @@ def get_liburl( # pylint: disable=too-many-return-statements,too-many-branches
return liburl + static.buefy_js.relpath return liburl + static.buefy_js.relpath
return f"https://unpkg.com/buefy@{version}/dist/buefy.min.js" return f"https://unpkg.com/buefy@{version}/dist/buefy.min.js"
if key == "buefy.css": elif key == "buefy.css":
if static and hasattr(static, "buefy_css"): if static and hasattr(static, "buefy_css"):
return liburl + static.buefy_css.relpath return liburl + static.buefy_css.relpath
return f"https://unpkg.com/buefy@{version}/dist/buefy.min.css" return f"https://unpkg.com/buefy@{version}/dist/buefy.min.css"
if key == "vue": elif key == "vue":
if static and hasattr(static, "vue_js"): if static and hasattr(static, "vue_js"):
return liburl + static.vue_js.relpath return liburl + static.vue_js.relpath
return f"https://unpkg.com/vue@{version}/dist/vue.min.js" return f"https://unpkg.com/vue@{version}/dist/vue.min.js"
if key == "vue_resource": elif key == "vue_resource":
if static and hasattr(static, "vue_resource_js"): if static and hasattr(static, "vue_resource_js"):
return liburl + static.vue_resource_js.relpath return liburl + static.vue_resource_js.relpath
return f"https://cdn.jsdelivr.net/npm/vue-resource@{version}" return f"https://cdn.jsdelivr.net/npm/vue-resource@{version}"
if key == "fontawesome": elif key == "fontawesome":
if static and hasattr(static, "fontawesome_js"): if static and hasattr(static, "fontawesome_js"):
return liburl + static.fontawesome_js.relpath return liburl + static.fontawesome_js.relpath
return f"https://use.fontawesome.com/releases/v{version}/js/all.js" return f"https://use.fontawesome.com/releases/v{version}/js/all.js"
if key == "bb_vue": elif key == "bb_vue":
if static and hasattr(static, "bb_vue_js"): if static and hasattr(static, "bb_vue_js"):
return liburl + static.bb_vue_js.relpath return liburl + static.bb_vue_js.relpath
return f"https://unpkg.com/vue@{version}/dist/vue.esm-browser.prod.js" return f"https://unpkg.com/vue@{version}/dist/vue.esm-browser.prod.js"
if key == "bb_oruga": elif key == "bb_oruga":
if static and hasattr(static, "bb_oruga_js"): if static and hasattr(static, "bb_oruga_js"):
return liburl + static.bb_oruga_js.relpath return liburl + static.bb_oruga_js.relpath
return f"https://unpkg.com/@oruga-ui/oruga-next@{version}/dist/oruga.mjs" return f"https://unpkg.com/@oruga-ui/oruga-next@{version}/dist/oruga.mjs"
if key == "bb_oruga_bulma": elif key == "bb_oruga_bulma":
if static and hasattr(static, "bb_oruga_bulma_js"): if static and hasattr(static, "bb_oruga_bulma_js"):
return liburl + static.bb_oruga_bulma_js.relpath return liburl + static.bb_oruga_bulma_js.relpath
return f"https://unpkg.com/@oruga-ui/theme-bulma@{version}/dist/bulma.js" return f"https://unpkg.com/@oruga-ui/theme-bulma@{version}/dist/bulma.js"
if key == "bb_oruga_bulma_css": elif key == "bb_oruga_bulma_css":
if static and hasattr(static, "bb_oruga_bulma_css"): if static and hasattr(static, "bb_oruga_bulma_css"):
return liburl + static.bb_oruga_bulma_css.relpath return liburl + static.bb_oruga_bulma_css.relpath
return f"https://unpkg.com/@oruga-ui/theme-bulma@{version}/dist/bulma.css" return f"https://unpkg.com/@oruga-ui/theme-bulma@{version}/dist/bulma.css"
if key == "bb_fontawesome_svg_core": elif key == "bb_fontawesome_svg_core":
if static and hasattr(static, "bb_fontawesome_svg_core_js"): if static and hasattr(static, "bb_fontawesome_svg_core_js"):
return liburl + static.bb_fontawesome_svg_core_js.relpath return liburl + static.bb_fontawesome_svg_core_js.relpath
return f"https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-svg-core@{version}/+esm" return f"https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-svg-core@{version}/+esm"
if key == "bb_free_solid_svg_icons": elif key == "bb_free_solid_svg_icons":
if static and hasattr(static, "bb_free_solid_svg_icons_js"): if static and hasattr(static, "bb_free_solid_svg_icons_js"):
return liburl + static.bb_free_solid_svg_icons_js.relpath return liburl + static.bb_free_solid_svg_icons_js.relpath
return f"https://cdn.jsdelivr.net/npm/@fortawesome/free-solid-svg-icons@{version}/+esm" return f"https://cdn.jsdelivr.net/npm/@fortawesome/free-solid-svg-icons@{version}/+esm"
if key == "bb_vue_fontawesome": elif key == "bb_vue_fontawesome":
if static and hasattr(static, "bb_vue_fontawesome_js"): if static and hasattr(static, "bb_vue_fontawesome_js"):
return liburl + static.bb_vue_fontawesome_js.relpath return liburl + static.bb_vue_fontawesome_js.relpath
return ( return (
@ -546,7 +546,7 @@ def get_model_fields(config, model_class, include_fk=False):
return fields return fields
def prop_is_fk(mapper, prop): # pylint: disable=empty-docstring def prop_is_fk(mapper, prop):
""" """ """ """
if not isinstance(prop, orm.ColumnProperty): if not isinstance(prop, orm.ColumnProperty):
return False return False
@ -581,18 +581,18 @@ def make_json_safe(value, key=None, warn=True):
if value is colander.null: if value is colander.null:
return None return None
if isinstance(value, dict): elif isinstance(value, dict):
# recursively convert dict # recursively convert dict
parent = dict(value) parent = dict(value)
for k, v in parent.items(): for key, value in parent.items():
parent[k] = make_json_safe(v, key=k, warn=warn) parent[key] = make_json_safe(value, key=key, warn=warn)
value = parent value = parent
elif isinstance(value, list): elif isinstance(value, list):
# recursively convert list # recursively convert list
parent = list(value) parent = list(value)
for i, v in enumerate(parent): for i, value in enumerate(parent):
parent[i] = make_json_safe(v, key=key, warn=warn) parent[i] = make_json_safe(value, key=key, warn=warn)
value = parent value = parent
elif isinstance(value, _uuid.UUID): elif isinstance(value, _uuid.UUID):

View file

@ -86,6 +86,7 @@ class AuthView(View):
headers = login_user(self.request, user) headers = login_user(self.request, user)
return self.redirect(referrer, headers=headers) return self.redirect(referrer, headers=headers)
else:
self.request.session.flash("Invalid user credentials", "error") self.request.session.flash("Invalid user credentials", "error")
return { return {
@ -190,7 +191,7 @@ class AuthView(View):
return {"index_title": str(self.request.user), "form": form} return {"index_title": str(self.request.user), "form": form}
def change_password_make_schema(self): # pylint: disable=empty-docstring def change_password_make_schema(self):
""" """ """ """
schema = colander.Schema() schema = colander.Schema()

View file

@ -121,7 +121,7 @@ class BatchMasterView(MasterView):
return super().render_to_response(template, context) return super().render_to_response(template, context)
def configure_grid(self, g): # pylint: disable=empty-docstring def configure_grid(self, g):
""" """ """ """
super().configure_grid(g) super().configure_grid(g)
model = self.app.model model = self.app.model
@ -144,20 +144,20 @@ class BatchMasterView(MasterView):
# description # description
g.set_link("description") g.set_link("description")
def render_batch_id(self, batch, key, value): # pylint: disable=empty-docstring def render_batch_id(self, batch, key, value):
""" """ """ """
if value: if value:
batch_id = int(value) batch_id = int(value)
return f"{batch_id:08d}" return f"{batch_id:08d}"
return None return None
def get_instance_title(self, batch): # pylint: disable=empty-docstring def get_instance_title(self, batch):
""" """ """ """
if batch.description: if batch.description:
return f"{batch.id_str} {batch.description}" return f"{batch.id_str} {batch.description}"
return batch.id_str return batch.id_str
def configure_form(self, f): # pylint: disable=too-many-branches,empty-docstring def configure_form(self, f):
""" """ """ """
super().configure_form(f) super().configure_form(f)
batch = f.model_instance batch = f.model_instance
@ -378,7 +378,7 @@ class BatchMasterView(MasterView):
############################## ##############################
@classmethod @classmethod
def get_row_model_class(cls): # pylint: disable=empty-docstring def get_row_model_class(cls):
""" """ """ """
if hasattr(cls, "row_model_class"): if hasattr(cls, "row_model_class"):
return cls.row_model_class return cls.row_model_class
@ -396,7 +396,7 @@ class BatchMasterView(MasterView):
query = self.Session.query(BatchRow).filter(BatchRow.batch == batch) query = self.Session.query(BatchRow).filter(BatchRow.batch == batch)
return query return query
def configure_row_grid(self, g): # pylint: disable=empty-docstring def configure_row_grid(self, g):
""" """ """ """
super().configure_row_grid(g) super().configure_row_grid(g)
@ -404,7 +404,7 @@ class BatchMasterView(MasterView):
g.set_renderer("status_code", self.render_row_status) g.set_renderer("status_code", self.render_row_status)
def render_row_status(self, row, key, value): # pylint: disable=empty-docstring def render_row_status(self, row, key, value):
""" """ """ """
return row.STATUS.get(value, value) return row.STATUS.get(value, value)
@ -413,7 +413,7 @@ class BatchMasterView(MasterView):
############################## ##############################
@classmethod @classmethod
def defaults(cls, config): # pylint: disable=empty-docstring def defaults(cls, config):
""" """ """ """
cls._defaults(config) cls._defaults(config)
cls._batch_defaults(config) cls._batch_defaults(config)

View file

@ -85,7 +85,7 @@ class CommonView(View):
""" """
return {"index_title": self.app.get_title()} return {"index_title": self.app.get_title()}
def feedback(self): # pylint: disable=empty-docstring def feedback(self):
""" """ """ """
model = self.app.model model = self.app.model
session = Session() session = Session()
@ -116,7 +116,7 @@ class CommonView(View):
return {"ok": True} return {"ok": True}
def feedback_make_schema(self): # pylint: disable=empty-docstring def feedback_make_schema(self):
""" """ """ """
schema = colander.Schema() schema = colander.Schema()
@ -132,7 +132,7 @@ class CommonView(View):
return schema return schema
def feedback_send(self, context): # pylint: disable=empty-docstring def feedback_send(self, context):
""" """ """ """
self.app.send_email("feedback", context) self.app.send_email("feedback", context)

View file

@ -89,7 +89,7 @@ class EmailSettingView(MasterView):
data.append(self.normalize_setting(setting)) data.append(self.normalize_setting(setting))
return data return data
def normalize_setting(self, setting): # pylint: disable=empty-docstring def normalize_setting(self, setting):
""" """ """ """
key = setting.__name__ key = setting.__name__
return { return {
@ -107,7 +107,7 @@ class EmailSettingView(MasterView):
"enabled": self.email_handler.is_enabled(key), "enabled": self.email_handler.is_enabled(key),
} }
def configure_grid(self, g): # pylint: disable=empty-docstring def configure_grid(self, g):
""" """ """ """
super().configure_grid(g) super().configure_grid(g)
@ -122,7 +122,7 @@ class EmailSettingView(MasterView):
# to # to
g.set_renderer("to", self.render_to_short) g.set_renderer("to", self.render_to_short)
def render_to_short(self, setting, field, value): # pylint: disable=empty-docstring def render_to_short(self, setting, field, value):
""" """ """ """
recips = value recips = value
if not recips: if not recips:
@ -134,7 +134,7 @@ class EmailSettingView(MasterView):
recips = ", ".join(recips[:2]) recips = ", ".join(recips[:2])
return f"{recips}, ..." return f"{recips}, ..."
def get_instance(self): # pylint: disable=empty-docstring def get_instance(self):
""" """ """ """
key = self.request.matchdict["key"] key = self.request.matchdict["key"]
setting = self.email_handler.get_email_setting(key, instance=False) setting = self.email_handler.get_email_setting(key, instance=False)
@ -143,11 +143,11 @@ class EmailSettingView(MasterView):
raise self.notfound() raise self.notfound()
def get_instance_title(self, setting): # pylint: disable=empty-docstring def get_instance_title(self, setting):
""" """ """ """
return setting["subject"] return setting["subject"]
def configure_form(self, f): # pylint: disable=empty-docstring def configure_form(self, f):
""" """ """ """
super().configure_form(f) super().configure_form(f)
@ -173,7 +173,7 @@ class EmailSettingView(MasterView):
# enabled # enabled
f.set_node("enabled", colander.Boolean()) f.set_node("enabled", colander.Boolean())
def persist(self, setting): # pylint: disable=too-many-branches,empty-docstring def persist(self, setting):
""" """ """ """
session = self.Session() session = self.Session()
key = self.request.matchdict["key"] key = self.request.matchdict["key"]
@ -233,7 +233,7 @@ class EmailSettingView(MasterView):
# enabled # enabled
save("enabled", "true" if setting["enabled"] else "false") save("enabled", "true" if setting["enabled"] else "false")
def render_to_response(self, template, context): # pylint: disable=empty-docstring def render_to_response(self, template, context):
""" """ """ """
if self.viewing: if self.viewing:
setting = context["instance"] setting = context["instance"]
@ -270,7 +270,7 @@ class EmailSettingView(MasterView):
return self.request.response return self.request.response
@classmethod @classmethod
def defaults(cls, config): # pylint: disable=empty-docstring def defaults(cls, config):
""" """ """ """
cls._email_defaults(config) cls._email_defaults(config)
cls._defaults(config) cls._defaults(config)

View file

@ -483,7 +483,7 @@ class MasterView(View):
context["pager_stats"] = grid.get_vue_pager_stats() context["pager_stats"] = grid.get_vue_pager_stats()
return self.json_response(context) return self.json_response(context)
# full, not partial else: # full, not partial
# nb. when user asks to reset view, it is via the query # nb. when user asks to reset view, it is via the query
# string. if so we then redirect to discard that. # string. if so we then redirect to discard that.
@ -801,6 +801,8 @@ class MasterView(View):
self.delete_bulk_action(data) self.delete_bulk_action(data)
return self.redirect(self.get_index_url()) return self.redirect(self.get_index_url())
else:
# start thread for delete; show progress page # start thread for delete; show progress page
route_prefix = self.get_route_prefix() route_prefix = self.get_route_prefix()
key = f"{route_prefix}.delete_bulk" key = f"{route_prefix}.delete_bulk"
@ -813,9 +815,7 @@ class MasterView(View):
thread.start() thread.start()
return self.render_progress(progress) return self.render_progress(progress)
def delete_bulk_thread( # pylint: disable=empty-docstring def delete_bulk_thread(self, query, success_url=None, progress=None):
self, query, success_url=None, progress=None
):
""" """ """ """
model_title_plural = self.get_model_title_plural() model_title_plural = self.get_model_title_plural()
@ -867,7 +867,7 @@ class MasterView(View):
delete, data, progress, message=f"Deleting {model_title_plural}" delete, data, progress, message=f"Deleting {model_title_plural}"
) )
def delete_bulk_make_button(self): # pylint: disable=empty-docstring def delete_bulk_make_button(self):
""" """ """ """
route_prefix = self.get_route_prefix() route_prefix = self.get_route_prefix()
@ -1111,9 +1111,7 @@ class MasterView(View):
:param progress: Optional progress indicator factory. :param progress: Optional progress indicator factory.
""" """
def execute_thread( # pylint: disable=empty-docstring def execute_thread(self, key, user_uuid, progress=None):
self, key, user_uuid, progress=None
):
""" """ """ """
model = self.app.model model = self.app.model
model_title = self.get_model_title() model_title = self.get_model_title()

View file

@ -2,7 +2,7 @@
################################################################################ ################################################################################
# #
# wuttaweb -- Web App for Wutta Framework # wuttaweb -- Web App for Wutta Framework
# Copyright © 2024-2025 Lance Edgar # Copyright © 2024 Lance Edgar
# #
# This file is part of Wutta Framework. # This file is part of Wutta Framework.
# #
@ -70,7 +70,7 @@ class PersonView(MasterView):
"users", "users",
] ]
def configure_grid(self, g): # pylint: disable=empty-docstring def configure_grid(self, g):
""" """ """ """
super().configure_grid(g) super().configure_grid(g)
@ -83,7 +83,7 @@ class PersonView(MasterView):
# last_name # last_name
g.set_link("last_name") g.set_link("last_name")
def configure_form(self, f): # pylint: disable=empty-docstring def configure_form(self, f):
""" """ """ """
super().configure_form(f) super().configure_form(f)
person = f.model_instance person = f.model_instance
@ -129,7 +129,7 @@ class PersonView(MasterView):
return grid return grid
def objectify(self, form): # pylint: disable=empty-docstring def objectify(self, form):
""" """ """ """
person = super().objectify(form) person = super().objectify(form)
@ -138,7 +138,7 @@ class PersonView(MasterView):
return person return person
def autocomplete_query(self, term): # pylint: disable=empty-docstring def autocomplete_query(self, term):
""" """ """ """
model = self.app.model model = self.app.model
session = self.Session() session = self.Session()
@ -147,7 +147,7 @@ class PersonView(MasterView):
query = query.filter(sa.and_(*criteria)).order_by(model.Person.full_name) query = query.filter(sa.and_(*criteria)).order_by(model.Person.full_name)
return query return query
def view_profile(self, session=None): # pylint: disable=empty-docstring def view_profile(self, session=None):
""" """ """ """
person = self.get_instance(session=session) person = self.get_instance(session=session)
context = { context = {
@ -156,13 +156,13 @@ class PersonView(MasterView):
} }
return self.render_to_response("view_profile", context) return self.render_to_response("view_profile", context)
def make_user(self): # pylint: disable=empty-docstring def make_user(self):
""" """ """ """
self.request.session.flash("TODO: this feature is not yet supported", "error") self.request.session.flash("TODO: this feature is not yet supported", "error")
return self.redirect(self.request.get_referrer()) return self.redirect(self.request.get_referrer())
@classmethod @classmethod
def defaults(cls, config): # pylint: disable=empty-docstring def defaults(cls, config):
""" """ """ """
# nb. Person may come from custom model # nb. Person may come from custom model

View file

@ -2,7 +2,7 @@
################################################################################ ################################################################################
# #
# wuttaweb -- Web App for Wutta Framework # wuttaweb -- Web App for Wutta Framework
# Copyright © 2024-2025 Lance Edgar # Copyright © 2024 Lance Edgar
# #
# This file is part of Wutta Framework. # This file is part of Wutta Framework.
# #
@ -72,16 +72,14 @@ class ReportView(MasterView):
super().__init__(request, context=context) super().__init__(request, context=context)
self.report_handler = self.app.get_report_handler() self.report_handler = self.app.get_report_handler()
def get_grid_data( # pylint: disable=empty-docstring def get_grid_data(self, columns=None, session=None):
self, columns=None, session=None
):
""" """ """ """
data = [] data = []
for report in self.report_handler.get_reports().values(): for report in self.report_handler.get_reports().values():
data.append(self.normalize_report(report)) data.append(self.normalize_report(report))
return data return data
def normalize_report(self, report): # pylint: disable=empty-docstring def normalize_report(self, report):
""" """ """ """
return { return {
"report_key": report.report_key, "report_key": report.report_key,
@ -89,7 +87,7 @@ class ReportView(MasterView):
"help_text": report.__doc__, "help_text": report.__doc__,
} }
def configure_grid(self, g): # pylint: disable=empty-docstring def configure_grid(self, g):
""" """ """ """
super().configure_grid(g) super().configure_grid(g)
@ -103,7 +101,7 @@ class ReportView(MasterView):
# help_text # help_text
g.set_searchable("help_text") g.set_searchable("help_text")
def get_instance(self): # pylint: disable=empty-docstring def get_instance(self):
""" """ """ """
key = self.request.matchdict["report_key"] key = self.request.matchdict["report_key"]
report = self.report_handler.get_report(key) report = self.report_handler.get_report(key)
@ -112,7 +110,7 @@ class ReportView(MasterView):
raise self.notfound() raise self.notfound()
def get_instance_title(self, report): # pylint: disable=empty-docstring def get_instance_title(self, report):
""" """ """ """
return report["report_title"] return report["report_title"]
@ -151,7 +149,7 @@ class ReportView(MasterView):
return self.render_to_response("view", context) return self.render_to_response("view", context)
def configure_form(self, f): # pylint: disable=empty-docstring def configure_form(self, f):
""" """ """ """
super().configure_form(f) super().configure_form(f)
key = self.request.matchdict["report_key"] key = self.request.matchdict["report_key"]
@ -212,7 +210,7 @@ class ReportView(MasterView):
context["report_generated"] = datetime.datetime.now() context["report_generated"] = datetime.datetime.now()
return context return context
def normalize_columns(self, columns): # pylint: disable=empty-docstring def normalize_columns(self, columns):
""" """ """ """
normal = [] normal = []
for column in columns: for column in columns:
@ -222,7 +220,7 @@ class ReportView(MasterView):
normal.append(column) normal.append(column)
return normal return normal
def get_download_data(self): # pylint: disable=empty-docstring def get_download_data(self):
""" """ """ """
key = self.request.matchdict["report_key"] key = self.request.matchdict["report_key"]
report = self.report_handler.get_report(key) report = self.report_handler.get_report(key)
@ -231,14 +229,14 @@ class ReportView(MasterView):
data = self.report_handler.make_report_data(report, params) data = self.report_handler.make_report_data(report, params)
return params, columns, data return params, columns, data
def get_download_path(self, data, ext): # pylint: disable=empty-docstring def get_download_path(self, data, ext):
""" """ """ """
tempdir = tempfile.mkdtemp() tempdir = tempfile.mkdtemp()
filename = f"{data['output_title']}.{ext}" filename = f"{data['output_title']}.{ext}"
return os.path.join(tempdir, filename) return os.path.join(tempdir, filename)
@classmethod @classmethod
def defaults(cls, config): # pylint: disable=empty-docstring def defaults(cls, config):
""" """ """ """
cls._defaults(config) cls._defaults(config)
cls._report_defaults(config) cls._report_defaults(config)

View file

@ -2,7 +2,7 @@
################################################################################ ################################################################################
# #
# wuttaweb -- Web App for Wutta Framework # wuttaweb -- Web App for Wutta Framework
# Copyright © 2024-2025 Lance Edgar # Copyright © 2024 Lance Edgar
# #
# This file is part of Wutta Framework. # This file is part of Wutta Framework.
# #
@ -59,13 +59,13 @@ class RoleView(MasterView):
sort_defaults = "name" sort_defaults = "name"
# TODO: master should handle this, possibly via configure_form() # TODO: master should handle this, possibly via configure_form()
def get_query(self, session=None): # pylint: disable=empty-docstring def get_query(self, session=None):
""" """ """ """
model = self.app.model model = self.app.model
query = super().get_query(session=session) query = super().get_query(session=session)
return query.order_by(model.Role.name) return query.order_by(model.Role.name)
def configure_grid(self, g): # pylint: disable=empty-docstring def configure_grid(self, g):
""" """ """ """
super().configure_grid(g) super().configure_grid(g)
@ -75,7 +75,7 @@ class RoleView(MasterView):
# notes # notes
g.set_renderer("notes", self.grid_render_notes) g.set_renderer("notes", self.grid_render_notes)
def is_editable(self, role): # pylint: disable=empty-docstring def is_editable(self, role):
""" """ """ """
session = self.app.get_session(role) session = self.app.get_session(role)
auth = self.app.get_auth_handler() auth = self.app.get_auth_handler()
@ -93,7 +93,7 @@ class RoleView(MasterView):
return True return True
def is_deletable(self, role): # pylint: disable=empty-docstring def is_deletable(self, role):
""" """ """ """
session = self.app.get_session(role) session = self.app.get_session(role)
auth = self.app.get_auth_handler() auth = self.app.get_auth_handler()
@ -108,7 +108,7 @@ class RoleView(MasterView):
return True return True
def configure_form(self, f): # pylint: disable=empty-docstring def configure_form(self, f):
""" """ """ """
super().configure_form(f) super().configure_form(f)
role = f.model_instance role = f.model_instance
@ -171,7 +171,7 @@ class RoleView(MasterView):
return grid return grid
def unique_name(self, node, value): # pylint: disable=empty-docstring def unique_name(self, node, value):
""" """ """ """
model = self.app.model model = self.app.model
session = Session() session = Session()
@ -266,7 +266,7 @@ class RoleView(MasterView):
return available return available
def objectify(self, form): # pylint: disable=empty-docstring def objectify(self, form):
""" """ """ """
# normal logic first # normal logic first
role = super().objectify(form) role = super().objectify(form)
@ -276,7 +276,7 @@ class RoleView(MasterView):
return role return role
def update_permissions(self, role, form): # pylint: disable=empty-docstring def update_permissions(self, role, form):
""" """ """ """
if "permissions" not in form.validated: if "permissions" not in form.validated:
return return
@ -293,7 +293,7 @@ class RoleView(MasterView):
auth.revoke_permission(role, pkey) auth.revoke_permission(role, pkey)
@classmethod @classmethod
def defaults(cls, config): # pylint: disable=empty-docstring def defaults(cls, config):
""" """ """ """
cls._defaults(config) cls._defaults(config)
cls._role_defaults(config) cls._role_defaults(config)
@ -340,7 +340,7 @@ class PermissionView(MasterView):
"permission", "permission",
] ]
def get_query(self, **kwargs): # pylint: disable=empty-docstring def get_query(self, **kwargs):
""" """ """ """
query = super().get_query(**kwargs) query = super().get_query(**kwargs)
model = self.app.model model = self.app.model
@ -350,7 +350,7 @@ class PermissionView(MasterView):
return query return query
def configure_grid(self, g): # pylint: disable=empty-docstring def configure_grid(self, g):
""" """ """ """
super().configure_grid(g) super().configure_grid(g)
model = self.app.model model = self.app.model
@ -363,7 +363,7 @@ class PermissionView(MasterView):
# permission # permission
g.set_link("permission") g.set_link("permission")
def configure_form(self, f): # pylint: disable=empty-docstring def configure_form(self, f):
""" """ """ """
super().configure_form(f) super().configure_form(f)

View file

@ -71,9 +71,7 @@ class AppInfoView(MasterView):
# TODO: for tailbone backward compat with get_liburl() etc. # TODO: for tailbone backward compat with get_liburl() etc.
weblib_config_prefix = None weblib_config_prefix = None
def get_grid_data( # pylint: disable=empty-docstring def get_grid_data(self, columns=None, session=None):
self, columns=None, session=None
):
""" """ """ """
# nb. init with empty data, only load it upon user request # nb. init with empty data, only load it upon user request
@ -93,7 +91,7 @@ class AppInfoView(MasterView):
return data return data
def configure_grid(self, g): # pylint: disable=empty-docstring def configure_grid(self, g):
""" """ """ """
super().configure_grid(g) super().configure_grid(g)
@ -105,7 +103,7 @@ class AppInfoView(MasterView):
# editable_project_location # editable_project_location
g.set_searchable("editable_project_location") g.set_searchable("editable_project_location")
def get_weblibs(self): # pylint: disable=empty-docstring def get_weblibs(self):
""" """ """ """
return OrderedDict( return OrderedDict(
[ [
@ -124,7 +122,7 @@ class AppInfoView(MasterView):
] ]
) )
def configure_get_simple_settings(self): # pylint: disable=empty-docstring def configure_get_simple_settings(self):
""" """ """ """
simple_settings = [ simple_settings = [
# basics # basics
@ -173,7 +171,7 @@ class AppInfoView(MasterView):
return simple_settings return simple_settings
def configure_get_context(self, **kwargs): # pylint: disable=empty-docstring def configure_get_context(self, **kwargs):
""" """ """ """
context = super().configure_get_context(**kwargs) context = super().configure_get_context(**kwargs)
@ -242,14 +240,14 @@ class SettingView(MasterView):
sort_defaults = "name" sort_defaults = "name"
# TODO: master should handle this (per model key) # TODO: master should handle this (per model key)
def configure_grid(self, g): # pylint: disable=empty-docstring def configure_grid(self, g):
""" """ """ """
super().configure_grid(g) super().configure_grid(g)
# name # name
g.set_link("name") g.set_link("name")
def configure_form(self, f): # pylint: disable=empty-docstring def configure_form(self, f):
""" """ """ """
super().configure_form(f) super().configure_form(f)
@ -260,7 +258,7 @@ class SettingView(MasterView):
# TODO: master should handle this (per column nullable) # TODO: master should handle this (per column nullable)
f.set_required("value", False) f.set_required("value", False)
def unique_name(self, node, value): # pylint: disable=empty-docstring def unique_name(self, node, value):
""" """ """ """
model = self.app.model model = self.app.model
session = self.Session() session = self.Session()

View file

@ -72,7 +72,7 @@ class UpgradeView(MasterView):
sort_defaults = ("created", "desc") sort_defaults = ("created", "desc")
def configure_grid(self, g): # pylint: disable=empty-docstring def configure_grid(self, g):
""" """ """ """
super().configure_grid(g) super().configure_grid(g)
model = self.app.model model = self.app.model
@ -110,7 +110,7 @@ class UpgradeView(MasterView):
) )
g.set_filter("executed_by", Executor.username, label="Executed By Username") g.set_filter("executed_by", Executor.username, label="Executed By Username")
def grid_row_class(self, upgrade, data, i): # pylint: disable=empty-docstring def grid_row_class(self, upgrade, data, i):
""" """ """ """
enum = self.app.enum enum = self.app.enum
if upgrade.status == enum.UpgradeStatus.EXECUTING: if upgrade.status == enum.UpgradeStatus.EXECUTING:
@ -119,7 +119,7 @@ class UpgradeView(MasterView):
return "has-background-warning" return "has-background-warning"
return None return None
def configure_form(self, f): # pylint: disable=empty-docstring def configure_form(self, f):
""" """ """ """
super().configure_form(f) super().configure_form(f)
enum = self.app.enum enum = self.app.enum
@ -213,7 +213,7 @@ class UpgradeView(MasterView):
super().delete_instance(upgrade) super().delete_instance(upgrade)
def objectify(self, form): # pylint: disable=empty-docstring def objectify(self, form):
""" """ """ """
upgrade = super().objectify(form) upgrade = super().objectify(form)
enum = self.app.enum enum = self.app.enum
@ -225,15 +225,13 @@ class UpgradeView(MasterView):
return upgrade return upgrade
def download_path(self, upgrade, filename): # pylint: disable=empty-docstring def download_path(self, upgrade, filename):
""" """ """ """
if filename: if filename:
return self.get_upgrade_filepath(upgrade, filename) return self.get_upgrade_filepath(upgrade, filename)
return None return None
def get_upgrade_filepath( # pylint: disable=empty-docstring def get_upgrade_filepath(self, upgrade, filename=None, create=True):
self, upgrade, filename=None, create=True
):
""" """ """ """
uuid = str(upgrade.uuid) uuid = str(upgrade.uuid)
path = self.app.get_appdir( path = self.app.get_appdir(
@ -289,7 +287,7 @@ class UpgradeView(MasterView):
else: else:
upgrade.status = enum.UpgradeStatus.FAILURE upgrade.status = enum.UpgradeStatus.FAILURE
def execute_progress(self): # pylint: disable=empty-docstring def execute_progress(self):
""" """ """ """
route_prefix = self.get_route_prefix() route_prefix = self.get_route_prefix()
upgrade = self.get_instance() upgrade = self.get_instance()
@ -331,7 +329,7 @@ class UpgradeView(MasterView):
return data return data
def configure_get_simple_settings(self): # pylint: disable=empty-docstring def configure_get_simple_settings(self):
""" """ """ """
script = self.config.get(f"{self.app.appname}.upgrades.command") script = self.config.get(f"{self.app.appname}.upgrades.command")
@ -344,7 +342,7 @@ class UpgradeView(MasterView):
] ]
@classmethod @classmethod
def defaults(cls, config): # pylint: disable=empty-docstring def defaults(cls, config):
""" """ """ """
# nb. Upgrade may come from custom model # nb. Upgrade may come from custom model

View file

@ -74,7 +74,7 @@ class UserView(MasterView):
"api_tokens", "api_tokens",
] ]
def get_query(self, session=None): # pylint: disable=empty-docstring def get_query(self, session=None):
""" """ """ """
query = super().get_query(session=session) query = super().get_query(session=session)
@ -84,7 +84,7 @@ class UserView(MasterView):
return query return query
def configure_grid(self, g): # pylint: disable=empty-docstring def configure_grid(self, g):
""" """ """ """
super().configure_grid(g) super().configure_grid(g)
model = self.app.model model = self.app.model
@ -100,13 +100,13 @@ class UserView(MasterView):
g.set_sorter("person", model.Person.full_name) g.set_sorter("person", model.Person.full_name)
g.set_filter("person", model.Person.full_name, label="Person Full Name") g.set_filter("person", model.Person.full_name, label="Person Full Name")
def grid_row_class(self, user, data, i): # pylint: disable=empty-docstring def grid_row_class(self, user, data, i):
""" """ """ """
if not user.active: if not user.active:
return "has-background-warning" return "has-background-warning"
return None return None
def is_editable(self, user): # pylint: disable=empty-docstring def is_editable(self, user):
""" """ """ """
# only root can edit certain users # only root can edit certain users
@ -115,7 +115,7 @@ class UserView(MasterView):
return True return True
def configure_form(self, f): # pylint: disable=empty-docstring def configure_form(self, f):
""" """ """ """
super().configure_form(f) super().configure_form(f)
user = f.model_instance user = f.model_instance
@ -161,7 +161,7 @@ class UserView(MasterView):
else: else:
f.remove("api_tokens") f.remove("api_tokens")
def unique_username(self, node, value): # pylint: disable=empty-docstring def unique_username(self, node, value):
""" """ """ """
model = self.app.model model = self.app.model
session = self.Session() session = self.Session()
@ -175,7 +175,7 @@ class UserView(MasterView):
if query.count(): if query.count():
node.raise_invalid("Username must be unique") node.raise_invalid("Username must be unique")
def objectify(self, form): # pylint: disable=empty-docstring def objectify(self, form):
""" """ """ """
model = self.app.model model = self.app.model
auth = self.app.get_auth_handler() auth = self.app.get_auth_handler()
@ -221,7 +221,7 @@ class UserView(MasterView):
return user return user
def update_roles(self, user, form): # pylint: disable=empty-docstring def update_roles(self, user, form):
""" """ """ """
# TODO # TODO
# if not self.has_perm('edit_roles'): # if not self.has_perm('edit_roles'):
@ -311,7 +311,7 @@ class UserView(MasterView):
return grid return grid
def normalize_api_token(self, token): # pylint: disable=empty-docstring def normalize_api_token(self, token):
""" """ """ """
return { return {
"uuid": token.uuid.hex, "uuid": token.uuid.hex,
@ -366,7 +366,7 @@ class UserView(MasterView):
return {} return {}
@classmethod @classmethod
def defaults(cls, config): # pylint: disable=empty-docstring def defaults(cls, config):
""" """ """ """
# nb. User may come from custom model # nb. User may come from custom model

View file

@ -121,7 +121,7 @@ class TestUpgradeView(WebTestCase):
model = self.app.model model = self.app.model
enum = self.app.enum enum = self.app.enum
appdir = self.mkdtemp() appdir = self.mkdir("app")
self.config.setdefault("wutta.appdir", appdir) self.config.setdefault("wutta.appdir", appdir)
self.assertEqual(self.app.get_appdir(), appdir) self.assertEqual(self.app.get_appdir(), appdir)
@ -150,7 +150,7 @@ class TestUpgradeView(WebTestCase):
model = self.app.model model = self.app.model
enum = self.app.enum enum = self.app.enum
appdir = self.mkdtemp() appdir = self.mkdir("app")
self.config.setdefault("wutta.appdir", appdir) self.config.setdefault("wutta.appdir", appdir)
self.assertEqual(self.app.get_appdir(), appdir) self.assertEqual(self.app.get_appdir(), appdir)
@ -181,7 +181,7 @@ class TestUpgradeView(WebTestCase):
model = self.app.model model = self.app.model
enum = self.app.enum enum = self.app.enum
appdir = self.mkdtemp() appdir = self.mkdir("app")
self.config.setdefault("wutta.appdir", appdir) self.config.setdefault("wutta.appdir", appdir)
self.assertEqual(self.app.get_appdir(), appdir) self.assertEqual(self.app.get_appdir(), appdir)
@ -219,7 +219,7 @@ class TestUpgradeView(WebTestCase):
model = self.app.model model = self.app.model
enum = self.app.enum enum = self.app.enum
appdir = self.mkdtemp() appdir = self.mkdir("app")
self.config.setdefault("wutta.appdir", appdir) self.config.setdefault("wutta.appdir", appdir)
self.assertEqual(self.app.get_appdir(), appdir) self.assertEqual(self.app.get_appdir(), appdir)