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()} + + + +${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 name="context_menu_items()"> -
  • ${h.link_to("Back to Label Profiles", url('label_profiles'))}
  • - % if form.updating: - <% profile = form.fieldset.model %> - <% printer = profile.get_printer(request.rattail_config) %> - % if printer and printer.required_settings: -
  • ${h.link_to("Edit Printer Settings", url('label_profile.printer_settings', uuid=profile.uuid))}
  • - % endif -
  • ${h.link_to("View this Label Profile", url('label_profile.read', uuid=profile.uuid))}
  • - % endif - - -${parent.body()} diff --git a/tailbone/templates/labels/profiles/edit.mako b/tailbone/templates/labels/profiles/edit.mako new file mode 100644 index 00000000..b9304422 --- /dev/null +++ b/tailbone/templates/labels/profiles/edit.mako @@ -0,0 +1,25 @@ +## -*- coding: utf-8 -*- +<%inherit file="/master/edit.mako" /> + +<%def name="head_tags()"> + ${parent.head_tags()} + + + +<%def name="context_menu_items()"> + ${parent.context_menu_items()} + <% 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 + + +${parent.body()} diff --git a/tailbone/templates/labels/profiles/index.mako b/tailbone/templates/labels/profiles/index.mako deleted file mode 100644 index 509aa09c..00000000 --- a/tailbone/templates/labels/profiles/index.mako +++ /dev/null @@ -1,12 +0,0 @@ -## -*- coding: utf-8 -*- -<%inherit file="/grid.mako" /> - -<%def name="title()">Label Profiles - -<%def name="context_menu_items()"> - % if request.has_perm('label_profiles.create'): -
  • ${h.link_to("Create a new Label Profile", url('label_profile.create'))}
  • - % endif - - -${parent.body()} diff --git a/tailbone/templates/labels/profiles/printer.mako b/tailbone/templates/labels/profiles/printer.mako index d2f1f7d1..3fe1089f 100644 --- a/tailbone/templates/labels/profiles/printer.mako +++ b/tailbone/templates/labels/profiles/printer.mako @@ -4,9 +4,9 @@ <%def name="title()">Printer Settings <%def name="context_menu_items()"> -
  • ${h.link_to("Back to Label Profiles", url('label_profiles'))}
  • -
  • ${h.link_to("View this Label Profile", url('label_profile.read', uuid=profile.uuid))}
  • -
  • ${h.link_to("Edit this Label Profile", url('label_profile.update', uuid=profile.uuid))}
  • +
  • ${h.link_to("Back to Label Profiles", url('labelprofiles'))}
  • +
  • ${h.link_to("View this Label Profile", url('labelprofiles.view', uuid=profile.uuid))}
  • +
  • ${h.link_to("Edit this Label Profile", url('labelprofiles.edit', uuid=profile.uuid))}
  • @@ -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 - - -${parent.body()} - -<% profile = form.fieldset.model %> -<% printer = profile.get_printer(request.rattail_config) %> - -% if printer and printer.required_settings: -

    Printer Settings

    - -
    - % for name, display in printer.required_settings.iteritems(): -
    - -
    ${profile.get_printer_setting(name) or ''}
    -
    - % endfor -
    - -% 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 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 + + +${parent.body()} + +<% printer = instance.get_printer(request.rattail_config) %> +% if printer and printer.required_settings: +

    Printer Settings

    + +
    + % for name, display in printer.required_settings.iteritems(): +
    + +
    ${instance.get_printer_setting(name) or ''}
    +
    + % endfor +
    + +% 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",