Source code for rattail.autocomplete.customers

# -*- coding: utf-8 -*-
################################################################################
#
#  Rattail -- Retail Software Framework
#  Copyright © 2010-2021 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 <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Autocomplete Handler for Customers
"""

from __future__ import unicode_literals, absolute_import

import re

import sqlalchemy as sa
from sqlalchemy import orm

from rattail.autocomplete import Autocompleter
from rattail.autocomplete.base import PhoneMagicMixin
from rattail.db import model


[docs] class CustomerAutocompleter(Autocompleter): """ Autocompleter for Customers (by name) """ autocompleter_key = 'customers' model_class = model.Customer autocomplete_fieldname = 'name'
[docs] class CustomerPhoneAutocompleter(Autocompleter): """ Autocompleter for Customers (by phone) .. note:: As currently implemented, this view will only work with a PostgreSQL database. It normalizes the user's search term and the database values to numeric digits only (i.e. removes special characters from each) in order to be able to perform smarter matching. However normalizing the database value currently uses the PG SQL ``regexp_replace()`` function. """ autocompleter_key = 'customers.phone' invalid_pattern = re.compile(r'\D')
[docs] def prepare_autocomplete_term(self, term, **kwargs): return self.invalid_pattern.sub('', term)
[docs] def make_autocomplete_query(self, session, term, **kwargs): model = self.model return session.query(model.CustomerPhoneNumber)\ .filter(sa.func.regexp_replace(model.CustomerPhoneNumber.number, r'\D', '', 'g').like('%{}%'.format(term)))\ .order_by(model.CustomerPhoneNumber.number)\ .options(orm.joinedload(model.CustomerPhoneNumber.customer))
def autocomplete_display(self, phone): return "{} {}".format(phone.number, phone.customer) def autocomplete_value(self, phone): return phone.customer.uuid
[docs] class CustomerNewOrderAutocompleter(PhoneMagicMixin, Autocompleter): """ Special "new order" autocompleter for customers. We set it apart with a different key (``'customers.neworder'``) so that you can override it independently of other customer autocompleters. But the default logic for this one is a bit special too, in that it will try to search for *either* phone number *or* customer name. If the search term includes at least 4 digits then it is considered to be a phone number search; otherwise it will be considered a name search. """ autocompleter_key = 'customers.neworder' model_class = model.Customer autocomplete_fieldname = 'name' phone_model_class = model.CustomerPhoneNumber