def test_override_template(self):
        """
        """
        self.create_doc()
        doc = self.portal.doc
        overrider = IOverrider(doc)

        doc.setTitle("Foobar")

        template = u"Title {{ context.Title() }}"
        storage = IOverrideStorage(doc)
        storage.enabled_overrides = ["getUnfilteredTemplate"]
        storage.getUnfilteredTemplate = template

        self.assertEqual(overrider.getUnfilteredTemplate(), template)
    def test_override_not_enabled(self):
        """ Do not enable override, but have the field filled in
        """

        self.setDiscriminateMode("web")

        self.create_doc()
        doc = self.portal.doc
        overrider = IOverrider(doc)

        doc.setTitle("Foobar")

        template = u"Title {{context.Title()}}"
        storage = IOverrideStorage(doc)
        storage.getUnfilteredTemplate = template

        self.assertNotEqual(overrider.getUnfilteredTemplate(), template)
class EasyTemplateMobile(grok.View):
    """ Enable viewing of templated pages with mobile overrides
    """

    grok.require("zope2.View") # TODO: How to make grok accept permissions as pseudo-constants
    grok.context(ITemplatedDocument)

    def __init__(self, context, request):
        grok.View.__init__(self, context, request)

        self.overrider = IOverrider(self.context)

    def title(self):
        """
        """
        return self.overrider.Title()

    def description(self):
        """
        """
        return self.overrider.Description()

    def cooked_text(self):
        """
        @return: Resulting HTML of evaluated template
        """
        return self._cookTemplate()

    def outputTemplateErrors(self, messages):
        """ Write template errors to the user and the log output. """
        outputTemplateErrors(messages, request=self.request, logger=logger, context=self.context)

    def getTemplateSource(self):
        """ Try look up what text box we use for mobile rendering

        1. Mobile "raw template" input

        2. Mobile WYSIWYG

        3. Generic raw template

        4. Generic WYWIWYG

        """

        storage = IOverrideStorage(self.context)

        # TODO: Bad API, will be changed
        if self.overrider._isOverrideEnabled("getUnfilteredTemplate", storage):
            # Raw HTML code for mobile
            text = self.overrider.getUnfilteredTemplate()
        elif self.overrider._isOverrideEnabled("getText", storage):
            # WYSIWYG HTML code for mobile
            text = self.overrider.getText()
        else:
            # Choose between normal kupu editor input
            # and unfiltered input
            unfiltered = self.context.getRawUnfilteredTemplate()

            if unfiltered != None and unfiltered.strip() != "":
                # We are using raw HTML input
                text = unfiltered.decode("utf-8")
            else:
                text = self.context.getText().decode("utf-8")

        return text

    def compile(self, text):
        """ Compile the template. """
        engine = getEngine()

        if text == None:
            text = ""

        # TODO: Compile template only if the context has been changed
        t, messages = engine.loadString(text, False)
        return t, messages


    def _cookTemplate(self):
        """ Cook the view mode output. """

        context = getTemplateContext(self.context)

        text = self.getTemplateSource()
        t, messages = self.compile(text)

        self.outputTemplateErrors(messages)
        if not t:
            return ERROR_MESSAGE

        output, messages = t.evaluate(context)
        self.outputTemplateErrors(messages)
        if not output:
            return ERROR_MESSAGE

        return unicode(output).encode("utf-8")