Add API caching, move calls out into its own modules for reuse.

This commit is contained in:
2013-11-11 20:50:16 +00:00
parent ccf41cc2ce
commit 79d12ee1c0
6 changed files with 88 additions and 24 deletions

43
evesde/eveapi/__init__.py Normal file
View File

@@ -0,0 +1,43 @@
from datetime import timedelta
from django.utils.timezone import now
from django.conf import settings
from eveapi import EVEAPIConnection
from evesde.models.cache import EVEAPICache
class EVEAPICache(object):
def hash(self, data):
from hashlib import sha1
return sha1('-'.join(data)).hexdigest()
def store(self, host, path, params, doc, obj):
key = self.hash((host, path, str(params.items())))
cached = now() + timedelta(seconds=obj.cachedUntil - obj.currentTime)
try:
obj = EVEAPICache.objects.get(key=key)
except EVEAPICache.DoesNotExist:
EVEAPICache.objects.create(key=key, cache_until=cached, document=doc)
else:
obj.cache_until = cached
obj.document = doc
obj.save()
def retrieve(self, host, path, params):
key = self.hash((host, path, str(params.items())))
try:
obj = EVEAPICache.objects.get(key=key)
except EVEAPICache.DoesNotExist:
pass
else:
if obj.cache_until >= now():
return obj.document
return None
def get_api_connection():
cache_handler = getattr(settings, 'EVE_SDE_CACHE_HANDLER', 'evesde.eveapi.EVEAPICache')
return EVEAPIConnection(cacheHandler=cache_obj)

25
evesde/eveapi/eve.py Normal file
View File

@@ -0,0 +1,25 @@
from django.db import transaction
from evesde.models.locations import Station
from evesde.eveapi import get_api_connection
def import_conquerable_stations():
"""Import all conquerable stations and outposts from the EVE API"""
api = get_api_connection()
stations = Station.objects.all()
objs = []
for station in api.eve.ConquerableStationList().outposts:
print "Importing %s" % station.stationName
try:
obj = stations.get(pk=station.stationID)
except Station.DoesNotExist:
obj = Station(pk=station.stationID)
obj.name = station.stationName
obj.system_id = station.solarSystemID
objs.append(obj)
with transaction.atomic():
for obj in objs:
obj.save()