text: # coding:utf-8
  from django import forms
  from django.conf import settings
  from django.contrib.admin.widgets import AdminTextareaWidget
  from django.template.loader import render_to_string
  from django.utils.safestring import mark_safe
  from django.utils.http import urlencode
  from . import settings as USettings
  from .commands import *
  from django.utils.six import string_types
  
  # 修正输入的文件路径,输入路径的标准格式：abc,不需要前后置的路径符号
  # 如果输入的路径参数是一个函数则执行，否则可以拉接受时间格式化，用来生成如file20121208.bmp的重命名格式
  
  
  def calc_path(OutputPath, instance=None):
      if callable(OutputPath):
          try:
              OutputPath = OutputPath(instance)
          except:
              OutputPath = ""
      else:
          try:
              import datetime
              OutputPath = datetime.datetime.now().strftime(OutputPath)
          except:
              pass
  
      return OutputPath
  
  # width=600, height=300, toolbars="full", imagePath="", filePath="", upload_settings={},
      # settings={},command=None,event_handler=None
  
  
  class UEditorWidget(forms.Textarea):
  
      def __init__(self, attrs=None):
  
          params = attrs.copy()
  
          width = params.pop("width")
          height = params.pop("height")
          toolbars = params.pop("toolbars", "full")
          imagePath = params.pop("imagePath", "")
          filePath = params.pop("filePath", "")
          upload_settings = params.pop("upload_settings", {})
          settings = params.pop("settings", {})
          command = params.pop("command", None)
          event_handler = params.pop("event_handler", None)
  
          # 扩展命令
          self.command = command
          self.event_handler = event_handler
          # 上传路径
          self.upload_settings = upload_settings.copy()
          self.upload_settings.update({
              "imagePathFormat": imagePath,
              "filePathFormat": filePath
          })
          # 保存
          self._upload_settings = self.upload_settings.copy()
          self.recalc_path(None)
  
          self.ueditor_settings = {
              'toolbars': toolbars,
              'initialFrameWidth': width,
              'initialFrameHeight': height
          }
          # 以下处理工具栏设置，将normal,mini等模式名称转化为工具栏配置值
          if toolbars == "full":
              del self.ueditor_settings['toolbars']
          elif isinstance(toolbars, string_types) and toolbars in USettings.TOOLBARS_SETTINGS:
              self.ueditor_settings[
                  "toolbars"] = USettings.TOOLBARS_SETTINGS[toolbars]
          else:
              self.ueditor_settings["toolbars"] = toolbars
              # raise ValueError('toolbars should be a string defined in DjangoUeditor.settings.TOOLBARS_SETTINGS, options are full(default), besttome, mini and normal!')
          self.ueditor_settings.update(settings)
          super(UEditorWidget, self).__init__(attrs)
  
      def recalc_path(self, model_inst):
          """计算上传路径,允许是function"""
          try:
              uSettings = self.upload_settings
              if 'filePathFormat' in self._upload_settings:
                  uSettings['filePathFormat'] = calc_path(
                      self._upload_settings['filePathFormat'], model_inst)
              if 'imagePathFormat' in self._upload_settings:
                  uSettings['imagePathFormat'] = calc_path(
                      self._upload_settings['imagePathFormat'], model_inst)
              if 'scrawlPathFormat' in self._upload_settings:
                  uSettings['scrawlPathFormat'] = calc_path(
                      self._upload_settings['scrawlPathFormat'], model_inst)
              if 'videoPathFormat' in self._upload_settings:
                  uSettings['videoPathFormat'] = calc_path(
                      self._upload_settings['videoPathFormat'], model_inst),
              if 'snapscreenPathFormat' in self._upload_settings:
                  uSettings['snapscreenPathFormat'] = calc_path(
                      self._upload_settings['snapscreenPathFormat'], model_inst)
              if 'catcherPathFormat' in self._upload_settings:
                  uSettings['catcherPathFormat'] = calc_path(
                      self._upload_settings['catcherPathFormat'], model_inst)
              if 'imageManagerListPath' in self._upload_settings:
                  uSettings['imageManagerListPath'] = calc_path(
                      self._upload_settings['imageManagerListPath'], model_inst)
              if 'fileManagerListPath' in self._upload_settings:
                  uSettings['fileManagerListPath'] = calc_path(
                      self._upload_settings['fileManagerListPath'], model_inst)
              # 设置默认值，未指定涂鸦、截图、远程抓图、图片目录时,默认均等于imagePath
              if uSettings['imagePathFormat'] != "":
                  default_path = uSettings['imagePathFormat']
  
                  uSettings['scrawlPathFormat'] = uSettings.get(
                      'scrawlPathFormat', default_path)
                  uSettings['videoPathFormat'] = uSettings.get(
                      'videoPathFormat', default_path)
                  uSettings['snapscreenPathFormat'] = uSettings.get(
                      'snapscreenPathFormat', default_path)
                  uSettings['catcherPathFormat'] = uSettings.get(
                      'catcherPathFormat', default_path)
                  uSettings['imageManagerListPath'] = uSettings.get(
                      'imageManagerListPath', default_path)
  
              if uSettings['filePathFormat'] != "":
                  uSettings['fileManagerListPath'] = uSettings.get(
                      'fileManagerListPath', uSettings['filePathFormat'])
          except:
              pass
  
      def render(self, name, value, attrs=None):
          if value is None:
              value = ''
          # 传入模板的参数
          editor_id = "id_%s" % name.replace("-", "_")
          uSettings = {
              "name": name,
              "id": editor_id,
              "value": value
          }
          if isinstance(self.command, list):
              cmdjs = ""
              if isinstance(self.command, list):
                  for cmd in self.command:
                      cmdjs = cmdjs + cmd.render(editor_id)
              else:
                  cmdjs = self.command.render(editor_id)
              uSettings["commands"] = cmdjs
  
          uSettings["settings"] = self.ueditor_settings.copy()
          uSettings["settings"].update({
              "serverUrl": "/ueditor/controller/?%s" % urlencode(self._upload_settings)
          })
          # 生成事件侦听
          if self.event_handler:
              uSettings["bindEvents"] = self.event_handler.render(editor_id)
  
          context = {
              'UEditor': uSettings,
              'STATIC_URL': settings.STATIC_URL,
              'STATIC_ROOT': settings.STATIC_ROOT,
              'MEDIA_URL': settings.MEDIA_URL,
              'MEDIA_ROOT': settings.MEDIA_ROOT
          }
          return mark_safe(render_to_string('ueditor.html', context))
  
      class Media:
          js = ("ueditor/ueditor.config.js",
                "ueditor/ueditor.all.min.js")
  
  
  class AdminUEditorWidget(AdminTextareaWidget, UEditorWidget):
  
      def __init__(self, **kwargs):
          super(AdminUEditorWidget, self).__init__(**kwargs)
  