Retrieve character objects from api keys.

This commit is contained in:
Adarnof 2016-12-19 20:56:14 -05:00
parent 8379fdd7d5
commit 604808b195
4 changed files with 28 additions and 26 deletions

View File

@ -3,7 +3,7 @@ from eveonline.models import EveCharacter
from eveonline.models import EveApiKeyPair from eveonline.models import EveApiKeyPair
from eveonline.models import EveAllianceInfo from eveonline.models import EveAllianceInfo
from eveonline.models import EveCorporationInfo 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 from services.managers.eve_api_manager import EveApiManager
import logging import logging
@ -33,7 +33,7 @@ class EveManager:
) )
@staticmethod @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, corporation_name, corporation_ticker, alliance_id,
alliance_name, user, api_id): alliance_name, user, api_id):
logger.debug("Creating model for character %s id %s" % (character_name, character_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.is_blue = model.is_blue if is_blue == None else is_blue
model.save() 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 @staticmethod
def get_api_key_pairs(user): def get_api_key_pairs(user):
if EveApiKeyPair.objects.filter(user=user).exists(): if EveApiKeyPair.objects.filter(user=user).exists():

View File

@ -217,6 +217,15 @@ class EveXmlProvider(EveProvider):
) )
return model 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): def get_character(self, id):
api = evelink.eve.EVE(api=self.api) api = evelink.eve.EVE(api=self.api)
try: try:
@ -225,14 +234,7 @@ class EveXmlProvider(EveProvider):
if int(e.code) == 105: if int(e.code) == 105:
raise ObjectNotFound(id, 'character') raise ObjectNotFound(id, 'character')
raise e raise e
model = Character( return self._build_character(charinfo)
self.adapter,
id,
charinfo['name'],
charinfo['corp']['id'],
charinfo['alliance']['id'],
)
return model
class EveAdapter(EveProvider): class EveAdapter(EveProvider):

View File

@ -27,21 +27,16 @@ def refresh_api(api):
try: try:
EveApiManager.validate_api(api.api_id, api.api_key, api.user) EveApiManager.validate_api(api.api_id, api.api_key, api.user)
# Update characters # Update characters
characters = EveApiManager.get_characters_from_api(api.api_id, api.api_key) characters = EveManager.get_characters_from_api(api)
EveManager.update_characters_from_list(characters) for c in characters:
new_character = False try:
for char in characters.result: EveManager.update_character_obj(c)
# Ensure we have a model for all characters on key except EveCharacter.DoesNotExist:
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, c))
logger.debug( EveManager.create_character_obj(c, api.user, api.api_id)
"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)
current_chars = EveCharacter.objects.filter(api_id=api.api_id) current_chars = EveCharacter.objects.filter(api_id=api.api_id)
for c in current_chars: 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)) logger.info("Character %s no longer found on API ID %s" % (c, api.api_id))
c.delete() c.delete()
except evelink.api.APIError as e: except evelink.api.APIError as e:

View File

@ -46,9 +46,8 @@ def add_api_key(request):
api_key.save() api_key.save()
owner = request.user owner = request.user
# Grab characters associated with the key pair # Grab characters associated with the key pair
characters = EveApiManager.get_characters_from_api(form.cleaned_data['api_id'], characters = EveManager.get_characters_from_api(api_key)
form.cleaned_data['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()]
EveManager.create_characters_from_list(characters, owner, form.cleaned_data['api_id'])
logger.info("Successfully processed api add form for user %s" % request.user) logger.info("Successfully processed api add form for user %s" % request.user)
if not settings.API_SSO_VALIDATION: if not settings.API_SSO_VALIDATION:
messages.success(request, 'Added API key %s to your account.' % form.cleaned_data['api_id']) messages.success(request, 'Added API key %s to your account.' % form.cleaned_data['api_id'])