First draft of price fetching code, as well as a bugfix fixing fitting calculations being done twice

This commit is contained in:
cncfanatics
2010-09-11 14:05:04 +02:00
parent f81db477fc
commit 2bb7abca11
7 changed files with 99 additions and 13 deletions

View File

@@ -86,7 +86,7 @@ class Fit(object):
eos.db.commit() eos.db.commit()
fit.clear() fit.clear()
fit.calculateModifiedAttributes() fit.calculateModifiedAttributes()
return fit return True
def removeModule(self, fitID, position): def removeModule(self, fitID, position):
fit = eos.db.getFit(fitID) fit = eos.db.getFit(fitID)
@@ -94,11 +94,11 @@ class Fit(object):
eos.db.commit() eos.db.commit()
fit.clear() fit.clear()
fit.calculateModifiedAttributes() fit.calculateModifiedAttributes()
return fit return True
def addDrone(self, fitID, itemID): def addDrone(self, fitID, itemID):
if fitID == None: if fitID == None:
return return False
fit = eos.db.getFit(fitID) fit = eos.db.getFit(fitID)
item = eos.db.getItem(itemID, eager=("attributes", "group.category")) item = eos.db.getItem(itemID, eager=("attributes", "group.category"))
@@ -112,8 +112,9 @@ class Fit(object):
eos.db.commit() eos.db.commit()
fit.clear() fit.clear()
fit.calculateModifiedAttributes() fit.calculateModifiedAttributes()
return True
return fit else:
return False
def removeDrone(self, fitID, i): def removeDrone(self, fitID, i):
fit = eos.db.getFit(fitID) fit = eos.db.getFit(fitID)
@@ -128,7 +129,7 @@ class Fit(object):
eos.db.commit() eos.db.commit()
fit.clear() fit.clear()
fit.calculateModifiedAttributes() fit.calculateModifiedAttributes()
return fit return True
def toggleDrone(self, fitID, i): def toggleDrone(self, fitID, i):
fit = eos.db.getFit(fitID) fit = eos.db.getFit(fitID)
@@ -141,4 +142,4 @@ class Fit(object):
eos.db.commit() eos.db.commit()
fit.clear() fit.clear()
fit.calculateModifiedAttributes() fit.calculateModifiedAttributes()
return fit return True

View File

@@ -19,6 +19,46 @@
import eos.db import eos.db
import eos.types import eos.types
import wx
import collections
import threading
from sqlalchemy.orm.exc import NoResultFound
class PriceWorkerThread(threading.Thread):
def run(self):
self.cv = threading.Condition()
self.updateRequests = collections.deque()
self.scheduled = set()
self.processUpdates()
def processUpdates(self):
updateRequests = self.updateRequests
cv = self.cv
while True:
cv.acquire()
while len(updateRequests) == 0:
cv.wait()
# Grab our data and rerelease the lock
callback, requests = self.updateRequests.popleft()
self.scheduled.clear()
cv.release()
# Grab prices, this is the time-consuming part
if len(requests) > 0:
eos.types.Price.fetchPrices(*requests)
callback()
def trigger(self, prices, callbacks):
self.cv.acquire()
self.updateRequests.append((callbacks, prices))
self.scheduled.update(prices)
self.cv.notify()
self.cv.release()
class Market(): class Market():
instance = None instance = None
@@ -39,6 +79,10 @@ class Market():
def __init__(self): def __init__(self):
self.activeMetas = set() self.activeMetas = set()
self.priceCache = {}
self.workerThread = PriceWorkerThread()
self.workerThread.daemon = True
self.workerThread.start()
def getChildren(self, id): def getChildren(self, id):
""" """
@@ -162,3 +206,36 @@ class Market():
l.append((var.ID, var.name, var.icon.iconFile if var.icon else "")) l.append((var.ID, var.name, var.icon.iconFile if var.icon else ""))
return l return l
def getPrices(self, typeIDs, callback):
fetch = set()
all = []
new = []
for typeID in typeIDs:
price = self.priceCache.get(typeID)
if price is None:
try:
price = eos.db.getPrice(typeID)
except NoResultFound:
price = eos.types.Price(typeID)
new.append(price)
self.priceCache[typeID] = price
all.append(price)
if not price.isValid and not price in self.workerThread.scheduled:
fetch.add(price)
def dbAdd():
for price in new:
eos.db.saveddata_session.add(price)
eos.db.saveddata_session.commit()
eos.db.saveddata_session.flush()
def cb():
wx.CallAfter(callback, all)
wx.CallAfter(dbAdd)
print map(lambda p: p.typeID, fetch)
print map(lambda p: p.typeID, new)
self.workerThread.trigger(fetch, cb)

2
eos

Submodule eos updated: e7818890ac...c61a2e9e8d

View File

@@ -49,8 +49,10 @@ class DroneView(d.Display):
def addItem(self, event): def addItem(self, event):
cFit = controller.Fit.getInstance() cFit = controller.Fit.getInstance()
fitID = self.mainFrame.getActiveFit() fitID = self.mainFrame.getActiveFit()
cFit.addDrone(fitID, event.itemID) trigger = cFit.addDrone(fitID, event.itemID)
wx.PostEvent(self.mainFrame, fv.FitChanged(fitID=fitID)) if trigger:
wx.PostEvent(self.mainFrame, fv.FitChanged(fitID=fitID))
event.Skip() event.Skip()
def removeItem(self, event): def removeItem(self, event):

View File

@@ -45,6 +45,7 @@ class FittingView(d.Display):
#Gets called from the fitMultiSwitch when it decides its time #Gets called from the fitMultiSwitch when it decides its time
def changeFit(self, fitID): def changeFit(self, fitID):
print "c"
self.activeFitID = fitID self.activeFitID = fitID
if fitID == None: if fitID == None:
self.Hide() self.Hide()
@@ -54,6 +55,7 @@ class FittingView(d.Display):
wx.PostEvent(self.mainFrame, FitChanged(fitID=fitID)) wx.PostEvent(self.mainFrame, FitChanged(fitID=fitID))
def appendItem(self, itemID): def appendItem(self, itemID):
print "a"
fitID = self.activeFitID fitID = self.activeFitID
if fitID != None: if fitID != None:
cFit = controller.Fit.getInstance() cFit = controller.Fit.getInstance()
@@ -61,6 +63,7 @@ class FittingView(d.Display):
wx.PostEvent(self.mainFrame, FitChanged(fitID=fitID)) wx.PostEvent(self.mainFrame, FitChanged(fitID=fitID))
def removeItem(self, event): def removeItem(self, event):
print "i"
row, _ = self.HitTest(event.Position) row, _ = self.HitTest(event.Position)
if row != -1: if row != -1:
cFit = controller.Fit.getInstance() cFit = controller.Fit.getInstance()

View File

@@ -106,6 +106,7 @@ class MultiSwitch(wx.Notebook):
self.SetPageImage(tab, self.imageList.Add(bitmap)) self.SetPageImage(tab, self.imageList.Add(bitmap))
def pageChanged(self, event): def pageChanged(self, event):
print "p"
selection = event.Selection selection = event.Selection
page = self.GetPage(selection) page = self.GetPage(selection)
if hasattr(page, "type") and page.type == "fit": if hasattr(page, "type") and page.type == "fit":
@@ -153,6 +154,7 @@ class MultiSwitch(wx.Notebook):
event.Skip() event.Skip()
def itemSelected(self, event): def itemSelected(self, event):
print "s"
selected = self.GetSelection() selected = self.GetSelection()
page = self.GetPage(selected) page = self.GetPage(selected)
if page.type == "fit": if page.type == "fit":

View File

@@ -32,6 +32,7 @@ class StatsPane(wx.Panel):
"capacitorViewFull", "targetingmiscViewFull", "priceViewFull"] "capacitorViewFull", "targetingmiscViewFull", "priceViewFull"]
def fitChanged(self, event): def fitChanged(self, event):
print "f"
cFit = controller.Fit.getInstance() cFit = controller.Fit.getInstance()
fit = cFit.getFit(event.fitID) fit = cFit.getFit(event.fitID)
for view in self.views: for view in self.views:
@@ -45,8 +46,8 @@ class StatsPane(wx.Panel):
# Force font size 8 # Force font size 8
standardFont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) standardFont = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
standardFont.SetPointSize(8) standardFont.SetPointSize(8)
self.SetFont(standardFont) self.SetFont(standardFont)
mainSizer = wx.BoxSizer(wx.VERTICAL) mainSizer = wx.BoxSizer(wx.VERTICAL)
self.SetSizer(mainSizer) self.SetSizer(mainSizer)
@@ -61,7 +62,7 @@ class StatsPane(wx.Panel):
view.populatePanel(contentPanel, headerPanel) view.populatePanel(contentPanel, headerPanel)
tp.SetLabel(view.getHeaderText(None)) tp.SetLabel(view.getHeaderText(None))
view.refreshPanel(None) view.refreshPanel(None)
mainSizer.Add(tp, 0, wx.EXPAND | wx.LEFT, 3) mainSizer.Add(tp, 0, wx.EXPAND | wx.LEFT, 3)