Example #1
0
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)
Example #2
0
    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
Example #3
0
    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
Example #5
0
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
Example #6
0
    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()