def __init__(self, queryset, passthrough=None):
self.queryset = queryset
self.passthrough = passthrough
+
def __getitem__(self, key):
try:
return self.queryset.get(key__exact=key).value
except ObjectDoesNotExist:
- if self.passthrough:
+ if self.passthrough is not None:
return self.passthrough.__getitem__(key)
raise KeyError
+
def keys(self):
keys = set(self.queryset.values_list('key', flat=True).distinct())
- if self.passthrough:
- keys += set(self.passthrough.keys())
+ if self.passthrough is not None:
+ keys |= set(self.passthrough.keys())
return list(keys)
from django.contrib.sites.models import Site
from django.http import HttpResponse, HttpResponseServerError, HttpResponseRedirect
from django.core.servers.basehttp import FileWrapper
-from philo.models.base import TreeEntity, Entity
+from philo.models.base import TreeEntity, Entity, QuerySetMapper
from philo.utils import ContentTypeSubclassLimiter
from philo.validators import RedirectValidator
def accepts_subpath(self):
return self.view.accepts_subpath
- def render_to_response(self, request, path=None, subpath=None):
- return self.view.render_to_response(self, request, path, subpath)
+ def render_to_response(self, request, path=None, subpath=None, extra_context=None):
+ return self.view.render_to_response(self, request, path, subpath, extra_context)
class Meta:
app_label = 'philo'
accepts_subpath = False
- def render_to_response(self, node, request, path=None, subpath=None):
+ def attributes_with_node(self, node):
+ return QuerySetMapper(self.attribute_set, passthrough=node.attributes)
+
+ def relationships_with_node(self, node):
+ return QuerySetMapper(self.relationship_set, passthrough=node.relationships)
+
+ def render_to_response(self, node, request, path=None, subpath=None, extra_context=None):
raise NotImplementedError('View subclasses must implement render_to_response.')
class Meta:
urlpatterns = []
- def render_to_response(self, node, request, path=None, subpath=None):
+ def render_to_response(self, node, request, path=None, subpath=None, extra_context=None):
if not subpath:
subpath = ""
subpath = "/" + subpath
target = models.CharField(max_length=200, validators=[RedirectValidator()])
status_code = models.IntegerField(choices=STATUS_CODES, default=302, verbose_name='redirect type')
- def render_to_response(self, node, request, path=None, subpath=None):
+ def render_to_response(self, node, request, path=None, subpath=None, extra_context=None):
response = HttpResponseRedirect(self.target)
response.status_code = self.status_code
return response
mimetype = models.CharField(max_length=255)
file = models.FileField(upload_to='philo/files/%Y/%m/%d')
- def render_to_response(self, node, request, path=None, subpath=None):
+ def render_to_response(self, node, request, path=None, subpath=None, extra_context=None):
wrapper = FileWrapper(self.file)
response = HttpResponse(wrapper, content_type=self.mimetype)
response['Content-Length'] = self.file.size
template = models.ForeignKey(Template, related_name='pages')
title = models.CharField(max_length=255)
- def render_to_response(self, node, request, path=None, subpath=None):
- return HttpResponse(self.template.django_template.render(RequestContext(request, {'page': self})), mimetype=self.template.mimetype)
+ def render_to_response(self, node, request, path=None, subpath=None, extra_context=None):
+ context = {}
+ context.update(extra_context or {})
+ context.update({'page': self, 'attributes': self.attributes_with_node(node), 'relationships': self.relationships_with_node(node)})
+ return HttpResponse(self.template.django_template.render(RequestContext(request, context)), mimetype=self.template.mimetype)
def __unicode__(self):
return self.title