# 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