server level files directly, don't try to render them on the fly

This commit is contained in:
Laura Klünder 2016-12-19 15:19:10 +01:00
parent b669e75af1
commit cf6b850de6

View file

@ -1,46 +1,22 @@
import os import mimetypes
from django.conf import settings from django.conf import settings
from django.core.files import File
from django.http import HttpResponse from django.http import HttpResponse
from PIL import Image
from c3nav.mapdata.utils.misc import get_render_path from c3nav.mapdata.utils.misc import get_render_path
class LevelComposer: class LevelComposer:
images = {}
images_mtimes = {}
@classmethod
def _get_image(cls, filename, cached=True):
mtime = None
if cached:
mtime = os.path.getmtime(filename)
if filename in cls.images:
if cls.images_mtimes[filename] == mtime:
return cls.images[filename]
img = Image.open(filename)
if cached:
cls.images[filename] = img
cls.images_mtimes[filename] = mtime
return img
def _get_public_level_image(self, level):
return self._get_image(get_render_path('png', level.name, 'full', True))
def _get_complete_level_image(self, level):
return self._get_image(get_render_path('png', level.name, 'full', False))
def get_level_image(self, request, level): def get_level_image(self, request, level):
if settings.DIRECT_EDITING: if settings.DIRECT_EDITING:
img = self._get_complete_level_image(level) img = get_render_path('png', level.name, 'full', True)
else: else:
img = self._get_public_level_image(level) img = get_render_path('png', level.name, 'full', False)
response = HttpResponse(content_type="image/png")
img.save(response, 'PNG') response = HttpResponse(content_type=mimetypes.guess_type(img)[0])
for chunk in File(open(img, 'rb')).chunks():
response.write(chunk)
return response return response