diff --git a/eos/gamedata.py b/eos/gamedata.py index f97aaa58f..9cbb28a3b 100644 --- a/eos/gamedata.py +++ b/eos/gamedata.py @@ -254,6 +254,7 @@ class Item(EqBase): self.__offensive = None self.__assistive = None self.__overrides = None + self.__price = None @property def attributes(self): @@ -441,34 +442,22 @@ class Item(EqBase): @property def price(self): - try: - if not hasattr(self, "__price"): + + # todo: use `from sqlalchemy import inspect` instead (need to verify it works in old and new OS X builds) + if self.__price is not None and getattr(self.__price, '_sa_instance_state', None): + pyfalog.debug("Price data for {} was deleted, resetting object".format(self.ID)) + self.__price = None + + if self.__price is None: + db_price = eos.db.getPrice(self.ID) + # do not yet have a price in the database for this item, create one + if db_price is None: + print "Creating a price for {}".format(self.ID) self.__price = types_Price(self.ID) - - # Get the price from the DB - price = eos.db.getPrice(self.ID) - - if price: - if self.__price.time > price.time: - # The object is newer than the DB, update the DB. - eos.db.add(self.__price) - eos.db.commit() - - if self.__price.time < price.time: - # DB object is newer than local object, update the local object - self.__price = price + eos.db.add(self.__price) + eos.db.commit() else: - pyfalog.debug("Unable to fetch item price from database.") - - return self.__price - - except Exception as e: - # We want to catch our failure and log it, but don't bail out for a single missing price tag. - pyfalog.error("Failed to get price for typeID: {0}", self.ID) - pyfalog.error(e) - if not self.__price.price: - self.__price.price = 0 - self.__price.failed = True + self.__price = db_price return self.__price diff --git a/gui/builtinContextMenus/priceClear.py b/gui/builtinContextMenus/priceClear.py index 0a2dfae63..b49673f96 100644 --- a/gui/builtinContextMenus/priceClear.py +++ b/gui/builtinContextMenus/priceClear.py @@ -3,6 +3,7 @@ import gui.mainFrame # noinspection PyPackageRequirements import wx import gui.globalEvents as GE +from service.price import Price from service.settings import ContextMenuSettings @@ -21,6 +22,8 @@ class PriceClear(ContextMenu): return "Reset Price Cache" def activate(self, fullContext, selection, i): + sPrc = Price.getInstance() + sPrc.clearPriceCache() wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.mainFrame.getActiveFit())) diff --git a/service/price.py b/service/price.py index 6572adea4..35fdc69b6 100644 --- a/service/price.py +++ b/service/price.py @@ -34,7 +34,7 @@ from service.market import Market pyfalog = Logger(__name__) -VALIDITY = 24 * 60 * 60 # Price validity period, 24 hours +VALIDITY = 60 # Price validity period, 24 hours REREQUEST = 4 * 60 * 60 # Re-request delay for failed fetches, 4 hours TIMEOUT = 15 * 60 # Network timeout delay for connection issues, 15 minutes @@ -128,7 +128,6 @@ class Price(object): priceobj.failed = None # Update the DB. - db.add(priceobj) db.commit() # delete price from working dict @@ -144,7 +143,6 @@ class Price(object): priceobj.failed = True # Update the DB. - db.add(priceobj) db.commit() del priceMap[typeID] @@ -160,7 +158,6 @@ class Price(object): priceobj.failed = True # Update the DB. - db.add(priceobj) db.commit() @classmethod @@ -217,6 +214,10 @@ class Price(object): else: self.priceWorkerThread.trigger(requests, cb) + def clearPriceCache(self): + pyfalog.debug("Clearing Prices") + db.clearPrices() + class PriceWorkerThread(threading.Thread): def __init__(self):