From 9a739381aebc4ff20ad65359f3a4043709caa518 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Mon, 5 Aug 2024 21:49:18 -0500 Subject: [PATCH] feat: add basic App Info view (index only) more to come! --- docs/api/wuttaweb/index.rst | 1 + docs/api/wuttaweb/views.settings.rst | 6 +++ src/wuttaweb/menus.py | 5 +- src/wuttaweb/subscribers.py | 1 + src/wuttaweb/templates/appinfo/index.mako | 56 ++++++++++++++++++++++ src/wuttaweb/templates/master/index.mako | 4 ++ src/wuttaweb/views/essential.py | 1 + src/wuttaweb/views/settings.py | 47 +++++++++++++++++++ tests/forms/test_base.py | 2 +- tests/test_subscribers.py | 2 +- tests/views/test_master.py | 2 +- tests/views/test_settings.py | 13 ++++++ tests/views/utils.py | 57 +++++++++++++++++++++++ 13 files changed, 192 insertions(+), 5 deletions(-) create mode 100644 docs/api/wuttaweb/views.settings.rst create mode 100644 src/wuttaweb/templates/appinfo/index.mako create mode 100644 src/wuttaweb/views/settings.py create mode 100644 tests/views/test_settings.py create mode 100644 tests/views/utils.py diff --git a/docs/api/wuttaweb/index.rst b/docs/api/wuttaweb/index.rst index 057ce36..5afd18b 100644 --- a/docs/api/wuttaweb/index.rst +++ b/docs/api/wuttaweb/index.rst @@ -24,3 +24,4 @@ views.common views.essential views.master + views.settings diff --git a/docs/api/wuttaweb/views.settings.rst b/docs/api/wuttaweb/views.settings.rst new file mode 100644 index 0000000..7923331 --- /dev/null +++ b/docs/api/wuttaweb/views.settings.rst @@ -0,0 +1,6 @@ + +``wuttaweb.views.settings`` +=========================== + +.. automodule:: wuttaweb.views.settings + :members: diff --git a/src/wuttaweb/menus.py b/src/wuttaweb/menus.py index c0e7ae1..0fe780d 100644 --- a/src/wuttaweb/menus.py +++ b/src/wuttaweb/menus.py @@ -118,8 +118,9 @@ class MenuHandler(GenericHandler): 'type': 'menu', 'items': [ { - 'title': "TODO!", - 'url': '#', + 'title': "App Info", + 'route': 'appinfo', + 'perm': 'appinfo.list', }, ], } diff --git a/src/wuttaweb/subscribers.py b/src/wuttaweb/subscribers.py index 63fe428..92d40d9 100644 --- a/src/wuttaweb/subscribers.py +++ b/src/wuttaweb/subscribers.py @@ -249,6 +249,7 @@ def before_render(event): context['h'] = helpers context['url'] = request.route_url context['json'] = json + context['b'] = 'o' if request.use_oruga else 'b' # for buefy # TODO: this should be avoided somehow, for non-traditional web # apps, esp. "API" web apps. (in the meantime can configure the diff --git a/src/wuttaweb/templates/appinfo/index.mako b/src/wuttaweb/templates/appinfo/index.mako new file mode 100644 index 0000000..7354514 --- /dev/null +++ b/src/wuttaweb/templates/appinfo/index.mako @@ -0,0 +1,56 @@ +## -*- coding: utf-8; -*- +<%inherit file="/master/index.mako" /> + +<%def name="page_content()"> + + + + + + + +<%def name="modify_this_page_vars()"> + ${parent.modify_this_page_vars()} + + + + +${parent.body()} diff --git a/src/wuttaweb/templates/master/index.mako b/src/wuttaweb/templates/master/index.mako index ce8273f..fd3d573 100644 --- a/src/wuttaweb/templates/master/index.mako +++ b/src/wuttaweb/templates/master/index.mako @@ -1,6 +1,10 @@ ## -*- coding: utf-8; -*- <%inherit file="/page.mako" /> +<%def name="title()">${index_title} + +<%def name="content_title()"> + <%def name="page_content()">

TODO: index page content

diff --git a/src/wuttaweb/views/essential.py b/src/wuttaweb/views/essential.py index 93c8149..0d4ec35 100644 --- a/src/wuttaweb/views/essential.py +++ b/src/wuttaweb/views/essential.py @@ -39,6 +39,7 @@ def defaults(config, **kwargs): config.include(mod('wuttaweb.views.auth')) config.include(mod('wuttaweb.views.common')) + config.include(mod('wuttaweb.views.settings')) def includeme(config): diff --git a/src/wuttaweb/views/settings.py b/src/wuttaweb/views/settings.py new file mode 100644 index 0000000..42ce834 --- /dev/null +++ b/src/wuttaweb/views/settings.py @@ -0,0 +1,47 @@ +# -*- 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 . +# +################################################################################ +""" +Views for app settings +""" + +from wuttaweb.views import MasterView + + +class AppInfoView(MasterView): + """ + Master view for the overall app, to show/edit config etc. + """ + model_name = 'AppInfo' + model_title_plural = "App Info" + route_prefix = 'appinfo' + + +def defaults(config, **kwargs): + base = globals() + + AppInfoView = kwargs.get('AppInfoView', base['AppInfoView']) + AppInfoView.defaults(config) + + +def includeme(config): + defaults(config) diff --git a/tests/forms/test_base.py b/tests/forms/test_base.py index 95ff122..5e29ad6 100644 --- a/tests/forms/test_base.py +++ b/tests/forms/test_base.py @@ -49,7 +49,7 @@ class TestForm(TestCase): self.config = WuttaConfig(defaults={ 'wutta.web.menus.handler_spec': 'tests.utils:NullMenuHandler', }) - self.request = testing.DummyRequest(wutta_config=self.config) + self.request = testing.DummyRequest(wutta_config=self.config, use_oruga=False) self.pyramid_config = testing.setUp(request=self.request, settings={ 'mako.directories': ['wuttaweb:templates'], diff --git a/tests/test_subscribers.py b/tests/test_subscribers.py index e2fa7fd..c991383 100644 --- a/tests/test_subscribers.py +++ b/tests/test_subscribers.py @@ -219,7 +219,7 @@ class TestBeforeRender(TestCase): }) def make_request(self): - request = testing.DummyRequest() + request = testing.DummyRequest(use_oruga=False) request.registry.settings = {'wutta_config': self.config} request.wutta_config = self.config return request diff --git a/tests/views/test_master.py b/tests/views/test_master.py index b786129..8fe4c47 100644 --- a/tests/views/test_master.py +++ b/tests/views/test_master.py @@ -18,7 +18,7 @@ class TestMasterView(TestCase): 'wutta.web.menus.handler_spec': 'tests.utils:NullMenuHandler', }) self.app = self.config.get_app() - self.request = testing.DummyRequest(wutta_config=self.config) + self.request = testing.DummyRequest(wutta_config=self.config, use_oruga=False) self.pyramid_config = testing.setUp(request=self.request, settings={ 'wutta_config': self.config, 'mako.directories': ['wuttaweb:templates'], diff --git a/tests/views/test_settings.py b/tests/views/test_settings.py new file mode 100644 index 0000000..321364b --- /dev/null +++ b/tests/views/test_settings.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8; -*- + +from tests.views.utils import WebTestCase + +from wuttaweb.views import settings + + +class TestAppInfoView(WebTestCase): + + def test_index(self): + # just a sanity check + view = settings.AppInfoView(self.request) + response = view.index() diff --git a/tests/views/utils.py b/tests/views/utils.py new file mode 100644 index 0000000..495f5cb --- /dev/null +++ b/tests/views/utils.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8; -*- + +from unittest import TestCase +from unittest.mock import MagicMock + +from pyramid import testing + +from wuttjamaican.conf import WuttaConfig +from wuttaweb import subscribers + + +class WebTestCase(TestCase): + """ + Base class for test suites requiring a full (typical) web app. + """ + + def setUp(self): + self.setup_web() + + def setup_web(self): + self.config = WuttaConfig(defaults={ + 'wutta.db.default.url': 'sqlite://', + 'wutta.web.menus.handler_spec': 'tests.utils:NullMenuHandler', + }) + + self.request = testing.DummyRequest() + + self.pyramid_config = testing.setUp(request=self.request, settings={ + 'wutta_config': self.config, + 'mako.directories': ['wuttaweb:templates'], + }) + + # init db + self.app = self.config.get_app() + model = self.app.model + model.Base.metadata.create_all(bind=self.config.appdb_engine) + self.session = self.app.make_session() + + # init web + self.pyramid_config.include('pyramid_mako') + self.pyramid_config.include('wuttaweb.static') + self.pyramid_config.include('wuttaweb.views.essential') + self.pyramid_config.add_subscriber('wuttaweb.subscribers.before_render', + 'pyramid.events.BeforeRender') + + # setup new request w/ anonymous user + event = MagicMock(request=self.request) + subscribers.new_request(event) + def user_getter(request, **kwargs): pass + subscribers.new_request_set_user(event, db_session=self.session, + user_getter=user_getter) + + def tearDown(self): + self.teardown_web() + + def teardown_web(self): + testing.tearDown()