1
2
3 u"""
4 Ситуация такова. Котировка имеет несколько имен. Первое имя - это имя котировки
5 в исходных данных. Второе имя - это человеческое имя. Третье имя - это число,
6 под которым котировка хранится в базе данных. Этот модуль нужен для
7 преобразования человеческого имени в объект класса L{Quote}.
8 """
9
10 __author__ = "Zasimov Alexey"
11 __email__ = "zasimov-a@yandex-team.ru"
12
13
14 from stocks3.core.config import Configurable, ConfigurationError, parseXML
15 from stocks3.core.stock import *
16 from stocks3.core.stockscatalog import StocksCatalog
17 from stocks3.share.singleton import Singleton
18
19
22 self.configName = self.readString("", "stock").strip()
23 stocksCatalog = StocksCatalog()
24 if not stocksCatalog.is_valid_stock(self.configName):
25 raise RuntimeError("Unknown stock: %s" % self.configName.encode("utf-8"))
26 defaultUnit = stocksCatalog.getUnit(self.configName)
27 self.configUnit = self.readString("", "unit", defaultUnit)
28 self.configScale = self.readFloat("", "scale", 1.0)
29 return self
30
35
36
39 self.configId = self.readInt("", "inner-id")
40 numeratorNode = self.node.find("numerator")
41 if numeratorNode is None:
42 raise ConfigurationError("Expected one numerator for quote %s" % self.configId)
43 denominatorNode = self.node.find("denominator")
44 if denominatorNode is None:
45 raise ConfigurationError("Expected one denominator for quote %s" % self.configId)
46 self.configNumerator = ConfigurableStock(self.tree, numeratorNode)
47 self.configDenominator = ConfigurableStock(self.tree, denominatorNode)
48 return self
49
53
54
56
57
59 __metaclass__ = Singleton
60
61
62 quotesXml = "catalog/quotes.xml"
63
65 tree = parseXML(self.quotesXml)
66 self._quotes = {}
67 self._reverse_quotes = {}
68 self._names = {}
69 for quoteNode in tree.getroot().findall("quote"):
70 name = quoteNode.attrib["name"].strip()
71 quote = ConfigurableQuote(tree, quoteNode)
72 if self._quotes.has_key(name):
73 raise RuntimeError("Quote with name %s already defined." % name.encode("utf-8"))
74 self._quotes[name] = quote
75 if self._reverse_quotes.has_key(quote.quoteId):
76 raise RuntimeError("Quote with id %s already defined (name - %s)" % (quote.quoteId, self._names[quote.quoteId].encode("utf-8")))
77 self._reverse_quotes[quote.quoteId] = quote
78 self._names[quote.quoteId] = name
79
81 try:
82 return self._quotes[name]
83 except KeyError, e:
84 raise QuoteError("Unknown quote %s" % e)
85
87 return self._quotes[int(ident)]
88
90 return self._names[int(ident)]
91