Use the new label handler

also, move "print one-off labels" logic into product master view
This commit is contained in:
Lance Edgar 2022-01-13 21:25:17 -06:00
parent 517dd4ad9e
commit fe7612c885
2 changed files with 59 additions and 47 deletions

View file

@ -2,7 +2,7 @@
################################################################################ ################################################################################
# #
# Rattail -- Retail Software Framework # Rattail -- Retail Software Framework
# Copyright © 2010-2021 Lance Edgar # Copyright © 2010-2022 Lance Edgar
# #
# This file is part of Rattail. # This file is part of Rattail.
# #
@ -62,6 +62,11 @@ class LabelProfileView(MasterView):
'sync_me', 'sync_me',
] ]
def __init__(self, request):
super(LabelProfileView, self).__init__(request)
app = self.get_rattail_app()
self.label_handler = app.get_label_handler()
def configure_grid(self, g): def configure_grid(self, g):
super(LabelProfileView, self).configure_grid(g) super(LabelProfileView, self).configure_grid(g)
g.set_sort_defaults('ordinal') g.set_sort_defaults('ordinal')
@ -80,7 +85,7 @@ class LabelProfileView(MasterView):
def after_edit(self, profile): def after_edit(self, profile):
if not profile.format: if not profile.format:
formatter = profile.get_formatter(self.rattail_config) formatter = self.label_handler.get_formatter(profile)
if formatter: if formatter:
try: try:
profile.format = formatter.default_format profile.format = formatter.default_format
@ -122,17 +127,17 @@ class LabelProfileView(MasterView):
View for editing extended Printer Settings, for a given Label Profile. View for editing extended Printer Settings, for a given Label Profile.
""" """
profile = self.get_instance() profile = self.get_instance()
read_profile = self.redirect(self.get_action_url('view', profile)) redirect = self.redirect(self.get_action_url('view', profile))
printer = profile.get_printer(self.rattail_config) printer = self.label_handler.get_printer(profile)
if not printer: if not printer:
msg = "Label profile \"{}\" does not have a functional printer spec.".format(profile) msg = "Label profile \"{}\" does not have a functional printer spec.".format(profile)
self.request.session.flash(msg) self.request.session.flash(msg)
return read_profile return redirect
if not printer.required_settings: if not printer.required_settings:
msg = "Printer class for label profile \"{}\" does not require any settings.".format(profile) msg = "Printer class for label profile \"{}\" does not require any settings.".format(profile)
self.request.session.flash(msg) self.request.session.flash(msg)
return read_profile return redirect
form = self.make_printer_settings_form(profile, printer) form = self.make_printer_settings_form(profile, printer)
@ -140,8 +145,9 @@ class LabelProfileView(MasterView):
if self.request.method == 'POST': if self.request.method == 'POST':
for setting in printer.required_settings: for setting in printer.required_settings:
if setting in self.request.POST: if setting in self.request.POST:
profile.save_printer_setting(setting, self.request.POST[setting]) self.label_handler.save_printer_setting(
return read_profile profile, setting, self.request.POST[setting])
return redirect
return self.render_to_response('printer', { return self.render_to_response('printer', {
'form': form, 'form': form,

View file

@ -49,7 +49,6 @@ from pyramid import httpexceptions
from webhelpers2.html import tags, HTML from webhelpers2.html import tags, HTML
from tailbone import forms, grids from tailbone import forms, grids
from tailbone.db import Session
from tailbone.views import MasterView from tailbone.views import MasterView
from tailbone.util import raw_datetime from tailbone.util import raw_datetime
@ -178,7 +177,8 @@ class ProductView(MasterView):
def __init__(self, request): def __init__(self, request):
super(ProductView, self).__init__(request) super(ProductView, self).__init__(request)
self.print_labels = request.rattail_config.getbool('tailbone', 'products.print_labels', default=False) self.expose_label_printing = self.rattail_config.getbool(
'tailbone', 'products.print_labels', default=False)
app = self.get_rattail_app() app = self.get_rattail_app()
self.product_handler = app.get_products_handler() self.product_handler = app.get_products_handler()
@ -360,7 +360,7 @@ class ProductView(MasterView):
g.set_sort_defaults('upc') g.set_sort_defaults('upc')
if self.print_labels and self.has_perm('print_labels'): if self.expose_label_printing and self.has_perm('print_labels'):
if use_buefy: if use_buefy:
g.more_actions.append(self.make_action( g.more_actions.append(self.make_action(
'print_label', icon='print', url='#', 'print_label', icon='print', url='#',
@ -661,7 +661,7 @@ class ProductView(MasterView):
kwargs = super(ProductView, self).template_kwargs_index(**kwargs) kwargs = super(ProductView, self).template_kwargs_index(**kwargs)
model = self.model model = self.model
if self.print_labels: if self.expose_label_printing:
kwargs['label_profiles'] = self.Session.query(model.LabelProfile)\ kwargs['label_profiles'] = self.Session.query(model.LabelProfile)\
.filter(model.LabelProfile.visible == True)\ .filter(model.LabelProfile.visible == True)\
@ -1704,6 +1704,37 @@ class ProductView(MasterView):
self.request.response.body = product.image.bytes self.request.response.body = product.image.bytes
return self.request.response return self.request.response
def print_labels(self):
app = self.get_rattail_app()
label_handler = app.get_label_handler()
model = self.model
profile = self.request.params.get('profile')
profile = self.Session.query(model.LabelProfile).get(profile) if profile else None
if not profile:
return {'error': "Label profile not found"}
product = self.request.params.get('product')
product = self.Session.query(model.Product).get(product) if product else None
if not product:
return {'error': "Product not found"}
quantity = self.request.params.get('quantity')
if not quantity.isdigit():
return {'error': "Quantity must be numeric"}
quantity = int(quantity)
printer = label_handler.get_printer(profile)
if not printer:
return {'error': "Couldn't get printer from label profile"}
try:
printer.print_labels([({'product': product}, quantity)])
except Exception as error:
log.warning("error occurred while printing labels", exc_info=True)
return {'error': six.text_type(error)}
return {'ok': True}
def search(self): def search(self):
""" """
Locate a product(s) by UPC. Locate a product(s) by UPC.
@ -1964,10 +1995,18 @@ class ProductView(MasterView):
template_prefix = cls.get_template_prefix() template_prefix = cls.get_template_prefix()
permission_prefix = cls.get_permission_prefix() permission_prefix = cls.get_permission_prefix()
model_title = cls.get_model_title() model_title = cls.get_model_title()
model_title_plural = cls.get_model_title_plural()
# print labels # print labels
config.add_tailbone_permission('products', 'products.print_labels', config.add_tailbone_permission(permission_prefix,
"Print labels for products") '{}.print_labels'.format(permission_prefix),
"Print labels for {}".format(model_title_plural))
config.add_route('{}.print_labels'.format(route_prefix),
'{}/labels'.format(url_prefix))
config.add_view(cls, attr='print_labels',
route_name='{}.print_labels'.format(route_prefix),
permission='{}.print_labels'.format(permission_prefix),
renderer='json')
# view deleted products # view deleted products
config.add_tailbone_permission('products', 'products.view_deleted', config.add_tailbone_permission('products', 'products.view_deleted',
@ -2250,39 +2289,6 @@ class PendingProductView(MasterView):
permission='{}.resolve_product'.format(permission_prefix)) permission='{}.resolve_product'.format(permission_prefix))
def print_labels(request):
profile = request.params.get('profile')
profile = Session.query(model.LabelProfile).get(profile) if profile else None
if not profile:
return {'error': "Label profile not found"}
product = request.params.get('product')
product = Session.query(model.Product).get(product) if product else None
if not product:
return {'error': "Product not found"}
quantity = request.params.get('quantity')
if not quantity.isdigit():
return {'error': "Quantity must be numeric"}
quantity = int(quantity)
printer = profile.get_printer(request.rattail_config)
if not printer:
return {'error': "Couldn't get printer from label profile"}
try:
printer.print_labels([(product, quantity, {})])
except Exception as error:
log.warning("error occurred while printing labels", exc_info=True)
return {'error': six.text_type(error)}
return {'ok': True}
def includeme(config): def includeme(config):
config.add_route('products.print_labels', '/products/labels')
config.add_view(print_labels, route_name='products.print_labels',
renderer='json', permission='products.print_labels')
ProductView.defaults(config) ProductView.defaults(config)
PendingProductView.defaults(config) PendingProductView.defaults(config)