Package stocks3 :: Package core :: Module quotemaker
[hide private]
[frames] | no frames]

Source Code for Module stocks3.core.quotemaker

 1  # -*- coding: utf-8 -*- 
 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   
20 -class ConfigurableStock(Configurable, StockWithUnit):
21 - def makeConfig(self):
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
31 - def __init__(self, tree, node):
32 Configurable.__init__(self, tree, node) 33 unit = Unit(self.configUnit, self.configScale) 34 StockWithUnit.__init__(self, self.configName, unit)
35 36
37 -class ConfigurableQuote(Configurable, Quote):
38 - def makeConfig(self):
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
50 - def __init__(self, tree, node):
51 Configurable.__init__(self, tree, node) 52 Quote.__init__(self, self.configId, self.configNumerator, self.configDenominator)
53 54
55 -class QuoteError(Exception): pass
56 57
58 -class QuoteMaker:
59 __metaclass__ = Singleton 60 61 # FIXME: 62 quotesXml = "catalog/quotes.xml" 63
64 - def __init__(self):
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
80 - def getQuote(self, name):
81 try: 82 return self._quotes[name] 83 except KeyError, e: 84 raise QuoteError("Unknown quote %s" % e)
85
86 - def getQuoteById(self, ident):
87 return self._quotes[int(ident)]
88
89 - def getQuoteName(self, ident):
90 return self._names[int(ident)]
91