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)