From 981e0429793172b7baa242bab881a18345685420 Mon Sep 17 00:00:00 2001 From: Andrew Williams Date: Wed, 1 Dec 2010 17:15:30 +0000 Subject: [PATCH] Added faster Alliance update function --- eve_api/models/api_player.py | 4 ++-- eve_api/tasks.py | 34 +++++++++++++++++++++++++++++++--- eve_api/utils.py | 6 ++++++ 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/eve_api/models/api_player.py b/eve_api/models/api_player.py index 4ec85cf..ac986da 100644 --- a/eve_api/models/api_player.py +++ b/eve_api/models/api_player.py @@ -213,8 +213,6 @@ class EVEPlayerCorporation(EVEAPIModel): EVE API service. """ - from eve_api.api_puller.accounts import import_eve_character - # Pull XML from the EVE API via eve_proxy. dom = EVEPlayerCorporation.objects.api_corp_sheet_xml(self.id) @@ -249,6 +247,8 @@ class EVEPlayerCorporation(EVEAPIModel): # Something weird has happened continue + from eve_api.tasks import import_eve_character + ceoid = dom.getElementsByTagName('ceoID')[0].firstChild.nodeValue self.ceo_character = import_eve_character(ceoid) diff --git a/eve_api/tasks.py b/eve_api/tasks.py index cb2d9e3..699cd60 100644 --- a/eve_api/tasks.py +++ b/eve_api/tasks.py @@ -2,7 +2,7 @@ from datetime import datetime, timedelta from xml.dom import minidom from celery.decorators import task -from eve_api.models import EVEAccount, EVEPlayerCorporation, EVEPlayerCharacter, EVEPlayerCharacterRole +from eve_api.models import EVEAccount, EVEPlayerCorporation, EVEPlayerCharacter, EVEPlayerCharacterRole, EVEPlayerAlliance from eve_api.api_puller.corp_management import pull_corp_members from eve_api.app_defines import * from eve_api.utils import basic_xml_parse @@ -204,10 +204,38 @@ def import_eve_character(character_id, api_key=None, user_id=None): @task(ignore_result=True) def import_alliance_details(): - from eve_api.api_puller.alliances import __start_full_import as alliance_import - alliance_import() + doc = CachedDocument.objects.api_query('/eve/AllianceList.xml.aspx') + dom = minidom.parseString(doc.body.encode('utf-8')) + nodes = dom.getElementsByTagName('result')[0].childNodes + for alliance in basic_xml_parse(nodes)['alliances']: + print alliance + allobj, created = EVEPlayerAlliance.objects.get_or_create(pk=alliance['allianceID']) + if created: + allobj.name = alliance['name'] + allobj.ticker = alliance['shortName'] + allobj.date_founded = alliance['startDate'] + allobj.member_count = alliance['memberCount'] + allobj.api_last_updated = datetime.utcnow() + allobj.save() + + corplist = allobj.eveplayercorporation_set.all().values_list('id', flat=True) + + validcorps = [] + for corp in alliance['memberCorporations']: + if corp.id not in corplist: + corpobj, created = EVEPlayerCorporation.objects.get_or_create(pk=corp['corporationID']) + corpobj.alliance = allobj + corpobj.save() + if created: + import_corp_details.delay(corp['corporationID']) + validcorps.append(int(corp['corporationID'])) + + delcorps = set(corplist) - set(validcorps) + EVEPlayerCorporation.objects.filter(id__in=delcorps).update(alliance=None) + + @task(ignore_result=True) def import_corp_members(api_userid, api_key, character_id): pull_corp_members(api_key, api_userid, character_id) diff --git a/eve_api/utils.py b/eve_api/utils.py index b731126..88bf851 100644 --- a/eve_api/utils.py +++ b/eve_api/utils.py @@ -15,6 +15,12 @@ def basic_xml_parse(nodes): d = {} for e in nd.attributes.keys(): d[e] = nd.attributes[e].value + + if len(nd.childNodes) > 0: + p = basic_xml_parse(nd.childNodes) + for i in p.keys(): + d[i] = p[i] + rset.append(d) values[node.attributes['name'].value] = rset else: