diff --git a/eveonline/managers.py b/eveonline/managers.py index e8ee3d4b..5036ca1c 100644 --- a/eveonline/managers.py +++ b/eveonline/managers.py @@ -3,7 +3,7 @@ from eveonline.models import EveCharacter from eveonline.models import EveApiKeyPair from eveonline.models import EveAllianceInfo from eveonline.models import EveCorporationInfo -from eveonline.providers import eve_adapter_factory +from eveonline.providers import eve_adapter_factory, EveXmlProvider from services.managers.eve_api_manager import EveApiManager import logging @@ -33,7 +33,7 @@ class EveManager: ) @staticmethod - def create_character(character_id, character_name, corporation_id, + def create_xml_character(character_id, character_name, corporation_id, corporation_name, corporation_ticker, alliance_id, alliance_name, user, api_id): logger.debug("Creating model for character %s id %s" % (character_name, character_id)) @@ -184,6 +184,12 @@ class EveManager: model.is_blue = model.is_blue if is_blue == None else is_blue model.save() + @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) + return [provider._build_character(result) for id, result in char_result.items()] + @staticmethod def get_api_key_pairs(user): if EveApiKeyPair.objects.filter(user=user).exists(): diff --git a/eveonline/providers.py b/eveonline/providers.py index be71244a..861ed39f 100644 --- a/eveonline/providers.py +++ b/eveonline/providers.py @@ -217,6 +217,15 @@ class EveXmlProvider(EveProvider): ) return model + def _build_character(self, result): + return Character( + self.adapter, + result['id'], + result['name'], + result['corp']['id'], + result['alliance']['id'], + ) + def get_character(self, id): api = evelink.eve.EVE(api=self.api) try: @@ -225,14 +234,7 @@ class EveXmlProvider(EveProvider): if int(e.code) == 105: raise ObjectNotFound(id, 'character') raise e - model = Character( - self.adapter, - id, - charinfo['name'], - charinfo['corp']['id'], - charinfo['alliance']['id'], - ) - return model + return self._build_character(charinfo) class EveAdapter(EveProvider): diff --git a/eveonline/tasks.py b/eveonline/tasks.py index 8d98bbea..10ed57cf 100644 --- a/eveonline/tasks.py +++ b/eveonline/tasks.py @@ -27,21 +27,16 @@ def refresh_api(api): try: EveApiManager.validate_api(api.api_id, api.api_key, api.user) # Update characters - characters = EveApiManager.get_characters_from_api(api.api_id, api.api_key) - EveManager.update_characters_from_list(characters) - new_character = False - for char in characters.result: - # Ensure we have a model for all characters on key - if not EveManager.check_if_character_exist(characters.result[char]['name']): - logger.debug( - "API key %s has a new character on the account: %s" % (api.api_id, characters.result[char]['name'])) - new_character = True - if new_character: - logger.debug("Creating new character %s from api key %s" % (characters.result[char]['name'], api.api_id)) - EveManager.create_characters_from_list(characters, api.user, api.api_id) + characters = EveManager.get_characters_from_api(api) + for c in characters: + try: + EveManager.update_character_obj(c) + except EveCharacter.DoesNotExist: + logger.debug("API key %s has a new character on the account: %s" % (api.api_id, c)) + EveManager.create_character_obj(c, api.user, api.api_id) current_chars = EveCharacter.objects.filter(api_id=api.api_id) for c in current_chars: - if not int(c.character_id) in characters.result: + if not int(c.character_id) in [c.id for c in characters]: logger.info("Character %s no longer found on API ID %s" % (c, api.api_id)) c.delete() except evelink.api.APIError as e: diff --git a/eveonline/views.py b/eveonline/views.py index 27a958fe..d1aec33c 100755 --- a/eveonline/views.py +++ b/eveonline/views.py @@ -46,9 +46,8 @@ def add_api_key(request): api_key.save() owner = request.user # Grab characters associated with the key pair - characters = EveApiManager.get_characters_from_api(form.cleaned_data['api_id'], - form.cleaned_data['api_key']) - EveManager.create_characters_from_list(characters, owner, form.cleaned_data['api_id']) + characters = EveManager.get_characters_from_api(api_key) + [EveManager.create_character_with_id(c.id, owner, api_key.api_id) for c in characters if not EveCharacter.objects.filter(character_id=c.id).exists()] logger.info("Successfully processed api add form for user %s" % request.user) if not settings.API_SSO_VALIDATION: messages.success(request, 'Added API key %s to your account.' % form.cleaned_data['api_id'])