Initial work on eve_api for Django 1.4

This commit is contained in:
2012-05-20 12:21:24 +01:00
parent 27abcf8661
commit 0a4b30244f
9 changed files with 37 additions and 18 deletions

View File

@@ -1,7 +1,9 @@
from django.db import models from django.db import models
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from eve_api.models import EVEAPIModel from eve_api.models import EVEAPIModel
class EVEPlayerAlliance(EVEAPIModel): class EVEPlayerAlliance(EVEAPIModel):
""" """
Represents a player-controlled alliance. Updated from the alliance Represents a player-controlled alliance. Updated from the alliance

View File

@@ -1,5 +1,6 @@
from django.db import models from django.db import models
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from eve_api.app_defines import * from eve_api.app_defines import *
from eve_api.models import EVEAPIModel from eve_api.models import EVEAPIModel

View File

@@ -1,9 +1,12 @@
from django.db import models from django.db import models
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from gargoyle import gargoyle from gargoyle import gargoyle
from eve_api.models import EVEAPIModel from eve_api.models import EVEAPIModel
from eve_api.app_defines import * from eve_api.app_defines import *
class EVEPlayerCorporation(EVEAPIModel): class EVEPlayerCorporation(EVEAPIModel):
""" """
Represents a player-controlled corporation. Updated from a mixture of Represents a player-controlled corporation. Updated from a mixture of

View File

@@ -22,6 +22,7 @@ from eve_api.tasks.corporation import import_corp_members, import_corp_details
from sso.tasks import update_user_access from sso.tasks import update_user_access
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.utils.timezone import now, utc
@task(ignore_result=True, expires=120) @task(ignore_result=True, expires=120)
def queue_apikey_updates(update_delay=86400, batch_size=50): def queue_apikey_updates(update_delay=86400, batch_size=50):
@@ -40,9 +41,9 @@ def queue_apikey_updates(update_delay=86400, batch_size=50):
log.info("Updating APIs older than %s" % (datetime.now() - delta)) log.info("Updating APIs older than %s" % (datetime.now() - delta))
if gargoyle.is_active('eve-cak'): if gargoyle.is_active('eve-cak'):
accounts = EVEAccount.objects.filter(api_last_updated__lt=(datetime.now() - delta)).exclude(api_status__in=[API_STATUS_ACC_EXPIRED, API_STATUS_KEY_EXPIRED, API_STATUS_AUTH_ERROR]).order_by('api_last_updated')[:batch_size] accounts = EVEAccount.objects.filter(api_last_updated__lt=(now() - delta)).exclude(api_status__in=[API_STATUS_ACC_EXPIRED, API_STATUS_KEY_EXPIRED, API_STATUS_AUTH_ERROR]).order_by('api_last_updated')[:batch_size]
else: else:
accounts = EVEAccount.objects.filter(api_last_updated__lt=(datetime.now() - delta)).exclude(api_status__in=[API_STATUS_ACC_EXPIRED, API_STATUS_KEY_EXPIRED, API_STATUS_AUTH_ERROR]).exclude(api_keytype__gt=2).order_by('api_last_updated')[:batch_size] accounts = EVEAccount.objects.filter(api_last_updated__lt=(now() - delta)).exclude(api_status__in=[API_STATUS_ACC_EXPIRED, API_STATUS_KEY_EXPIRED, API_STATUS_AUTH_ERROR]).exclude(api_keytype__gt=2).order_by('api_last_updated')[:batch_size]
log.info("%s account(s) to update" % accounts.count()) log.info("%s account(s) to update" % accounts.count())
for acc in accounts: for acc in accounts:
log.debug("Queueing UserID %s for update" % acc.pk) log.debug("Queueing UserID %s for update" % acc.pk)
@@ -115,7 +116,7 @@ def import_apikey_func(api_userid, api_key, user=None, force_cache=False, log=lo
account.api_keytype = API_KEYTYPE_ACCOUNT account.api_keytype = API_KEYTYPE_ACCOUNT
account.api_accessmask = int(keydoc['accessMask']) account.api_accessmask = int(keydoc['accessMask'])
if not keydoc['expires'] == '': if not keydoc['expires'] == '':
account.api_expiry = datetime.strptime(keydoc['expires'], '%Y-%m-%d %H:%M:%S') account.api_expiry = datetime.strptime(keydoc['expires'], '%Y-%m-%d %H:%M:%S').replace(tzinfo=utc)
# Checks account status to see if the account is still active # Checks account status to see if the account is still active
if not account.api_keytype == API_KEYTYPE_CORPORATION: if not account.api_keytype == API_KEYTYPE_CORPORATION:
@@ -124,8 +125,8 @@ def import_apikey_func(api_userid, api_key, user=None, force_cache=False, log=lo
status = CachedDocument.objects.api_query('/account/AccountStatus.xml.aspx', params=auth_params, no_cache=True) status = CachedDocument.objects.api_query('/account/AccountStatus.xml.aspx', params=auth_params, no_cache=True)
status = basic_xml_parse_doc(status)['eveapi'] status = basic_xml_parse_doc(status)['eveapi']
if not status.get('error', None): if not status.get('error', None):
paiddate = datetime.strptime(status['result']['paidUntil'], '%Y-%m-%d %H:%M:%S') paiddate = datetime.strptime(status['result']['paidUntil'], '%Y-%m-%d %H:%M:%S').replace(tzinfo=utc)
if paiddate <= datetime.utcnow(): if paiddate <= now():
account.api_status = API_STATUS_ACC_EXPIRED account.api_status = API_STATUS_ACC_EXPIRED
else: else:
account.api_status = API_STATUS_OK account.api_status = API_STATUS_OK
@@ -236,7 +237,7 @@ def import_apikey_func(api_userid, api_key, user=None, force_cache=False, log=lo
if account.user: if account.user:
update_user_access.delay(account.user.id) update_user_access.delay(account.user.id)
account.api_last_updated = datetime.utcnow() account.api_last_updated = now()
account.save() account.save()
return account return account

View File

@@ -11,6 +11,7 @@ from eve_api.utils import basic_xml_parse_doc
from eve_api.tasks.corporation import import_corp_details, import_corp_details_result from eve_api.tasks.corporation import import_corp_details, import_corp_details_result
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.utils.timezone import now, utc
@task(ignore_result=True, default_retry_delay=10 * 60) @task(ignore_result=True, default_retry_delay=10 * 60)
def import_alliance_details(): def import_alliance_details():
@@ -32,10 +33,10 @@ def import_alliance_details():
allobj, created = EVEPlayerAlliance.objects.get_or_create(pk=alliance['allianceID']) allobj, created = EVEPlayerAlliance.objects.get_or_create(pk=alliance['allianceID'])
allobj.name = alliance['name'] allobj.name = alliance['name']
allobj.ticker = alliance['shortName'] allobj.ticker = alliance['shortName']
allobj.date_founded = datetime.strptime(alliance['startDate'], "%Y-%m-%d %H:%M:%S") allobj.date_founded = datetime.strptime(alliance['startDate'], "%Y-%m-%d %H:%M:%S").replace(tzinfo=utc)
allobj.executor, created = EVEPlayerCorporation.objects.get_or_create(id=alliance['executorCorpID']) allobj.executor, created = EVEPlayerCorporation.objects.get_or_create(id=alliance['executorCorpID'])
allobj.member_count = alliance['memberCount'] allobj.member_count = alliance['memberCount']
allobj.api_last_updated = datetime.utcnow() allobj.api_last_updated = now()
allobj.save() allobj.save()
members = [int(corp['corporationID']) for corp in alliance['memberCorporations']] members = [int(corp['corporationID']) for corp in alliance['memberCorporations']]

View File

@@ -2,6 +2,8 @@ from datetime import datetime, timedelta
from xml.dom import minidom from xml.dom import minidom
import logging import logging
from django.utils.timezone import now, utc
from celery.task import task from celery.task import task
from celery.task.sets import subtask from celery.task.sets import subtask
from gargoyle import gargoyle from gargoyle import gargoyle
@@ -85,11 +87,11 @@ def import_eve_character_func(character_id, key_id=None, logger=logging.getLogge
# Set corporation and join date # Set corporation and join date
corp, created = EVEPlayerCorporation.objects.get_or_create(pk=values['corporationID']) corp, created = EVEPlayerCorporation.objects.get_or_create(pk=values['corporationID'])
from eve_api.tasks.corporation import import_corp_details from eve_api.tasks.corporation import import_corp_details
if created or not corp.name or corp.api_last_updated < (datetime.utcnow() - timedelta(hours=12)): if created or not corp.name or corp.api_last_updated < (now() - timedelta(hours=12)):
import_corp_details.delay(values['corporationID']) import_corp_details.delay(values['corporationID'])
pchar.corporation = corp pchar.corporation = corp
pchar.corporation_date = values['corporationDate'] pchar.corporation_date = datetime.strptime(values['corporationDate'], "%Y-%m-%d %H:%M:%S").replace(tzinfo=utc)
# Derrive Race value from the choices # Derrive Race value from the choices
for v in API_RACES_CHOICES: for v in API_RACES_CHOICES:
@@ -106,7 +108,8 @@ def import_eve_character_func(character_id, key_id=None, logger=logging.getLogge
corp, created = EVEPlayerCorporation.objects.get_or_create(pk=emp['corporationID']) corp, created = EVEPlayerCorporation.objects.get_or_create(pk=emp['corporationID'])
if created: if created:
import_corp_details.delay(emp['corporationID']) import_corp_details.delay(emp['corporationID'])
eobj, created = EVEPlayerCharacterEmploymentHistory.objects.get_or_create(pk=emp['recordID'], corporation=corp, character=pchar, start_date=emp['startDate']) startdate = datetime.strptime(emp['startDate'], "%Y-%m-%d %H:%M:%S").replace(tzinfo=utc)
eobj, created = EVEPlayerCharacterEmploymentHistory.objects.get_or_create(pk=emp['recordID'], corporation=corp, character=pchar, start_date=startdate)
# We've been passed a Key ID, try and work with it # We've been passed a Key ID, try and work with it
if key_id: if key_id:
@@ -183,7 +186,7 @@ def import_eve_character_func(character_id, key_id=None, logger=logging.getLogge
else: else:
pchar.gender = API_GENDER_FEMALE pchar.gender = API_GENDER_FEMALE
pchar.api_last_updated = datetime.utcnow() pchar.api_last_updated = now()
pchar.save() pchar.save()
if acc: if acc:

View File

@@ -55,7 +55,7 @@ def import_corp_details_result(corp_id, callback=None):
def import_corp_details_func(corp_id, log=logging.getLogger(__name__)): def import_corp_details_func(corp_id, log=logging.getLogger(__name__)):
corpobj, created = EVEPlayerCorporation.objects.get_or_create(id=corp_id) corpobj, created = EVEPlayerCorporation.objects.get_or_create(id=corp_id)
if created or not corpobj.api_last_updated or corpobj.api_last_updated < (datetime.utcnow() - timedelta(hours=12)): if created or not corpobj.api_last_updated or corpobj.api_last_updated < (now() - timedelta(hours=12)):
try: try:
doc = CachedDocument.objects.api_query('/corp/CorporationSheet.xml.aspx', {'corporationID': corp_id}) doc = CachedDocument.objects.api_query('/corp/CorporationSheet.xml.aspx', {'corporationID': corp_id})
@@ -98,7 +98,7 @@ def import_corp_details_func(corp_id, log=logging.getLogger(__name__)):
if int(d['allianceID']): if int(d['allianceID']):
corpobj.alliance, created = EVEPlayerAlliance.objects.get_or_create(id=d['allianceID']) corpobj.alliance, created = EVEPlayerAlliance.objects.get_or_create(id=d['allianceID'])
corpobj.api_last_updated = datetime.utcnow() corpobj.api_last_updated = now()
corpobj.save() corpobj.save()
# Skip looking up the CEOs for NPC corps and ones with no CEO defined (dead corps) # Skip looking up the CEOs for NPC corps and ones with no CEO defined (dead corps)
@@ -159,10 +159,10 @@ def import_corp_members(key_id, character_id):
if created: if created:
charobj.name = character['name'] charobj.name = character['name']
charobj.corporation = corp charobj.corporation = corp
charobj.corporation_date = character['startDateTime'] charobj.corporation_date = datetime.strptime(character['startDateTime'], "%Y-%m-%d %H:%M:%S").replace(tzinfo=utc)
if 'logonDateTime' in character: if 'logonDateTime' in character:
charobj.last_login = character['logonDateTime'] charobj.last_login = datetime.strptime(character['logonDateTime'], "%Y-%m-%d %H:%M:%S").replace(tzinfo=utc)
charobj.last_logoff = character['logoffDateTime'] charobj.last_logoff = datetime.strptime(character['logoffDateTime'], "%Y-%m-%d %H:%M:%S").replace(tzinfo=utc)
charobj.current_location_id = int(character['locationID']) charobj.current_location_id = int(character['locationID'])
else: else:
charobj.last_login = None charobj.last_login = None

View File

@@ -1,4 +1,8 @@
from datetime import datetime
from xml.dom import minidom from xml.dom import minidom
from django.utils.timezone import utc
from eve_proxy.models import CachedDocument from eve_proxy.models import CachedDocument
def basic_xml_parse(nodes): def basic_xml_parse(nodes):
@@ -51,3 +55,7 @@ def basic_xml_parse_doc(doc):
return basic_xml_parse(dom.childNodes) return basic_xml_parse(dom.childNodes)
return {} return {}
def parse_eveapi_date(datestring):
return datetime.strptime(datestring, "%Y-%m-%d %H:%M:%S").replace(tzinfo=utc)

View File

@@ -6,7 +6,6 @@ from django.http import HttpResponse, Http404
from django.shortcuts import render_to_response, get_object_or_404, redirect from django.shortcuts import render_to_response, get_object_or_404, redirect
from django.template import RequestContext from django.template import RequestContext
from django.views.generic import DetailView, ListView from django.views.generic import DetailView, ListView
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
@@ -22,6 +21,7 @@ from eve_api.tasks import import_apikey_result
from eve_api.utils import basic_xml_parse_doc from eve_api.utils import basic_xml_parse_doc
from eve_api.views.mixins import DetailPaginationMixin from eve_api.views.mixins import DetailPaginationMixin
@login_required @login_required
def eveapi_add(request, post_save_redirect='/', template='eve_api/add.html'): def eveapi_add(request, post_save_redirect='/', template='eve_api/add.html'):
""" Add a EVE API key to a user's account """ """ Add a EVE API key to a user's account """