Source code for wutta_corepos.web.views.corepos.members
# -*- coding: utf-8; -*-
################################################################################
#
# Wutta-COREPOS -- Wutta Framework integration for CORE-POS
# Copyright © 2025 Lance Edgar
#
# This file is part of Wutta Framework.
#
# Wutta Framework 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.
#
# Wutta Framework 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
# Wutta Framework. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Views for CORE-POS Members
"""
import sqlalchemy as sa
from sqlalchemy import orm
from corepos.db.office_op.model import MemberInfo
from wutta_corepos.web.views.corepos import CoreOpMasterView
[docs]
class MemberView(CoreOpMasterView): # pylint: disable=abstract-method
"""
Master view for
:class:`~pycorepos:corepos.db.office_op.model.MemberInfo`; route
prefix is ``corepos_members``.
Notable URLs provided by this class:
* ``/corepos/members/``
* ``/corepos/members/XXX``
"""
model_class = MemberInfo
model_title = "CORE-POS Member"
route_prefix = "corepos_members"
url_prefix = "/corepos/members"
# nb. this is just for readonly lookup
creatable = False
editable = False
deletable = False
grid_columns = [
"card_number",
"first_name",
"last_name",
"street",
"city",
"state",
"zip",
"phone",
"email",
]
filter_defaults = {
"card_number": {"active": True, "verb": "equal"},
"first_name": {"active": True, "verb": "contains"},
"last_name": {"active": True, "verb": "contains"},
}
sort_defaults = "card_number"
def get_query(self, session=None): # pylint: disable=empty-docstring
""" """
query = super().get_query(session=session)
op_model = self.corepos_handler.get_model_office_op()
query = query.outerjoin(
op_model.CustomerClassic,
sa.and_(
op_model.CustomerClassic.card_number == op_model.MemberInfo.card_number,
op_model.CustomerClassic.person_number == 1,
),
).options(orm.joinedload(op_model.MemberInfo.customers))
return query
def configure_grid(self, grid): # pylint: disable=empty-docstring
""" """
g = grid
super().configure_grid(g)
op_model = self.corepos_handler.get_model_office_op()
# first_name
g.set_renderer("first_name", self.render_customer_attr)
g.set_sorter("first_name", op_model.CustomerClassic.first_name)
# last_name
g.set_renderer("last_name", self.render_customer_attr)
g.set_sorter("last_name", op_model.CustomerClassic.last_name)
# links
if self.has_perm("view"):
g.set_link("card_number")
g.set_link("first_name")
g.set_link("last_name")
def render_customer_attr( # pylint: disable=unused-argument,empty-docstring
self, member, key, value
):
""" """
customer = member.customers[0]
return getattr(customer, key)
def defaults(config, **kwargs): # pylint: disable=missing-function-docstring
base = globals()
MemberView = kwargs.get( # pylint: disable=invalid-name,redefined-outer-name
"MemberView", base["MemberView"]
)
MemberView.defaults(config)
def includeme(config): # pylint: disable=missing-function-docstring
defaults(config)