Variable itemtype name datasources (#662)

Make provider settings optional
Wait to initialize adapter until first external call
Abstract get methods from adapter
This commit is contained in:
Adarnof
2017-01-19 19:19:20 -05:00
committed by GitHub
parent 3d50f977d9
commit 0b57e027f7
7 changed files with 127 additions and 58 deletions

View File

@@ -9,15 +9,23 @@ import logging
logger = logging.getLogger(__name__)
adapter = eve_adapter_factory()
class EveManager:
def __init__(self):
pass
class EveManager(object):
adapter = None
@classmethod
def get_adapter(cls):
if not cls.adapter:
cls.adapter = eve_adapter_factory()
return cls.adapter
@classmethod
def get_character(cls, character_id):
return cls.get_adapter().get_character(character_id)
@staticmethod
def create_character(id, user, api_id):
return EveManager.create_character_obj(adapter.get_character(id), user, api_id)
return EveManager.create_character_obj(EveManager.get_character(id), user, api_id)
@staticmethod
def create_character_obj(character, user, api_id):
@@ -35,7 +43,7 @@ class EveManager:
@staticmethod
def update_character(id):
return EveManager.update_character_obj(adapter.get_character(id))
return EveManager.update_character_obj(EveManager.get_character(id))
@staticmethod
def update_character_obj(char):
@@ -61,9 +69,13 @@ class EveManager:
else:
logger.warn("Attempting to create existing api keypair with id %s" % api_id)
@classmethod
def get_alliance(cls, alliance_id):
return cls.get_adapter().get_alliance(alliance_id)
@staticmethod
def create_alliance(id, is_blue=False):
return EveManager.create_alliance_obj(adapter.get_alliance(id), is_blue=is_blue)
return EveManager.create_alliance_obj(EveManager.get_alliance(id), is_blue=is_blue)
@staticmethod
def create_alliance_obj(alliance, is_blue=False):
@@ -77,7 +89,7 @@ class EveManager:
@staticmethod
def update_alliance(id, is_blue=None):
return EveManager.update_alliance_obj(adapter.get_alliance(id), is_blue=is_blue)
return EveManager.update_alliance_obj(EveManager.get_alliance(id), is_blue=is_blue)
@staticmethod
def update_alliance_obj(alliance, is_blue=None):
@@ -89,17 +101,20 @@ class EveManager:
@staticmethod
def populate_alliance(id):
alliance_model = EveAllianceInfo.objects.get(alliance_id=id)
alliance = adapter.get_alliance(id)
alliance = EveManager.get_alliance(id)
for corp_id in alliance.corp_ids:
if not EveCorporationInfo.objects.filter(corporation_id=corp_id).exists():
EveManager.create_corporation(corp_id, is_blue=alliance_model.is_blue)
EveCorporationInfo.objects.filter(corporation_id__in=alliance.corp_ids).update(alliance=alliance_model)
EveCorporationInfo.objects.filter(alliance=alliance_model).exclude(corporation_id__in=alliance.corp_ids).update(alliance=None)
@classmethod
def get_corporation(cls, corp_id):
return cls.get_adapter().get_corp(corp_id)
@staticmethod
def create_corporation(id, is_blue=False):
return EveManager.create_corporation_obj(adapter.get_corp(id), is_blue=is_blue)
return EveManager.create_corporation_obj(EveManager.get_corporation(id), is_blue=is_blue)
@staticmethod
def create_corporation_obj(corp, is_blue=False):
@@ -118,7 +133,7 @@ class EveManager:
@staticmethod
def update_corporation(id, is_blue=None):
return EveManager.update_corporation_obj(adapter.get_corp(id), is_blue=is_blue)
return EveManager.update_corporation_obj(EveManager.get_corporation(id), is_blue=is_blue)
@staticmethod
def update_corporation_obj(corp, is_blue=None):
@@ -131,10 +146,14 @@ class EveManager:
model.is_blue = model.is_blue if is_blue == None else is_blue
model.save()
@classmethod
def get_itemtype(cls, type_id):
return cls.get_adapter().get_itemtype(type_id)
@staticmethod
def get_characters_from_api(api):
char_result = EveApiManager.get_characters_from_api(api.api_id, api.api_key).result
provider = EveXmlProvider(adapter=adapter)
provider = EveXmlProvider(adapter=EveManager.get_adapter())
return [provider._build_character(result) for id, result in char_result.items()]
@staticmethod

View File

@@ -15,9 +15,9 @@ OBJ_CACHE_DURATION = int(getattr(settings, 'EVEONLINE_OBJ_CACHE_DURATION', 300))
@python_2_unicode_compatible
class ObjectNotFound(Exception):
def __init__(self, id, type):
self.id = id
self.type = type
def __init__(self, obj_id, type_name):
self.id = obj_id
self.type = type_name
def __str__(self):
return '%s with ID %s not found.' % (self.type, self.id)
@@ -48,8 +48,8 @@ class Entity(object):
}
@classmethod
def from_dict(cls, dict):
return cls(dict['id'], dict['name'])
def from_dict(cls, data_dict):
return cls(data_dict['id'], data_dict['name'])
class Corporation(Entity):
@@ -185,6 +185,20 @@ class Character(Entity):
)
class ItemType(Entity):
def __init__(self, provider, type_id, name):
super(ItemType, self).__init__(type_id, name)
self.provider = provider
@classmethod
def from_dict(cls, data_dict):
return cls(
None,
data_dict['id'],
data_dict['name'],
)
class EveProvider(object):
def get_alliance(self, alliance_id):
"""
@@ -198,12 +212,18 @@ class EveProvider(object):
"""
raise NotImplementedError()
def get_character(self, corp_id):
def get_character(self, character_id):
"""
:return: a Character object for the given ID
"""
raise NotImplementedError()
def get_itemtype(self, type_id):
"""
:return: an ItemType object for the given ID
"""
raise NotImplemented()
@python_2_unicode_compatible
class EveSwaggerProvider(EveProvider):
@@ -214,13 +234,13 @@ class EveSwaggerProvider(EveProvider):
def __str__(self):
return 'esi'
def get_alliance(self, id):
def get_alliance(self, alliance_id):
try:
data = self.client.Alliance.get_alliances_alliance_id(alliance_id=id).result()
corps = self.client.Alliance.get_alliances_alliance_id_corporations(alliance_id=id).result()
data = self.client.Alliance.get_alliances_alliance_id(alliance_id=alliance_id).result()
corps = self.client.Alliance.get_alliances_alliance_id_corporations(alliance_id=alliance_id).result()
model = Alliance(
self.adapter,
id,
alliance_id,
data['alliance_name'],
data['ticker'],
corps,
@@ -228,14 +248,14 @@ class EveSwaggerProvider(EveProvider):
)
return model
except HTTPNotFound:
raise ObjectNotFound(id, 'alliance')
raise ObjectNotFound(alliance_id, 'alliance')
def get_corp(self, id):
def get_corp(self, corp_id):
try:
data = self.client.Corporation.get_corporations_corporation_id(corporation_id=id).result()
data = self.client.Corporation.get_corporations_corporation_id(corporation_id=corp_id).result()
model = Corporation(
self.adapter,
id,
corp_id,
data['corporation_name'],
data['ticker'],
data['ceo_id'],
@@ -246,20 +266,27 @@ class EveSwaggerProvider(EveProvider):
except HTTPNotFound:
raise ObjectNotFound(id, 'corporation')
def get_character(self, id):
def get_character(self, character_id):
try:
data = self.client.Character.get_characters_character_id(character_id=id).result()
data = self.client.Character.get_characters_character_id(character_id=character_id).result()
alliance_id = self.adapter.get_corp(data['corporation_id']).alliance_id
model = Character(
self.adapter,
id,
character_id,
data['name'],
data['corporation_id'],
alliance_id,
)
return model
except (HTTPNotFound, HTTPUnprocessableEntity):
raise ObjectNotFound(id, 'character')
raise ObjectNotFound(character_id, 'character')
def get_itemtype(self, type_id):
try:
data = self.client.Universe.get_universe_types_type_id(type_id=type_id).result()
return ItemType(self.adapter, type_id, data['name'])
except (HTTPNotFound, HTTPUnprocessableEntity):
raise ObjectNotFound(type_id, 'type')
@python_2_unicode_compatible
@@ -329,23 +356,37 @@ class EveXmlProvider(EveProvider):
raise e
return self._build_character(charinfo)
def get_itemtype(self, type_id):
api = evelink.eve.EVE(api=self.api)
try:
type_name = api.type_name_from_id(type_id).result
assert type_name != 'Unknown Type'
return ItemType(self.adapter, type_id, type_name)
except AssertionError:
raise ObjectNotFound(type_id, 'itemtype')
class EveAdapter(EveProvider):
"""
Redirects queries to appropriate data source.
"""
def __init__(self, char_provider, corp_provider, alliance_provider):
def __init__(self, char_provider, corp_provider, alliance_provider, itemtype_provider):
self.char_provider = char_provider
self.corp_provider = corp_provider
self.alliance_provider = alliance_provider
self.itemtype_provider = itemtype_provider
self.char_provider.adapter = self
self.corp_provider.adapter = self
self.alliance_provider.adapter = self
self.itemtype_provider.adapter = self
def __repr__(self):
return "<{} (char:{}, corp:{}, alliance:{})>".format(self.__class__.__name__, str(self.char_provider),
str(self.corp_provider), str(self.alliance_provider))
return "<{} (character:{} corp:{} alliance:{} itemtype:{})>".format(self.__class__.__name__,
str(self.char_provider),
str(self.corp_provider),
str(self.alliance_provider),
str(self.itemtype_provider))
@staticmethod
def _get_from_cache(obj_class, id):
@@ -390,6 +431,15 @@ class EveAdapter(EveProvider):
self._cache(obj)
return obj
def get_itemtype(self, type_id):
obj = self._get_from_cache(ItemType, type_id)
if obj:
obj.provider = self
else:
obj = self._get_itemtype(type_id)
self._cache(obj)
return obj
def _get_character(self, id):
return self.char_provider.get_character(id)
@@ -399,11 +449,19 @@ class EveAdapter(EveProvider):
def _get_alliance(self, id):
return self.alliance_provider.get_alliance(id)
def _get_itemtype(self, type_id):
return self.itemtype_provider.get_itemtype(type_id)
def eve_adapter_factory(character_source=settings.EVEONLINE_CHARACTER_PROVIDER,
corp_source=settings.EVEONLINE_CORP_PROVIDER,
alliance_source=settings.EVEONLINE_ALLIANCE_PROVIDER, api_key=None, token=None):
sources = [character_source, corp_source, alliance_source]
CHARACTER_PROVIDER = getattr(settings, 'EVEONLINE_CHARACTER_PROVIDER', 'esi')
CORP_PROVIDER = getattr(settings, 'EVEONLINE_CORP_PROVIDER', 'esi')
ALLIANCE_PROVIDER = getattr(settings, 'EVEONLINE_ALLIANCE_PROVIDER', 'esi')
ITEMTYPE_PROVIDER = getattr(settings, 'EVEONLINE_ITEMTYPE_PROVIDER', 'esi')
def eve_adapter_factory(character_source=CHARACTER_PROVIDER, corp_source=CORP_PROVIDER,
alliance_source=ALLIANCE_PROVIDER, itemtype_source=ITEMTYPE_PROVIDER, api_key=None, token=None):
sources = [character_source, corp_source, alliance_source, itemtype_source]
providers = []
if 'xml' in sources:
@@ -418,4 +476,4 @@ def eve_adapter_factory(character_source=settings.EVEONLINE_CHARACTER_PROVIDER,
providers.append(esi)
else:
raise ValueError('Unrecognized data source "%s"' % source)
return EveAdapter(providers[0], providers[1], providers[2])
return EveAdapter(providers[0], providers[1], providers[2], providers[3])

View File

@@ -12,7 +12,6 @@ from services.managers.eve_api_manager import EveApiManager
from eveonline.models import EveCharacter
from eveonline.models import EveCorporationInfo
from eveonline.models import EveAllianceInfo
from eveonline.providers import eve_adapter_factory
from authentication.tasks import set_state
import logging
import evelink