# -*- coding: utf-8 -*-
from django import forms
from django.conf import settings
from django.db import models
from django.db.models.signals import pre_save
from .utils import EMarkdownWorker
from .widgets import EMarkdownWidget
[docs]class EMarkdownField(models.TextField):
"""
This field save markdown text with auto-populate text to html field.
This field must be used with second text field for html content.
This field support django-modeltranslation package.
EMarkdownField can use upload_link and upload_file_link for invoke upload dialog from backend.
Unfortunately, this mechanism is not fully developed for using like 3d party.
We develop this in near future.
"""
[docs] def set_markdown(self, instance=None, update_fields=None, **kwargs):
value = getattr(instance, self.attname)
dofollow = False
if hasattr(instance, 'dofollow'):
dofollow = getattr(instance, 'dofollow')
if (value and len(value) > 0) or getattr(settings, 'MARKDOWN_WRITE_EMPTY_CONTENT', False):
languages = getattr(settings, "LANGUAGES", None)
if 'modeltranslation' in settings.INSTALLED_APPS and self.name.endswith(
tuple([code for code, language in languages])):
instance.__dict__['{}_{}'.format(self.html_field, self.name[-2:])] = EMarkdownWorker(
value).get_text(dofollow, self.add_header_anchors)
else:
instance.__dict__[self.html_field] = EMarkdownWorker(value).get_text(dofollow, self.add_header_anchors)
[docs] def contribute_to_class(self, cls, name, **kwargs):
super().contribute_to_class(cls, name, **kwargs)
pre_save.connect(self.set_markdown, sender=cls)
def __init__(self, html_field=None, *args, **kwargs):
self.html_field = html_field
self.placeholder = kwargs.pop("placeholder", '')
self.upload_link = kwargs.pop("upload_link", None)
self.upload_file_link = kwargs.pop("upload_file_link", None)
self.extended_mode = kwargs.pop("extended_mode", True)
self.fullscreen = kwargs.pop("fullscreen", True)
self.add_header_anchors = kwargs.pop('add_header_anchors', False)
if not self.upload_link:
self.upload_link = getattr(settings, 'MARKDOWN_UPLOAD_LINK', None)
if not self.upload_file_link:
self.upload_file_link = getattr(settings, "MARKDOWN_UPLOAD_FILE_LINK", None)
super().__init__(*args, **kwargs)
@staticmethod
def _get_form_class():
return EMarkdownFormField