Merge branch 'development'
Conflicts: eos/db/saveddata/queries.py
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
215
service/fleet.py
215
service/fleet.py
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user