Beispiel #1
0
def render_flatpage(request, f):
    """
    Internal interface to the flat page view.
    """
    # If registration is required for accessing this page, and the user isn't
    # logged in, redirect to the login page.
    if f.registration_required and not request.user.is_authenticated():
        from djangocg.contrib.auth.views import redirect_to_login
        return redirect_to_login(request.path)
    if f.template_name:
        t = loader.select_template((f.template_name, DEFAULT_TEMPLATE))
    else:
        t = loader.get_template(DEFAULT_TEMPLATE)

    # To avoid having to always use the "|safe" filter in flatpage templates,
    # mark the title and content as already safe (since they are raw HTML
    # content in the first place).
    f.title = mark_safe(f.title)
    f.content = mark_safe(f.content)

    c = RequestContext(request, {
        'flatpage': f,
    })
    response = HttpResponse(t.render(c))
    populate_xheaders(request, response, FlatPage, f.id)
    return response
Beispiel #2
0
 def contents(self):
     from djangocg.contrib.admin.templatetags.admin_list import _boolean_icon
     from djangocg.contrib.admin.views.main import EMPTY_CHANGELIST_VALUE
     field, obj, model_admin = self.field['field'], self.form.instance, self.model_admin
     try:
         f, attr, value = lookup_field(field, obj, model_admin)
     except (AttributeError, ValueError, ObjectDoesNotExist):
         result_repr = EMPTY_CHANGELIST_VALUE
     else:
         if f is None:
             boolean = getattr(attr, "boolean", False)
             if boolean:
                 result_repr = _boolean_icon(value)
             else:
                 result_repr = smart_text(value)
                 if getattr(attr, "allow_tags", False):
                     result_repr = mark_safe(result_repr)
         else:
             if value is None:
                 result_repr = EMPTY_CHANGELIST_VALUE
             elif isinstance(f.rel, ManyToManyRel):
                 result_repr = ", ".join(map(six.text_type, value.all()))
             else:
                 result_repr = display_for_field(value, f)
     return conditional_escape(result_repr)
Beispiel #3
0
    def render(self, name, value, attrs=None):
        rel_to = self.rel.to
        if attrs is None:
            attrs = {}
        extra = []
        if rel_to in self.admin_site._registry:
            # The related object is registered with the same AdminSite
            related_url = reverse('admin:%s_%s_changelist' %
                                    (rel_to._meta.app_label,
                                    rel_to._meta.module_name),
                                    current_app=self.admin_site.name)

            params = self.url_parameters()
            if params:
                url = '?' + '&'.join(['%s=%s' % (k, v) for k, v in params.items()])
            else:
                url = ''
            if "class" not in attrs:
                attrs['class'] = 'vForeignKeyRawIdAdminField' # The JavaScript code looks for this hook.
            # TODO: "lookup_id_" is hard-coded here. This should instead use
            # the correct API to determine the ID dynamically.
            extra.append('<a href="%s%s" class="related-lookup" id="lookup_id_%s" onclick="return showRelatedObjectLookupPopup(this);"> '
                            % (related_url, url, name))
            extra.append('<img src="%s" width="16" height="16" alt="%s" /></a>'
                            % (static('admin/img/selector-search.gif'), _('Lookup')))
        output = [super(ForeignKeyRawIdWidget, self).render(name, value, attrs)] + extra
        if value:
            output.append(self.label_for_value(value))
        return mark_safe(''.join(output))
Beispiel #4
0
 def as_table(self):
     "Returns this formset rendered as HTML <tr>s -- excluding the <table></table>."
     # XXX: there is no semantic division between forms here, there
     # probably should be. It might make sense to render each form as a
     # table row with each field as a td.
     forms = ' '.join([form.as_table() for form in self])
     return mark_safe('\n'.join([six.text_type(self.management_form), forms]))
def safeseq(value):
    """
    A "safe" filter for sequences. Marks each element in the sequence,
    individually, as safe, after converting them to unicode. Returns a list
    with the results.
    """
    return [mark_safe(force_text(obj)) for obj in value]
def linebreaks_filter(value, autoescape=None):
    """
    Replaces line breaks in plain text with appropriate HTML; a single
    newline becomes an HTML line break (``<br />``) and a new line
    followed by a blank line becomes a paragraph break (``</p>``).
    """
    autoescape = autoescape and not isinstance(value, SafeData)
    return mark_safe(linebreaks(value, autoescape))
 def _dec(*args, **kwargs):
     if args:
         args = list(args)
         args[0] = force_text(args[0])
         if (isinstance(args[0], SafeData) and
             getattr(_dec._decorated_function, 'is_safe', False)):
             return mark_safe(func(*args, **kwargs))
     return func(*args, **kwargs)
Beispiel #8
0
 def main_view(self, request):
     easy_model = EasyModel(self.site, self.model)
     html_snippets = mark_safe('\n'.join([p.model_index_html(request, self.model, self.site) for p in self.plugins.values()]))
     return render_to_response('databrowse/model_detail.html', {
         'model': easy_model,
         'root_url': self.site.root_url,
         'plugin_html': html_snippets,
     })
def cut(value, arg):
    """
    Removes all values of arg from the given string.
    """
    safe = isinstance(value, SafeData)
    value = value.replace(arg, '')
    if safe and arg != ';':
        return mark_safe(value)
    return value
def urlizetrunc(value, limit, autoescape=None):
    """
    Converts URLs into clickable links, truncating URLs to the given character
    limit, and adding 'rel=nofollow' attribute to discourage spamming.

    Argument: Length to truncate URLs to.
    """
    return mark_safe(urlize_impl(value, trim_url_limit=int(limit), nofollow=True,
                            autoescape=autoescape))
Beispiel #11
0
 def render(self, context):
     bits = []
     for node in self:
         if isinstance(node, Node):
             bit = self.render_node(node, context)
         else:
             bit = node
         bits.append(force_text(bit))
     return mark_safe(''.join(bits))
Beispiel #12
0
def slugify(value):
    """
    Converts to lowercase, removes non-word characters (alphanumerics and
    underscores) and converts spaces to hyphens. Also strips leading and
    trailing whitespace.
    """
    value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore').decode('ascii')
    value = re.sub('[^\w\s-]', '', value).strip().lower()
    return mark_safe(re.sub('[-\s]+', '-', value))
Beispiel #13
0
def textile(value):
    try:
        import textile
    except ImportError:
        if settings.DEBUG:
            raise template.TemplateSyntaxError("Error in 'textile' filter: The Python textile library isn't installed.")
        return force_text(value)
    else:
        return mark_safe(force_text(textile.textile(force_bytes(value), encoding='utf-8', output='utf-8')))
Beispiel #14
0
 def render(self, name, value, attrs=None, choices=()):
     if value is None: value = []
     final_attrs = self.build_attrs(attrs, name=name)
     output = [format_html('<select multiple="multiple"{0}>', flatatt(final_attrs))]
     options = self.render_options(choices, value)
     if options:
         output.append(options)
     output.append('</select>')
     return mark_safe('\n'.join(output))
Beispiel #15
0
 def render(self, context):
     old_setting = context.autoescape
     context.autoescape = self.setting
     output = self.nodelist.render(context)
     context.autoescape = old_setting
     if self.setting:
         return mark_safe(output)
     else:
         return output
Beispiel #16
0
    def test_validation_error(self):
        ###################
        # ValidationError #
        ###################

        # Can take a string.
        self.assertHTMLEqual(str(ErrorList(ValidationError("There was an error.").messages)),
                         '<ul class="errorlist"><li>There was an error.</li></ul>')

        # Can take a unicode string.
        self.assertHTMLEqual(six.text_type(ErrorList(ValidationError("Not \u03C0.").messages)),
                         '<ul class="errorlist"><li>Not π.</li></ul>')

        # Can take a lazy string.
        self.assertHTMLEqual(str(ErrorList(ValidationError(ugettext_lazy("Error.")).messages)),
                         '<ul class="errorlist"><li>Error.</li></ul>')

        # Can take a list.
        self.assertHTMLEqual(str(ErrorList(ValidationError(["Error one.", "Error two."]).messages)),
                         '<ul class="errorlist"><li>Error one.</li><li>Error two.</li></ul>')

        # Can take a mixture in a list.
        self.assertHTMLEqual(str(ErrorList(ValidationError(["First error.", "Not \u03C0.", ugettext_lazy("Error.")]).messages)),
                         '<ul class="errorlist"><li>First error.</li><li>Not π.</li><li>Error.</li></ul>')

        @python_2_unicode_compatible
        class VeryBadError:
            def __str__(self): return "A very bad error."

        # Can take a non-string.
        self.assertHTMLEqual(str(ErrorList(ValidationError(VeryBadError()).messages)),
                         '<ul class="errorlist"><li>A very bad error.</li></ul>')

        # Escapes non-safe input but not input marked safe.
        example = 'Example of link: <a href="http://www.example.com/">example</a>'
        self.assertHTMLEqual(str(ErrorList([example])),
                         '<ul class="errorlist"><li>Example of link: &lt;a href=&quot;http://www.example.com/&quot;&gt;example&lt;/a&gt;</li></ul>')
        self.assertHTMLEqual(str(ErrorList([mark_safe(example)])),
                         '<ul class="errorlist"><li>Example of link: <a href="http://www.example.com/">example</a></li></ul>')
        self.assertHTMLEqual(str(ErrorDict({'name': example})),
                         '<ul class="errorlist"><li>nameExample of link: &lt;a href=&quot;http://www.example.com/&quot;&gt;example&lt;/a&gt;</li></ul>')
        self.assertHTMLEqual(str(ErrorDict({'name': mark_safe(example)})),
                         '<ul class="errorlist"><li>nameExample of link: <a href="http://www.example.com/">example</a></li></ul>')
Beispiel #17
0
def format_html(format_string, *args, **kwargs):
    """
    Similar to str.format, but passes all arguments through conditional_escape,
    and calls 'mark_safe' on the result. This function should be used instead
    of str.format or % interpolation to build up small HTML fragments.
    """
    args_safe = map(conditional_escape, args)
    kwargs_safe = dict([(k, conditional_escape(v)) for (k, v) in
                        six.iteritems(kwargs)])
    return mark_safe(format_string.format(*args_safe, **kwargs_safe))
def linebreaksbr(value, autoescape=None):
    """
    Converts all newlines in a piece of plain text to HTML line breaks
    (``<br />``).
    """
    autoescape = autoescape and not isinstance(value, SafeData)
    value = normalize_newlines(value)
    if autoescape:
        value = escape(value)
    return mark_safe(value.replace('\n', '<br />'))
Beispiel #19
0
def restructuredtext(value):
    try:
        from docutils.core import publish_parts
    except ImportError:
        if settings.DEBUG:
            raise template.TemplateSyntaxError("Error in 'restructuredtext' filter: The Python docutils library isn't installed.")
        return force_text(value)
    else:
        docutils_settings = getattr(settings, "RESTRUCTUREDTEXT_FILTER_SETTINGS", {})
        parts = publish_parts(source=force_bytes(value), writer_name="html4css1", settings_overrides=docutils_settings)
        return mark_safe(force_text(parts["fragment"]))
def join(value, arg, autoescape=None):
    """
    Joins a list with a string, like Python's ``str.join(list)``.
    """
    value = map(force_text, value)
    if autoescape:
        value = [conditional_escape(v) for v in value]
    try:
        data = conditional_escape(arg).join(value)
    except AttributeError: # fail silently but nicely
        return value
    return mark_safe(data)
Beispiel #21
0
 def resolve(self, context, ignore_failures=False):
     if isinstance(self.var, Variable):
         try:
             obj = self.var.resolve(context)
         except VariableDoesNotExist:
             if ignore_failures:
                 obj = None
             else:
                 if settings.TEMPLATE_STRING_IF_INVALID:
                     global invalid_var_format_string
                     if invalid_var_format_string is None:
                         invalid_var_format_string = '%s' in settings.TEMPLATE_STRING_IF_INVALID
                     if invalid_var_format_string:
                         return settings.TEMPLATE_STRING_IF_INVALID % self.var
                     return settings.TEMPLATE_STRING_IF_INVALID
                 else:
                     obj = settings.TEMPLATE_STRING_IF_INVALID
     else:
         obj = self.var
     for func, args in self.filters:
         arg_vals = []
         for lookup, arg in args:
             if not lookup:
                 arg_vals.append(mark_safe(arg))
             else:
                 arg_vals.append(arg.resolve(context))
         if getattr(func, 'expects_localtime', False):
             obj = template_localtime(obj, context.use_tz)
         if getattr(func, 'needs_autoescape', False):
             new_obj = func(obj, autoescape=context.autoescape, *arg_vals)
         else:
             new_obj = func(obj, *arg_vals)
         if getattr(func, 'is_safe', False) and isinstance(obj, SafeData):
             obj = mark_safe(new_obj)
         elif isinstance(obj, EscapeData):
             obj = mark_for_escaping(new_obj)
         else:
             obj = new_obj
     return obj
Beispiel #22
0
 def label_tag(self):
     classes = []
     contents = conditional_escape(force_text(self.field.label))
     if self.is_checkbox:
         classes.append('vCheckboxLabel')
     else:
         contents += ':'
     if self.field.field.required:
         classes.append('required')
     if not self.is_first:
         classes.append('inline')
     attrs = classes and {'class': ' '.join(classes)} or {}
     return self.field.label_tag(contents=mark_safe(contents), attrs=attrs)
Beispiel #23
0
def markdown(value, arg=''):
    """
    Runs Markdown over a given value, optionally using various
    extensions python-markdown supports.

    Syntax::

        {{ value|markdown:"extension1_name,extension2_name..." }}

    To enable safe mode, which strips raw HTML and only returns HTML
    generated by actual Markdown syntax, pass "safe" as the first
    extension in the list.

    If the version of Markdown in use does not support extensions,
    they will be silently ignored.

    """
    try:
        import markdown
    except ImportError:
        if settings.DEBUG:
            raise template.TemplateSyntaxError("Error in 'markdown' filter: The Python markdown library isn't installed.")
        return force_text(value)
    else:
        markdown_vers = getattr(markdown, "version_info", 0)
        if markdown_vers < (2, 1):
            if settings.DEBUG:
                raise template.TemplateSyntaxError(
                    "Error in 'markdown' filter: Django does not support versions of the Python markdown library < 2.1.")
            return force_text(value)
        else:
            extensions = [e for e in arg.split(",") if e]
            if extensions and extensions[0] == "safe":
                extensions = extensions[1:]
                return mark_safe(markdown.markdown(
                    force_text(value), extensions, safe_mode=True, enable_attributes=False))
            else:
                return mark_safe(markdown.markdown(
                    force_text(value), extensions, safe_mode=False))
Beispiel #24
0
 def render(self, name, value, attrs=None, choices=()):
     if attrs is None:
         attrs = {}
     attrs['class'] = 'selectfilter'
     if self.is_stacked:
         attrs['class'] += 'stacked'
     output = [super(FilteredSelectMultiple, self).render(name, value, attrs, choices)]
     output.append('<script type="text/javascript">addEvent(window, "load", function(e) {')
     # TODO: "id_" is hard-coded here. This should instead use the correct
     # API to determine the ID dynamically.
     output.append('SelectFilter.init("id_%s", "%s", %s, "%s"); });</script>\n'
         % (name, self.verbose_name.replace('"', '\\"'), int(self.is_stacked), static('admin/')))
     return mark_safe(''.join(output))
Beispiel #25
0
 def render_option(self, selected_choices, option_value, option_label):
     option_value = force_text(option_value)
     if option_value in selected_choices:
         selected_html = mark_safe(' selected="selected"')
         if not self.allow_multiple_selected:
             # Only allow for a single selection.
             selected_choices.remove(option_value)
     else:
         selected_html = ''
     return format_html('<option value="{0}"{1}>{2}</option>',
                        option_value,
                        selected_html,
                        force_text(option_label))
def linenumbers(value, autoescape=None):
    """Displays text with line numbers."""
    lines = value.split('\n')
    # Find the maximum width of the line count, for use with zero padding
    # string format command
    width = six.text_type(len(six.text_type(len(lines))))
    if not autoescape or isinstance(value, SafeData):
        for i, line in enumerate(lines):
            lines[i] = ("%0" + width  + "d. %s") % (i + 1, line)
    else:
        for i, line in enumerate(lines):
            lines[i] = ("%0" + width  + "d. %s") % (i + 1, escape(line))
    return mark_safe('\n'.join(lines))
Beispiel #27
0
 def render(self, name, value, attrs=None, choices=()):
     if value is None: value = []
     final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
     id_ = final_attrs.get('id', None)
     inputs = []
     for i, v in enumerate(value):
         input_attrs = dict(value=force_text(v), **final_attrs)
         if id_:
             # An ID attribute was given. Add a numeric index as a suffix
             # so that the inputs don't all have the same ID attribute.
             input_attrs['id'] = '%s_%s' % (id_, i)
         inputs.append(format_html('<input{0} />', flatatt(input_attrs)))
     return mark_safe('\n'.join(inputs))
Beispiel #28
0
 def render(self, name, value, *args, **kwargs):
     rel_to = self.rel.to
     info = (rel_to._meta.app_label, rel_to._meta.object_name.lower())
     self.widget.choices = self.choices
     output = [self.widget.render(name, value, *args, **kwargs)]
     if self.can_add_related:
         related_url = reverse('admin:%s_%s_add' % info, current_app=self.admin_site.name)
         # TODO: "add_id_" is hard-coded here. This should instead use the
         # correct API to determine the ID dynamically.
         output.append('<a href="%s" class="add-another" id="add_id_%s" onclick="return showAddAnotherPopup(this);"> '
                       % (related_url, name))
         output.append('<img src="%s" width="10" height="10" alt="%s"/></a>'
                       % (static('admin/img/icon_addlink.gif'), _('Add Another')))
     return mark_safe(''.join(output))
Beispiel #29
0
def paginator_number(cl, i):
    """
    Generates an individual page index link in a paginated list.
    """
    if i == DOT:
        return "... "
    elif i == cl.page_num:
        return format_html('<span class="this-page">{0}</span> ', i + 1)
    else:
        return format_html(
            '<a href="{0}"{1}>{2}</a> ',
            cl.get_query_string({PAGE_VAR: i}),
            mark_safe(' class="end"' if i == cl.paginator.num_pages - 1 else ""),
            i + 1,
        )
Beispiel #30
0
def parse_rst(text, default_reference_context, thing_being_parsed=None):
    """
    Convert the string from reST to an XHTML fragment.
    """
    overrides = {
        'doctitle_xform' : True,
        'inital_header_level' : 3,
        "default_reference_context" : default_reference_context,
        "link_base" : reverse('django-admindocs-docroot').rstrip('/')
    }
    if thing_being_parsed:
        thing_being_parsed = force_bytes("<%s>" % thing_being_parsed)
    parts = docutils.core.publish_parts(text, source_path=thing_being_parsed,
                destination_path=None, writer_name='html',
                settings_overrides=overrides)
    return mark_safe(parts['fragment'])