from django import VERSION as DJANGO_VERSION from django import forms from django.template.loader import get_template from django.contrib.admin import widgets from django.conf import settings from django.core.exceptions import ImproperlyConfigured from .settings import ( MARKDOWNX_EDITOR_RESIZABLE, MARKDOWNX_URLS_PATH, MARKDOWNX_UPLOAD_URLS_PATH, MARKDOWNX_SERVER_CALL_LATENCY ) try: DEBUG = getattr(settings, 'DEBUG', False) except ImproperlyConfigured: # Documentations work around. DEBUG = False class MarkdownxWidget(forms.Textarea): """ MarkdownX TextArea widget for forms. Markdown enabled version of Django "TextArea" widget. """ template_name = 'markdownx/' + ('widget2.html' if DJANGO_VERSION[:2] >= (1, 11) else 'widget.html') def get_context(self, name, value, attrs=None): """ Context for the template in Django 1.10 or below. """ if not DJANGO_VERSION[:2] >= (1, 11): return super(MarkdownxWidget, self).get_context(name, value, attrs) try: attrs.update(self.add_markdownx_attrs(attrs)) except AttributeError: attrs = self.add_markdownx_attrs(attrs) return super(MarkdownxWidget, self).get_context(name, value, attrs) def render(self, name, value, attrs=None, renderer=None): """ Rendering the template and attributes thereof in Django 1.11+. .. Note:: The argument ``renderer`` added in was deprecated in Django 1.11. """ if not DJANGO_VERSION[:2] < (1, 11): return super(MarkdownxWidget, self).render(name, value, attrs, renderer) attrs = self.build_attrs(attrs, name=name) attrs.update(self.add_markdownx_attrs(attrs)) widget = super(MarkdownxWidget, self).render(name, value, attrs) template = get_template(self.template_name) return template.render({ 'markdownx_editor': widget, }) @staticmethod def add_markdownx_attrs(attrs): """ Setting (X)HTML node attributes. :param attrs: Attributes to be set. :type attrs: dict :return: Dictionary of attributes, including the default attributes. :rtype: dict """ if 'class' in attrs.keys(): attrs['class'] += ' markdownx-editor' else: attrs.update({ 'class': 'markdownx-editor' }) attrs.update({ 'data-markdownx-editor-resizable': MARKDOWNX_EDITOR_RESIZABLE, 'data-markdownx-urls-path': MARKDOWNX_URLS_PATH, 'data-markdownx-upload-urls-path': MARKDOWNX_UPLOAD_URLS_PATH, 'data-markdownx-latency': MARKDOWNX_SERVER_CALL_LATENCY }) return attrs class Media: js = { 'markdownx/js/' + ('markdownx.min.js' if not DEBUG else 'markdownx.js'), } class AdminMarkdownxWidget(MarkdownxWidget, widgets.AdminTextareaWidget): """ MarkdownX TextArea widget for admin. Markdown enabled version of Django "TextArea" widget. """ class Media: css = { 'all': {'markdownx/admin/css/markdownx.css', } } js = { 'markdownx/js/' + ('markdownx.min.js' if not DEBUG else 'markdownx.js'), }