Source code for rattail.db.model.stores

# -*- 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/>.
#
################################################################################
"""
Data Models for Stores
"""

from __future__ import unicode_literals, absolute_import

import six
import sqlalchemy as sa
from sqlalchemy.orm import relationship
from sqlalchemy.ext.orderinglist import ordering_list

from .core import Base, uuid_column
from .contact import PhoneNumber, EmailAddress


[docs] @six.python_2_unicode_compatible class Store(Base): """ Represents a store (physical or otherwise) within the organization. """ __tablename__ = 'store' __versioned__ = {} uuid = uuid_column() id = sa.Column(sa.String(length=10), nullable=True, doc=""" Supposedly unique ID string for the store. """) name = sa.Column(sa.String(length=100), nullable=True, doc=""" Common name for the store. """) database_key = sa.Column(sa.String(length=30), nullable=True, doc=""" Supposedly unique "config key" for the store. This key is used e.g. to define the database connection for the store. """) archived = sa.Column(sa.Boolean(), nullable=True, doc=""" If set, this should indicate the record is "archived" and is no longer in use per se. """) def __str__(self): return str(self.name or '') def add_email_address(self, address, type='Info'): email = StoreEmailAddress(address=address, type=type) self.emails.append(email) def add_phone_number(self, number, type='Voice'): phone = StorePhoneNumber(number=number, type=type) self.phones.append(phone) # TODO: this class should use ContactMixin instead def first_phone(self, **kwargs): if self.phones: return self.phones[0]
[docs] class StorePhoneNumber(PhoneNumber): """ Represents a phone (or fax) number associated with a store. """ __mapper_args__ = {'polymorphic_identity': 'Store'}
Store.phones = relationship( StorePhoneNumber, backref='store', primaryjoin=StorePhoneNumber.parent_uuid == Store.uuid, foreign_keys=[StorePhoneNumber.parent_uuid], collection_class=ordering_list('preference', count_from=1), order_by=StorePhoneNumber.preference, cascade='save-update, merge, delete, delete-orphan') Store.phone = relationship( StorePhoneNumber, primaryjoin=sa.and_( StorePhoneNumber.parent_uuid == Store.uuid, StorePhoneNumber.preference == 1), foreign_keys=[StorePhoneNumber.parent_uuid], uselist=False, viewonly=True)
[docs] class StoreEmailAddress(EmailAddress): """ Represents an email address associated with a store. """ __mapper_args__ = {'polymorphic_identity': 'Store'}
Store.emails = relationship( StoreEmailAddress, backref='store', primaryjoin=StoreEmailAddress.parent_uuid == Store.uuid, foreign_keys=[StoreEmailAddress.parent_uuid], collection_class=ordering_list('preference', count_from=1), order_by=StoreEmailAddress.preference, cascade='save-update, merge, delete, delete-orphan') Store.email = relationship( StoreEmailAddress, primaryjoin=sa.and_( StoreEmailAddress.parent_uuid == Store.uuid, StoreEmailAddress.preference == 1), foreign_keys=[StoreEmailAddress.parent_uuid], uselist=False, viewonly=True)