Merge remote-tracking branch 'upstream/master'

updated from upstream
This commit is contained in:
Constantin Wenger
2016-02-11 06:53:01 +01:00
41 changed files with 114 additions and 42 deletions

View File

@@ -1,5 +1,7 @@
# pyfa
[![Join the chat at https://gitter.im/pyfa-org/Pyfa](https://badges.gitter.im/pyfa-org/Pyfa.svg)](https://gitter.im/pyfa-org/Pyfa?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
![pyfa](https://cloud.githubusercontent.com/assets/3904767/10271512/af385ef2-6ade-11e5-8f67-52b8b1e4c797.PNG)
## What is it?
@@ -12,7 +14,7 @@ The latest version along with release notes can always be found on the projects
## Installing
Windows and OS X users are supplied self-contained builds of pyfa that can be run without additional software. An `.exe` installer is also available for the Windows builds. There is no self-contained package for Linux users, which are expected to run pyfa through their distributions Python interpreter. However, there are a number of third-party packages available that handle the dependencies and updates for pyfa (for example, [pyfa for Arch Linux](https://aur.archlinux.org/packages/pyfa/)). Please check your distributions repositories.
## Requirements
### Requirements
If you wish to help with development or simply need to run pyfa through a Python interpreter, the following software is required:
* Python 2.7
@@ -22,6 +24,14 @@ If you wish to help with development or simply need to run pyfa through a Python
* `matplotlib` (for some Linux distributions, you may need to install separate wxPython bindings, such as `python-matplotlib-wx`)
* `requests`
### Linux Distro-specific Packages
The following is a list of pyfa packages available for certain distros. Please note that these packages are maintained by third-parties and are not evaluated by the pyfa developers.
* Debian/Ubuntu/derivitives: https://github.com/AdamMajer/Pyfa/releases
* Arch: https://aur.archlinux.org/packages/pyfa/
* openSUSE: https://build.opensuse.org/package/show/home:rmk2/pyfa
* FreeBSD: http://www.freshports.org/games/pyfa/ (see #484 for instructions)
## Bug Reporting
The preferred method of reporting bugs is through the projects GitHub Issues interface. Alternatively, posting a report in the pyfa thread on the official EVE Online forums is acceptable. Guidelines for bug reporting can be found on [this wiki page](https://github.com/DarkFenX/Pyfa/wiki/Bug-Reporting).

View File

@@ -18,10 +18,10 @@ debug = False
saveInRoot = False
# Version data
version = "1.18.0"
version = "1.19.1"
tag = "Stable"
expansionName = "YC 118.1"
expansionVersion = "1.0"
expansionName = "February 2016"
expansionVersion = "1.1"
evemonMinVersion = "4081"
pyfaPath = None

View File

@@ -5,6 +5,8 @@
gangBonus = "commandBonusECM"
gangBoost = "ewarStrECM"
type = "active", "gang"
runTime = "late"
def handler(fit, module, context):
if "gang" not in context: return
for scanType in ("Magnetometric", "Radar", "Ladar", "Gravimetric"):

View File

@@ -5,6 +5,8 @@
gangBonus = "commandBonusRSD"
gangBoost = "ewarStrRSD"
type = "active", "gang"
runTime = "late"
def handler(fit, module, context):
if "gang" not in context: return
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Sensor Linking"),

View File

@@ -5,6 +5,8 @@
gangBonus = "commandBonusTD"
gangBoost = "ewarStrTD"
type = "active", "gang"
runTime = "late"
def handler(fit, module, context):
if "gang" not in context: return
for bonus in (

View File

@@ -5,6 +5,8 @@
gangBonus = "commandBonusTP"
gangBoost = "ewarStrTP"
type = "active", "gang"
runTime = "late"
def handler(fit, module, context):
if "gang" not in context: return
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Target Painting"),

View File

@@ -1,7 +1,7 @@
# droneDmgBonus
#
# Used by:
# Skills from group: Drones (8 of 21)
# Skills from group: Drones (8 of 23)
# Skills named like: Drone Specialization (4 of 4)
type = "passive"
def handler(fit, skill, context):

View File

@@ -1,7 +1,7 @@
# energyDestabilizationNew
#
# Used by:
# Drones from group: Cap Drain Drone (3 of 3)
# Drones from group: Energy Neutralizer Drone (3 of 3)
from eos.types import State
type = "active", "projected"
def handler(fit, container, context):

View File

@@ -4,6 +4,8 @@
# Variations of module: Skirmish Warfare Link - Rapid Deployment I (2 of 2)
type = "gang", "active"
gangBoost = "speedFactor"
runTime = "late"
def handler(fit, module, context):
if "gang" not in context: return
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name == "Propulsion Module",

View File

@@ -4,6 +4,8 @@
# Variations of module: Armored Warfare Link - Passive Defense I (2 of 2)
type = "gang", "active"
gangBoost = "armorResistance"
runTime = "late"
def handler(fit, module, context):
if "gang" not in context: return
for damageType in ("Em", "Thermal", "Explosive", "Kinetic"):

View File

@@ -4,6 +4,8 @@
# Variations of module: Armored Warfare Link - Damage Control I (2 of 2)
type = "gang", "active"
gangBoost = "armorRepairCapacitorNeed"
runTime = "late"
def handler(fit, module, context):
if "gang" not in context: return
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Repair Systems") or mod.item.requiresSkill("Remote Armor Repair Systems"),

View File

@@ -4,6 +4,8 @@
# Variations of module: Armored Warfare Link - Rapid Repair I (2 of 2)
type = "gang", "active"
gangBoost = "armorRepairDuration"
runTime = "late"
def handler(fit, module, context):
if "gang" not in context: return
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Repair Systems") or mod.item.requiresSkill("Remote Armor Repair Systems"),

View File

@@ -4,6 +4,8 @@
# Variations of module: Skirmish Warfare Link - Evasive Maneuvers I (2 of 2)
type = "gang", "active"
gangBoost = "signatureRadius"
runTime = "late"
def handler(fit, module, context):
if "gang" not in context: return
fit.ship.boostItemAttr("signatureRadius", module.getModifiedItemAttr("commandBonus"),

View File

@@ -4,6 +4,8 @@
# Variations of module: Information Warfare Link - Recon Operation I (2 of 2)
type = "gang", "active"
gangBoost = "electronicMaxRange"
runTime = "late"
def handler(fit, module, context):
if "gang" not in context: return
groups = ("Target Painter", "Weapon Disruptor", "Remote Sensor Damper", "ECM", "ECM Burst")

View File

@@ -3,8 +3,9 @@
# Used by:
# Variations of module: Information Warfare Link - Electronic Superiority I (2 of 2)
type = "active"
def handler(fit, module, context):
module.multiplyItemAttr("commandBonusTD", module.getModifiedItemAttr("commandBonusHidden"))
module.multiplyItemAttr("commandBonusECM", module.getModifiedItemAttr("commandBonusHidden"))
module.multiplyItemAttr("commandBonusRSD", module.getModifiedItemAttr("commandBonusHidden"))
module.multiplyItemAttr("commandBonusTP", module.getModifiedItemAttr("commandBonusHidden"))
module.multiplyItemAttr("commandBonusTP", module.getModifiedItemAttr("commandBonusHidden"))

View File

@@ -4,9 +4,11 @@
# Variations of module: Skirmish Warfare Link - Interdiction Maneuvers I (2 of 2)
type = "gang", "active"
gangBoost = "interdictionMaxRange"
runTime = "late"
def handler(fit, module, context):
if "gang" not in context: return
groups = ("Stasis Web","Warp Scrambler")
groups = ("Stasis Web", "Warp Scrambler")
fit.modules.filteredItemBoost(lambda mod: mod.item.group.name in groups,
"maxRange", module.getModifiedItemAttr("commandBonus"),
stackingPenalties = True)

View File

@@ -5,6 +5,8 @@
type = "gang", "active"
gangBoost = "maxTargetRange"
gangBonus = "commandBonus"
runTime = "late"
def handler(fit, module, context):
if "gang" not in context: return
fit.ship.boostItemAttr("maxTargetRange", module.getModifiedItemAttr("commandBonus"),

View File

@@ -4,6 +4,8 @@
# Variations of module: Siege Warfare Link - Shield Efficiency I (2 of 2)
type = "gang", "active"
gangBoost = "shieldRepairCapacitorNeed"
runTime = "late"
def handler(fit, module, context):
if "gang" not in context: return
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Shield Operation") or mod.item.requiresSkill("Shield Emission Systems"),

View File

@@ -4,6 +4,8 @@
# Variations of module: Siege Warfare Link - Active Shielding I (2 of 2)
type = "gang", "active"
gangBoost = "shieldRepairDuration"
runTime = "late"
def handler(fit, module, context):
if "gang" not in context: return
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Shield Operation") or mod.item.requiresSkill("Shield Emission Systems"),

View File

@@ -4,6 +4,8 @@
# Variations of module: Siege Warfare Link - Shield Harmonizing I (2 of 2)
type = "gang", "active"
gangBoost = "shieldResistance"
runTime = "late"
def handler(fit, module, context):
if "gang" not in context: return
for damageType in ("Em", "Explosive", "Thermal", "Kinetic"):

View File

@@ -6,4 +6,4 @@ type = "gang"
gangBoost = "scanResolution"
gangBonus = "scanResolutionBonus"
def handler(fit, skill, context):
fit.ship.boostItemAttr(gangBoost, skill.getModifiedItemAttr(gangBonus) * skill.level)
fit.ship.boostItemAttr(gangBoost, skill.getModifiedItemAttr(gangBonus) * skill.level, stackingPenalties = True)

View File

@@ -7,4 +7,4 @@ gangBoost = "maxTargetRange"
gangBonus = "maxTargetRangeBonus"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
fit.ship.boostItemAttr(gangBoost, container.getModifiedItemAttr(gangBonus) * level)
fit.ship.boostItemAttr(gangBoost, container.getModifiedItemAttr(gangBonus) * level, stackingPenalties = True )

View File

@@ -7,4 +7,4 @@ gangBoost = "agility"
gangBonus = "agilityBonus"
def handler(fit, container, context):
level = container.level if "skill" in context else 1
fit.ship.boostItemAttr(gangBoost, container.getModifiedItemAttr(gangBonus) * level)
fit.ship.boostItemAttr(gangBoost, container.getModifiedItemAttr(gangBonus) * level, stackingPenalties = True)

View File

@@ -476,9 +476,6 @@ class Fit(object):
logger.debug("Fit has already been calculated and is not projected, returning: %r", self)
return
# Mark fit as calculated
self.__calculated = True
for runTime in ("early", "normal", "late"):
# Items that are unrestricted. These items are run on the local fit
# first and then projected onto the target fit it one is designated
@@ -505,9 +502,10 @@ class Fit(object):
# Registering the item about to affect the fit allows us to
# track "Affected By" relations correctly
if item is not None:
# apply effects locally
self.register(item)
item.calculateModifiedAttributes(self, runTime, False)
if not self.__calculated:
# apply effects locally if this is first time running them on fit
self.register(item)
item.calculateModifiedAttributes(self, runTime, False)
if projected is True and item not in chain.from_iterable(r):
# apply effects onto target fit
@@ -517,6 +515,9 @@ class Fit(object):
timer.checkpoint('Done with runtime: %s'%runTime)
# Mark fit as calculated
self.__calculated = True
# Only apply projected fits if fit it not projected itself.
if not projected:
for fit in self.projectedFits:

View File

@@ -374,7 +374,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
if shipType is not None:
fitsOnType.add(shipType)
for i in xrange(1, 6):
for i in xrange(1, 10):
shipType = self.getModifiedItemAttr("canFitShipType%d" % i)
if shipType is not None:
fitsOnType.add(shipType)

BIN
eve.db

Binary file not shown.

View File

@@ -25,8 +25,16 @@ licenses = (
"Silk Icons Set by famfamfam.com - Creative Commons Attribution 2.5 License",
"Fat Cow Icons by fatcow.com - Creative Commons Attribution 3.0 License"
)
developers = ("blitzmann \t(Sable Blitzmann)", "cncfanatics \t(Sakari Orisi) (founder)" , "DarkPhoenix \t(Kadesh Priestess) (project lead)", "Darriele \t(Darriele)")
credits = ("Entity (Entity) \t\tCapacitor calculations / EVEAPI python lib / Reverence", "Aurora \t\t\tMaths", "Corollax (Aamrr) \tVarious EOS / pyfa improvements")
developers = (
"blitzmann \t(Sable Blitzmann) (maintainer)",
"cncfanatics \t(Sakari Orisi)" ,
"DarkPhoenix \t(Kadesh Priestess)",
"Darriele \t\t(Darriele)")
credits = (
"Entity (Entity) \tCapacitor calculations / EVEAPI python lib / Reverence",
"Aurora \t\tMaths",
"Corollax (Aamrr) \tVarious EOS / pyfa improvements",
"Dreae (Dreae)\tPyCrest")
description = (
"Pyfa (the Python Fitting Assistant) is an open-source standalone application able to "
"create and simulate fittings for EVE-Online SciFi MMORPG with a very high degree of "

View File

@@ -97,8 +97,8 @@ class PFCrestPref ( PreferenceView):
service.Crest.restartService()
def OnBtnApply(self, event):
self.settings.set('clientID', self.inputClientID.GetValue())
self.settings.set('clientSecret', self.inputClientSecret.GetValue())
self.settings.set('clientID', self.inputClientID.GetValue().strip())
self.settings.set('clientSecret', self.inputClientSecret.GetValue().strip())
sCrest = service.Crest.getInstance()
sCrest.delAllCharacters()

View File

@@ -62,6 +62,8 @@ class PFGeneralPref ( PreferenceView):
self.cbGaugeAnimation = wx.CheckBox( panel, wx.ID_ANY, u"Animate gauges", wx.DefaultPosition, wx.DefaultSize, 0 )
mainSizer.Add( self.cbGaugeAnimation, 0, wx.ALL|wx.EXPAND, 5 )
self.cbExportCharges = wx.CheckBox( panel, wx.ID_ANY, u"Export loaded charges", wx.DefaultPosition, wx.DefaultSize, 0 )
mainSizer.Add( self.cbExportCharges, 0, wx.ALL|wx.EXPAND, 5 )
defCharSizer = wx.BoxSizer( wx.HORIZONTAL )
@@ -78,6 +80,7 @@ class PFGeneralPref ( PreferenceView):
self.cbShowTooltip.SetValue(self.sFit.serviceFittingOptions["showTooltip"] or False)
self.cbMarketShortcuts.SetValue(self.sFit.serviceFittingOptions["showMarketShortcuts"] or False)
self.cbGaugeAnimation.SetValue(self.sFit.serviceFittingOptions["enableGaugeAnimation"])
self.cbExportCharges.SetValue(self.sFit.serviceFittingOptions["exportCharges"])
self.cbGlobalChar.Bind(wx.EVT_CHECKBOX, self.OnCBGlobalCharStateChange)
self.cbGlobalDmgPattern.Bind(wx.EVT_CHECKBOX, self.OnCBGlobalDmgPatternStateChange)
@@ -90,6 +93,7 @@ class PFGeneralPref ( PreferenceView):
self.cbShowTooltip.Bind(wx.EVT_CHECKBOX, self.onCBShowTooltip)
self.cbMarketShortcuts.Bind(wx.EVT_CHECKBOX, self.onCBShowShortcuts)
self.cbGaugeAnimation.Bind(wx.EVT_CHECKBOX, self.onCBGaugeAnimation)
self.cbExportCharges.Bind(wx.EVT_CHECKBOX, self.onCBExportCharges)
self.cbRackLabels.Enable(self.sFit.serviceFittingOptions["rackSlots"] or False)
@@ -152,6 +156,9 @@ class PFGeneralPref ( PreferenceView):
def onCBGaugeAnimation(self, event):
self.sFit.serviceFittingOptions["enableGaugeAnimation"] = self.cbGaugeAnimation.GetValue()
def onCBExportCharges(self, event):
self.sFit.serviceFittingOptions["exportCharges"] = self.cbExportCharges.GetValue()
def getImage(self):
return BitmapLoader.getBitmap("prefs_settings", "gui")

View File

@@ -96,7 +96,7 @@ class PFUpdatePref (PreferenceView):
self.resetButton.Hide()
def OnDownload(self, event):
wx.LaunchDefaultBrowser('https://github.com/DarkFenX/Pyfa/releases/tag/'+self.UpdateSettings.get('version'))
wx.LaunchDefaultBrowser('https://github.com/pyfa-org/Pyfa/releases/tag/'+self.UpdateSettings.get('version'))
def getImage(self):
return BitmapLoader.getBitmap("prefs_update", "gui")

View File

@@ -426,7 +426,7 @@ class Miscellanea(ViewColumn):
ttEntries.append("shield")
tooltip = "{0} repaired per second".format(formatList(ttEntries)).capitalize()
return text, tooltip
elif itemGroup == "Cap Drain Drone":
elif itemGroup == "Energy Neutralizer Drone":
neutAmount = stuff.getModifiedItemAttr("energyDestabilizationAmount")
cycleTime = stuff.getModifiedItemAttr("duration")
if not neutAmount or not cycleTime:

View File

@@ -32,7 +32,7 @@ import gui.globalEvents as GE
class CharacterEditor(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__ (self, parent, id=wx.ID_ANY, title=u"pyfa: Character Editor", pos=wx.DefaultPosition,
size=wx.Size(641, 600), style=wx.DEFAULT_FRAME_STYLE|wx.FRAME_FLOAT_ON_PARENT|wx.TAB_TRAVERSAL)
size=wx.Size(640, 600), style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER)
i = wx.IconFromBitmap(BitmapLoader.getBitmap("character_small", "gui"))
self.SetIcon(i)
@@ -40,7 +40,6 @@ class CharacterEditor(wx.Frame):
self.mainFrame = parent
#self.disableWin = wx.WindowDisabler(self)
self.SetSizeHintsSz(wx.Size(640, 600), wx.DefaultSize)
self.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_BTNFACE ) )
mainSizer = wx.BoxSizer(wx.VERTICAL)
@@ -801,4 +800,4 @@ class SaveCharacterAs(wx.Dialog):
event.Skip()
self.Close()

View File

@@ -326,6 +326,7 @@ class MainFrame(wx.Frame):
def ShowAboutBox(self, evt):
import eos.config
v = sys.version_info
info = wx.AboutDialogInfo()
info.Name = "pyfa"
info.Version = gui.aboutData.versionString
@@ -336,14 +337,14 @@ class MainFrame(wx.Frame):
"\n\nLicenses:\n\t" +
"\n\t".join(gui.aboutData.licenses) +
"\n\nEVE Data: \t" + eos.config.gamedata_version +
"\nPython: \t" + sys.version +
"\nPython: \t\t" + '{}.{}.{}'.format(v.major, v.minor, v.micro) +
"\nwxPython: \t" + wx.__version__ +
"\nSQLAlchemy: \t" + sqlalchemy.__version__,
700, wx.ClientDC(self))
500, wx.ClientDC(self))
if "__WXGTK__" in wx.PlatformInfo:
forumUrl = "http://forums.eveonline.com/default.aspx?g=posts&t=247609"
forumUrl = "http://forums.eveonline.com/default.aspx?g=posts&t=466425"
else:
forumUrl = "http://forums.eveonline.com/default.aspx?g=posts&t=247609"
forumUrl = "http://forums.eveonline.com/default.aspx?g=posts&t=466425"
info.WebSite = (forumUrl, "pyfa thread at EVE Online forum")
wx.AboutBox(info)
@@ -397,10 +398,10 @@ class MainFrame(wx.Frame):
dlg.ShowModal()
def goWiki(self, event):
webbrowser.open('https://github.com/DarkFenX/Pyfa/wiki')
webbrowser.open('https://github.com/pyfa-org/Pyfa/wiki')
def goForums(self, event):
webbrowser.open('https://forums.eveonline.com/default.aspx?g=posts&t=247609')
webbrowser.open('https://forums.eveonline.com/default.aspx?g=posts&t=466425')
def registerMenu(self):
menuBar = self.GetMenuBar()

View File

@@ -108,7 +108,8 @@ class MainMenuBar(wx.MenuBar):
graphFrameItem.SetBitmap(BitmapLoader.getBitmap("graphs_small", "gui"))
windowMenu.AppendItem(graphFrameItem)
preferencesItem = wx.MenuItem(windowMenu, wx.ID_PREFERENCES, "Preferences\tCTRL+P")
preferencesShortCut = "CTRL+," if 'wxMac' in wx.PlatformInfo else "CTRL+P"
preferencesItem = wx.MenuItem(windowMenu, wx.ID_PREFERENCES, "Preferences\t"+preferencesShortCut)
preferencesItem.SetBitmap(BitmapLoader.getBitmap("preferences_small", "gui"))
windowMenu.AppendItem(preferencesItem)

View File

@@ -5,7 +5,7 @@
##
## Author: Darriele - HomeWorld
##
## Project home: http://github.com/DarkFenX/Pyfa - pyfa project
## Project home: https://github.com/pyfa-org/Pyfa - pyfa project
## Some portions of code are based on
## AGW:pycollapsiblepane generic implementation of wx.CollapsiblePane
## AGW:pycollapsiblepane credits ( from the original source file used ):

View File

@@ -116,5 +116,5 @@ class UpdateDialog(wx.Dialog):
self.UpdateSettings.set('version', None)
def OnDownload(self, e):
wx.LaunchDefaultBrowser('https://github.com/DarkFenX/Pyfa/releases/tag/'+self.releaseInfo['tag_name'])
wx.LaunchDefaultBrowser('https://github.com/pyfa-org/Pyfa/releases/tag/'+self.releaseInfo['tag_name'])
self.OnClose(e)

View File

@@ -15,7 +15,7 @@
#define MyAppName "pyfa"
#define MyAppPublisher "pyfa"
#define MyAppURL "https://forums.eveonline.com/default.aspx?g=posts&t=247609&p=1"
#define MyAppURL "https://forums.eveonline.com/default.aspx?g=posts&t=466425&p=1"
#define MyAppExeName "pyfa.exe"
; What version starts with the new structure (1.x.0). This is used to determine if we run directory structure cleanup
@@ -53,7 +53,7 @@ SetupIconFile={#MyAppDir}\pyfa.ico
Compression=lzma
SolidCompression=yes
CloseApplications=yes
AppReadmeFile=https://github.com/DarkFenX/Pyfa/blob/v{#MyAppVersion}/readme.txt
AppReadmeFile=https://github.com/pyfa-org/Pyfa/blob/v{#MyAppVersion}/readme.txt
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

View File

@@ -0,0 +1,10 @@
"""
Conversion pack for January 2016 (YC118.1) release
"""
CONVERSIONS = {
# Renamed items
"Capital Coaxial Remote Armor Repairer Blueprint": "CONCORD Capital Remote Armor Repairer Blueprint",
"Capital Murky Remote Shield Booster Blueprint": "CONCORD Capital Remote Shield Booster Blueprint",
}

View File

@@ -104,7 +104,8 @@ class Fit(object):
"compactSkills": True,
"showTooltip": True,
"showMarketShortcuts": False,
"enableGaugeAnimation": True}
"enableGaugeAnimation": True,
"exportCharges": True}
self.serviceFittingOptions = SettingsProvider.getInstance().getSettings(
"pyfaServiceFittingOptions", serviceFittingDefaultOptions)

View File

@@ -551,12 +551,13 @@ class Port(object):
offineSuffix = " /OFFLINE"
export = "[%s, %s]\n" % (fit.ship.item.name, fit.name)
stuff = {}
sFit = service.Fit.getInstance()
for module in fit.modules:
slot = module.slot
if not slot in stuff:
stuff[slot] = []
curr = module.item.name if module.item else ("[Empty %s slot]" % Slot.getName(slot).capitalize() if slot is not None else "")
if module.charge:
if module.charge and sFit.serviceFittingOptions["exportCharges"]:
curr += ", %s" % module.charge.name
if module.state == State.OFFLINE:
curr += offineSuffix
@@ -664,6 +665,8 @@ class Port(object):
doc = xml.dom.minidom.Document()
fittings = doc.createElement("fittings")
doc.appendChild(fittings)
sFit = service.Fit.getInstance()
for i, fit in enumerate(fits):
try:
fitting = doc.createElement("fitting")
@@ -701,7 +704,7 @@ class Port(object):
hardware.setAttribute("slot", "%s slot %d" % (slotName, slotId))
fitting.appendChild(hardware)
if module.charge:
if module.charge and sFit.serviceFittingOptions["exportCharges"]:
if not module.charge.name in charges:
charges[module.charge.name] = 0
# `or 1` because some charges (ie scripts) are without qty

View File

@@ -37,7 +37,7 @@ class CheckUpdateThread(threading.Thread):
network = service.Network.getInstance()
try:
response = network.request('https://api.github.com/repos/DarkFenX/Pyfa/releases', network.UPDATE)
response = network.request('https://api.github.com/repos/pyfa-org/Pyfa/releases', network.UPDATE)
jsonResponse = json.loads(response.read())
jsonResponse.sort(key=lambda x: calendar.timegm(dateutil.parser.parse(x['published_at']).utctimetuple()), reverse=True)