Refactor usage of get_vendor() lookup

This commit is contained in:
Lance Edgar 2022-08-13 23:55:30 -05:00
parent 4607425f40
commit 7c76a7839e
5 changed files with 52 additions and 12 deletions

View file

@ -507,7 +507,8 @@ class PurchaseBatchHandler(BatchHandler):
Returns the "configured" vendor for the given invoice parser.
"""
session = self.app.get_session(batch)
vendor = api.get_vendor(session, parser.vendor_key)
vendor_handler = self.get_vendor_handler()
vendor = vendor_handler.get_vendor(session, parser.vendor_key)
if vendor is not batch.vendor:
raise RuntimeError("Parser is for vendor '{}' "
"but batch is for: {}".format(
@ -730,7 +731,8 @@ class PurchaseBatchHandler(BatchHandler):
parser = self.require_invoice_parser(batch)
parser.session = session
parser.vendor = api.get_vendor(session, parser.vendor_key)
vendor_handler = self.app.get_vendor_handler()
parser.vendor = vendor_handler.get_vendor(session, parser.vendor_key)
if parser.vendor is not child_batch.vendor:
raise RuntimeError("Parser is for vendor '{}' but batch is for: {}".format(
parser.vendor_key, child_batch.vendor))

View file

@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2021 Lance Edgar
# Copyright © 2010-2022 Lance Edgar
#
# This file is part of Rattail.
#
@ -47,7 +47,8 @@ class VendorInvoiceHandler(BatchHandler):
parser_key = kwargs.get('parser_key')
if parser_key and not kwargs.get('vendor') and not kwargs.get('vendor_uuid'):
parser = require_invoice_parser(self.config, parser_key)
kwargs['vendor'] = api.get_vendor(session, parser.vendor_key)
vendor_handler = self.app.get_vendor_handler()
kwargs['vendor'] = vendor_handler.get_vendor(session, parser.vendor_key)
return super(VendorInvoiceHandler, self).make_batch(session, progress=progress, **kwargs)
def should_populate(self, batch):
@ -70,7 +71,8 @@ class VendorInvoiceHandler(BatchHandler):
path = batch.filepath(self.config)
parser = require_invoice_parser(self.config, batch.parser_key)
parser.session = session
parser.vendor = api.get_vendor(session, parser.vendor_key)
vendor_handler = self.app.get_vendor_handler()
parser.vendor = vendor_handler.get_vendor(session, parser.vendor_key)
assert batch.vendor is parser.vendor
batch.invoice_date = parser.parse_invoice_date(path)
self.setup_populate(batch, progress=progress)

View file

@ -26,16 +26,24 @@ Vendors API
from __future__ import unicode_literals, absolute_import
import warnings
from sqlalchemy.orm.exc import NoResultFound
from rattail.db import model
# TODO: need to refactor this into the AppHandler, or..?
# TODO: remove this
def get_vendor(session, key):
"""
Locate and return a vendor for the given key, if possible.
.. warning::
This function is deprecated; use
:meth:`rattail.vendors.handler.VendorHandler.get_vendor()`
instead.
First the key is assumed to be a ``Vendor.id`` value. If no matches are
found, then it looks for a special setting in the database. If one is
found, ``get_vendor()`` is called again with its value.
@ -47,6 +55,10 @@ def get_vendor(session, key):
:returns: The :class:`rattail.db.model.Vendor` instance if found; otherwise
``None``.
"""
warnings.warn("api.get_vendor() is a deprecated function; please "
"use VendorHandler.get_vendor() method instead",
DeprecationWarning, stacklevel=2)
# Vendor.uuid match?
vendor = session.query(model.Vendor).get(key)
if vendor:

View file

@ -28,6 +28,8 @@ from __future__ import unicode_literals, absolute_import
import six
from sqlalchemy import orm
from rattail.app import GenericHandler
from rattail.util import load_entry_points
@ -76,9 +78,33 @@ class VendorHandler(GenericHandler):
This is mainly useful to allow catalog and invoice parsers to
"loosely" associate with a particular vendor by way of this
key, which could be shared across organizations etc.
:param session: Active database session.
:param key: Value to use when searching for the vendor.
:returns: The :class:`~rattail.db.model.vendors.Vendor`
instance if found; otherwise ``None``.
"""
from rattail.db.api.vendors import get_vendor
return get_vendor(session, key)
model = self.model
# Vendor.uuid match?
vendor = session.query(model.Vendor).get(key)
if vendor:
return vendor
# Vendor.id match?
try:
return session.query(model.Vendor)\
.filter(model.Vendor.id == key)\
.one()
except orm.exc.NoResultFound:
pass
# try settings, if value then recurse
key = self.app.get_setting(session, 'rattail.vendor.{}'.format(key))
if key is not None:
return self.get_vendor(session, key, **kwargs)
def render_vendor(self, vendor, **kwargs):
return six.text_type(vendor)

View file

@ -71,11 +71,9 @@ class InvoiceParser(object):
Fetch the :class:~rattail.db.model.vendors.Vendor` record
which is associated with the current parser, if any.
"""
from rattail.db import api
if self.vendor_key:
vendor = api.get_vendor(session, self.vendor_key)
return vendor
vendor_handler = self.app.get_vendor_handler()
return vendor_handler.get_vendor(session, self.vendor_key)
def parse_invoice_date(self, path):
"""