mirror of
https://github.com/nikdoof/django-evesde.git
synced 2025-12-18 12:19:23 +00:00
Add API caching, move calls out into its own modules for reuse.
This commit is contained in:
43
evesde/eveapi/__init__.py
Normal file
43
evesde/eveapi/__init__.py
Normal 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
25
evesde/eveapi/eve.py
Normal 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()
|
||||
@@ -1,27 +1,8 @@
|
||||
from django.core.management.base import BaseCommand
|
||||
from django.db import transaction
|
||||
from evesde.models.locations import Station
|
||||
from eveapi import EVEAPIConnection
|
||||
|
||||
from evesde.eveapi.eve import import_conquerable_stations
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = 'Imports outposts from the EVE API.'
|
||||
|
||||
def handle(self, *args, **options):
|
||||
api = EVEAPIConnection()
|
||||
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()
|
||||
import_conquerable_stations()
|
||||
@@ -1,3 +1,4 @@
|
||||
from locations import Location, Region, Constellation, System, SystemJump, Planet, Moon, Station
|
||||
from objects import InSpaceObject
|
||||
from types import TypeCategory, TypeGroup, Type, UnitType, AttributeType, TypeAttribute
|
||||
from types import TypeCategory, TypeGroup, Type, UnitType, AttributeType, TypeAttribute
|
||||
from cache import EVEAPICache
|
||||
14
evesde/models/cache.py
Normal file
14
evesde/models/cache.py
Normal file
@@ -0,0 +1,14 @@
|
||||
from django.db import models
|
||||
|
||||
|
||||
class EVEAPICache(models.Model):
|
||||
|
||||
key = models.CharField('Cache Key', blank=False, max_length=40)
|
||||
cache_until = models.DateTimeField('Cached Until', blank=False)
|
||||
document = models.TextField('Document')
|
||||
|
||||
class Meta:
|
||||
app_label = 'evesde'
|
||||
|
||||
def __unicode__(self):
|
||||
return '%(key)s - %(cache_until)s' % self.__dict__
|
||||
@@ -6,8 +6,8 @@ class InheritanceQuerySet(QuerySet):
|
||||
def select_subclasses(self, *subclasses):
|
||||
if not subclasses:
|
||||
subclasses = [o for o in dir(self.model)
|
||||
if isinstance(getattr(self.model, o), SingleRelatedObjectDescriptor)\
|
||||
and issubclass(getattr(self.model,o).related.model, self.model)]
|
||||
if isinstance(getattr(self.model, o), SingleRelatedObjectDescriptor)
|
||||
and issubclass(getattr(self.model, o).related.model, self.model)]
|
||||
new_qs = self.select_related(*subclasses)
|
||||
new_qs.subclasses = subclasses
|
||||
return new_qs
|
||||
|
||||
Reference in New Issue
Block a user