From b7f3a67cd03178524c9161f9767d05bea384adad Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Sun, 29 Jan 2023 18:46:49 -0600 Subject: [PATCH] Add basic API support for printing product labels --- tailbone/api/labels.py | 51 ++++++++++++++++++++++++++++++++++++++ tailbone/api/products.py | 53 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 tailbone/api/labels.py diff --git a/tailbone/api/labels.py b/tailbone/api/labels.py new file mode 100644 index 00000000..8bc11f8f --- /dev/null +++ b/tailbone/api/labels.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8; -*- +################################################################################ +# +# Rattail -- Retail Software Framework +# Copyright © 2010-2023 Lance Edgar +# +# This file is part of Rattail. +# +# Rattail is free software: you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation, either version 3 of the License, or (at your option) any later +# version. +# +# Rattail is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# Rattail. If not, see . +# +################################################################################ +""" +Tailbone Web API - Label Views +""" + +from __future__ import unicode_literals, absolute_import + +from rattail.db.model import LabelProfile + +from tailbone.api import APIMasterView + + +class LabelProfileView(APIMasterView): + """ + API views for Label Profile data + """ + model_class = LabelProfile + collection_url_prefix = '/label-profiles' + object_url_prefix = '/label-profile' + + +def defaults(config, **kwargs): + base = globals() + + LabelProfileView = kwargs.get('LabelProfileView', base['LabelProfileView']) + LabelProfileView.defaults(config) + + +def includeme(config): + defaults(config) diff --git a/tailbone/api/products.py b/tailbone/api/products.py index a1547cce..4c3df983 100644 --- a/tailbone/api/products.py +++ b/tailbone/api/products.py @@ -26,6 +26,8 @@ Tailbone Web API - Product Views from __future__ import unicode_literals, absolute_import +import logging + import six import sqlalchemy as sa from sqlalchemy import orm @@ -37,6 +39,9 @@ from rattail.db import model from tailbone.api import APIMasterView +log = logging.getLogger(__name__) + + class ProductView(APIMasterView): """ API views for Product data @@ -63,6 +68,14 @@ class ProductView(APIMasterView): 'sale_price_display', 'sale_ends', 'sale_ends_display', + 'tpr_price', + 'tpr_price_display', + 'tpr_ends', + 'tpr_ends_display', + 'current_price', + 'current_price_display', + 'current_ends', + 'current_ends_display', 'vendor_name', 'costs', 'image_url', @@ -115,6 +128,39 @@ class ProductView(APIMasterView): return {'ok': True, 'product': self.normalize(product)} + def print_labels(self): + app = self.get_rattail_app() + label_handler = app.get_label_handler() + model = self.model + data = self.request.json_body + + uuid = data.get('label_profile_uuid') + profile = self.Session.query(model.LabelProfile).get(uuid) if uuid else None + if not profile: + return {'error': "Label profile not found"} + + uuid = data.get('product_uuid') + product = self.Session.query(model.Product).get(uuid) if uuid else None + if not product: + return {'error': "Product not found"} + + try: + quantity = int(data.get('quantity')) + except: + return {'error': "Quantity must be integer"} + + 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} + @classmethod def defaults(cls, config): cls._defaults(config) @@ -133,6 +179,13 @@ class ProductView(APIMasterView): permission='{}.list'.format(permission_prefix)) config.add_cornice_service(quick_lookup) + # print labels + print_labels = Service(name='{}.print_labels'.format(route_prefix), + path='{}/print-labels'.format(collection_url_prefix)) + print_labels.add_view('POST', 'print_labels', klass=cls, + permission='{}.print_labels'.format(permission_prefix)) + config.add_cornice_service(print_labels) + def defaults(config, **kwargs): base = globals()