142 lines
4.2 KiB
Python
142 lines
4.2 KiB
Python
# coding=UTF-8
|
|
|
|
from api.extensions import db
|
|
from .product import Currencies
|
|
from sqlalchemy.orm import validates
|
|
from sqlalchemy.ext.associationproxy import association_proxy
|
|
|
|
|
|
class Market(db.Model):
|
|
__tablename__ = "markets"
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
name = db.Column(db.String(255))
|
|
vat = db.Column(db.Float, nullable=False)
|
|
price_adjustments = db.Column("price_adjustment", db.Float, nullable=False)
|
|
currency = db.Column(db.String(3), db.ForeignKey("product-currencies.iso3char"))
|
|
_pc = db.relationship(Currencies, uselist=False)
|
|
exchange_rate = association_proxy("_pc", "exchange_rate")
|
|
|
|
def to_json(self):
|
|
return {
|
|
"id": self.id,
|
|
"name": self.name,
|
|
"price_adjustment": str(self.price_adjustments),
|
|
"vat": str(self.vat),
|
|
"currency": self.currency,
|
|
"exchange_rate": str(self.exchange_rate),
|
|
}
|
|
|
|
# hack: market need a territory to make it compatible with current price calculations code
|
|
# this will be removed in P5-6491
|
|
@property
|
|
def territory(self):
|
|
if self.name == 'GLOBAL':
|
|
return 'EU'
|
|
return self.name
|
|
|
|
|
|
class PriceAdjustments(db.Model):
|
|
|
|
__tablename__ = "price_adjustments"
|
|
|
|
territory = db.Column(db.String(2), primary_key=True)
|
|
adjustment = db.Column(db.Numeric)
|
|
|
|
|
|
# P5-6490 deprecated market model. Will be replaced with Market
|
|
class LegacyMarket(object):
|
|
def __init__(self, name, locale, currency, vat, iso3):
|
|
self.name = name
|
|
self.locale = locale
|
|
self.currency = currency
|
|
self.vat = vat
|
|
self.iso3 = iso3
|
|
self.language = locale.split("_")[0]
|
|
self.territory = locale.split("_")[1]
|
|
self._price_adjustments = None
|
|
self._exchange_rate = None
|
|
self._price_adjustments = None
|
|
|
|
@property
|
|
def price_adjustments(self):
|
|
if self._price_adjustments is None:
|
|
row = PriceAdjustments.query.filter_by(territory=self.territory).first()
|
|
if row:
|
|
self._price_adjustments = float(row.adjustment)
|
|
else:
|
|
self._price_adjustments = 1
|
|
|
|
return self._price_adjustments
|
|
|
|
@price_adjustments.setter
|
|
def price_adjustments(self, value):
|
|
self._price_adjustments = value
|
|
|
|
@property
|
|
def exchange_rate(self):
|
|
if self._exchange_rate is None:
|
|
row = Currencies.query.filter_by(iso3char=self.currency).first()
|
|
if row:
|
|
self._exchange_rate = row.exchange_rate
|
|
else:
|
|
self._exchange_rate = 1
|
|
return self._exchange_rate
|
|
|
|
@exchange_rate.setter
|
|
def exchange_rate(self, value):
|
|
self._exchange_rate = value
|
|
|
|
def to_json(self):
|
|
return {
|
|
"name": self.name,
|
|
"locale": self.locale,
|
|
"currency": self.currency,
|
|
"vat": self.vat,
|
|
"iso3": self.iso3,
|
|
"language": self.language,
|
|
"territory": self.territory,
|
|
"price_adjustments": self.price_adjustments,
|
|
"exchange_rate": self.exchange_rate,
|
|
}
|
|
|
|
def __repr__(self):
|
|
return self.locale
|
|
|
|
|
|
_markets = [
|
|
("Sweden", "sv_SE", "SEK", 1.25, "SWE"),
|
|
("Norway", "nn_NO", "NOK", 1.25, "NOR"),
|
|
("United kingdom", "en_GB", "GBP", 1.20, "GBR"),
|
|
("Denmark", "da_DK", "DKK", 1.25, "DNK"),
|
|
("Finland", "fi_FI", "EUR", 1.24, "FIN"),
|
|
("Germany", "de_DE", "EUR", 1.19, "DEU"),
|
|
("Netherlands", "nl_NL", "EUR", 1.21, "NLD"),
|
|
("Austria", "de_AT", "EUR", 1.20, "AUT"),
|
|
("USA", "en_US", "USD", 1, "USA"),
|
|
("Spain", "es_ES", "EUR", 1.21, "ESP"),
|
|
("France", "fr_FR", "EUR", 1.20, "FRA"),
|
|
("Poland", "pl_PL", "EUR", 1.23, "POL"),
|
|
("International", "en_EU", "EUR", 1.25, None),
|
|
("Italy", "it_IT", "EUR", 1.22, "ITA"),
|
|
]
|
|
|
|
|
|
def iter_markets():
|
|
for market in _markets:
|
|
yield LegacyMarket(*market)
|
|
|
|
|
|
def from_locale(locale):
|
|
for market in iter_markets():
|
|
if market.locale == locale:
|
|
return market
|
|
return None
|
|
|
|
|
|
def from_territory(territory):
|
|
for market in iter_markets():
|
|
if market.territory == territory.upper():
|
|
return market
|
|
return None
|