datatracker/dajaxice/finders.py

76 lines
2.2 KiB
Python

import os
import tempfile
from django.contrib.staticfiles import finders
from django.template import Context
from django.template.loader import get_template
from django.core.exceptions import SuspiciousOperation
class VirtualStorage(finders.FileSystemStorage):
"""" Mock a FileSystemStorage to build tmp files on demand."""
def __init__(self, *args, **kwargs):
self._files_cache = {}
super(VirtualStorage, self).__init__(*args, **kwargs)
def get_or_create_file(self, path):
if path not in self.files:
return ''
data = getattr(self, self.files[path])()
try:
current_file = open(self._files_cache[path])
current_data = current_file.read()
current_file.close()
if current_data != data:
os.remove(path)
raise Exception("Invalid data")
except Exception:
handle, tmp_path = tempfile.mkstemp()
tmp_file = open(tmp_path, 'w')
tmp_file.write(data)
tmp_file.close()
self._files_cache[path] = tmp_path
return self._files_cache[path]
def exists(self, name):
return name in self.files
def listdir(self, path):
folders, files = [], []
for f in self.files:
if f.startswith(path):
f = f.replace(path, '', 1)
if os.sep in f:
folders.append(f.split(os.sep, 1)[0])
else:
files.append(f)
return folders, files
def path(self, name):
try:
path = self.get_or_create_file(name)
except ValueError:
raise SuspiciousOperation("Attempted access to '%s' denied." % name)
return os.path.normpath(path)
class DajaxiceStorage(VirtualStorage):
files = {os.path.join('dajaxice', 'dajaxice.core.js'): 'dajaxice_core_js'}
def dajaxice_core_js(self):
from dajaxice.core import dajaxice_autodiscover, dajaxice_config
dajaxice_autodiscover()
c = Context({'dajaxice_config': dajaxice_config})
return get_template(os.path.join('dajaxice', 'dajaxice.core.js')).render(c)
class DajaxiceFinder(finders.BaseStorageFinder):
storage = DajaxiceStorage()