Skip to content

Commit 3c882b9

Browse files
voiletvoilet
voilet
authored and
voilet
committed
first commit
0 parents  commit 3c882b9

File tree

2,626 files changed

+449855
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

2,626 files changed

+449855
-0
lines changed

DjangoUeditor/__init__.py

Whitespace-only changes.

DjangoUeditor/adminx.py

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#coding:utf-8
2+
#__author__ = 'sai'
3+
#DjangoUeditor Xadmin plugin
4+
5+
import xadmin
6+
from django.db.models import TextField
7+
from xadmin.views import BaseAdminPlugin, ModelFormAdminView, DetailAdminView
8+
from DjangoUeditor.models import UEditorField
9+
from DjangoUeditor.widgets import UEditorWidget
10+
from django.conf import settings
11+
12+
class XadminUEditorWidget(UEditorWidget):
13+
def __init__(self,**kwargs):
14+
self.ueditor_settings=kwargs
15+
self.Media.js = None
16+
super(XadminUEditorWidget, self).__init__(kwargs)
17+
18+
class UeditorPlugin(BaseAdminPlugin):
19+
20+
def get_field_style(self, attrs, db_field, style, **kwargs):
21+
if style == 'ueditor':
22+
if isinstance(db_field, UEditorField):
23+
return {'widget': XadminUEditorWidget(**db_field.formfield().widget.attrs)}
24+
if isinstance(db_field, TextField):
25+
return {'widget': XadminUEditorWidget}
26+
return attrs
27+
28+
def block_extrahead(self, context, nodes):
29+
js = '<script type="text/javascript" src="%s"></script>' % (settings.STATIC_URL + "ueditor/ueditor.config.js")
30+
js += '<script type="text/javascript" src="%s"></script>' % (settings.STATIC_URL + "ueditor/ueditor.all.min.js")
31+
nodes.append(js)
32+
33+
xadmin.site.register_plugin(UeditorPlugin, DetailAdminView)
34+
xadmin.site.register_plugin(UeditorPlugin, ModelFormAdminView)

DjangoUeditor/commands.py

+182
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
# coding:utf-8
2+
import urllib
3+
import settings as USettings
4+
5+
6+
class UEditorEventHandler(object):
7+
"""用来处理UEditor的事件侦听"""
8+
def on_selectionchange(self):
9+
return ""
10+
def on_contentchange(self):
11+
return ""
12+
def render(self,editorID):
13+
jscode="""
14+
%(editor)s.addListener('%(event)s', function () {
15+
%(event_code)s
16+
});"""
17+
event_codes=[]
18+
#列出所有on_打头的方法,然后在ueditor中进行侦听
19+
events=filter(lambda x: x[0:3]=="on_", dir(self))
20+
for event in events:
21+
try:
22+
event_code=getattr(self,event)()
23+
if event_code:
24+
event_code=event_code % {"editor":editorID}
25+
event_codes.append(jscode % {"editor":editorID,"event":event[3:],"event_code":event_code})
26+
except:
27+
pass
28+
29+
if len(event_codes)==0:
30+
return ""
31+
else:
32+
return "\n".join(event_codes)
33+
34+
class UEditorCommand(object):
35+
"""
36+
为前端增加按钮,下拉等扩展,
37+
"""
38+
def __init__(self,**kwargs):
39+
self.uiName=kwargs.pop("uiName","")
40+
self.index=kwargs.pop("index",0)
41+
self.title=kwargs.pop("title",self.uiName)
42+
self.ajax_url=kwargs.pop("ajax_url","")
43+
44+
def render_ui(self,editor):
45+
"""" 创建ueditor的ui扩展对象的js代码,如button,combo等 """
46+
raise NotImplementedError
47+
48+
49+
50+
def render_ajax_command(self):
51+
""""生成通过ajax调用后端命令的前端ajax代码"""
52+
if not self.ajax_url: return ""
53+
54+
return u"""
55+
UE.ajax.request( '%(ajax_url)s', {
56+
data: {
57+
name: 'ueditor'
58+
},
59+
onsuccess: function ( xhr ) {%(ajax_success)s},
60+
onerror: function ( xhr ){ %(ajax_error)s }
61+
});
62+
""" % {
63+
"ajax_url":self.ajax_url,
64+
"ajax_success":self.onExecuteAjaxCommand("success"),
65+
"ajax_error":self.onExecuteAjaxCommand("error")
66+
}
67+
68+
def render_command(self):
69+
"""" 返回注册命令的js定义 """
70+
cmd=self.onExecuteCommand()
71+
ajax_cmd=self.render_ajax_command()
72+
queryvalue_command=self.onExecuteQueryvalueCommand()
73+
cmds=[]
74+
if cmd or ajax_cmd:
75+
cmds.append( u"""execCommand: function() {
76+
%(exec_cmd)s
77+
%(exec_ajax_cmd)s
78+
}
79+
""" % {"exec_cmd":cmd,"exec_ajax_cmd":ajax_cmd},)
80+
81+
if queryvalue_command:
82+
cmds.append(u"""queryCommandValue:function(){
83+
%s
84+
}""" % queryvalue_command)
85+
if len(cmds)>0:
86+
return u"""
87+
editor.registerCommand(uiName, {
88+
%s
89+
});
90+
""" % ",".join(cmds)
91+
else:
92+
return ""
93+
94+
def render(self,editorID):
95+
return u"""
96+
UE.registerUI("%(uiName)s", function(editor, uiName) {
97+
%(registerCommand)s
98+
%(uiObject)s
99+
},%(index)s,"%(editor)s");
100+
""" % {
101+
"registerCommand":self.render_command(),
102+
"uiName":self.uiName,
103+
"uiObject":self.render_ui(editorID),
104+
"index":self.index,
105+
"editor":editorID
106+
}
107+
108+
def onExecuteCommand(self):
109+
""" 返回执行Command时的js代码 """
110+
return ""
111+
def onExecuteAjaxCommand(self,state):
112+
""" 返回执行Command时发起Ajax调用成功与失败的js代码 """
113+
return ""
114+
def onExecuteQueryvalueCommand(self):
115+
"""" 返回执行QueryvalueCommand时的js代码 """
116+
return ""
117+
118+
class UEditorButtonCommand(UEditorCommand):
119+
def __init__(self,**kwargs):
120+
self.icon = kwargs.pop("icon", "")
121+
super(UEditorButtonCommand, self).__init__(**kwargs)
122+
123+
def onClick(self):
124+
""""按钮单击js代码,默认执行uiName命令,默认会调用Command """
125+
return """
126+
editor.execCommand(uiName);
127+
"""
128+
def render_ui(self,editorID):
129+
""" 创建button的js代码: """
130+
return """
131+
var btn = new UE.ui.Button({
132+
name: uiName,
133+
title: "%(title)s",
134+
cssRules: "background-image:url('%(icon)s')!important;",
135+
onclick: function() {
136+
%(onclick)s
137+
}
138+
});
139+
return btn
140+
""" % {
141+
"icon": urllib.basejoin(USettings.gSettings.MEDIA_URL , self.icon),
142+
"onclick": self.onClick(),
143+
"title": self.title
144+
}
145+
146+
147+
class UEditorComboCommand(UEditorCommand):
148+
def __init__(self,**kwargs):
149+
self.items = kwargs.pop("items", [])
150+
self.initValue=kwargs.pop("initValue","")
151+
152+
super(UEditorComboCommand, self).__init__(**kwargs)
153+
154+
def get_items(self):
155+
return self.items
156+
157+
def onSelect(self):
158+
return ""
159+
160+
def render_ui(self,editorID):
161+
""" 创建combo的js代码: """
162+
return """
163+
var combox = new UE.ui.Combox({
164+
editor:editor,
165+
items:%(items)s,
166+
onselect:function (t, index) {
167+
%(onselect)s
168+
},
169+
title:'%(title)s',
170+
initValue:'%(initValue)s'
171+
});
172+
return combox;
173+
""" % {
174+
"title":self.title,
175+
"items":str(self.get_items()),
176+
"onselect": self.onSelect(),
177+
"initValue":self.initValue
178+
}
179+
180+
181+
class UEditorDialogCommand(UEditorCommand):
182+
pass

DjangoUeditor/forms.py

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# coding: utf-8
2+
3+
from django import forms
4+
from widgets import UEditorWidget
5+
from DjangoUeditor.models import UEditorField as ModelUEditorField
6+
7+
8+
class UEditorField(forms.CharField):
9+
def __init__(self, label, width=600, height=300, toolbars="full", imagePath="", filePath="", upload_settings={},
10+
settings={}, command=None, event_handler=None, *args, **kwargs):
11+
uSettings = locals().copy()
12+
del uSettings["self"], uSettings["label"], uSettings["args"], uSettings["kwargs"]
13+
kwargs["widget"] = UEditorWidget(attrs=uSettings)
14+
kwargs["label"] = label
15+
super(UEditorField, self).__init__(*args, **kwargs)
16+
17+
18+
def UpdateUploadPath(model_form, model_inst=None):
19+
""" 遍历model字段,如果是UEditorField则需要重新计算路径 """
20+
if model_inst is not None:
21+
try:
22+
for field in model_inst._meta.fields:
23+
if isinstance(field, ModelUEditorField):
24+
model_form.__getitem__(field.name).field.widget.recalc_path(model_inst)
25+
except:
26+
pass
27+
28+
29+
class UEditorModelForm(forms.ModelForm):
30+
def __init__(self, *args, **kwargs):
31+
super(UEditorModelForm, self).__init__(*args, **kwargs)
32+
try:
33+
if kwargs.has_key("instance"):
34+
UpdateUploadPath(self, kwargs["instance"])
35+
else:
36+
UpdateUploadPath(self, None)
37+
except Exception:
38+
pass

DjangoUeditor/models.py

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# coding: utf-8
2+
from django.db import models
3+
from django.contrib.admin import widgets as admin_widgets
4+
from widgets import UEditorWidget, AdminUEditorWidget
5+
6+
7+
class UEditorField(models.TextField):
8+
"""
9+
百度HTML编辑器字段,初始化时,可以提供以下参数
10+
initial:初始内容
11+
toolbars:提供工具按钮列表,取值为列表,如['bold', 'italic'],取值为:mini,normal,full,代表小,一般,全部
12+
imagePath:图片上传的路径,如"images/",实现上传到"{{MEDIA_ROOT}}/images"文件夹
13+
filePath:附件上传的路径,如"files/",实现上传到"{{MEDIA_ROOT}}/files"文件夹
14+
"""
15+
16+
def __init__(self, verbose_name=None, width=600, height=300, toolbars="full", imagePath="", filePath="",
17+
upload_settings={}, settings={}, command=None, event_handler=None, **kwargs):
18+
self.ueditor_settings = locals().copy()
19+
kwargs["verbose_name"] = verbose_name
20+
del self.ueditor_settings["self"], self.ueditor_settings["kwargs"], self.ueditor_settings["verbose_name"]
21+
super(UEditorField, self).__init__(**kwargs)
22+
23+
def formfield(self, **kwargs):
24+
defaults = {'widget': UEditorWidget(attrs=self.ueditor_settings)}
25+
defaults.update(kwargs)
26+
if defaults['widget'] == admin_widgets.AdminTextareaWidget:
27+
defaults['widget'] = AdminUEditorWidget(attrs=self.ueditor_settings)
28+
return super(UEditorField, self).formfield(**defaults)
29+
30+
31+
# 以下支持south
32+
try:
33+
from south.modelsinspector import add_introspection_rules
34+
35+
add_introspection_rules([], ["^DjangoUeditor\.models\.UEditorField"])
36+
except:
37+
pass

0 commit comments

Comments
 (0)