import threading import time # noinspection PyPackageRequirements import wx from service.const import PortEftOptions from service.settings import HTMLExportSettings from service.fit import Fit from service.port import Port from service.market import Market from logbook import Logger from eos.db import getFit pyfalog = Logger(__name__) class exportHtml: _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", encoding='utf-8') FILE.write(HTML) FILE.close() except IOError as ex: pyfalog.warning("Failed to write to " + settings.getPath()) pass except Exception as ex: 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: pyfalog.error("Failed to export line") continue finally: if self.callback: wx.CallAfter(self.callback, count) count += 1 return HTML