__all__ = ['Item', 'Variant', 'Category', 'User', 'Cart', 'Address', 'Invoice']
import re
from myghty.util import *
class ModelSupertype(object):pass
class Item(ModelSupertype):
def __init__(self, name, description, image, price, variants = None):
self.name = name
self.description = description
self.image = image
self.price = price
self.variants = {}
if variants is not None:
for v in variants:
list = self.variants.setdefault(v.categoryname, OrderedDict())
list[v.name] = v
def get_variant_categories(self):
return self.variants.keys()
def get_variant(self, categoryname, name):
try:
return self.variants[categoryname][name]
except KeyError:
return None
def __eq__(self, other):
return other.name == self.name
def __ne__(self, other):
return not self.__eq__(other)
class Variant(ModelSupertype):
def __init__(self, categoryname, name, price = None):
self.categoryname = categoryname
self.name = name
self.price = price
def __eq__(self, other):
return (
self.categoryname == other.categoryname
and self.name == other.name
)
def __ne__(self, other):
return not self.__eq__(other)
class Category(ModelSupertype):
def __init__(self, name, description, items, parent = None):
self.name = name
self.description = description
self.items = items
self.subcategories = OrderedDict()
self.parent = parent
self.path = '/%s' % self.name
if self.parent is not None:
self.path = parent.path + self.path
self.parent.subcategories[self.name] = self
self.root = self.parent.root
else:
self.allitems = {}
self.root = self
for item in items:
if not hasattr(item, 'primarycategory'):
item.primarycategory = self
self.root.allitems[item.name] = item
def get_item(self, name):
return self.root.allitems[name]
def get_path(self):
return self.path
def get_category(self, path):
match = re.match(r'/([^/]*)(/.*)?', path)
(token, remainder) = match.group(1, 2)
if not token: return self
c = self.subcategories[token]
if not remainder: return c
else: return c.get_category(remainder)
def get_categories(self):
return iter(self.subcategories)
def __str__(self):
return self.name
class User(ModelSupertype):
def __init__(self, username = None, email = None):
self.username = username
self.email = email
self.addresses = []
self.cart = None
self.invoice = None
class Cart(ModelSupertype):
def __init__(self):
self.items = []
def add_item(self, item, quantity, variants = []):
for i in self.items:
if i.equals(item, variants):
i.quantity += quantity
return
self.items.append(CartItem(item, quantity, variants))
def remove_item(self, index):
self.items[index:index + 1] = []
def get_total(self):
sum = 0
for i in self.items:
sum += i.get_total_price()
return sum
def is_empty(self):
return len(self.items) == 0
class CartItem(ModelSupertype):
def __init__(self, item, quantity, variants):
self.item = item
self.variants = dict([(v.categoryname, v) for v in variants])
self.quantity = quantity
self.price = item.price
for v in self.variants.values():
if v.price is not None:
self.price = v.price
def get_variant_categories(self):
return self.variants.keys()
def get_variant(self, categoryname):
try:
return self.variants[categoryname]
except KeyError:
return None
def get_item_price(self):
return self.price
def get_total_price(self):
return self.quantity * self.price
def equals(self, item, variants):
if self.item != item:
return False
for variant in variants:
try:
if self.variants[variant.categoryname] != variant:
return False
except KeyError:
return False
return True
def __eq__(self, other):
return self.equals(other.item, other.variants.values())
def __ne__(self, other):
return not self.__eq__(other)
class Address(ModelSupertype):
def __init__(self, firstname = None,
lastname = None,
street1 = None,
street2 = None,
city = None,
state = None,
zipcode = None,
country = None):
self.street1 = street1
self.street2 = street2
self.firstname = firstname
self.lastname = lastname
self.city = city
self.state = state
self.zipcode = zipcode
self.country = country
def __eq__(self, other):
for key in ('firstname', 'lastname', 'street1',
'street2', 'city', 'state', 'zipcode', 'country'):
if (not hasattr(other, key)
or getattr(other, key) != getattr(self, key)):
return False
return True
def __ne__(self, other):
return not self.__eq__(other)
class CreditCard(ModelSupertype):
def __init__(self, ccname = None, cctype = None, ccnumber = None, ccexp = None):
self.ccname = ccname
self.cctype = cctype
self.ccnumber = ccnumber
self.ccexp = ccexp
def _hiddencc(self):
return ((len(self.ccnumber) - 5) * 'X') + self.ccnumber[-4:len(self.ccnumber)]
hiddencc = property(_hiddencc)
class Invoice(ModelSupertype):
def __init__(self, items, user, billingaddress = None, shippingaddress = None, creditcard = None):
self.items = items
self.user = user
self.billingaddress = billingaddress
self.shippingaddress = shippingaddress
self.creditcard = creditcard
def get_total(self):
sum = 0
for i in self.items:
sum += i.get_total_price()
return sum
|