From da0b37dd2d9fa13afdb0c67ee47122f9ad10cbe6 Mon Sep 17 00:00:00 2001 From: Andrew Williams Date: Wed, 5 Jan 2011 09:47:35 +0000 Subject: [PATCH] Add task to import multiple characters in one run, allowing for easier permission callbacks --- eve_api/tasks/account.py | 19 +++++++------------ eve_api/tasks/character.py | 31 ++++++++++++++++++++++++++----- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/eve_api/tasks/account.py b/eve_api/tasks/account.py index 69a1e7a..2f281db 100644 --- a/eve_api/tasks/account.py +++ b/eve_api/tasks/account.py @@ -9,7 +9,7 @@ from eve_proxy.models import CachedDocument from eve_api.models import EVEAccount, EVEPlayerCharacter from eve_api.app_defines import * from eve_api.utils import basic_xml_parse_doc -from eve_api.tasks.character import import_eve_character +from eve_api.tasks.character import import_eve_characters from eve_api.tasks.corporation import import_corp_members, import_corp_details from sso.tasks import update_user_access @@ -111,20 +111,15 @@ def import_apikey_func(api_userid, api_key, user=None, force_cache=False): # Process the account's character list charlist = set(account.characters.all().values_list('id', flat=True)) - newcharlist = [] - for char in doc['result']['characters']: - tasklist.append(import_eve_character.subtask(args=(char['characterID'], api_key, api_userid))) - newcharlist.append(int(char['characterID'])) + newcharlist = [char['characterID'] char in doc['result']['characters']] - toremove = charlist - set(newcharlist) - for char in account.characters.filter(id__in=toremove): + for char in account.characters.filter(id__in=set(charlist - set(newcharlist)): account.characters.remove(char) - # If we have a user, update their details in the taskset if account.user: - tasklist.append(update_user_access.subtask(kwargs={'user': account.user.id })) - - ts = TaskSet(tasks=tasklist) - ts.apply_async() + cb = update_user_access.subtask(kwargs={'user': account.user.id }) + else: + cb = None + import_eve_characters.delay(newcharlist, api_key, api_userid, callback=cb) return account diff --git a/eve_api/tasks/character.py b/eve_api/tasks/character.py index dd676b3..5ee4e9c 100644 --- a/eve_api/tasks/character.py +++ b/eve_api/tasks/character.py @@ -2,6 +2,7 @@ from datetime import datetime, timedelta from xml.dom import minidom from celery.decorators import task +from celery.task.set import subtask from eve_proxy.models import CachedDocument @@ -14,10 +15,33 @@ from eve_api.utils import basic_xml_parse, basic_xml_parse_doc def import_eve_character(character_id, api_key=None, user_id=None, callback=None): """ Imports a character from the API, providing a API key will populate - further details + further details. Returns a single EVEPlayerCharacter object """ + pchar = import_eve_character_func(character_id, api_key, user_id) + if callback: + subtask(callback).delay(character=pchar.id) + else: + return pchar + + +@task() +def import_eve_characters(character_list, api_key=None, user_id=None, callback=None): + """ + Imports characters from the API, providing a API key will populate + further details. Returns a list of EVEPlayerCharacter objects + + """ + + results = [import_eve_character_func(char, api_key, user_id) for char in character_list] + if callback: + subtask(callback).delay(characters=results) + else: + return results + + +def import_eve_character_func(character_id, api_key=None, user_id=None): char_doc = CachedDocument.objects.api_query('/eve/CharacterInfo.xml.aspx', params={'characterID': character_id}, no_cache=False) @@ -107,7 +131,4 @@ def import_eve_character(character_id, api_key=None, user_id=None, callback=None except EVEAccount.DoesNotExist: pass - if callback: - callback.delay(character=pchar.id) - else: - return pchar + return pchar