diff --git a/eos/db/saveddata/character.py b/eos/db/saveddata/character.py index 850c41c6e..4dd84cf41 100644 --- a/eos/db/saveddata/character.py +++ b/eos/db/saveddata/character.py @@ -23,7 +23,7 @@ import datetime from eos.db import saveddata_meta from eos.db.saveddata.implant import charImplants_table -from eos.effectHandlerHelpers import HandledImplantBoosterList, HandledSsoCharacterList +from eos.effectHandlerHelpers import HandledImplantList, HandledSsoCharacterList from eos.saveddata.implant import Implant from eos.saveddata.user import User from eos.saveddata.character import Character, Skill @@ -75,7 +75,7 @@ mapper(Character, characters_table, cascade="all,delete-orphan"), "_Character__implants" : relation( Implant, - collection_class=HandledImplantBoosterList, + collection_class=HandledImplantList, cascade='all,delete-orphan', backref='character', single_parent=True, diff --git a/eos/db/saveddata/fit.py b/eos/db/saveddata/fit.py index dbee2c622..efdac1c76 100644 --- a/eos/db/saveddata/fit.py +++ b/eos/db/saveddata/fit.py @@ -31,7 +31,7 @@ from eos.db.saveddata.drone import drones_table from eos.db.saveddata.fighter import fighters_table from eos.db.saveddata.implant import fitImplants_table from eos.db.saveddata.module import modules_table -from eos.effectHandlerHelpers import HandledDroneCargoList, HandledImplantBoosterList, HandledModuleList, HandledProjectedDroneList, HandledProjectedModList +from eos.effectHandlerHelpers import HandledDroneCargoList, HandledImplantList, HandledBoosterList, HandledModuleList, HandledProjectedDroneList, HandledProjectedModList from eos.saveddata.booster import Booster from eos.saveddata.cargo import Cargo from eos.saveddata.character import Character @@ -183,7 +183,7 @@ mapper(es_Fit, fits_table, "shipID": fits_table.c.shipID, "_Fit__boosters": relation( Booster, - collection_class=HandledImplantBoosterList, + collection_class=HandledBoosterList, cascade='all, delete, delete-orphan', backref='owner', single_parent=True), @@ -219,7 +219,7 @@ mapper(es_Fit, fits_table, primaryjoin=and_(fighters_table.c.fitID == fits_table.c.ID, fighters_table.c.projected == True)), # noqa "_Fit__implants": relation( Implant, - collection_class=HandledImplantBoosterList, + collection_class=HandledImplantList, cascade='all, delete, delete-orphan', backref='owner', single_parent=True, diff --git a/eos/db/saveddata/implantSet.py b/eos/db/saveddata/implantSet.py index 369f04760..1618fa244 100644 --- a/eos/db/saveddata/implantSet.py +++ b/eos/db/saveddata/implantSet.py @@ -23,7 +23,7 @@ import datetime from eos.db import saveddata_meta from eos.db.saveddata.implant import implantsSetMap_table -from eos.effectHandlerHelpers import HandledImplantBoosterList +from eos.effectHandlerHelpers import HandledImplantList from eos.saveddata.implant import Implant from eos.saveddata.implantSet import ImplantSet @@ -38,7 +38,7 @@ mapper(ImplantSet, implant_set_table, properties={ "_ImplantSet__implants": relation( Implant, - collection_class=HandledImplantBoosterList, + collection_class=HandledImplantList, cascade='all, delete, delete-orphan', backref='set', single_parent=True, diff --git a/eos/effectHandlerHelpers.py b/eos/effectHandlerHelpers.py index efe4d7e38..8732f67aa 100644 --- a/eos/effectHandlerHelpers.py +++ b/eos/effectHandlerHelpers.py @@ -211,7 +211,8 @@ class HandledDroneCargoList(HandledList): self.remove(thing) -class HandledImplantBoosterList(HandledList): +class HandledImplantList(HandledList): + def append(self, thing): if thing.isInvalid: HandledList.append(self, thing) @@ -234,6 +235,32 @@ class HandledImplantBoosterList(HandledList): return None +class HandledBoosterList(HandledList): + + def append(self, thing): + if thing.isInvalid: + HandledList.append(self, thing) + self.remove(thing) + return + + self.makeRoom(thing) + HandledList.append(self, thing) + + def makeRoom(self, thing): + # if needed, remove booster that was occupying slot + oldObj = next((m for m in self if m.slot == thing.slot), None) + if oldObj: + pyfalog.info("Slot {0} occupied with {1}, replacing with {2}", thing.slot, oldObj.item.name, + thing.item.name) + itemID = oldObj.itemID + state = oldObj.active + sideEffects = {se.effectID: se.active for se in oldObj.sideEffects} + oldObj.itemID = 0 # hack to remove from DB. See GH issue #324 + self.remove(oldObj) + return itemID, state, sideEffects + return None, None, None + + class HandledSsoCharacterList(list): def append(self, character): old = next((x for x in self if x.client == character.client), None) diff --git a/eos/saveddata/character.py b/eos/saveddata/character.py index 7fc112d71..f05b74b2c 100644 --- a/eos/saveddata/character.py +++ b/eos/saveddata/character.py @@ -27,7 +27,7 @@ from sqlalchemy.orm import validates, reconstructor import eos import eos.db import eos.config -from eos.effectHandlerHelpers import HandledItem, HandledImplantBoosterList +from eos.effectHandlerHelpers import HandledItem, HandledImplantList pyfalog = Logger(__name__) @@ -51,7 +51,7 @@ class Character(object): for item in self.getSkillList(): self.addSkill(Skill(self, item.ID, self.defaultLevel)) - self.__implants = HandledImplantBoosterList() + self.__implants = HandledImplantList() @reconstructor def init(self): diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index c31c17696..cac16af50 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -27,7 +27,7 @@ from sqlalchemy.orm import validates, reconstructor import eos.db from eos import capSim -from eos.effectHandlerHelpers import HandledModuleList, HandledDroneCargoList, HandledImplantBoosterList, HandledProjectedDroneList, HandledProjectedModList +from eos.effectHandlerHelpers import HandledModuleList, HandledDroneCargoList, HandledImplantList, HandledBoosterList, HandledProjectedDroneList, HandledProjectedModList from eos.const import ImplantLocation, CalcType, FittingSlot from eos.saveddata.ship import Ship from eos.saveddata.drone import Drone @@ -57,8 +57,8 @@ class Fit(object): self.__drones = HandledDroneCargoList() self.__fighters = HandledDroneCargoList() self.__cargo = HandledDroneCargoList() - self.__implants = HandledImplantBoosterList() - self.__boosters = HandledImplantBoosterList() + self.__implants = HandledImplantList() + self.__boosters = HandledBoosterList() # self.__projectedFits = {} self.__projectedModules = HandledProjectedModList() self.__projectedDrones = HandledProjectedDroneList() diff --git a/eos/saveddata/implantSet.py b/eos/saveddata/implantSet.py index 46b6876c3..8b996e183 100644 --- a/eos/saveddata/implantSet.py +++ b/eos/saveddata/implantSet.py @@ -19,13 +19,13 @@ from copy import deepcopy -from eos.effectHandlerHelpers import HandledImplantBoosterList +from eos.effectHandlerHelpers import HandledImplantList class ImplantSet(object): def __init__(self, name=None): self.name = name - self.__implants = HandledImplantBoosterList() + self.__implants = HandledImplantList() @property def implants(self): diff --git a/gui/fitCommands/calc/fitAddBooster.py b/gui/fitCommands/calc/fitAddBooster.py index 3295c88cc..11a53c1ef 100644 --- a/gui/fitCommands/calc/fitAddBooster.py +++ b/gui/fitCommands/calc/fitAddBooster.py @@ -9,49 +9,52 @@ class FitAddBoosterCommand(wx.Command): """" from sFit.addBooster """ - def __init__(self, fitID, itemID, state=None, sideEffects=None): + def __init__(self, fitID, itemID, state, sideEffects): wx.Command.__init__(self, True) self.fitID = fitID - self.itemID = itemID - self.state = state - self.sideEffects = sideEffects - self.new_index = None - self.old_item = None + self.newItemID = itemID + self.newState = state + self.newSideEffects = sideEffects + self.newIndex = None + self.oldItemID = None + self.oldState = None + self.oldSideEffects = None def Do(self): - pyfalog.debug("Adding booster ({0}) to fit ID: {1}", self.itemID, self.fitID) + pyfalog.debug("Adding booster ({0}) to fit ID: {1}", self.newItemID, self.fitID) fit = eos.db.getFit(self.fitID) - item = eos.db.getItem(self.itemID, eager="attributes") + item = eos.db.getItem(self.newItemID, eager="attributes") - if next((x for x in fit.boosters if x.itemID == self.itemID), None): + if next((x for x in fit.boosters if x.itemID == self.newItemID), None): return False # already have item in list of boosters try: booster = Booster(item) except ValueError: - pyfalog.warning("Invalid item: {0}", self.itemID) + pyfalog.warning("Invalid item: {0}", self.newItemID) return False - if self.state is not None: - booster.active = self.state - if self.sideEffects is not None: + if self.newState is not None: + booster.active = self.newState + if self.newSideEffects is not None: for sideEffect in booster.sideEffects: - sideEffect.active = self.sideEffects.get(sideEffect.effectID, False) + sideEffect.active = self.newSideEffects.get(sideEffect.effectID, False) - self.old_item = fit.boosters.makeRoom(booster) + + self.oldItemID, self.oldState, self.oldSideEffects = fit.boosters.makeRoom(booster) fit.boosters.append(booster) - self.new_index = fit.boosters.index(booster) + self.newIndex = fit.boosters.index(booster) return True def Undo(self): - if self.old_item: + if self.oldItemID: # If we had an item in the slot previously, add it back. - cmd = FitAddBoosterCommand(self.fitID, self.old_item) + cmd = FitAddBoosterCommand(self.fitID, self.oldItemID, self.oldState, self.oldSideEffects) cmd.Do() return True from .fitRemoveBooster import FitRemoveBoosterCommand # Avoid circular import - cmd = FitRemoveBoosterCommand(self.fitID, self.new_index) + cmd = FitRemoveBoosterCommand(self.fitID, self.newIndex) cmd.Do() return True