From 51696c509fee3f560fac383ddc2cdc8e113e2662 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Wed, 1 Jul 2015 20:54:40 -0400 Subject: [PATCH] Merged Cargo and Drone collection class (essentially the same). Utilized SQLAlchemy's `flag_modified()` to force SA to update DB (in this case, remove the entry) --- eos/db/saveddata/fit.py | 8 +++---- eos/effectHandlerHelpers.py | 45 ++++++++++++------------------------- eos/saveddata/fit.py | 7 +++--- 3 files changed, 20 insertions(+), 40 deletions(-) diff --git a/eos/db/saveddata/fit.py b/eos/db/saveddata/fit.py index 6dfea588b..478a576a6 100644 --- a/eos/db/saveddata/fit.py +++ b/eos/db/saveddata/fit.py @@ -27,9 +27,7 @@ from eos.db.saveddata.drone import drones_table from eos.db.saveddata.cargo import cargo_table from eos.db.saveddata.implant import fitImplants_table from eos.types import Fit, Module, User, Booster, Drone, Cargo, Implant, Character, DamagePattern, TargetResists -from eos.effectHandlerHelpers import HandledModuleList, HandledDroneList, \ -HandledImplantBoosterList, HandledProjectedModList, HandledProjectedDroneList, \ -HandledProjectedFitList, HandledCargoList +from eos.effectHandlerHelpers import * fits_table = Table("fits", saveddata_meta, Column("ID", Integer, primary_key = True), @@ -56,9 +54,9 @@ mapper(Fit, fits_table, primaryjoin = and_(modules_table.c.fitID == fits_table.c.ID, modules_table.c.projected == True)), "owner" : relation(User, backref = "fits"), "_Fit__boosters" : relation(Booster, collection_class = HandledImplantBoosterList, cascade='all, delete, delete-orphan', single_parent=True), - "_Fit__drones" : relation(Drone, collection_class = HandledDroneList, cascade='all, delete, delete-orphan', single_parent=True, + "_Fit__drones" : relation(Drone, collection_class = HandledDroneCargoList, cascade='all, delete, delete-orphan', single_parent=True, primaryjoin = and_(drones_table.c.fitID == fits_table.c.ID, drones_table.c.projected == False)), - "_Fit__cargo" : relation(Cargo, collection_class = HandledCargoList, cascade='all, delete, delete-orphan', single_parent=True, + "_Fit__cargo" : relation(Cargo, collection_class = HandledDroneCargoList, cascade='all, delete, delete-orphan', single_parent=True, primaryjoin = and_(cargo_table.c.fitID == fits_table.c.ID)), "_Fit__projectedDrones" : relation(Drone, collection_class = HandledProjectedDroneList, cascade='all, delete, delete-orphan', single_parent=True, primaryjoin = and_(drones_table.c.fitID == fits_table.c.ID, drones_table.c.projected == True)), diff --git a/eos/effectHandlerHelpers.py b/eos/effectHandlerHelpers.py index df2addf16..be669a24a 100644 --- a/eos/effectHandlerHelpers.py +++ b/eos/effectHandlerHelpers.py @@ -17,6 +17,7 @@ # along with eos. If not, see . #=============================================================================== +from sqlalchemy.orm.attributes import flag_modified import eos.db import eos.types @@ -153,41 +154,23 @@ class HandledModuleList(HandledList): if mod.getModifiedItemAttr("subSystemSlot") == slot: del self[i] -class HandledDroneList(HandledList): +class HandledDroneCargoList(HandledList): def find(self, item): - for d in self: - if d.item == item: - yield d + for o in self: + if o.item == item: + yield o def findFirst(self, item): - for d in self.find(item): - return d + for o in self.find(item): + return o - def append(self, drone): - HandledList.append(self, drone) - - if drone.isInvalid: - # @todo figure out why this DOES NOT remove drone from database - self.remove(drone) - - -class HandledCargoList(HandledList): - def find(self, item): - for d in self: - if d.item == item: - yield d - - def findFirst(self, item): - for d in self.find(item): - return d - - def append(self, cargo): - HandledList.append(self, cargo) - - if cargo.isInvalid: - # @todo figure out why this DOES NOT remove the cargo from database - self.remove(cargo) + def append(self, obj): + HandledList.append(self, obj) + if obj.isInvalid: + # we must flag it as modified, otherwise it will not be removed from the database + flag_modified(obj, "itemID") + self.remove(obj) class HandledImplantBoosterList(HandledList): def __init__(self): @@ -251,7 +234,7 @@ class HandledProjectedModList(HandledList): if not proj.item.isType("projected") and not isSystemEffect: self.remove(proj) -class HandledProjectedDroneList(HandledDroneList): +class HandledProjectedDroneList(HandledDroneCargoList): def append(self, proj): proj.projected = True HandledList.append(self, proj) diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index f8328371f..12cf1a7bd 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -17,8 +17,7 @@ # along with eos. If not, see . #=============================================================================== -from eos.effectHandlerHelpers import HandledList, HandledModuleList, HandledDroneList, HandledImplantBoosterList, \ -HandledProjectedFitList, HandledProjectedModList, HandledProjectedDroneList, HandledCargoList +from eos.effectHandlerHelpers import * from eos.modifiedAttributeDict import ModifiedAttributeDict from sqlalchemy.orm import validates, reconstructor from itertools import chain @@ -50,8 +49,8 @@ class Fit(object): def __init__(self): self.__modules = HandledModuleList() - self.__drones = HandledDroneList() - self.__cargo = HandledCargoList() + self.__drones = HandledDroneCargoList() + self.__cargo = HandledDroneCargoList() self.__implants = HandledImplantBoosterList() self.__boosters = HandledImplantBoosterList() self.__projectedFits = HandledProjectedFitList()