diff --git a/eos/db/gamedata/item.py b/eos/db/gamedata/item.py index 2683a41e9..16f1fd134 100644 --- a/eos/db/gamedata/item.py +++ b/eos/db/gamedata/item.py @@ -25,7 +25,7 @@ from sqlalchemy.orm.collections import attribute_mapped_collection from eos.db import gamedata_meta from eos.db.gamedata.dynamicAttributes import dynamicApplicable_table from eos.db.gamedata.effect import typeeffects_table -from eos.gamedata import Attribute, DynamicItem, Effect, Group, Item, MetaType, Traits +from eos.gamedata import Attribute, DynamicItem, Effect, Group, Item, Traits, MetaGroup items_table = Table("invtypes", gamedata_meta, Column("typeID", Integer, primary_key=True), @@ -41,9 +41,11 @@ items_table = Table("invtypes", gamedata_meta, Column("iconID", Integer), Column("graphicID", Integer), Column("groupID", Integer, ForeignKey("invgroups.groupID"), index=True), + Column("metaLevel", Integer), + Column("metaGroupID", Integer, ForeignKey("invmetagroups.metaGroupID"), index=True), + Column("variationParentTypeID", Integer, ForeignKey("invtypes.typeID"), index=True), Column("replacements", String)) -from .metaGroup import metatypes_table # noqa from .traits import traits_table # noqa mapper(Item, items_table, @@ -51,9 +53,8 @@ mapper(Item, items_table, "group" : relation(Group, backref=backref("items", cascade="all,delete")), "_Item__attributes": relation(Attribute, cascade='all, delete, delete-orphan', collection_class=attribute_mapped_collection('name')), "effects": relation(Effect, secondary=typeeffects_table, collection_class=attribute_mapped_collection('name')), - "metaGroup" : relation(MetaType, - primaryjoin=metatypes_table.c.typeID == items_table.c.typeID, - uselist=False), + "metaGroup" : relation(MetaGroup, backref=backref("items", cascade="all,delete")), + "varParent" : relation(Item, backref=backref("varChildren", cascade="all,delete"), remote_side=items_table.c.typeID), "ID" : synonym("typeID"), "name" : synonym("typeName"), "description" : deferred(items_table.c.description), @@ -64,7 +65,6 @@ mapper(Item, items_table, primaryjoin=dynamicApplicable_table.c.applicableTypeID == items_table.c.typeID, secondaryjoin=dynamicApplicable_table.c.typeID == DynamicItem.typeID, secondary=dynamicApplicable_table, - backref="applicableItems") - }) + backref="applicableItems")}) Item.category = association_proxy("group", "category") diff --git a/eos/db/gamedata/metaGroup.py b/eos/db/gamedata/metaGroup.py index 3c044a1cf..05221c44d 100644 --- a/eos/db/gamedata/metaGroup.py +++ b/eos/db/gamedata/metaGroup.py @@ -17,35 +17,17 @@ # along with eos. If not, see . # =============================================================================== -from sqlalchemy import Table, Column, Integer, ForeignKey, String -from sqlalchemy.ext.associationproxy import association_proxy -from sqlalchemy.orm import relation, mapper, synonym +from sqlalchemy import Table, Column, Integer, String +from sqlalchemy.orm import mapper, synonym from eos.db import gamedata_meta -from eos.db.gamedata.item import items_table -from eos.gamedata import Item, MetaGroup, MetaType +from eos.gamedata import MetaGroup metagroups_table = Table("invmetagroups", gamedata_meta, Column("metaGroupID", Integer, primary_key=True), Column("metaGroupName", String)) -metatypes_table = Table("invmetatypes", gamedata_meta, - Column("typeID", Integer, ForeignKey("invtypes.typeID"), primary_key=True), - Column("parentTypeID", Integer, ForeignKey("invtypes.typeID")), - Column("metaGroupID", Integer, ForeignKey("invmetagroups.metaGroupID"))) - mapper(MetaGroup, metagroups_table, properties={ "ID" : synonym("metaGroupID"), - "name": synonym("metaGroupName") - }) - -mapper(MetaType, metatypes_table, - properties={ - "ID" : synonym("metaGroupID"), - "parent": relation(Item, primaryjoin=metatypes_table.c.parentTypeID == items_table.c.typeID), - "items" : relation(Item, primaryjoin=metatypes_table.c.typeID == items_table.c.typeID), - "info" : relation(MetaGroup, lazy=False) - }) - -MetaType.name = association_proxy("info", "name") + "name": synonym("metaGroupName")}) diff --git a/eos/db/gamedata/queries.py b/eos/db/gamedata/queries.py index 4bd165c35..02423f3ab 100644 --- a/eos/db/gamedata/queries.py +++ b/eos/db/gamedata/queries.py @@ -23,8 +23,8 @@ from sqlalchemy.sql import and_, or_, select import eos.config from eos.db import gamedata_session +from eos.db.gamedata.item import items_table from eos.db.gamedata.group import groups_table -from eos.db.gamedata.metaGroup import items_table, metatypes_table from eos.db.util import processEager, processWhere from eos.gamedata import AlphaClone, Attribute, AttributeInfo, Category, DynamicItem, Group, Item, MarketGroup, MetaData, MetaGroup @@ -342,11 +342,9 @@ def getVariations(itemids, groupIDs=None, where=None, eager=None): if len(itemids) == 0: return [] - itemfilter = or_(*(metatypes_table.c.parentTypeID == itemid for itemid in itemids)) + itemfilter = or_(*(items_table.c.variationParentTypeID == itemid for itemid in itemids)) filter = processWhere(itemfilter, where) - joinon = items_table.c.typeID == metatypes_table.c.typeID - vars = gamedata_session.query(Item).options(*processEager(eager)).join((metatypes_table, joinon)).filter( - filter).all() + vars = gamedata_session.query(Item).options(*processEager(eager)).filter(filter).all() if vars: return vars diff --git a/eos/gamedata.py b/eos/gamedata.py index 8041f78b9..bdd7b3a1d 100644 --- a/eos/gamedata.py +++ b/eos/gamedata.py @@ -609,10 +609,6 @@ class MetaGroup(EqBase): pass -class MetaType(EqBase): - pass - - class Unit(EqBase): def __init__(self): diff --git a/eve.db b/eve.db index 57397c877..16c419360 100644 Binary files a/eve.db and b/eve.db differ diff --git a/gui/builtinContextMenus/fitAddCurrentlyOpen.py b/gui/builtinContextMenus/fitAddCurrentlyOpen.py index b29998cd6..335523c9d 100644 --- a/gui/builtinContextMenus/fitAddCurrentlyOpen.py +++ b/gui/builtinContextMenus/fitAddCurrentlyOpen.py @@ -1,7 +1,6 @@ # noinspection PyPackageRequirements import wx -import gui.fitCommands as cmd import gui.mainFrame from gui.builtinViews.emptyView import BlankPage from gui.contextMenu import ContextMenuUnconditional diff --git a/gui/builtinContextMenus/itemVariationChange.py b/gui/builtinContextMenus/itemVariationChange.py index 026876e64..9b8423fc9 100644 --- a/gui/builtinContextMenus/itemVariationChange.py +++ b/gui/builtinContextMenus/itemVariationChange.py @@ -56,9 +56,7 @@ class ChangeItemToVariation(ContextMenuCombined): fit = sFit.getFit(self.mainFrame.getActiveFit()) def get_metalevel(x): - if 'metaLevel' not in x.attributes: - return 0 - return x.attributes['metaLevel'].value + return x.metaLevel or 0 def get_metagroup(x): # We want deadspace before officer mods diff --git a/gui/builtinItemStatsViews/itemCompare.py b/gui/builtinItemStatsViews/itemCompare.py index 37acc7351..97ebff68d 100644 --- a/gui/builtinItemStatsViews/itemCompare.py +++ b/gui/builtinItemStatsViews/itemCompare.py @@ -9,7 +9,7 @@ from gui.utils.numberFormatter import formatAmount def defaultSort(item): - return (item.attributes['metaLevel'].value if 'metaLevel' in item.attributes else 0, item.name) + return (item.metaLevel or 0, item.name) class ItemCompare(wx.Panel): diff --git a/gui/builtinMarketBrowser/itemView.py b/gui/builtinMarketBrowser/itemView.py index 5e020704d..984a746bf 100644 --- a/gui/builtinMarketBrowser/itemView.py +++ b/gui/builtinMarketBrowser/itemView.py @@ -215,7 +215,7 @@ class ItemView(Display): # Get position of market group metagrpid = sMkt.getMetaGroupIdByItem(item) metatab = self.metaMap.get(metagrpid) - metalvl = self.metalvls.get(item.ID, 0) + metalvl = item.metaLevel or 0 return catname, mktgrpid, parentname, metatab, metalvl, item.name @@ -237,11 +237,6 @@ class ItemView(Display): def populate(self, items): if len(items) > 0: - # Get dictionary with meta level attribute - sAttr = Attribute.getInstance() - attrs = sAttr.getAttributeInfo("metaLevel") - sMkt = self.sMkt - self.metalvls = sMkt.directAttrRequest(items, attrs) # Clear selection self.unselectAll() # Perform sorting, using item's meta levels besides other stuff @@ -254,11 +249,6 @@ class ItemView(Display): def refresh(self, items): if len(items) > 1: - # Get dictionary with meta level attribute - sAttr = Attribute.getInstance() - attrs = sAttr.getAttributeInfo("metaLevel") - sMkt = self.sMkt - self.metalvls = sMkt.directAttrRequest(items, attrs) # Re-sort stuff if self.marketBrowser.mode != 'recent': items.sort(key=self.itemSort) diff --git a/scripts/jsonToSql.py b/scripts/jsonToSql.py index caab1d184..c356e84ba 100755 --- a/scripts/jsonToSql.py +++ b/scripts/jsonToSql.py @@ -56,15 +56,14 @@ def main(db, json_path): # Config dict tables = { 'clonegrades': ('fsd_lite', eos.gamedata.AlphaCloneSkill), - 'dgmattribs': ('bulkdata', eos.gamedata.AttributeInfo), - 'dgmeffects': ('bulkdata', eos.gamedata.Effect), - 'dgmtypeattribs': ('bulkdata', eos.gamedata.Attribute), - 'dgmtypeeffects': ('bulkdata', eos.gamedata.ItemEffect), - 'dgmunits': ('bulkdata', eos.gamedata.Unit), + 'dogmaattributes': ('bulkdata', eos.gamedata.AttributeInfo), + 'dogmaeffects': ('bulkdata', eos.gamedata.Effect), + 'dogmatypeattributes': ('bulkdata', eos.gamedata.Attribute), + 'dogmatypeeffects': ('bulkdata', eos.gamedata.ItemEffect), + 'dogmaunits': ('bulkdata', eos.gamedata.Unit), 'evecategories': ('fsd_lite', eos.gamedata.Category), 'evegroups': ('fsd_lite', eos.gamedata.Group), - 'invmetagroups': ('bulkdata', eos.gamedata.MetaGroup), - 'invmetatypes': ('bulkdata', eos.gamedata.MetaType), + 'metagroups': ('fsd_binary', eos.gamedata.MetaGroup), 'evetypes': ('fsd_lite', eos.gamedata.Item), 'traits': ('phobos', eos.gamedata.Traits), 'metadata': ('phobos', eos.gamedata.MetaData), @@ -73,13 +72,16 @@ def main(db, json_path): fieldMapping = { 'marketgroups': { 'id': 'marketGroupID', - 'name': 'marketGroupName'}} + 'name': 'marketGroupName'}, + 'metagroups': { + 'id': 'metaGroupID'}} rowsInValues = ( 'evetypes', 'evegroups', 'evecategories', - 'marketgroups') + 'marketgroups', + 'metagroups') def convertIcons(data): new = [] @@ -176,13 +178,13 @@ def main(db, json_path): # Get data on item effects # Format: {type ID: set(effect, IDs)} typesEffects = {} - for row in tables['dgmtypeeffects']: + for row in tables['dogmatypeeffects']: typesEffects.setdefault(row['typeID'], set()).add(row['effectID']) # Get data on type attributes # Format: {type ID: {attribute ID: attribute value}} typesNormalAttribs = {} typesSkillAttribs = {} - for row in tables['dgmtypeattribs']: + for row in tables['dogmatypeattributes']: attributeID = row['attributeID'] if attributeID in skillReqAttribsFlat: typeSkillAttribs = typesSkillAttribs.setdefault(row['typeID'], {}) @@ -304,7 +306,7 @@ def main(db, json_path): # group Ship Modifiers, for items like tactical t3 ship modes row['groupID'] == 1306 or # Civilian weapons - row['typeName'].startswith('Civilian') or + (row['typeName'].startswith('Civilian') and "Shuttle" not in row['typeName']) or # Micro Bombs (Fighters) row['typeID'] in (41549, 41548, 41551, 41550) or # Abyssal weather (environment) @@ -321,7 +323,7 @@ def main(db, json_path): # ignore checker def isIgnored(file, row): - if file in ('evetypes', 'dgmtypeeffects', 'dgmtypeattribs', 'invmetatypes') and row['typeID'] not in eveTypes: + if file in ('evetypes', 'dogmatypeeffects', 'dogmatypeattributes') and row['typeID'] not in eveTypes: return True return False @@ -338,7 +340,7 @@ def main(db, json_path): if ( jsonName == 'evetypes' and ( # Apparently people really want Civilian modules available - row['typeName'].startswith('Civilian') or + (row['typeName'].startswith('Civilian') and "Shuttle" not in row['typeName']) or row['typeName'] in ('Capsule', 'Dark Blood Tracking Disruptor')) ): row['published'] = True diff --git a/service/market.py b/service/market.py index bae35bbce..f7afacd18 100644 --- a/service/market.py +++ b/service/market.py @@ -29,7 +29,7 @@ from sqlalchemy.sql import or_ import config import eos.db from eos.gamedata import Category as types_Category, Group as types_Group, Item as types_Item, MarketGroup as types_MarketGroup, \ - MetaGroup as types_MetaGroup, MetaType as types_MetaType + MetaGroup as types_MetaGroup from service import conversions from service.jargon import JargonLoader from service.settings import SettingsProvider @@ -118,13 +118,13 @@ class SearchWorkerThread(threading.Thread): if len(request) >= config.minItemSearchLength: results = eos.db.searchItems(request, where=filter_, join=(types_Item.group, types_Group.category), - eager=("group.category", "metaGroup", "metaGroup.parent")) + eager=("group.category", "metaGroup")) jargon_results = [] if len(jargon_request) >= config.minItemSearchLength: jargon_results = eos.db.searchItems(jargon_request, where=filter_, join=(types_Item.group, types_Group.category), - eager=("group.category", "metaGroup", "metaGroup.parent")) + eager=("group.category", "metaGroup")) items = set() # Return only published items, consult with Market service this time @@ -173,6 +173,7 @@ class Market: self.les_grp.categoryID = ships.ID self.les_grp.description = "" self.les_grp.icon = None + print(self.getGroup("Shuttle")) self.ITEMS_FORCEGROUP = { "Capsule" : self.getGroup("Shuttle"), "Opux Luxury Yacht" : self.les_grp, # One of those is wedding present at CCP fanfest, another was hijacked from ISD guy during an event @@ -461,19 +462,8 @@ class Market: """Get meta group by item""" # Check if item is in forced metagroup map if item.name in self.ITEMS_FORCEDMETAGROUP: - # Create meta group from scratch - metaGroup = types_MetaType() - # Get meta group info object based on meta group name - metaGroupInfo = self.getMetaGroup(self.ITEMS_FORCEDMETAGROUP[item.name][0]) - # Get parent item based on its name - parent = self.getItem(self.ITEMS_FORCEDMETAGROUP[item.name][1]) - # Assign all required for metaGroup variables - metaGroup.info = metaGroupInfo - metaGroup.items = item - metaGroup.parent = parent - metaGroup.metaGroupID = metaGroupInfo.ID - metaGroup.parentTypeID = parent.ID - metaGroup.typeID = item.ID + metaGroupName = self.ITEMS_FORCEDMETAGROUP[item.name][0] + metaGroup = eos.db.getMetaGroup(metaGroupName) # If no forced meta group is provided, try to use item's # meta group if any else: @@ -513,14 +503,15 @@ class Market: def getParentItemByItem(self, item, selfparent=True): """Get parent item by item""" - mg = self.getMetaGroupByItem(item) - if mg: - parent = mg.parent + parent = None + if item.name in self.ITEMS_FORCEDMETAGROUP: + parentName = self.ITEMS_FORCEDMETAGROUP[item.name][1] + parent = self.getItem(parentName) + if parent is None: + parent = item.varParent # Consider self as parent if item has no parent in database - elif selfparent is True: + if parent is None and selfparent is True: parent = item - else: - parent = None return parent def getVariationsByItems(self, items, alreadyparent=False): @@ -756,7 +747,7 @@ class Market: filter_ = types_Category.name.in_(["Ship", "Structure"]) results = eos.db.searchItems(name, where=filter_, join=(types_Item.group, types_Group.category), - eager=("group.category", "metaGroup", "metaGroup.parent")) + eager=("group.category", "metaGroup")) ships = set() for item in results: if self.getPublicityByItem(item): diff --git a/service/port/efs.py b/service/port/efs.py index 307baa3fa..6c345b1f2 100755 --- a/service/port/efs.py +++ b/service/port/efs.py @@ -460,13 +460,11 @@ class EfsPort: def getT2ItemsWhere(additionalFilter, mustBeOffensive=False, category="Module"): # Used to obtain a smaller subset of items while still containing examples of each group. T2_META_LEVEL = 5 - metaLevelAttrID = getAttributeInfo("metaLevel").attributeID categoryID = getCategory(category).categoryID result = gamedata_session.query(Item).join(ItemEffect, Group, Attribute).\ filter( additionalFilter, - Attribute.attributeID == metaLevelAttrID, - Attribute.value == T2_META_LEVEL, + Item.metaLevel == T2_META_LEVEL, Group.categoryID == categoryID, ).all() if mustBeOffensive: