fix: format all code with black

and from now on should not deviate from that...
This commit is contained in:
Lance Edgar 2025-08-31 13:05:00 -05:00
parent eb9291fce7
commit 1b4ba2089a
19 changed files with 248 additions and 205 deletions

View file

@ -8,32 +8,32 @@
from importlib.metadata import version as get_version from importlib.metadata import version as get_version
project = 'Wutta-COREPOS' project = "Wutta-COREPOS"
copyright = '2025, Lance Edgar' copyright = "2025, Lance Edgar"
author = 'Lance Edgar' author = "Lance Edgar"
release = get_version('Wutta-COREPOS') release = get_version("Wutta-COREPOS")
# -- General configuration --------------------------------------------------- # -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
extensions = [ extensions = [
'sphinx.ext.autodoc', "sphinx.ext.autodoc",
'sphinx.ext.intersphinx', "sphinx.ext.intersphinx",
'sphinx.ext.viewcode', "sphinx.ext.viewcode",
'sphinx.ext.todo', "sphinx.ext.todo",
] ]
templates_path = ['_templates'] templates_path = ["_templates"]
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
intersphinx_mapping = { intersphinx_mapping = {
'wuttaweb': ('https://docs.wuttaproject.org/wuttaweb/', None), "wuttaweb": ("https://docs.wuttaproject.org/wuttaweb/", None),
'wuttjamaican': ('https://docs.wuttaproject.org/wuttjamaican/', None), "wuttjamaican": ("https://docs.wuttaproject.org/wuttjamaican/", None),
} }
# -- Options for HTML output ------------------------------------------------- # -- Options for HTML output -------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
html_theme = 'furo' html_theme = "furo"
html_static_path = ['_static'] html_static_path = ["_static"]

View file

@ -3,4 +3,4 @@
from importlib.metadata import version from importlib.metadata import version
__version__ = version('Wutta-COREPOS') __version__ = version("Wutta-COREPOS")

View file

@ -41,9 +41,11 @@ class WuttaCoreposAppProvider(AppProvider):
:rtype: :class:`~wutta_corepos.handler.CoreposHandler` :rtype: :class:`~wutta_corepos.handler.CoreposHandler`
""" """
if not hasattr(self, 'corepos_handler'): if not hasattr(self, "corepos_handler"):
spec = self.config.get(f'{self.appname}.corepos_handler', spec = self.config.get(
default='wutta_corepos.handler:CoreposHandler') f"{self.appname}.corepos_handler",
default="wutta_corepos.handler:CoreposHandler",
)
factory = self.app.load_object(spec) factory = self.app.load_object(spec)
self.corepos_handler = factory(self.config, **kwargs) self.corepos_handler = factory(self.config, **kwargs)
return self.corepos_handler return self.corepos_handler

View file

@ -103,48 +103,56 @@ class WuttaCoreposConfigExtension(WuttaConfigExtension):
etc. If present, the ``default`` key will correspond to etc. If present, the ``default`` key will correspond to
:data:`core_lane_trans_engine`. :data:`core_lane_trans_engine`.
""" """
key = 'wutta_corepos'
key = "wutta_corepos"
def configure(self, config): def configure(self, config):
""" """ """ """
# office_op # office_op
from corepos.db.office_op import Session from corepos.db.office_op import Session
engines = get_engines(config, 'corepos.db.office_op')
engines = get_engines(config, "corepos.db.office_op")
config.core_office_op_engines = engines config.core_office_op_engines = engines
config.core_office_op_engine = engines.get('default') config.core_office_op_engine = engines.get("default")
Session.configure(bind=config.core_office_op_engine) Session.configure(bind=config.core_office_op_engine)
# office_trans # office_trans
from corepos.db.office_trans import Session from corepos.db.office_trans import Session
engines = get_engines(config, 'corepos.db.office_trans')
engines = get_engines(config, "corepos.db.office_trans")
config.core_office_trans_engines = engines config.core_office_trans_engines = engines
config.core_office_trans_engine = engines.get('default') config.core_office_trans_engine = engines.get("default")
Session.configure(bind=config.core_office_trans_engine) Session.configure(bind=config.core_office_trans_engine)
# office_arch # office_arch
from corepos.db.office_arch import Session from corepos.db.office_arch import Session
engines = get_engines(config, 'corepos.db.office_arch')
engines = get_engines(config, "corepos.db.office_arch")
config.core_office_arch_engines = engines config.core_office_arch_engines = engines
config.core_office_arch_engine = engines.get('default') config.core_office_arch_engine = engines.get("default")
Session.configure(bind=config.core_office_arch_engine) Session.configure(bind=config.core_office_arch_engine)
# lane_op # lane_op
from corepos.db.lane_op import Session from corepos.db.lane_op import Session
engines = get_engines(config, 'corepos.db.lane_op')
engines = get_engines(config, "corepos.db.lane_op")
config.core_lane_op_engines = engines config.core_lane_op_engines = engines
config.core_lane_op_engine = engines.get('default') config.core_lane_op_engine = engines.get("default")
Session.configure(bind=config.core_lane_op_engine) Session.configure(bind=config.core_lane_op_engine)
# lane_trans # lane_trans
from corepos.db.lane_trans import Session from corepos.db.lane_trans import Session
engines = get_engines(config, 'corepos.db.lane_trans')
engines = get_engines(config, "corepos.db.lane_trans")
config.core_lane_trans_engines = engines config.core_lane_trans_engines = engines
config.core_lane_trans_engine = engines.get('default') config.core_lane_trans_engine = engines.get("default")
Session.configure(bind=config.core_lane_trans_engine) Session.configure(bind=config.core_lane_trans_engine)
# define some schema columns "late" unless not supported # define some schema columns "late" unless not supported
if config.get_bool('corepos.db.office_op.use_latest_columns', if config.get_bool(
default=True, usedb=False): "corepos.db.office_op.use_latest_columns", default=True, usedb=False
):
from corepos.db.office_op.model import use_latest_columns from corepos.db.office_op.model import use_latest_columns
use_latest_columns() use_latest_columns()

View file

@ -5,6 +5,7 @@ Revises:
Create Date: 2025-01-24 21:13:14.359200 Create Date: 2025-01-24 21:13:14.359200
""" """
from typing import Sequence, Union from typing import Sequence, Union
from alembic import op from alembic import op
@ -13,25 +14,31 @@ import wuttjamaican.db.util
# revision identifiers, used by Alembic. # revision identifiers, used by Alembic.
revision: str = '0f94089f1af1' revision: str = "0f94089f1af1"
down_revision: Union[str, None] = None down_revision: Union[str, None] = None
branch_labels: Union[str, Sequence[str], None] = ('wutta_corepos',) branch_labels: Union[str, Sequence[str], None] = ("wutta_corepos",)
depends_on: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None: def upgrade() -> None:
# corepos_user # corepos_user
op.create_table('corepos_user', op.create_table(
sa.Column('uuid', wuttjamaican.db.util.UUID(), nullable=False), "corepos_user",
sa.Column('corepos_employee_number', sa.Integer(), nullable=False), sa.Column("uuid", wuttjamaican.db.util.UUID(), nullable=False),
sa.ForeignKeyConstraint(['uuid'], ['user.uuid'], name=op.f('fk_corepos_user_uuid_user')), sa.Column("corepos_employee_number", sa.Integer(), nullable=False),
sa.PrimaryKeyConstraint('uuid', name=op.f('pk_corepos_user')), sa.ForeignKeyConstraint(
sa.UniqueConstraint('corepos_employee_number', name=op.f('uq_corepos_user_corepos_employee_number')) ["uuid"], ["user.uuid"], name=op.f("fk_corepos_user_uuid_user")
),
sa.PrimaryKeyConstraint("uuid", name=op.f("pk_corepos_user")),
sa.UniqueConstraint(
"corepos_employee_number",
name=op.f("uq_corepos_user_corepos_employee_number"),
),
) )
def downgrade() -> None: def downgrade() -> None:
# corepos_user # corepos_user
op.drop_table('corepos_user') op.drop_table("corepos_user")

View file

@ -36,9 +36,9 @@ class CoreUser(model.Base):
:class:`~wuttjamaican:wuttjamaican.db.model.auth.User`. :class:`~wuttjamaican:wuttjamaican.db.model.auth.User`.
""" """
__tablename__ = 'corepos_user' __tablename__ = "corepos_user"
uuid = model.uuid_column(sa.ForeignKey('user.uuid'), default=None) uuid = model.uuid_column(sa.ForeignKey("user.uuid"), default=None)
user = orm.relationship( user = orm.relationship(
model.User, model.User,
cascade_backrefs=False, cascade_backrefs=False,
@ -48,20 +48,27 @@ class CoreUser(model.Base):
this record extends. this record extends.
""", """,
backref=orm.backref( backref=orm.backref(
'_corepos', "_corepos",
uselist=False, uselist=False,
cascade='all, delete-orphan', cascade="all, delete-orphan",
cascade_backrefs=False, cascade_backrefs=False,
doc=""" doc="""
Reference to the CORE-POS extension record for the user. Reference to the CORE-POS extension record for the user.
""") """,
),
) )
corepos_employee_number = sa.Column(sa.Integer(), nullable=False, unique=True, doc=""" corepos_employee_number = sa.Column(
sa.Integer(),
nullable=False,
unique=True,
doc="""
``employees.emp_no`` value for the user within CORE-POS. ``employees.emp_no`` value for the user within CORE-POS.
""") """,
)
def __str__(self): def __str__(self):
return str(self.user) return str(self.user)
CoreUser.make_proxy(model.User, '_corepos', 'corepos_employee_number')
CoreUser.make_proxy(model.User, "_corepos", "corepos_employee_number")

View file

@ -78,7 +78,7 @@ class CoreposHandler(GenericHandler):
return model return model
def make_session_office_op(self, dbkey='default', **kwargs): def make_session_office_op(self, dbkey="default", **kwargs):
""" """
Make a new :term:`db session` for the CORE Office 'op' DB. Make a new :term:`db session` for the CORE Office 'op' DB.
@ -87,11 +87,11 @@ class CoreposHandler(GenericHandler):
""" """
from corepos.db.office_op import Session from corepos.db.office_op import Session
if 'bind' not in kwargs: if "bind" not in kwargs:
kwargs['bind'] = self.config.core_office_op_engines[dbkey] kwargs["bind"] = self.config.core_office_op_engines[dbkey]
return Session(**kwargs) return Session(**kwargs)
def make_session_office_trans(self, dbkey='default', **kwargs): def make_session_office_trans(self, dbkey="default", **kwargs):
""" """
Make a new :term:`db session` for the CORE Office 'trans' DB. Make a new :term:`db session` for the CORE Office 'trans' DB.
@ -100,11 +100,11 @@ class CoreposHandler(GenericHandler):
""" """
from corepos.db.office_trans import Session from corepos.db.office_trans import Session
if 'bind' not in kwargs: if "bind" not in kwargs:
kwargs['bind'] = self.config.core_office_trans_engines[dbkey] kwargs["bind"] = self.config.core_office_trans_engines[dbkey]
return Session(**kwargs) return Session(**kwargs)
def make_session_office_arch(self, dbkey='default', **kwargs): def make_session_office_arch(self, dbkey="default", **kwargs):
""" """
Make a new :term:`db session` for the CORE Office 'arch' DB. Make a new :term:`db session` for the CORE Office 'arch' DB.
@ -113,11 +113,11 @@ class CoreposHandler(GenericHandler):
""" """
from corepos.db.office_arch import Session from corepos.db.office_arch import Session
if 'bind' not in kwargs: if "bind" not in kwargs:
kwargs['bind'] = self.config.core_office_arch_engines[dbkey] kwargs["bind"] = self.config.core_office_arch_engines[dbkey]
return Session(**kwargs) return Session(**kwargs)
def make_session_lane_op(self, dbkey='default', **kwargs): def make_session_lane_op(self, dbkey="default", **kwargs):
""" """
Make a new :term:`db session` for the CORE Lane 'op' DB. Make a new :term:`db session` for the CORE Lane 'op' DB.
@ -126,11 +126,11 @@ class CoreposHandler(GenericHandler):
""" """
from corepos.db.lane_op import Session from corepos.db.lane_op import Session
if 'bind' not in kwargs: if "bind" not in kwargs:
kwargs['bind'] = self.config.core_lane_op_engines[dbkey] kwargs["bind"] = self.config.core_lane_op_engines[dbkey]
return Session(**kwargs) return Session(**kwargs)
def make_session_lane_trans(self, dbkey='default', **kwargs): def make_session_lane_trans(self, dbkey="default", **kwargs):
""" """
Make a new :term:`db session` for the CORE Lane 'trans' DB. Make a new :term:`db session` for the CORE Lane 'trans' DB.
@ -139,8 +139,8 @@ class CoreposHandler(GenericHandler):
""" """
from corepos.db.lane_trans import Session from corepos.db.lane_trans import Session
if 'bind' not in kwargs: if "bind" not in kwargs:
kwargs['bind'] = self.config.core_lane_trans_engines[dbkey] kwargs["bind"] = self.config.core_lane_trans_engines[dbkey]
return Session(**kwargs) return Session(**kwargs)
def get_office_url(self, require=False): def get_office_url(self, require=False):
@ -154,15 +154,11 @@ class CoreposHandler(GenericHandler):
:returns: URL as string. :returns: URL as string.
""" """
url = self.config.get('corepos.office.url', require=require) url = self.config.get("corepos.office.url", require=require)
if url: if url:
return url.rstrip('/') return url.rstrip("/")
def get_office_department_url( def get_office_department_url(self, dept_id, office_url=None, require=False):
self,
dept_id,
office_url=None,
require=False):
""" """
Returns the CORE Office URL for a Department. Returns the CORE Office URL for a Department.
@ -178,13 +174,9 @@ class CoreposHandler(GenericHandler):
if not office_url: if not office_url:
office_url = self.get_office_url(require=require) office_url = self.get_office_url(require=require)
if office_url: if office_url:
return f'{office_url}/item/departments/DepartmentEditor.php?did={dept_id}' return f"{office_url}/item/departments/DepartmentEditor.php?did={dept_id}"
def get_office_employee_url( def get_office_employee_url(self, employee_id, office_url=None, require=False):
self,
employee_id,
office_url=None,
require=False):
""" """
Returns the CORE Office URL for an Employee. Returns the CORE Office URL for an Employee.
@ -200,13 +192,9 @@ class CoreposHandler(GenericHandler):
if not office_url: if not office_url:
office_url = self.get_office_url(require=require) office_url = self.get_office_url(require=require)
if office_url: if office_url:
return f'{office_url}/admin/Cashiers/CashierEditor.php?emp_no={employee_id}' return f"{office_url}/admin/Cashiers/CashierEditor.php?emp_no={employee_id}"
def get_office_likecode_url( def get_office_likecode_url(self, likecode_id, office_url=None, require=False):
self,
likecode_id,
office_url=None,
require=False):
""" """
Returns the CORE Office URL for a Like Code. Returns the CORE Office URL for a Like Code.
@ -222,13 +210,9 @@ class CoreposHandler(GenericHandler):
if not office_url: if not office_url:
office_url = self.get_office_url(require=require) office_url = self.get_office_url(require=require)
if office_url: if office_url:
return f'{office_url}/item/likecodes/LikeCodeEditor.php?start={likecode_id}' return f"{office_url}/item/likecodes/LikeCodeEditor.php?start={likecode_id}"
def get_office_product_url( def get_office_product_url(self, upc, office_url=None, require=False):
self,
upc,
office_url=None,
require=False):
""" """
Returns the CORE Office URL for a Product. Returns the CORE Office URL for a Product.
@ -244,13 +228,9 @@ class CoreposHandler(GenericHandler):
if not office_url: if not office_url:
office_url = self.get_office_url(require=require) office_url = self.get_office_url(require=require)
if office_url: if office_url:
return f'{office_url}/item/ItemEditorPage.php?searchupc={upc}' return f"{office_url}/item/ItemEditorPage.php?searchupc={upc}"
def get_office_vendor_url( def get_office_vendor_url(self, vend_id, office_url=None, require=False):
self,
vend_id,
office_url=None,
require=False):
""" """
Returns the CORE Office URL for a Vendor. Returns the CORE Office URL for a Vendor.
@ -266,4 +246,4 @@ class CoreposHandler(GenericHandler):
if not office_url: if not office_url:
office_url = self.get_office_url(require=require) office_url = self.get_office_url(require=require)
if office_url: if office_url:
return f'{office_url}/item/vendors/VendorIndexPage.php?vid={vend_id}' return f"{office_url}/item/vendors/VendorIndexPage.php?vid={vend_id}"

View file

@ -26,4 +26,4 @@ Wutta-COREPOS -- wuttaweb features
def includeme(config): def includeme(config):
config.include('wutta_corepos.web.views') config.include("wutta_corepos.web.views")

View file

@ -26,4 +26,4 @@ Wutta-COREPOS -- wuttaweb views
def includeme(config): def includeme(config):
config.include('wutta_corepos.web.views.corepos') config.include("wutta_corepos.web.views.corepos")

View file

@ -28,5 +28,5 @@ from .master import CoreOpMasterView
def includeme(config): def includeme(config):
config.include('wutta_corepos.web.views.corepos.members') config.include("wutta_corepos.web.views.corepos.members")
config.include('wutta_corepos.web.views.corepos.products') config.include("wutta_corepos.web.views.corepos.products")

View file

@ -33,6 +33,7 @@ class CoreOpMasterView(MasterView):
""" """
Base class for master views which use the CORE Office 'op' DB. Base class for master views which use the CORE Office 'op' DB.
""" """
Session = CoreOpSession Session = CoreOpSession
def __init__(self, request, context=None): def __init__(self, request, context=None):

View file

@ -43,10 +43,11 @@ class MemberView(CoreOpMasterView):
* ``/corepos/members/`` * ``/corepos/members/``
* ``/corepos/members/XXX`` * ``/corepos/members/XXX``
""" """
model_class = MemberInfo model_class = MemberInfo
model_title = "CORE-POS Member" model_title = "CORE-POS Member"
route_prefix = 'corepos_members' route_prefix = "corepos_members"
url_prefix = '/corepos/members' url_prefix = "/corepos/members"
# nb. this is just for readonly lookup # nb. this is just for readonly lookup
creatable = False creatable = False
@ -54,36 +55,37 @@ class MemberView(CoreOpMasterView):
deletable = False deletable = False
grid_columns = [ grid_columns = [
'card_number', "card_number",
'first_name', "first_name",
'last_name', "last_name",
'street', "street",
'city', "city",
'state', "state",
'zip', "zip",
'phone', "phone",
'email', "email",
] ]
filter_defaults = { filter_defaults = {
'card_number': {'active': True, 'verb': 'equal'}, "card_number": {"active": True, "verb": "equal"},
'first_name': {'active': True, 'verb': 'contains'}, "first_name": {"active": True, "verb": "contains"},
'last_name': {'active': True, 'verb': 'contains'}, "last_name": {"active": True, "verb": "contains"},
} }
sort_defaults = 'card_number' sort_defaults = "card_number"
def get_query(self, session=None): def get_query(self, session=None):
""" """ """ """
query = super().get_query(session=session) query = super().get_query(session=session)
op_model = self.corepos_handler.get_model_office_op() op_model = self.corepos_handler.get_model_office_op()
query = query.outerjoin(op_model.CustomerClassic, query = query.outerjoin(
op_model.CustomerClassic,
sa.and_( sa.and_(
op_model.CustomerClassic.card_number == op_model.MemberInfo.card_number, op_model.CustomerClassic.card_number == op_model.MemberInfo.card_number,
op_model.CustomerClassic.person_number == 1, op_model.CustomerClassic.person_number == 1,
))\ ),
.options(orm.joinedload(op_model.MemberInfo.customers)) ).options(orm.joinedload(op_model.MemberInfo.customers))
return query return query
@ -93,18 +95,18 @@ class MemberView(CoreOpMasterView):
op_model = self.corepos_handler.get_model_office_op() op_model = self.corepos_handler.get_model_office_op()
# first_name # first_name
g.set_renderer('first_name', self.render_customer_attr) g.set_renderer("first_name", self.render_customer_attr)
g.set_sorter('first_name', op_model.CustomerClassic.first_name) g.set_sorter("first_name", op_model.CustomerClassic.first_name)
# last_name # last_name
g.set_renderer('last_name', self.render_customer_attr) g.set_renderer("last_name", self.render_customer_attr)
g.set_sorter('last_name', op_model.CustomerClassic.last_name) g.set_sorter("last_name", op_model.CustomerClassic.last_name)
# links # links
if self.has_perm('view'): if self.has_perm("view"):
g.set_link('card_number') g.set_link("card_number")
g.set_link('first_name') g.set_link("first_name")
g.set_link('last_name') g.set_link("last_name")
def render_customer_attr(self, member, key, value): def render_customer_attr(self, member, key, value):
""" """ """ """
@ -115,7 +117,7 @@ class MemberView(CoreOpMasterView):
def defaults(config, **kwargs): def defaults(config, **kwargs):
base = globals() base = globals()
MemberView = kwargs.get('MemberView', base['MemberView']) MemberView = kwargs.get("MemberView", base["MemberView"])
MemberView.defaults(config) MemberView.defaults(config)

View file

@ -40,10 +40,11 @@ class ProductView(CoreOpMasterView):
* ``/corepos/products/`` * ``/corepos/products/``
* ``/corepos/products/XXX`` * ``/corepos/products/XXX``
""" """
model_class = Product model_class = Product
model_title = "CORE-POS Product" model_title = "CORE-POS Product"
route_prefix = 'corepos_products' route_prefix = "corepos_products"
url_prefix = '/corepos/products' url_prefix = "/corepos/products"
# nb. this is just for readonly lookup # nb. this is just for readonly lookup
creatable = False creatable = False
@ -51,45 +52,45 @@ class ProductView(CoreOpMasterView):
deletable = False deletable = False
labels = { labels = {
'upc': "UPC", "upc": "UPC",
} }
grid_columns = [ grid_columns = [
'upc', "upc",
'brand', "brand",
'description', "description",
'size', "size",
'department', "department",
'vendor', "vendor",
'normal_price', "normal_price",
] ]
filter_defaults = { filter_defaults = {
'upc': {'active': True, 'verb': 'contains'}, "upc": {"active": True, "verb": "contains"},
'brand': {'active': True, 'verb': 'contains'}, "brand": {"active": True, "verb": "contains"},
'description': {'active': True, 'verb': 'contains'}, "description": {"active": True, "verb": "contains"},
} }
sort_defaults = 'upc' sort_defaults = "upc"
def configure_grid(self, g): def configure_grid(self, g):
""" """ """ """
super().configure_grid(g) super().configure_grid(g)
# normal_price # normal_price
g.set_renderer('normal_price', 'currency') g.set_renderer("normal_price", "currency")
# links # links
g.set_link('upc') g.set_link("upc")
g.set_link('brand') g.set_link("brand")
g.set_link('description') g.set_link("description")
g.set_link('size') g.set_link("size")
def defaults(config, **kwargs): def defaults(config, **kwargs):
base = globals() base = globals()
ProductView = kwargs.get('ProductView', base['ProductView']) ProductView = kwargs.get("ProductView", base["ProductView"])
ProductView.defaults(config) ProductView.defaults(config)

View file

@ -15,10 +15,10 @@ def release(c, skip_tests=False):
Release a new version of Wutta-COREPOS Release a new version of Wutta-COREPOS
""" """
if not skip_tests: if not skip_tests:
c.run('pytest') c.run("pytest")
if os.path.exists('dist'): if os.path.exists("dist"):
shutil.rmtree('dist') shutil.rmtree("dist")
c.run('python -m build --sdist') c.run("python -m build --sdist")
c.run('twine upload dist/*') c.run("twine upload dist/*")

View file

@ -9,8 +9,8 @@ from wutta_corepos.db import model as mod
class TestCoreUser(ConfigTestCase): class TestCoreUser(ConfigTestCase):
def test_str(self): def test_str(self):
user = User(username='barney') user = User(username="barney")
self.assertEqual(str(user), 'barney') self.assertEqual(str(user), "barney")
ext = mod.CoreUser(user=user, corepos_employee_number=42) ext = mod.CoreUser(user=user, corepos_employee_number=42)
self.assertEqual(str(ext), 'barney') self.assertEqual(str(ext), "barney")

View file

@ -13,11 +13,11 @@ class TestWuttaCoreposConfigExtension(TestCase):
config = WuttaConfig() config = WuttaConfig()
# no engines by default # no engines by default
self.assertFalse(hasattr(config, 'core_office_op_engine')) self.assertFalse(hasattr(config, "core_office_op_engine"))
self.assertFalse(hasattr(config, 'core_office_trans_engine')) self.assertFalse(hasattr(config, "core_office_trans_engine"))
self.assertFalse(hasattr(config, 'core_office_arch_engine')) self.assertFalse(hasattr(config, "core_office_arch_engine"))
self.assertFalse(hasattr(config, 'core_lane_op_engine')) self.assertFalse(hasattr(config, "core_lane_op_engine"))
self.assertFalse(hasattr(config, 'core_lane_trans_engine')) self.assertFalse(hasattr(config, "core_lane_trans_engine"))
ext = mod.WuttaCoreposConfigExtension() ext = mod.WuttaCoreposConfigExtension()
ext.configure(config) ext.configure(config)
self.assertIsNone(config.core_office_op_engine) self.assertIsNone(config.core_office_op_engine)
@ -27,10 +27,10 @@ class TestWuttaCoreposConfigExtension(TestCase):
self.assertIsNone(config.core_lane_trans_engine) self.assertIsNone(config.core_lane_trans_engine)
# but config can change that # but config can change that
config.setdefault('corepos.db.office_op.default.url', 'sqlite://') config.setdefault("corepos.db.office_op.default.url", "sqlite://")
config.setdefault('corepos.db.lane_trans.default.url', 'sqlite://') config.setdefault("corepos.db.lane_trans.default.url", "sqlite://")
ext.configure(config) ext.configure(config)
self.assertIsNotNone(config.core_office_op_engine) self.assertIsNotNone(config.core_office_op_engine)
self.assertEqual(str(config.core_office_op_engine.url), 'sqlite://') self.assertEqual(str(config.core_office_op_engine.url), "sqlite://")
self.assertIsNotNone(config.core_lane_trans_engine) self.assertIsNotNone(config.core_lane_trans_engine)
self.assertEqual(str(config.core_lane_trans_engine.url), 'sqlite://') self.assertEqual(str(config.core_lane_trans_engine.url), "sqlite://")

View file

@ -18,75 +18,91 @@ class TestCoreposHandler(ConfigTestCase):
def test_get_model_office_op(self): def test_get_model_office_op(self):
from corepos.db.office_op import model from corepos.db.office_op import model
handler = self.make_handler() handler = self.make_handler()
op_model = handler.get_model_office_op() op_model = handler.get_model_office_op()
self.assertIs(op_model, model) self.assertIs(op_model, model)
def test_get_model_office_trans(self): def test_get_model_office_trans(self):
from corepos.db.office_trans import model from corepos.db.office_trans import model
handler = self.make_handler() handler = self.make_handler()
trans_model = handler.get_model_office_trans() trans_model = handler.get_model_office_trans()
self.assertIs(trans_model, model) self.assertIs(trans_model, model)
def test_get_model_office_arch(self): def test_get_model_office_arch(self):
from corepos.db.office_arch import model from corepos.db.office_arch import model
handler = self.make_handler() handler = self.make_handler()
arch_model = handler.get_model_office_arch() arch_model = handler.get_model_office_arch()
self.assertIs(arch_model, model) self.assertIs(arch_model, model)
def test_get_model_lane_op(self): def test_get_model_lane_op(self):
from corepos.db.lane_op import model from corepos.db.lane_op import model
handler = self.make_handler() handler = self.make_handler()
op_model = handler.get_model_lane_op() op_model = handler.get_model_lane_op()
self.assertIs(op_model, model) self.assertIs(op_model, model)
def test_get_model_lane_trans(self): def test_get_model_lane_trans(self):
from corepos.db.lane_trans import model from corepos.db.lane_trans import model
handler = self.make_handler() handler = self.make_handler()
trans_model = handler.get_model_lane_trans() trans_model = handler.get_model_lane_trans()
self.assertIs(trans_model, model) self.assertIs(trans_model, model)
def test_make_session_office_op(self): def test_make_session_office_op(self):
handler = self.make_handler() handler = self.make_handler()
engine = sa.create_engine('sqlite://') engine = sa.create_engine("sqlite://")
with patch.object(self.config, 'core_office_op_engines', create=True, with patch.object(
new={'default': engine}): self.config, "core_office_op_engines", create=True, new={"default": engine}
):
op_session = handler.make_session_office_op() op_session = handler.make_session_office_op()
self.assertIsInstance(op_session, orm.Session) self.assertIsInstance(op_session, orm.Session)
self.assertIs(op_session.bind, engine) self.assertIs(op_session.bind, engine)
def test_make_session_office_trans(self): def test_make_session_office_trans(self):
handler = self.make_handler() handler = self.make_handler()
engine = sa.create_engine('sqlite://') engine = sa.create_engine("sqlite://")
with patch.object(self.config, 'core_office_trans_engines', create=True, with patch.object(
new={'default': engine}): self.config,
"core_office_trans_engines",
create=True,
new={"default": engine},
):
trans_session = handler.make_session_office_trans() trans_session = handler.make_session_office_trans()
self.assertIsInstance(trans_session, orm.Session) self.assertIsInstance(trans_session, orm.Session)
self.assertIs(trans_session.bind, engine) self.assertIs(trans_session.bind, engine)
def test_make_session_office_arch(self): def test_make_session_office_arch(self):
handler = self.make_handler() handler = self.make_handler()
engine = sa.create_engine('sqlite://') engine = sa.create_engine("sqlite://")
with patch.object(self.config, 'core_office_arch_engines', create=True, with patch.object(
new={'default': engine}): self.config,
"core_office_arch_engines",
create=True,
new={"default": engine},
):
arch_session = handler.make_session_office_arch() arch_session = handler.make_session_office_arch()
self.assertIsInstance(arch_session, orm.Session) self.assertIsInstance(arch_session, orm.Session)
self.assertIs(arch_session.bind, engine) self.assertIs(arch_session.bind, engine)
def test_make_session_lane_op(self): def test_make_session_lane_op(self):
handler = self.make_handler() handler = self.make_handler()
engine = sa.create_engine('sqlite://') engine = sa.create_engine("sqlite://")
with patch.object(self.config, 'core_lane_op_engines', create=True, with patch.object(
new={'default': engine}): self.config, "core_lane_op_engines", create=True, new={"default": engine}
):
op_session = handler.make_session_lane_op() op_session = handler.make_session_lane_op()
self.assertIsInstance(op_session, orm.Session) self.assertIsInstance(op_session, orm.Session)
self.assertIs(op_session.bind, engine) self.assertIs(op_session.bind, engine)
def test_make_session_lane_trans(self): def test_make_session_lane_trans(self):
handler = self.make_handler() handler = self.make_handler()
engine = sa.create_engine('sqlite://') engine = sa.create_engine("sqlite://")
with patch.object(self.config, 'core_lane_trans_engines', create=True, with patch.object(
new={'default': engine}): self.config, "core_lane_trans_engines", create=True, new={"default": engine}
):
trans_session = handler.make_session_lane_trans() trans_session = handler.make_session_lane_trans()
self.assertIsInstance(trans_session, orm.Session) self.assertIsInstance(trans_session, orm.Session)
self.assertIs(trans_session.bind, engine) self.assertIs(trans_session.bind, engine)
@ -101,9 +117,11 @@ class TestCoreposHandler(ConfigTestCase):
self.assertRaises(ConfigurationError, handler.get_office_url, require=True) self.assertRaises(ConfigurationError, handler.get_office_url, require=True)
# config can specify (traliing slash is stripped) # config can specify (traliing slash is stripped)
self.config.setdefault('corepos.office.url', 'http://localhost/fannie/') self.config.setdefault("corepos.office.url", "http://localhost/fannie/")
self.assertEqual(handler.get_office_url(), 'http://localhost/fannie') self.assertEqual(handler.get_office_url(), "http://localhost/fannie")
self.assertEqual(handler.get_office_url(require=True), 'http://localhost/fannie') self.assertEqual(
handler.get_office_url(require=True), "http://localhost/fannie"
)
def test_get_office_department_url(self): def test_get_office_department_url(self):
handler = self.make_handler() handler = self.make_handler()
@ -112,8 +130,11 @@ class TestCoreposHandler(ConfigTestCase):
self.assertIsNone(handler.get_office_department_url(7)) self.assertIsNone(handler.get_office_department_url(7))
# typical # typical
self.config.setdefault('corepos.office.url', 'http://localhost/fannie/') self.config.setdefault("corepos.office.url", "http://localhost/fannie/")
self.assertEqual(handler.get_office_department_url(7), 'http://localhost/fannie/item/departments/DepartmentEditor.php?did=7') self.assertEqual(
handler.get_office_department_url(7),
"http://localhost/fannie/item/departments/DepartmentEditor.php?did=7",
)
def test_get_office_employee_url(self): def test_get_office_employee_url(self):
handler = self.make_handler() handler = self.make_handler()
@ -122,8 +143,11 @@ class TestCoreposHandler(ConfigTestCase):
self.assertIsNone(handler.get_office_employee_url(7)) self.assertIsNone(handler.get_office_employee_url(7))
# typical # typical
self.config.setdefault('corepos.office.url', 'http://localhost/fannie/') self.config.setdefault("corepos.office.url", "http://localhost/fannie/")
self.assertEqual(handler.get_office_employee_url(7), 'http://localhost/fannie/admin/Cashiers/CashierEditor.php?emp_no=7') self.assertEqual(
handler.get_office_employee_url(7),
"http://localhost/fannie/admin/Cashiers/CashierEditor.php?emp_no=7",
)
def test_get_office_likecode_url(self): def test_get_office_likecode_url(self):
handler = self.make_handler() handler = self.make_handler()
@ -132,18 +156,24 @@ class TestCoreposHandler(ConfigTestCase):
self.assertIsNone(handler.get_office_likecode_url(7)) self.assertIsNone(handler.get_office_likecode_url(7))
# typical # typical
self.config.setdefault('corepos.office.url', 'http://localhost/fannie/') self.config.setdefault("corepos.office.url", "http://localhost/fannie/")
self.assertEqual(handler.get_office_likecode_url(7), 'http://localhost/fannie/item/likecodes/LikeCodeEditor.php?start=7') self.assertEqual(
handler.get_office_likecode_url(7),
"http://localhost/fannie/item/likecodes/LikeCodeEditor.php?start=7",
)
def test_get_office_product_url(self): def test_get_office_product_url(self):
handler = self.make_handler() handler = self.make_handler()
# null # null
self.assertIsNone(handler.get_office_product_url('07430500132')) self.assertIsNone(handler.get_office_product_url("07430500132"))
# typical # typical
self.config.setdefault('corepos.office.url', 'http://localhost/fannie/') self.config.setdefault("corepos.office.url", "http://localhost/fannie/")
self.assertEqual(handler.get_office_product_url('07430500132'), 'http://localhost/fannie/item/ItemEditorPage.php?searchupc=07430500132') self.assertEqual(
handler.get_office_product_url("07430500132"),
"http://localhost/fannie/item/ItemEditorPage.php?searchupc=07430500132",
)
def test_get_office_vendor_url(self): def test_get_office_vendor_url(self):
handler = self.make_handler() handler = self.make_handler()
@ -152,5 +182,8 @@ class TestCoreposHandler(ConfigTestCase):
self.assertIsNone(handler.get_office_vendor_url(7)) self.assertIsNone(handler.get_office_vendor_url(7))
# typical # typical
self.config.setdefault('corepos.office.url', 'http://localhost/fannie/') self.config.setdefault("corepos.office.url", "http://localhost/fannie/")
self.assertEqual(handler.get_office_vendor_url(7), 'http://localhost/fannie/item/vendors/VendorIndexPage.php?vid=7') self.assertEqual(
handler.get_office_vendor_url(7),
"http://localhost/fannie/item/vendors/VendorIndexPage.php?vid=7",
)

View file

@ -29,16 +29,18 @@ class TestMemberView(WebTestCase):
def test_configure_grid(self): def test_configure_grid(self):
view = self.make_view() view = self.make_view()
grid = view.make_grid(model_class=view.model_class) grid = view.make_grid(model_class=view.model_class)
self.assertNotIn('first_name', grid.renderers) self.assertNotIn("first_name", grid.renderers)
self.assertNotIn('first_name', grid.linked_columns) self.assertNotIn("first_name", grid.linked_columns)
with patch.object(self.request, 'is_root', new=True): with patch.object(self.request, "is_root", new=True):
view.configure_grid(grid) view.configure_grid(grid)
self.assertIn('first_name', grid.renderers) self.assertIn("first_name", grid.renderers)
self.assertIn('first_name', grid.linked_columns) self.assertIn("first_name", grid.linked_columns)
def test_render_customer_attr(self): def test_render_customer_attr(self):
view = self.make_view() view = self.make_view()
member = op_model.MemberInfo() member = op_model.MemberInfo()
customer = op_model.CustomerClassic(first_name="Fred") customer = op_model.CustomerClassic(first_name="Fred")
member.customers.append(customer) member.customers.append(customer)
self.assertEqual(view.render_customer_attr(member, 'first_name', 'nope'), "Fred") self.assertEqual(
view.render_customer_attr(member, "first_name", "nope"), "Fred"
)

View file

@ -16,6 +16,6 @@ class TestProductView(WebTestCase):
def test_configure_grid(self): def test_configure_grid(self):
view = self.make_view() view = self.make_view()
grid = view.make_grid(model_class=view.model_class) grid = view.make_grid(model_class=view.model_class)
self.assertNotIn('upc', grid.linked_columns) self.assertNotIn("upc", grid.linked_columns)
view.configure_grid(grid) view.configure_grid(grid)
self.assertIn('upc', grid.linked_columns) self.assertIn("upc", grid.linked_columns)