Use the new label handler
also, move "print one-off labels" logic into product master view
This commit is contained in:
parent
517dd4ad9e
commit
fe7612c885
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue