Merge branch 'development'

Conflicts:
	eos/db/saveddata/queries.py
This commit is contained in:
blitzman
2017-01-10 22:42:01 -05:00
20 changed files with 179 additions and 1766 deletions

View File

@@ -5,7 +5,6 @@ from service.character import Character
from service.damagePattern import DamagePattern
from service.targetResists import TargetResists
from service.settings import SettingsProvider
from service.fleet import Fleet
from service.update import Update
from service.price import Price
from service.network import Network

View File

@@ -34,6 +34,8 @@ import service
import config
import logging
from eos.saveddata.character import Character as es_Character
logger = logging.getLogger(__name__)
class CharacterImportThread(threading.Thread):
@@ -45,6 +47,12 @@ class CharacterImportThread(threading.Thread):
def run(self):
paths = self.paths
sCharacter = Character.getInstance()
all5_character = es_Character("All 5", 5)
all_skill_ids = []
for skill in all5_character.skills:
# Parse out the skill item IDs to make searching it easier later on
all_skill_ids.append(skill.itemID)
for path in paths:
try:
# we try to parse api XML data first
@@ -59,19 +67,28 @@ class CharacterImportThread(threading.Thread):
charFile = open(path, mode='r').read()
doc = minidom.parseString(charFile)
if doc.documentElement.tagName not in ("SerializableCCPCharacter", "SerializableUriCharacter"):
logger.error("Incorrect EVEMon XML sheet")
raise RuntimeError("Incorrect EVEMon XML sheet")
name = doc.getElementsByTagName("name")[0].firstChild.nodeValue
skill_els = doc.getElementsByTagName("skill")
skills = []
for skill in skill_els:
skills.append({
"typeID": int(skill.getAttribute("typeID")),
"level": int(skill.getAttribute("level")),
})
if int(skill.getAttribute("typeID")) in all_skill_ids and (0 <= int(skill.getAttribute("level")) <= 5):
skills.append({
"typeID": int(skill.getAttribute("typeID")),
"level": int(skill.getAttribute("level")),
})
else:
logger.error("Attempted to import unknown skill %s (ID: %s) (Level: %s)",
skill.getAttribute("name"),
skill.getAttribute("typeID"),
skill.getAttribute("level"),
)
char = sCharacter.new(name+" (EVEMon)")
sCharacter.apiUpdateCharSheet(char.ID, skills)
except Exception, e:
print e.message
logger.error("Exception on character import:")
logger.error(e)
continue
wx.CallAfter(self.callback)
@@ -255,8 +272,11 @@ class Character(object):
return char
def rename(self, char, newName):
char.name = newName
eos.db.commit()
if char.name in ("All 0", "All 5"):
logger.info("Cannot rename built in characters.")
else:
char.name = newName
eos.db.commit()
def copy(self, char):
newChar = copy.deepcopy(char)

View File

@@ -34,7 +34,6 @@ from eos.types import State, Slot
from service.market import Market
from service.damagePattern import DamagePattern
from service.character import Character
from service.fleet import Fleet
from service.settings import SettingsProvider
from service.port import Port
@@ -177,8 +176,6 @@ class Fit(object):
def deleteFit(self, fitID):
fit = eos.db.getFit(fitID)
sFleet = Fleet.getInstance()
sFleet.removeAssociatedFleetData(fit)
eos.db.remove(fit)
@@ -229,7 +226,8 @@ class Fit(object):
self.recalc(fit, withBoosters=True)
def getFit(self, fitID, projected=False, basic=False):
''' Gets fit from database, and populates fleet data.
''' Gets fit from database
Projected is a recursion flag that is set to reduce recursions into projected fits
Basic is a flag to simply return the fit without any other processing
'''
@@ -243,14 +241,6 @@ class Fit(object):
inited = getattr(fit, "inited", None)
if inited is None or inited is False:
sFleet = Fleet.getInstance()
f = sFleet.getLinearFleet(fit)
if f is None:
sFleet.removeAssociatedFleetData(fit)
fit.fleet = None
else:
fit.fleet = f
if not projected:
for fitP in fit.projectedFits:
self.getFit(fitP.ID, projected=True)

View File

@@ -1,215 +0,0 @@
#===============================================================================
# Copyright (C) 2010 Diego Duclos
#
# This file is part of pyfa.
#
# pyfa is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# pyfa is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with pyfa. If not, see <http://www.gnu.org/licenses/>.
#===============================================================================
import eos.db
from eos.types import Fleet as Fleet_, Wing, Squad
import copy
class Fleet(object):
instance = None
@classmethod
def getInstance(cls):
if cls.instance is None:
cls.instance = Fleet()
return cls.instance
def __init__(self):
pass
def getFleetList(self):
fleetList = []
fleets = eos.db.getFleetList()
for fleet in fleets:
fleetList.append((fleet.ID, fleet.name, fleet.count()))
return fleetList
def getFleetByID(self, ID):
f = eos.db.getFleet(ID)
return f
def addFleet(self):
f = Fleet_()
eos.db.save(f)
return f
def renameFleet(self, fleet, newName):
fleet.name = newName
eos.db.commit()
def copyFleet(self, fleet):
newFleet = copy.deepcopy(fleet)
eos.db.save(newFleet)
return newFleet
def copyFleetByID(self, ID):
fleet = self.getFleetByID(ID)
return self.copyFleet(fleet)
def deleteFleet(self, fleet):
eos.db.remove(fleet)
def deleteFleetByID(self, ID):
fleet = self.getFleetByID(ID)
self.deleteFleet(fleet)
def makeLinearFleet(self, fit):
f = Fleet_()
w = Wing()
f.wings.append(w)
s = Squad()
w.squads.append(s)
s.members.append(fit)
fit.fleet = f
eos.db.save(f)
def setLinearFleetCom(self, boostee, booster):
#if boostee == booster:
# return
if self.getLinearFleet(boostee) is None:
self.removeAssociatedFleetData(boostee)
self.makeLinearFleet(boostee)
squadIDs = set(eos.db.getSquadsIDsWithFitID(boostee.ID))
squad = eos.db.getSquad(squadIDs.pop())
if squad.wing.gang.leader is not None and booster is None:
try:
squad.wing.gang.leader.boostsFits.remove(boostee.ID)
except KeyError:
pass
squad.wing.gang.leader = booster
if self.anyBoosters(squad) is False:
self.removeAssociatedFleetData(boostee)
from service.fit import Fit
sFit = Fit.getInstance()
sFit.recalc(boostee, withBoosters=True)
def setLinearWingCom(self, boostee, booster):
#if boostee == booster:
# return
if self.getLinearFleet(boostee) is None:
self.removeAssociatedFleetData(boostee)
self.makeLinearFleet(boostee)
squadIDs = set(eos.db.getSquadsIDsWithFitID(boostee.ID))
squad = eos.db.getSquad(squadIDs.pop())
if squad.wing.leader is not None and booster is None:
try:
squad.wing.leader.boostsFits.remove(boostee.ID)
except KeyError:
pass
squad.wing.leader = booster
if self.anyBoosters(squad) is False:
self.removeAssociatedFleetData(boostee)
from service.fit import Fit
sFit = Fit.getInstance()
sFit.recalc(boostee, withBoosters=True)
def setLinearSquadCom(self, boostee, booster):
#if boostee == booster:
# return
if self.getLinearFleet(boostee) is None:
self.removeAssociatedFleetData(boostee)
self.makeLinearFleet(boostee)
squadIDs = set(eos.db.getSquadsIDsWithFitID(boostee.ID))
squad = eos.db.getSquad(squadIDs.pop())
if squad.leader is not None and booster is None:
try:
squad.leader.boostsFits.remove(boostee.ID)
except KeyError:
pass
squad.leader = booster
if self.anyBoosters(squad) is False:
self.removeAssociatedFleetData(boostee)
from service.fit import Fit
sFit = Fit.getInstance()
sFit.recalc(boostee, withBoosters=True)
def getLinearFleet(self, fit):
sqIDs = eos.db.getSquadsIDsWithFitID(fit.ID)
if len(sqIDs) != 1:
return None
s = eos.db.getSquad(sqIDs[0])
if len(s.members) != 1:
return None
w = s.wing
if len(w.squads) != 1:
return None
f = w.gang
if len(f.wings) != 1:
return None
return f
def removeAssociatedFleetData(self, fit):
squadIDs = set(eos.db.getSquadsIDsWithFitID(fit.ID))
if len(squadIDs) == 0:
return
squads = list(eos.db.getSquad(sqID) for sqID in squadIDs)
wingIDs = set(squad.wing.ID for squad in squads)
fleetIDs = set(squad.wing.gang.ID for squad in squads)
for fleetID in fleetIDs:
fleet = eos.db.getFleet(fleetID)
for wing in fleet.wings:
wingIDs.add(wing.ID)
for wingID in wingIDs:
wing = eos.db.getWing(wingID)
for squad in wing.squads:
squadIDs.add(squad.ID)
for squadID in squadIDs:
squad = eos.db.getSquad(squadID)
if squad.leader is not None:
try:
squad.leader.boostsFits.remove(fit.ID)
except KeyError:
pass
eos.db.remove(squad)
for wingID in wingIDs:
wing = eos.db.getWing(wingID)
if wing.leader is not None:
try:
wing.leader.boostsFits.remove(fit.ID)
except KeyError:
pass
eos.db.remove(wing)
for fleetID in fleetIDs:
fleet = eos.db.getFleet(fleetID)
if fleet.leader is not None:
try:
fleet.leader.boostsFits.remove(fit.ID)
except KeyError:
pass
eos.db.remove(fleet)
fit.fleet = None
return
def anyBoosters(self, squad):
wing = squad.wing
fleet = wing.gang
if squad.leader is None and wing.leader is None and fleet.leader is None:
return False
return True
def loadLinearFleet(self, fit):
if self.getLinearFleet(fit) is None:
return None
squadID = eos.db.getSquadsIDsWithFitID(fit.ID)[0]
s = eos.db.getSquad(squadID)
w = s.wing
f = w.gang
return (f.leader, w.leader, s.leader)

View File

@@ -406,7 +406,12 @@ class Port(object):
cargoMap[modName] = 0
cargoMap[modName] += extraAmount
elif item.category.name == "Implant":
fit.implants.append(Implant(item))
if "implantness" in item.attributes:
fit.implants.append(Implant(item))
elif "boosterness" in item.attributes:
fit.boosters.append(Booster(item))
else:
logger.error("Failed to import implant: %s", line)
# elif item.category.name == "Subsystem":
# try:
# subsystem = Module(item)

View File

@@ -23,6 +23,11 @@ import os
import eos.types
import eos.db.migration as migration
from eos.db.saveddata.loadDefaultDatabaseValues import DefaultDatabaseValues
from eos.db.saveddata.databaseRepair import DatabaseCleanup
import logging
logger = logging.getLogger(__name__)
class PrefetchThread(threading.Thread):
def run(self):
@@ -55,6 +60,14 @@ if os.path.isfile(config.saveDB):
# Import default database values
# Import values that must exist otherwise Pyfa breaks
DefaultDatabaseValues.importRequiredDefaults()
logging.debug("Starting database validation.")
database_cleanup_instance = DatabaseCleanup()
database_cleanup_instance.OrphanedCharacterSkills(eos.db.saveddata_engine)
database_cleanup_instance.OrphanedFitCharacterIDs(eos.db.saveddata_engine)
database_cleanup_instance.OrphanedFitDamagePatterns(eos.db.saveddata_engine)
logging.debug("Completed database validation.")
else:
# If database does not exist, do not worry about migration. Simply
# create and set version
@@ -67,4 +80,3 @@ else:
DefaultDatabaseValues.importDamageProfileDefaults()
# Import default values for target resist profiles
DefaultDatabaseValues.importResistProfileDefaults()