From 917d5ab3facdfa480d3f18a0d028fd86e375de9e Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Mon, 23 Mar 2020 19:59:28 -0500 Subject: [PATCH] Expose the `Role.notes` field for view/edit also add a simple "
 with sans-serif font" renderer
---
 tailbone/forms/core.py       | 12 +++++++++++-
 tailbone/static/css/base.css |  7 +++++++
 tailbone/views/roles.py      | 20 ++++++++++++++++++++
 3 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/tailbone/forms/core.py b/tailbone/forms/core.py
index 5cc41771..cf7dd49e 100644
--- a/tailbone/forms/core.py
+++ b/tailbone/forms/core.py
@@ -2,7 +2,7 @@
 ################################################################################
 #
 #  Rattail -- Retail Software Framework
-#  Copyright © 2010-2019 Lance Edgar
+#  Copyright © 2010-2020 Lance Edgar
 #
 #  This file is part of Rattail.
 #
@@ -609,6 +609,7 @@ class Form(object):
             self.set_renderer(key, self.render_codeblock)
             self.set_widget(key, dfwidget.TextAreaWidget(cols=80, rows=8))
         elif type_ == 'text':
+            self.set_renderer(key, self.render_pre_sans_serif)
             self.set_widget(key, dfwidget.TextAreaWidget(cols=80, rows=8))
         elif type_ == 'file':
             tmpstore = SessionFileUploadTempStore(self.request)
@@ -903,6 +904,15 @@ class Form(object):
             return ""
         return HTML.tag('pre', value)
 
+    def render_pre_sans_serif(self, record, field_name):
+        value = self.obtain_value(record, field_name)
+        if value is None:
+            return ""
+        # this uses a Bulma helper class, for which we also add custom styles
+        # to our "default" base.css (for jquery theme)
+        return HTML.tag('pre', class_='is-family-sans-serif',
+                        c=value)
+
     def obtain_value(self, record, field_name):
         if record:
             try:
diff --git a/tailbone/static/css/base.css b/tailbone/static/css/base.css
index 466ca50b..689fb000 100644
--- a/tailbone/static/css/base.css
+++ b/tailbone/static/css/base.css
@@ -91,6 +91,13 @@ ul.error li {
     list-style-type: none;
 }
 
+pre.is-family-sans-serif {
+    background-color: white;
+    font-family: Verdana, Arial, sans-serif;
+    font-size: 11pt;
+    padding: 1em;
+}
+
 /******************************
  * jQuery UI tweaks
  ******************************/
diff --git a/tailbone/views/roles.py b/tailbone/views/roles.py
index 02d7daf1..48ef827c 100644
--- a/tailbone/views/roles.py
+++ b/tailbone/views/roles.py
@@ -35,6 +35,7 @@ from rattail.db.auth import (has_permission, grant_permission, revoke_permission
 
 import colander
 from deform import widget as dfwidget
+from webhelpers2.html import HTML
 
 from tailbone import grids
 from tailbone.db import Session
@@ -51,21 +52,37 @@ class RolesView(PrincipalMasterView):
     grid_columns = [
         'name',
         'session_timeout',
+        'notes',
     ]
 
     form_fields = [
         'name',
         'session_timeout',
+        'notes',
         'permissions',
     ]
 
     def configure_grid(self, g):
         super(RolesView, self).configure_grid(g)
+
+        # name
         g.filters['name'].default_active = True
         g.filters['name'].default_verb = 'contains'
         g.set_sort_defaults('name')
         g.set_link('name')
 
+        # notes
+        g.set_renderer('notes', self.render_short_notes)
+
+    def render_short_notes(self, role, field):
+        value = getattr(role, field)
+        if value is None:
+            return ""
+        if len(value) < 100:
+            return value
+        return HTML.tag('span', title=value,
+                        c="{}...".format(value[:100]))
+
     def editable_instance(self, role):
         """
         We must prevent edit for certain built-in roles etc., depending on
@@ -124,6 +141,9 @@ class RolesView(PrincipalMasterView):
         # name
         f.set_validator('name', self.unique_name)
 
+        # notes
+        f.set_type('notes', 'text')
+
         # permissions
         self.tailbone_permissions = self.get_available_permissions()
         f.set_renderer('permissions', PermissionsRenderer(permissions=self.tailbone_permissions))