def render_page(request, page, page_version, edit=False): glitter = Glitter(page_version, request=request) columns = glitter.render(edit_mode=edit) template_name = page_version.template_name context = {"glitter": glitter, "edit_mode": edit, "columns": columns, page._meta.model_name: page, "object": page} rendered = render_to_string(template_name, context, request=request) return HttpResponse(rendered)
def get_object(self, queryset=None): obj = super(GlitterDetailMixin, self).get_object(queryset) version = self.kwargs.get('version') if version: self.glitter = Glitter(page_version=version, request=self.request) else: # If an object isn't viewable by end users - staff might still be able to edit the # object. Raise an exception and let middleware deal with it. if not obj.published or not obj.current_version: raise GlitterUnpublishedException(obj=obj) self.glitter = Glitter(page_version=obj.current_version, request=self.request) self.glitter_columns = self.glitter.render() return obj
def response_rerender(self, request, obj, template, extra_context=None): request.current_app = self.admin_site.name content_block = obj.content_block version = content_block.obj_version glitter = Glitter(version, request=request) columns = glitter.render(edit_mode=True, rerender=True) context = { 'column': slugify(content_block.column), 'rendered_json': JSONEncoderForHTML().encode({ 'content': columns[content_block.column], }), } if extra_context is not None: context.update(extra_context) return TemplateResponse(request, template, context)
def prepare_template(self, obj): template_name = 'search/indexes/%s/%s_%s.txt' % ( obj._meta.app_label, obj._meta.model_name, self.instance_name) # Need to fake an HTTP request incase any templates aren't happy try: server_name = getattr(settings, 'ALLOWED_HOSTS', '127.0.0.1')[0] except IndexError: server_name = '127.0.0.1' request = HttpRequest() request.META = { 'SERVER_NAME': server_name, 'SERVER_PORT': 80, } request.path = request.path_info = obj.get_absolute_url() request.method = 'GET' request.user = AnonymousUser() # Create Glitter to render current_version = obj.current_version glitter = Glitter(page_version=current_version, request=request) # Render the template into a variable columns = glitter.render() content = render_to_string(template_name, { 'glitter': glitter, 'edit_mode': False, 'columns': columns, obj._meta.model_name: obj, 'object': obj, }, context_instance=RequestContext(request)) # Need to escape HTML entities htmlparser = html_parser.HTMLParser() unescape = htmlparser.unescape content = unescape(content) # Prune excessive whitespace content = re.sub(r'\s+', ' ', content, flags=re.MULTILINE) return content
class GlitterDetailMixin(object): def post(self, request, *args, **kwargs): # By default detail views don't allow POST requests, however forms are usable as blocks. # So we allow POST requests, which does the same as GET. return self.get(request, *args, **kwargs) def get_object(self, queryset=None): obj = super(GlitterDetailMixin, self).get_object(queryset) version = self.kwargs.get('version') if version: self.glitter = Glitter(page_version=version, request=self.request) else: # If an object isn't viewable by end users - staff might still be able to edit the # object. Raise an exception and let middleware deal with it. if not obj.published or not obj.current_version: raise GlitterUnpublishedException(obj=obj) self.glitter = Glitter(page_version=obj.current_version, request=self.request) self.glitter_columns = self.glitter.render() return obj def get_template_names(self): return [self.glitter.version.template_name] def get_context_data(self, **kwargs): context = super(GlitterDetailMixin, self).get_context_data(**kwargs) obj = self.get_object() edit = self.kwargs.get('edit_mode') columns = self.glitter.render(edit_mode=edit) context['glitter'] = self.glitter context['columns'] = columns context['edit_mode'] = edit context[obj._meta.model_name] = obj return context
def test_html_blocks(self): # Add 100 HTML blocks to a page html_content_type = ContentType.objects.get_for_model(HTML) for block_position in range(1, 101): html_block = HTML.objects.create(content='<p>HTML Block</p>') content_block = ContentBlock.objects.create( obj_version=self.page_version, column='main_content', position=block_position, content_type=html_content_type, object_id=html_block.id, ) html_block.content_block = content_block html_block.save(update_fields=['content_block']) # Two queries: # - One to select content blocks, along with their content types # - Another to select all HTML blocks with self.assertNumQueries(2): glitter = Glitter(page_version=self.page_version) glitter.render()