diff --git a/tailbone/newgrids/filters.py b/tailbone/newgrids/filters.py
index 56bcd70b..9d05d7a6 100644
--- a/tailbone/newgrids/filters.py
+++ b/tailbone/newgrids/filters.py
@@ -267,7 +267,7 @@ class AlchemyBooleanFilter(AlchemyGridFilter):
"""
Boolean filter for SQLAlchemy.
"""
- default_verbs = ['is_true', 'is_false', 'is_null', 'is_not_null', 'is_any']
+ default_verbs = ['is_true', 'is_false', 'is_any']
def filter_is_true(self, query, value):
"""
diff --git a/tailbone/templates/labels/profiles/create.mako b/tailbone/templates/labels/profiles/create.mako
new file mode 100644
index 00000000..6bba2f33
--- /dev/null
+++ b/tailbone/templates/labels/profiles/create.mako
@@ -0,0 +1,17 @@
+## -*- coding: utf-8 -*-
+<%inherit file="/master/create.mako" />
+
+<%def name="head_tags()">
+ ${parent.head_tags()}
+
+%def>
+
+${parent.body()}
diff --git a/tailbone/templates/labels/profiles/crud.mako b/tailbone/templates/labels/profiles/crud.mako
deleted file mode 100644
index ace05e9f..00000000
--- a/tailbone/templates/labels/profiles/crud.mako
+++ /dev/null
@@ -1,29 +0,0 @@
-## -*- coding: utf-8 -*-
-<%inherit file="/crud.mako" />
-
-<%def name="head_tags()">
- ${parent.head_tags()}
-
-%def>
-
-<%def name="context_menu_items()">
-
@@ -40,7 +40,7 @@
${h.submit('update', "Update")}
-
+
${h.end_form()}
diff --git a/tailbone/templates/labels/profiles/read.mako b/tailbone/templates/labels/profiles/read.mako
deleted file mode 100644
index c48a21b6..00000000
--- a/tailbone/templates/labels/profiles/read.mako
+++ /dev/null
@@ -1,36 +0,0 @@
-## -*- coding: utf-8 -*-
-<%inherit file="/labels/profiles/crud.mako" />
-
-<%def name="context_menu_items()">
-
${h.link_to("Back to Label Profiles", url('label_profiles'))}
- % if form.readonly and request.has_perm('label_profiles.update'):
- <% profile = form.fieldset.model %>
- <% printer = profile.get_printer(request.rattail_config) %>
-
${h.link_to("Edit this Label Profile", url('label_profile.update', uuid=form.fieldset.model.uuid))}
- % if printer and printer.required_settings:
-
${h.link_to("Edit Printer Settings", url('label_profile.printer_settings', uuid=profile.uuid))}
- % endif
- % endif
- % if version_count is not Undefined and request.has_perm('labelprofile.versions.view'):
-
${h.link_to("View Change History ({0})".format(version_count), url('labelprofile.versions', uuid=form.fieldset.model.uuid))}
- % endif
-%def>
-
-${parent.body()}
-
-<% profile = form.fieldset.model %>
-<% printer = profile.get_printer(request.rattail_config) %>
-
-% if printer and printer.required_settings:
-
Printer Settings
-
-
-
-% endif
diff --git a/tailbone/templates/labels/profiles/view.mako b/tailbone/templates/labels/profiles/view.mako
new file mode 100644
index 00000000..d2f5894d
--- /dev/null
+++ b/tailbone/templates/labels/profiles/view.mako
@@ -0,0 +1,45 @@
+## -*- coding: utf-8 -*-
+<%inherit file="/master/view.mako" />
+
+<%def name="head_tags()">
+ ${parent.head_tags()}
+
+%def>
+
+<%def name="context_menu_items()">
+ ${parent.context_menu_items()}
+ % if request.has_perm('labelprofiles.edit'):
+ <% printer = instance.get_printer(request.rattail_config) %>
+ % if printer and printer.required_settings:
+
${h.link_to("Edit Printer Settings", url('labelprofiles.printer_settings', uuid=instance.uuid))}
+ % endif
+ % endif
+ % if version_count is not Undefined and request.has_perm('labelprofile.versions.view'):
+
${h.link_to("View Change History ({0})".format(version_count), url('labelprofile.versions', uuid=instance.uuid))}
+ % endif
+%def>
+
+${parent.body()}
+
+<% printer = instance.get_printer(request.rattail_config) %>
+% if printer and printer.required_settings:
+
Printer Settings
+
+
+
+% endif
diff --git a/tailbone/views/labels.py b/tailbone/views/labels.py
index fdf8699b..8af850fa 100644
--- a/tailbone/views/labels.py
+++ b/tailbone/views/labels.py
@@ -27,83 +27,49 @@ Label Views
from __future__ import unicode_literals
from rattail.db import model
-from rattail.db.model import LabelProfile
-
-from pyramid.httpexceptions import HTTPFound
import formalchemy
-
from webhelpers.html import HTML
+from pyramid.httpexceptions import HTTPFound
-from ..db import Session
-from . import SearchableAlchemyGridView, CrudView
-from ..grids.search import BooleanSearchFilter
-
-from .continuum import VersionView, version_defaults
+from tailbone.db import Session
+from tailbone.views import MasterView
+from tailbone.views.continuum import VersionView, version_defaults
-class ProfilesGrid(SearchableAlchemyGridView):
+class FormatFieldRenderer(formalchemy.TextAreaFieldRenderer):
- mapped_class = LabelProfile
- config_prefix = 'label_profiles'
- sort = 'ordinal'
+ def render_readonly(self, **kwargs):
+ value = self.raw_value
+ if not value:
+ return ''
+ return HTML.tag('pre', c=value)
- def filter_map(self):
- return self.make_filter_map(
- exact=['code', 'visible'],
- ilike=['description'])
+ def render(self, **kwargs):
+ kwargs.setdefault('size', (80, 8))
+ return super(FormatFieldRenderer, self).render(**kwargs)
- def filter_config(self):
- return self.make_filter_config(
- filter_factory_visible=BooleanSearchFilter)
- def sort_map(self):
- return self.make_sort_map('ordinal', 'code', 'description', 'visible')
+class ProfilesView(MasterView):
+ """
+ Master view for the LabelProfile model.
+ """
+ model_class = model.LabelProfile
+ model_title = "Label Profile"
+ url_prefix = '/labels/profiles'
- def grid(self):
- g = self.make_grid()
+ def configure_grid(self, g):
+ g.default_sortkey = 'ordinal'
g.configure(
include=[
g.ordinal,
g.code,
g.description,
g.visible,
- ],
+ ],
readonly=True)
- if self.request.has_perm('label_profiles.read'):
- g.viewable = True
- g.view_route_name = 'label_profile.read'
- if self.request.has_perm('label_profiles.update'):
- g.editable = True
- g.edit_route_name = 'label_profile.update'
- if self.request.has_perm('label_profiles.delete'):
- g.deletable = True
- g.delete_route_name = 'label_profile.delete'
- return g
-
-class ProfileCrud(CrudView):
-
- mapped_class = LabelProfile
- home_route = 'label_profiles'
- pretty_name = "Label Profile"
- update_cancel_route = 'label_profile.read'
-
- def fieldset(self, model):
-
- class FormatFieldRenderer(formalchemy.TextAreaFieldRenderer):
-
- def render_readonly(self, **kwargs):
- value = self.raw_value
- if not value:
- return ''
- return HTML.tag('pre', c=value)
-
- def render(self, **kwargs):
- kwargs.setdefault('size', (80, 8))
- return super(FormatFieldRenderer, self).render(**kwargs)
-
- fs = self.make_fieldset(model)
+ def configure_fieldset(self, fs):
fs.format.set(renderer=FormatFieldRenderer)
fs.configure(
include=[
@@ -114,11 +80,12 @@ class ProfileCrud(CrudView):
fs.formatter_spec,
fs.format,
fs.visible,
- ])
- return fs
+ ])
- def post_save(self, form):
- profile = form.fieldset.model
+ def after_create(self, profile):
+ self.after_edit(profile)
+
+ def after_edit(self, profile):
if not profile.format:
formatter = profile.get_formatter()
if formatter:
@@ -127,10 +94,6 @@ class ProfileCrud(CrudView):
except NotImplementedError:
pass
- def post_save_url(self, form):
- return self.request.route_url('label_profile.read',
- uuid=form.fieldset.model.uuid)
-
class LabelProfileVersionView(VersionView):
"""
@@ -144,12 +107,12 @@ class LabelProfileVersionView(VersionView):
def printer_settings(request):
uuid = request.matchdict['uuid']
- profile = Session.query(LabelProfile).get(uuid) if uuid else None
+ profile = Session.query(model.LabelProfile).get(uuid) if uuid else None
if not profile:
- return HTTPFound(location=request.route_url('label_profiles'))
+ return HTTPFound(location=request.route_url('labelprofiles'))
read_profile = HTTPFound(location=request.route_url(
- 'label_profile.read', uuid=profile.uuid))
+ 'labelprofiles.view', uuid=profile.uuid))
printer = profile.get_printer(request.rattail_config)
if not printer:
@@ -161,7 +124,7 @@ def printer_settings(request):
"require any settings." % profile)
return read_profile
- if request.POST:
+ if request.method == 'POST':
for setting in printer.required_settings:
if setting in request.POST:
profile.save_printer_setting(setting, request.POST[setting])
@@ -171,34 +134,11 @@ def printer_settings(request):
def includeme(config):
-
- config.add_route('label_profiles', '/labels/profiles')
- config.add_view(ProfilesGrid, route_name='label_profiles',
- renderer='/labels/profiles/index.mako',
- permission='label_profiles.list')
-
- config.add_route('label_profile.create', '/labels/profiles/new')
- config.add_view(ProfileCrud, attr='create', route_name='label_profile.create',
- renderer='/labels/profiles/crud.mako',
- permission='label_profiles.create')
-
- config.add_route('label_profile.read', '/labels/profiles/{uuid}')
- config.add_view(ProfileCrud, attr='read', route_name='label_profile.read',
- renderer='/labels/profiles/read.mako',
- permission='label_profiles.read')
-
- config.add_route('label_profile.update', '/labels/profiles/{uuid}/edit')
- config.add_view(ProfileCrud, attr='update', route_name='label_profile.update',
- renderer='/labels/profiles/crud.mako',
- permission='label_profiles.update')
-
- config.add_route('label_profile.delete', '/labels/profiles/{uuid}/delete')
- config.add_view(ProfileCrud, attr='delete', route_name='label_profile.delete',
- permission='label_profiles.delete')
-
- config.add_route('label_profile.printer_settings', '/labels/profiles/{uuid}/printer')
- config.add_view(printer_settings, route_name='label_profile.printer_settings',
- renderer='/labels/profiles/printer.mako',
- permission='label_profiles.update')
-
+ ProfilesView.defaults(config)
version_defaults(config, LabelProfileVersionView, 'labelprofile', template_prefix='/labels/profiles')
+
+ # edit printer settings
+ config.add_route('labelprofiles.printer_settings', '/labels/profiles/{uuid}/printer')
+ config.add_view(printer_settings, route_name='labelprofiles.printer_settings',
+ renderer='/labels/profiles/printer.mako',
+ permission='labelprofiles.edit')
diff --git a/tailbone/views/master.py b/tailbone/views/master.py
index ef26c618..ae4a031a 100644
--- a/tailbone/views/master.py
+++ b/tailbone/views/master.py
@@ -79,6 +79,7 @@ class MasterView(View):
if form.validate():
form.save()
instance = form.fieldset.model
+ self.after_create(instance)
self.request.session.flash("{0} {1} has been created.".format(
self.get_model_title(), instance))
return HTTPFound(location=self.get_action_url('view', instance))
@@ -104,6 +105,7 @@ class MasterView(View):
if self.request.method == 'POST':
if form.validate():
form.save()
+ self.after_edit(instance)
self.request.session.flash("{0} {1} has been updated.".format(
self.get_model_title(), instance))
return HTTPFound(location=self.get_action_url('view', instance))
@@ -433,9 +435,19 @@ class MasterView(View):
fieldset.prettify = prettify
return fieldset
+ def after_create(self, instance):
+ """
+ Event hook, called just after a new instance is saved.
+ """
+
+ def after_edit(self, instance):
+ """
+ Event hook, called just after an existing instance is saved.
+ """
+
def before_delete(self, instance):
"""
- Event hook which is called just before deletion is attempted.
+ Event hook, called just before deletion is attempted.
"""
##############################
diff --git a/tailbone/views/users.py b/tailbone/views/users.py
index df9ba9f8..7e43ce04 100644
--- a/tailbone/views/users.py
+++ b/tailbone/views/users.py
@@ -137,7 +137,6 @@ class UsersView(MasterView):
del g.filters['salt']
g.filters['username'].default_active = True
g.filters['username'].default_verb = 'contains'
- g.filters['active'].verbs = ['is_true', 'is_false', 'is_any']
g.filters['active'].default_active = True
g.filters['active'].default_verb = 'is_true'
g.filters['person'] = g.make_filter('person', model.Person.display_name, label="Person's Name",