diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c95667..55ce5e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,13 @@ All notable changes to wuttaweb will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## v0.10.2 (2024-08-19) + +### Fix + +- add `render_vue_finalize()` methods for grids, forms +- avoid error when checking model for column property + ## v0.10.1 (2024-08-19) ### Fix diff --git a/pyproject.toml b/pyproject.toml index cc4cdf2..5902f86 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ build-backend = "hatchling.build" [project] name = "WuttaWeb" -version = "0.10.1" +version = "0.10.2" description = "Web App for Wutta Framework" readme = "README.md" authors = [{name = "Lance Edgar", email = "lance@edbob.org"}] diff --git a/src/wuttaweb/forms/base.py b/src/wuttaweb/forms/base.py index 6b16bdd..5acca59 100644 --- a/src/wuttaweb/forms/base.py +++ b/src/wuttaweb/forms/base.py @@ -918,19 +918,42 @@ class Form: return HTML.tag('b-field', c=[html], **attrs) + def render_vue_finalize(self): + """ + Render the Vue "finalize" script for the form. + + By default this simply returns: + + .. code-block:: html + + + + The actual output may depend on various form attributes, in + particular :attr:`vue_tagname`. + """ + set_data = f"{self.vue_component}.data = function() {{ return {self.vue_component}Data }}" + make_component = f"Vue.component('{self.vue_tagname}', {self.vue_component})" + return HTML.tag('script', c=['\n', + HTML.literal(set_data), + '\n', + HTML.literal(make_component), + '\n']) + def get_vue_model_data(self): """ Returns a dict with form model data. Values may be nested depending on the types of fields contained in the form. - Note that the values need not be "converted" (to be - JSON-compatible) at this stage, for instance ``colander.null`` - is not a problem here. The point is to collect the raw data. + This collects the ``cstruct`` values for all fields which are + present both in :attr:`fields` as well as the Deform schema. - The dict should have a key/value for each field in the form. + It also converts each as needed, to ensure it is + JSON-serializable. - This method is called by :meth:`render_vue_model_data()` which - is responsible for ensuring JSON compatibility. + :returns: Dict of field/value items. """ dform = self.get_deform() model_data = {} diff --git a/src/wuttaweb/grids/base.py b/src/wuttaweb/grids/base.py index 9a6b195..3f22aad 100644 --- a/src/wuttaweb/grids/base.py +++ b/src/wuttaweb/grids/base.py @@ -578,7 +578,8 @@ class Grid: if key in sorters: continue prop = getattr(self.model_class, key, None) - if prop and isinstance(prop.property, orm.ColumnProperty): + if (prop and hasattr(prop, 'property') + and isinstance(prop.property, orm.ColumnProperty)): sorters[prop.key] = self.make_sorter(prop) return sorters @@ -1277,6 +1278,30 @@ class Grid: output = render(template, context) return HTML.literal(output) + def render_vue_finalize(self): + """ + Render the Vue "finalize" script for the grid. + + By default this simply returns: + + .. code-block:: html + + + + The actual output may depend on various grid attributes, in + particular :attr:`vue_tagname`. + """ + set_data = f"{self.vue_component}.data = function() {{ return {self.vue_component}Data }}" + make_component = f"Vue.component('{self.vue_tagname}', {self.vue_component})" + return HTML.tag('script', c=['\n', + HTML.literal(set_data), + '\n', + HTML.literal(make_component), + '\n']) + def get_vue_columns(self): """ Returns a list of Vue-compatible column definitions. diff --git a/src/wuttaweb/templates/form.mako b/src/wuttaweb/templates/form.mako index fc6d3c0..9a0d21e 100644 --- a/src/wuttaweb/templates/form.mako +++ b/src/wuttaweb/templates/form.mako @@ -3,7 +3,9 @@ <%def name="page_content()">