feat: add basic support for wutta-continuum
and i mean *basic* - so far.. eventually will expose version history for viewing etc. unfortunately got carried away and reorganized the api docs a little while i was at it..
This commit is contained in:
parent
24f5ee1dcc
commit
71728718d8
53 changed files with 308 additions and 76 deletions
|
@ -98,7 +98,8 @@ class WuttaSecurityPolicy:
|
|||
for current user
|
||||
|
||||
:param db_session: Optional :term:`db session` to use, instead of
|
||||
:class:`wuttaweb.db.Session`. Probably only useful for tests.
|
||||
:class:`wuttaweb.db.sess.Session`. Probably only useful for
|
||||
tests.
|
||||
"""
|
||||
|
||||
def __init__(self, db_session=None):
|
||||
|
|
43
src/wuttaweb/conf.py
Normal file
43
src/wuttaweb/conf.py
Normal file
|
@ -0,0 +1,43 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
################################################################################
|
||||
#
|
||||
# wuttaweb -- Web App for Wutta Framework
|
||||
# Copyright © 2024 Lance Edgar
|
||||
#
|
||||
# This file is part of Wutta Framework.
|
||||
#
|
||||
# Wutta Framework is free software: you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by the Free
|
||||
# Software Foundation, either version 3 of the License, or (at your option) any
|
||||
# later version.
|
||||
#
|
||||
# Wutta Framework is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
# more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along with
|
||||
# Wutta Framework. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
################################################################################
|
||||
"""
|
||||
Config Extension
|
||||
"""
|
||||
|
||||
from wuttjamaican.conf import WuttaConfigExtension
|
||||
|
||||
|
||||
class WuttaWebConfigExtension(WuttaConfigExtension):
|
||||
"""
|
||||
Config extension for WuttaWeb.
|
||||
|
||||
This sets the default plugin for SQLAlchemy-Continuum. Which is
|
||||
only relevant if Wutta-Continuum is installed and enabled. For
|
||||
more info see :doc:`wutta-continuum:index`.
|
||||
"""
|
||||
key = 'wuttaweb'
|
||||
|
||||
def configure(self, config):
|
||||
""" """
|
||||
config.setdefault('wutta_continuum.wutta_plugin_spec',
|
||||
'wuttaweb.db.continuum:WuttaWebContinuumPlugin')
|
31
src/wuttaweb/db/__init__.py
Normal file
31
src/wuttaweb/db/__init__.py
Normal file
|
@ -0,0 +1,31 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
################################################################################
|
||||
#
|
||||
# wuttaweb -- Web App for Wutta Framework
|
||||
# Copyright © 2024 Lance Edgar
|
||||
#
|
||||
# This file is part of Wutta Framework.
|
||||
#
|
||||
# Wutta Framework is free software: you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by the Free
|
||||
# Software Foundation, either version 3 of the License, or (at your option) any
|
||||
# later version.
|
||||
#
|
||||
# Wutta Framework is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
# more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along with
|
||||
# Wutta Framework. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
################################################################################
|
||||
"""
|
||||
Database Utilities
|
||||
|
||||
The following are available from this ``wuttaweb.db`` namespace:
|
||||
|
||||
* :class:`~wuttaweb.db.sess.Session`
|
||||
"""
|
||||
|
||||
from .sess import Session
|
56
src/wuttaweb/db/continuum.py
Normal file
56
src/wuttaweb/db/continuum.py
Normal file
|
@ -0,0 +1,56 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
################################################################################
|
||||
#
|
||||
# wuttaweb -- Web App for Wutta Framework
|
||||
# Copyright © 2024 Lance Edgar
|
||||
#
|
||||
# This file is part of Wutta Framework.
|
||||
#
|
||||
# Wutta Framework is free software: you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by the Free
|
||||
# Software Foundation, either version 3 of the License, or (at your option) any
|
||||
# later version.
|
||||
#
|
||||
# Wutta Framework is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
# more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along with
|
||||
# Wutta Framework. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
################################################################################
|
||||
"""
|
||||
SQLAlchemy-Continuum Plugin
|
||||
"""
|
||||
|
||||
from pyramid.threadlocal import get_current_request
|
||||
|
||||
try:
|
||||
from wutta_continuum.conf import WuttaContinuumPlugin
|
||||
except ImportError: # pragma: no cover
|
||||
pass
|
||||
else:
|
||||
|
||||
class WuttaWebContinuumPlugin(WuttaContinuumPlugin):
|
||||
"""
|
||||
SQLAlchemy-Continuum manager plugin for WuttaWeb.
|
||||
|
||||
This tries to use the current request to obtain user and IP
|
||||
address for the transaction.
|
||||
"""
|
||||
|
||||
# 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
|
||||
|
||||
def get_remote_addr(self, uow, session):
|
||||
""" """
|
||||
request = get_current_request()
|
||||
if request:
|
||||
return request.client_addr
|
||||
|
||||
def get_user_id(self, uow, session):
|
||||
""" """
|
||||
request = get_current_request()
|
||||
if request and request.user:
|
||||
return request.user.uuid
|
|
@ -128,7 +128,7 @@ class WuttaSet(colander.Set):
|
|||
:param request: Current :term:`request` object.
|
||||
|
||||
:param session: Optional :term:`db session` to use instead of
|
||||
:class:`wuttaweb.db.Session`.
|
||||
:class:`wuttaweb.db.sess.Session`.
|
||||
"""
|
||||
|
||||
def __init__(self, request, session=None):
|
||||
|
|
|
@ -99,8 +99,11 @@ class ObjectRefWidget(SelectWidget):
|
|||
""" """
|
||||
values = super().get_template_values(field, cstruct, kw)
|
||||
|
||||
if 'url' not in values and self.url and field.schema.model_instance:
|
||||
values['url'] = self.url(field.schema.model_instance)
|
||||
# add url, only if rendering readonly
|
||||
readonly = kw.get('readonly', self.readonly)
|
||||
if readonly:
|
||||
if 'url' not in values and self.url and field.schema.model_instance:
|
||||
values['url'] = self.url(field.schema.model_instance)
|
||||
|
||||
return values
|
||||
|
||||
|
@ -134,7 +137,7 @@ class WuttaCheckboxChoiceWidget(CheckboxChoiceWidget):
|
|||
:param request: Current :term:`request` object.
|
||||
|
||||
:param session: Optional :term:`db session` to use instead of
|
||||
:class:`wuttaweb.db.Session`.
|
||||
:class:`wuttaweb.db.sess.Session`.
|
||||
|
||||
It uses these Deform templates:
|
||||
|
||||
|
|
|
@ -147,7 +147,7 @@ def new_request_set_user(
|
|||
from database, instead of :func:`default_user_getter()`.
|
||||
|
||||
:param db_session: Optional :term:`db session` to use,
|
||||
instead of :class:`wuttaweb.db.Session`.
|
||||
instead of :class:`wuttaweb.db.sess.Session`.
|
||||
|
||||
This will add to the request object:
|
||||
|
||||
|
|
|
@ -491,10 +491,16 @@ def get_model_fields(config, model_class=None):
|
|||
try:
|
||||
mapper = sa.inspect(model_class)
|
||||
except sa.exc.NoInspectionAvailable:
|
||||
pass
|
||||
else:
|
||||
fields = [prop.key for prop in mapper.iterate_properties]
|
||||
return fields
|
||||
return
|
||||
|
||||
fields = [prop.key for prop in mapper.iterate_properties]
|
||||
|
||||
# nb. we never want the continuum 'versions' prop
|
||||
app = config.get_app()
|
||||
if app.continuum_is_enabled() and 'versions' in fields:
|
||||
fields.remove('versions')
|
||||
|
||||
return fields
|
||||
|
||||
|
||||
def make_json_safe(value, key=None, warn=True):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue