From fdd7dfad1e0da5935ebed089fbf4d64bfbf31988 Mon Sep 17 00:00:00 2001 From: Martin Date: Thu, 30 Jun 2016 16:16:06 +0200 Subject: [PATCH] add markets --- api/models/market.py | 103 ++++++++++++++++++++++++++++++++++++ api/models/product.py | 11 ++++ tests/models/__init__.py | 0 tests/models/test_market.py | 11 ++++ 4 files changed, 125 insertions(+) create mode 100644 api/models/market.py create mode 100644 api/models/product.py create mode 100644 tests/models/__init__.py create mode 100644 tests/models/test_market.py diff --git a/api/models/market.py b/api/models/market.py new file mode 100644 index 0000000..105c66d --- /dev/null +++ b/api/models/market.py @@ -0,0 +1,103 @@ +# coding=UTF-8 +from api import db +from .product import Currencies + + +class PriceAdjustments(db.Model): + + __tablename__ = 'price_adjustments' + + territory = db.Column(db.String(2), primary_key=True) + adjustment = db.Column(db.Numeric) + + +class Market(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) + 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 = float(row.exchange_rate) + 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 = [ + Market('Sweden', 'sv_SE', 'SEK', 1.25, 'SWE'), + Market('Norway', 'nn_NO', 'NOK', 1.25, 'NOR'), + Market('United kingdom', 'en_GB', 'GBP', 1.20, 'GBR'), + Market('Denmark', 'da_DK', 'DKK', 1.25, 'DNK'), + Market('Finland', 'fi_FI', 'EUR', 1.24, 'FIN'), + Market('Russia', 'ru_RU', 'RUB', 1, 'RUS'), + Market('Germany', 'de_DE', 'EUR', 1.19, 'DEU'), + Market('Netherlands', 'nl_NL', 'EUR', 1.21, 'NLD'), + Market('Austria', 'de_AT', 'EUR', 1.20, 'AUT'), + Market('USA', 'en_US', 'USD', 1, 'USA'), + Market('Spain', 'es_ES', 'EUR', 1.25, 'ESP'), + Market('France', 'fr_FR', 'EUR', 1.25, 'FRA'), + Market('Poland', 'pl_PL', 'PLN', 1.25, 'POL'), + Market('International', 'en_EU', 'EUR', 1, None), +] + +def iter_markets(): + for market in _markets: + yield 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 \ No newline at end of file diff --git a/api/models/product.py b/api/models/product.py new file mode 100644 index 0000000..aa30c2a --- /dev/null +++ b/api/models/product.py @@ -0,0 +1,11 @@ +# coding=UTF-8 + +from api import db + + +class Currencies(db.Model): + + __tablename__ = 'product-currencies' + + iso3char = db.Column(db.String(3), primary_key=True) + exchange_rate = db.Column(db.Numeric, default=1) \ No newline at end of file diff --git a/tests/models/__init__.py b/tests/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/models/test_market.py b/tests/models/test_market.py new file mode 100644 index 0000000..b8a4516 --- /dev/null +++ b/tests/models/test_market.py @@ -0,0 +1,11 @@ +# coding=UTF-8 + +import unittest2 +from api.models import market + +class TestMarket(unittest2.TestCase): + + def test_sweden(self): + sweden = market.from_territory('SE') + self.assertEqual('sv', sweden.language) + self.assertEqual('SE', sweden.territory) \ No newline at end of file