import threading import time # noinspection PyPackageRequirements import wx from service.settings import HTMLExportSettings from service.fit import Fit from service.port import Port from service.market import Market from eos.db import getFit class exportHtml(object): _instance = None @classmethod def getInstance(cls): if cls._instance is None: cls._instance = exportHtml() return cls._instance def __init__(self): self.thread = exportHtmlThread() def refreshFittingHtml(self, force=False, callback=False): settings = HTMLExportSettings.getInstance() if force or settings.getEnabled(): self.thread.stop() self.thread = exportHtmlThread(callback) self.thread.start() class exportHtmlThread(threading.Thread): def __init__(self, callback=False): threading.Thread.__init__(self) self.name = "HTMLExport" self.callback = callback self.stopRunning = False def stop(self): self.stopRunning = True def run(self): # wait 1 second just in case a lot of modifications get made time.sleep(1) if self.stopRunning: return sMkt = Market.getInstance() sFit = Fit.getInstance() settings = HTMLExportSettings.getInstance() minimal = settings.getMinimalEnabled() dnaUrl = "https://o.smium.org/loadout/dna/" if minimal: HTML = self.generateMinimalHTML(sMkt, sFit, dnaUrl) else: HTML = self.generateFullHTML(sMkt, sFit, dnaUrl) try: FILE = open(settings.getPath(), "w") FILE.write(HTML.encode('utf-8')) FILE.close() except IOError: print("Failed to write to " + settings.getPath()) pass if self.callback: wx.CallAfter(self.callback, -1) def generateFullHTML(self, sMkt, sFit, dnaUrl): """ Generate the complete HTML with styling and javascript """ timestamp = time.localtime(time.time()) localDate = "%d/%02d/%02d %02d:%02d" % (timestamp[0], timestamp[1], timestamp[2], timestamp[3], timestamp[4]) HTML = """ Pyfa Fittings

Pyfa fits

Last updated: %s ()
""" % (time.time(), dnaUrl, localDate) HTML += '
""" return HTML def generateMinimalHTML(self, sMkt, sFit, dnaUrl): """ Generate a minimal HTML version of the fittings, without any javascript or styling""" categoryList = list(sMkt.getShipRoot()) categoryList.sort(key=lambda _ship: _ship.name) count = 0 HTML = '' for group in categoryList: # init market group string to give ships something to attach to ships = list(sMkt.getShipList(group.ID)) ships.sort(key=lambda _ship: _ship.name) ships.sort(key=lambda _ship: _ship.name) for ship in ships: fits = sFit.getFitsWithShip(ship.ID) for fit in fits: if self.stopRunning: return try: dnaFit = Port.exportDna(getFit(fit[0])) HTML += '' + ship.name + ': ' + \ fit[1] + '
\n' except Exception, e: continue finally: if self.callback: wx.CallAfter(self.callback, count) count += 1 return HTML