WeizhongTu пре 9 година
родитељ
комит
30f5423ada

+ 4 - 3
.gitignore

@@ -1,6 +1,5 @@
-#### joe made this: http://goel.io/joe
+.DS_Store
 
-#####=== Python ===#####
 
 # Byte-compiled / optimized / DLL files
 __pycache__/
@@ -17,6 +16,7 @@ develop-eggs/
 dist/
 downloads/
 eggs/
+.eggs/
 lib/
 lib64/
 parts/
@@ -40,9 +40,11 @@ pip-delete-this-directory.txt
 htmlcov/
 .tox/
 .coverage
+.coverage.*
 .cache
 nosetests.xml
 coverage.xml
+*,cover
 
 # Translations
 *.mo
@@ -56,4 +58,3 @@ docs/_build/
 
 # PyBuilder
 target/
-

+ 62 - 51
DjangoUeditor/commands.py

@@ -1,55 +1,60 @@
-# coding:utf-8
-import urllib
+# -*- coding: utf-8 -*-
 from . import settings as USettings
+from django.utils.six.moves.urllib.parse import urljoin
 
 
 class UEditorEventHandler(object):
     """用来处理UEditor的事件侦听"""
+
     def on_selectionchange(self):
         return ""
+
     def on_contentchange(self):
         return ""
-    def render(self,editorID):
-        jscode="""
+
+    def render(self, editorID):
+        jscode = """
             %(editor)s.addListener('%(event)s', function () {
                 %(event_code)s
         });"""
-        event_codes=[]
-        #列出所有on_打头的方法,然后在ueditor中进行侦听
-        events=filter(lambda x: x[0:3]=="on_", dir(self))
+        event_codes = []
+        # 列出所有on_打头的方法,然后在ueditor中进行侦听
+        events = filter(lambda x: x[0:3] == "on_", dir(self))
         for event in events:
             try:
-                event_code=getattr(self,event)()
+                event_code = getattr(self, event)()
                 if event_code:
-                    event_code=event_code % {"editor":editorID}
-                    event_codes.append(jscode % {"editor":editorID,"event":event[3:],"event_code":event_code})
+                    event_code = event_code % {"editor": editorID}
+                    event_codes.append(jscode % {"editor": editorID, "event": event[
+                                       3:], "event_code": event_code})
             except:
                 pass
 
-        if len(event_codes)==0:
+        if len(event_codes) == 0:
             return ""
         else:
             return "\n".join(event_codes)
 
+
 class UEditorCommand(object):
     """
     为前端增加按钮,下拉等扩展,
     """
-    def __init__(self,**kwargs):
-        self.uiName=kwargs.pop("uiName","")
-        self.index=kwargs.pop("index",0)
-        self.title=kwargs.pop("title",self.uiName)
-        self.ajax_url=kwargs.pop("ajax_url","")
 
-    def render_ui(self,editor):
+    def __init__(self, **kwargs):
+        self.uiName = kwargs.pop("uiName", "")
+        self.index = kwargs.pop("index", 0)
+        self.title = kwargs.pop("title", self.uiName)
+        self.ajax_url = kwargs.pop("ajax_url", "")
+
+    def render_ui(self, editor):
         """" 创建ueditor的ui扩展对象的js代码,如button,combo等  """
         raise NotImplementedError
 
-
-
     def render_ajax_command(self):
         """"生成通过ajax调用后端命令的前端ajax代码"""
-        if not self.ajax_url: return ""
+        if not self.ajax_url:
+            return ""
 
         return u"""
             UE.ajax.request( '%(ajax_url)s', {
@@ -60,29 +65,29 @@ class UEditorCommand(object):
                  onerror: function ( xhr ){ %(ajax_error)s }
             });
         """ % {
-            "ajax_url":self.ajax_url,
-            "ajax_success":self.onExecuteAjaxCommand("success"),
-            "ajax_error":self.onExecuteAjaxCommand("error")
+            "ajax_url": self.ajax_url,
+            "ajax_success": self.onExecuteAjaxCommand("success"),
+            "ajax_error": self.onExecuteAjaxCommand("error")
         }
 
     def render_command(self):
         """" 返回注册命令的js定义  """
-        cmd=self.onExecuteCommand()
-        ajax_cmd=self.render_ajax_command()
-        queryvalue_command=self.onExecuteQueryvalueCommand()
-        cmds=[]
+        cmd = self.onExecuteCommand()
+        ajax_cmd = self.render_ajax_command()
+        queryvalue_command = self.onExecuteQueryvalueCommand()
+        cmds = []
         if cmd or ajax_cmd:
             cmds.append( u"""execCommand: function() {
                     %(exec_cmd)s
                     %(exec_ajax_cmd)s
                 }
-            """ % {"exec_cmd":cmd,"exec_ajax_cmd":ajax_cmd},)
+            """ % {"exec_cmd": cmd, "exec_ajax_cmd": ajax_cmd},)
 
         if queryvalue_command:
             cmds.append(u"""queryCommandValue:function(){
                     %s
                 }""" % queryvalue_command)
-        if len(cmds)>0:
+        if len(cmds) > 0:
             return u"""
             editor.registerCommand(uiName, {
                     %s
@@ -91,32 +96,36 @@ class UEditorCommand(object):
         else:
             return ""
 
-    def render(self,editorID):
+    def render(self, editorID):
         return u"""
         UE.registerUI("%(uiName)s", function(editor, uiName) {
             %(registerCommand)s
             %(uiObject)s
         },%(index)s,"%(editor)s");
         """ % {
-                "registerCommand":self.render_command(),
-                "uiName":self.uiName,
-                "uiObject":self.render_ui(editorID),
-                "index":self.index,
-                "editor":editorID
-            }
+            "registerCommand": self.render_command(),
+            "uiName": self.uiName,
+            "uiObject": self.render_ui(editorID),
+            "index": self.index,
+            "editor": editorID
+        }
 
     def onExecuteCommand(self):
         """ 返回执行Command时的js代码 """
         return ""
-    def onExecuteAjaxCommand(self,state):
+
+    def onExecuteAjaxCommand(self, state):
         """ 返回执行Command时发起Ajax调用成功与失败的js代码 """
         return ""
+
     def onExecuteQueryvalueCommand(self):
         """" 返回执行QueryvalueCommand时的js代码 """
         return ""
 
+
 class UEditorButtonCommand(UEditorCommand):
-    def __init__(self,**kwargs):
+
+    def __init__(self, **kwargs):
         self.icon = kwargs.pop("icon", "")
         super(UEditorButtonCommand, self).__init__(**kwargs)
 
@@ -125,7 +134,8 @@ class UEditorButtonCommand(UEditorCommand):
         return """
             editor.execCommand(uiName);
         """
-    def render_ui(self,editorID):
+
+    def render_ui(self, editorID):
         """         创建button的js代码:        """
         return """
             var btn = new UE.ui.Button({
@@ -138,16 +148,17 @@ class UEditorButtonCommand(UEditorCommand):
             });
             return btn
         """ % {
-                "icon": urllib.basejoin(USettings.gSettings.MEDIA_URL , self.icon),
-                "onclick": self.onClick(),
-                "title": self.title
-            }
+            "icon": urljoin(USettings.gSettings.MEDIA_URL, self.icon),
+            "onclick": self.onClick(),
+            "title": self.title
+        }
 
 
 class UEditorComboCommand(UEditorCommand):
-    def __init__(self,**kwargs):
+
+    def __init__(self, **kwargs):
         self.items = kwargs.pop("items", [])
-        self.initValue=kwargs.pop("initValue","")
+        self.initValue = kwargs.pop("initValue", "")
 
         super(UEditorComboCommand, self).__init__(**kwargs)
 
@@ -157,7 +168,7 @@ class UEditorComboCommand(UEditorCommand):
     def onSelect(self):
         return ""
 
-    def render_ui(self,editorID):
+    def render_ui(self, editorID):
         """         创建combo的js代码:        """
         return """
         var combox = new UE.ui.Combox({
@@ -171,12 +182,12 @@ class UEditorComboCommand(UEditorCommand):
         });
         return combox;
         """ % {
-                "title":self.title,
-                "items":str(self.get_items()),
-                "onselect": self.onSelect(),
-                "initValue":self.initValue
+            "title": self.title,
+            "items": str(self.get_items()),
+            "onselect": self.onSelect(),
+            "initValue": self.initValue
         }
 
 
 class UEditorDialogCommand(UEditorCommand):
-    pass
+    pass

+ 5 - 4
DjangoUeditor/forms.py

@@ -1,13 +1,14 @@
-# coding: utf-8
-
+# -*- coding: utf-8 -*-
 from django import forms
 from widgets import UEditorWidget
 from DjangoUeditor.models import UEditorField as ModelUEditorField
 
 
 class UEditorField(forms.CharField):
-
-    def __init__(self, label, width=600, height=300, toolbars="full", imagePath="", filePath="", upload_settings={}, settings={}, command=None, event_handler=None, *args, **kwargs):
+    def __init__(self, label, width=600, height=300, toolbars="full",
+                 imagePath="", filePath="", upload_settings={},
+                 settings={}, command=None, event_handler=None, *args,
+                 **kwargs):
         uSettings = locals().copy()
         del uSettings["self"], uSettings[
             "label"], uSettings["args"], uSettings["kwargs"]

+ 16 - 9
DjangoUeditor/models.py

@@ -1,4 +1,4 @@
-#coding: utf-8
+# -*- coding: utf-8 -*-
 from django.db import models
 from django.contrib.admin import widgets as admin_widgets
 from .widgets import UEditorWidget, AdminUEditorWidget
@@ -12,20 +12,27 @@ class UEditorField(models.TextField):
         imagePath:图片上传的路径,如"images/",实现上传到"{{MEDIA_ROOT}}/images"文件夹
         filePath:附件上传的路径,如"files/",实现上传到"{{MEDIA_ROOT}}/files"文件夹
     """
-    def __init__(self,verbose_name=None, width=600, height=300, toolbars="full",imagePath="", filePath="",upload_settings={},settings={},command=None,event_handler=None ,**kwargs):
-        self.ueditor_settings=locals().copy()
-        kwargs["verbose_name"]=verbose_name
-        del self.ueditor_settings["self"],self.ueditor_settings["kwargs"],self.ueditor_settings["verbose_name"]
-        super(UEditorField,self).__init__(**kwargs)
 
-    def formfield(self,**kwargs):
+    def __init__(self, verbose_name=None, width=600, height=300,
+                 toolbars="full", imagePath="", filePath="",
+                 upload_settings={}, settings={}, command=None,
+                 event_handler=None, **kwargs):
+        self.ueditor_settings = locals().copy()
+        kwargs["verbose_name"] = verbose_name
+        del self.ueditor_settings["self"], self.ueditor_settings[
+            "kwargs"], self.ueditor_settings["verbose_name"]
+        super(UEditorField, self).__init__(**kwargs)
+
+    def formfield(self, **kwargs):
         defaults = {'widget': UEditorWidget(attrs=self.ueditor_settings)}
         defaults.update(kwargs)
         if defaults['widget'] == admin_widgets.AdminTextareaWidget:
-            defaults['widget'] = AdminUEditorWidget(attrs=self.ueditor_settings)
+            defaults['widget'] = AdminUEditorWidget(
+                attrs=self.ueditor_settings)
         return super(UEditorField, self).formfield(**defaults)
 
-#以下支持south
+
+# 以下支持south
 try:
     from south.modelsinspector import add_introspection_rules
     add_introspection_rules([], ["^DjangoUeditor\.models\.UEditorField"])

+ 2 - 1
DjangoUeditor/settings.py

@@ -1,4 +1,4 @@
-# coding:utf-8
+# -*- coding: utf-8 -*-
 from django.conf import settings as gSettings  # 全局设置
 
 # 工具栏样式,可以添加任意多的模式
@@ -102,6 +102,7 @@ def UpdateUserSettings():
     if 'upload' in UserSettings:
         UEditorUploadSettings.update(UserSettings["upload"])
 
+
 # 读取用户Settings文件并覆盖默认配置
 UpdateUserSettings()
 

+ 18 - 10
DjangoUeditor/urls.py

@@ -1,14 +1,22 @@
-# coding:utf-8
-from django import VERSION
+# -*- coding: utf-8 -*-
+import django
+from .views import get_ueditor_controller
 
-if VERSION[0:2] > (1, 3):
-    from django.conf.urls import patterns, url
-else:
-    from django.conf.urls.defaults import patterns, url
+DJANGO_VERSION = django.VERSION[:2]
 
 
-from .views import get_ueditor_controller
+if DJANGO_VERSION >= (1, 8):
+    from django.conf.urls import url
+    urlpatterns = [
+        url(r'^controller/$', get_ueditor_controller)
+    ]
+
+else:
+    try:
+        from django.conf.urls import patterns, url
+    except ImportError:
+        from django.conf.urls.defaults import patterns, url
 
-urlpatterns = patterns('',
-    url(r'^controller/$', get_ueditor_controller)
-)
+    urlpatterns = patterns('',
+        url(r'^controller/$', get_ueditor_controller)
+    )

+ 11 - 7
DjangoUeditor/utils.py

@@ -1,4 +1,4 @@
-# coding: utf-8
+# -*- coding: utf-8 -*-
 # 文件大小类
 from django.utils import six
 
@@ -7,7 +7,10 @@ if six.PY3:
 
 
 class FileSize():
-    SIZE_UNIT = {"Byte": 1, "KB": 1024, "MB": 1048576, "GB": 1073741824, "TB": 1099511627776}
+    SIZE_UNIT = {
+        "Byte": 1, "KB": 1024, "MB": 1048576,
+        "GB": 1073741824, "TB": 1099511627776
+    }
 
     def __init__(self, size):
         self.size = long(FileSize.Format(size))
@@ -18,7 +21,7 @@ class FileSize():
         if isinstance(size, six.integer_types):
             return size
         else:
-            if not isinstance(size, str):
+            if not isinstance(size, six.string_types):
                 return 0
             else:
                 oSize = size.lstrip().upper().replace(" ", "")
@@ -41,14 +44,14 @@ class FileSize():
     # 返回字节为单位的值
     @property
     def size(self):
-        return self.size
+        return self._size
 
     @size.setter
     def size(self, newsize):
         try:
-            self.size = long(newsize)
+            self._size = long(newsize)
         except:
-            self.size = 0
+            self._size = 0
 
     # 返回带单位的自动值
     @property
@@ -67,7 +70,8 @@ class FileSize():
         if (self.size % FileSize.SIZE_UNIT[unit]) == 0:
             return "%s%s" % ((self.size / FileSize.SIZE_UNIT[unit]), unit)
         else:
-            return "%0.2f%s" % (round(float(self.size) / float(FileSize.SIZE_UNIT[unit]), 2), unit)
+            return "%0.2f%s" % (round(float(self.size) / float(
+                FileSize.SIZE_UNIT[unit]), 2), unit)
 
     def __str__(self):
         return self.FriendValue

+ 25 - 14
DjangoUeditor/views.py

@@ -1,4 +1,4 @@
-# coding:utf-8
+# -*- coding: utf-8 -*-
 from importlib import import_module
 from django.http import HttpResponse
 from . import settings as USettings
@@ -7,9 +7,12 @@ import json
 from django.views.decorators.csrf import csrf_exempt
 import datetime
 import random
-import urllib
 from django.utils import six
 
+from django.utils.six.moves.urllib.request import urlopen
+from django.utils.six.moves.urllib.parse import urljoin
+
+
 if six.PY3:
     long = int
 
@@ -35,19 +38,22 @@ def save_upload_file(PostFile, FilePath):
             f.write(chunk)
     except Exception as E:
         f.close()
-        return u"写入文件错误:" + E.message
+        return u"写入文件错误: {}".format(E.message)
     f.close()
     return u"SUCCESS"
 
 
 @csrf_exempt
 def get_ueditor_settings(request):
-    return HttpResponse(json.dumps(USettings.UEditorUploadSettings, ensure_ascii=False), content_type="application/javascript")
+    json_data = json.dumps(
+        USettings.UEditorUploadSettings,
+        ensure_ascii=False)
+    return HttpResponse(json_data, content_type="application/javascript")
 
 
 @csrf_exempt
 def get_ueditor_controller(request):
-    """获取ueditor的后端URL地址    """
+    """获取ueditor的后端URL地址"""
 
     action = request.GET.get("action", "")
     reponseAction = {
@@ -67,7 +73,10 @@ def get_ueditor_controller(request):
 def list_files(request):
     """列出文件"""
     if request.method != "GET":
-        return HttpResponse(json.dumps(u"{'state:'ERROR'}"), content_type="application/javascript")
+        return HttpResponse(
+            json.dumps(u"{'state:'ERROR'}"),
+            content_type="application/javascript"
+        )
     # 取得动作
     action = request.GET.get("action", "listimage")
 
@@ -114,7 +123,6 @@ def get_files(root_path, cur_path, allow_types=[]):
     files = []
     items = os.listdir(cur_path)
     for item in items:
-        item = unicode(item)
         item_fullname = os.path.join(
             root_path, cur_path, item).replace("\\", "/")
         if os.path.isdir(item_fullname):
@@ -124,7 +132,11 @@ def get_files(root_path, cur_path, allow_types=[]):
             is_allow_list = (len(allow_types) == 0) or (ext in allow_types)
             if is_allow_list:
                 files.append({
-                    "url": urllib.basejoin(USettings.gSettings.MEDIA_URL, os.path.join(os.path.relpath(cur_path, root_path), item).replace("\\", "/")),
+                    "url": urljoin(
+                        USettings.gSettings.MEDIA_URL,
+                        os.path.join(
+                            os.path.relpath(cur_path, root_path), item
+                            ).replace("\\", "/")),
                     "mtime": os.path.getmtime(item_fullname)
                 })
 
@@ -228,7 +240,7 @@ def UploadFile(request):
     # 返回数据
     return_info = {
         # 保存后的文件名称
-        'url': urllib.basejoin(USettings.gSettings.MEDIA_URL, OutputPathFormat),
+        'url': urljoin(USettings.gSettings.MEDIA_URL, OutputPathFormat),
         'original': upload_file_name,  # 原始文件名
         'type': upload_original_ext,
         'state': state,  # 上传状态,成功时返回SUCCESS,其他任何值将原样返回至图片上传框中
@@ -274,7 +286,7 @@ def catcher_remote_image(request):
             o_filename = os.path.join(o_path, o_file).replace("\\", "/")
             # 读取远程图片文件
             try:
-                remote_image = urllib.urlopen(remote_url)
+                remote_image = urlopen(remote_url)
                 # 将抓取到的文件写入文件
                 try:
                     f = open(o_filename, 'wb')
@@ -288,7 +300,7 @@ def catcher_remote_image(request):
 
             catcher_infos.append({
                 "state": state,
-                "url": urllib.basejoin(USettings.gSettings.MEDIA_URL, o_path_format),
+                "url": urljoin(USettings.gSettings.MEDIA_URL, o_path_format),
                 "size": os.path.getsize(o_filename),
                 "title": os.path.basename(o_file),
                 "original": remote_file_name,
@@ -319,9 +331,8 @@ def get_output_path(request, path_format, path_format_var):
         os.makedirs(OutputPath)
     return (OutputPathFormat, OutputPath, OutputFile)
 
-# 涂鸦功能上传处理
-
 
+# 涂鸦功能上传处理
 @csrf_exempt
 def save_scrawl_file(request, filename):
     import base64
@@ -333,5 +344,5 @@ def save_scrawl_file(request, filename):
         f.close()
         state = "SUCCESS"
     except Exception as E:
-        state = "写入图片文件错误:%s" % E.message
+        state = "写入图片文件错误: {}".format(E.message)
     return state