From 4d01d20f1d2c1e5584c4f404628ebfb4387b04d8 Mon Sep 17 00:00:00 2001 From: Andrew Williams Date: Wed, 5 Jan 2011 08:49:54 +0000 Subject: [PATCH] Task execution optimizations, tries to reduce exec time of API import --- eve_api/tasks/account.py | 23 +++++++++++------------ eve_api/tasks/character.py | 12 ++++++++---- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/eve_api/tasks/account.py b/eve_api/tasks/account.py index 566a8d3..9a8ad80 100644 --- a/eve_api/tasks/account.py +++ b/eve_api/tasks/account.py @@ -107,25 +107,24 @@ def import_apikey_func(api_userid, api_key, user=None, force_cache=False): account.api_last_updated = datetime.utcnow() account.save() + tasklist = [] + # Process the account's character list charlist = set(account.characters.all().values_list('id', flat=True)) newcharlist = [] for char in doc['result']['characters']: - import_eve_character.delay(char['characterID'], api_key, api_userid, callback=link_char_to_account.subtask(account=account.id)) + tasklist.append(import_eve_character.subtask(char['characterID'], api_key, api_userid)) newcharlist.append(int(char['characterID'])) toremove = charlist - set(newcharlist) for char in account.characters.filter(id__in=toremove): account.characters.remove(char) + + # If we have a user, update their details in the taskset + if account.user: + tasklist.append(update_user_access.subtask(user=account.user.id)) + + ts = TaskSet(tasks=tasklist) + ts.apply_async() + return account - - -@task(ignore_result=True) -def link_char_to_account(character, account): - acc = EVEAccount.objects.get(id=account) - char = EVEPlayerCharacter.objects.get(id=character) - - acc.characters.add(char) - - if acc.user: - update_user_access.delay(user=acc.user.id) diff --git a/eve_api/tasks/character.py b/eve_api/tasks/character.py index e812c14..e1bf27b 100644 --- a/eve_api/tasks/character.py +++ b/eve_api/tasks/character.py @@ -64,15 +64,15 @@ def import_eve_character(character_id, api_key=None, user_id=None, callback=None pchar.attrib_willpower = values['attributes']['willpower'] pchar.attrib_memory = values['attributes']['memory'] - # Process the character's skills pchar.total_sp = 0 for skill in values.get('skills', None): skillobj, created = EVESkill.objects.get_or_create(id=skill['typeID']) charskillobj, created = EVEPlayerCharacterSkill.objects.get_or_create(skill=skillobj, character=pchar) - charskillobj.level = int(skill['level']) - charskillobj.skillpoints = int(skill['skillpoints']) - charskillobj.save() + if created or not charskillobj.level == int(skill['level']) or not charskillobj.skillpoints == int(skill['skillpoints']): + charskillobj.level = int(skill['level']) + charskillobj.skillpoints = int(skill['skillpoints']) + charskillobj.save() pchar.total_sp = pchar.total_sp + int(skill['skillpoints']) # Process the character's roles @@ -97,6 +97,10 @@ def import_eve_character(character_id, api_key=None, user_id=None, callback=None try: acc = EVEAccount.objects.get(api_user_id=user_id) + + if not char in acc.characters.all(): + acc.characters.add(pchar) + if pchar.director and acc.api_keytype == API_KEYTYPE_FULL: from eve_api.tasks.corporation import import_corp_members import_corp_members.delay(api_key=api_key, api_userid=user_id, character_id=pchar.id)