Project

General

Profile

1
#!/usr/bin/env python
2

    
3
"""
4
FCKeditor - The text editor for Internet - http://www.fckeditor.net
5
Copyright (C) 2003-2009 Frederico Caldeira Knabben
6

    
7
== BEGIN LICENSE ==
8

    
9
Licensed under the terms of any of the following licenses at your
10
choice:
11

    
12
- GNU General Public License Version 2 or later (the "GPL")
13
http://www.gnu.org/licenses/gpl.html
14

    
15
- GNU Lesser General Public License Version 2.1 or later (the "LGPL")
16
http://www.gnu.org/licenses/lgpl.html
17

    
18
- Mozilla Public License Version 1.1 or later (the "MPL")
19
http://www.mozilla.org/MPL/MPL-1.1.html
20

    
21
== END LICENSE ==
22

    
23
Connector for Python and Zope.
24

    
25
This code was not tested at all.
26
It just was ported from pre 2.5 release, so for further reference see
27
\editor\filemanager\browser\default\connectors\py\connector.py in previous
28
releases.
29

    
30
"""
31

    
32
from fckutil import *
33
from connector import *
34
import config as Config
35

    
36
class FCKeditorConnectorZope(FCKeditorConnector):
37
	"""
38
	Zope versiof FCKeditorConnector
39
	"""
40
	# Allow access (Zope)
41
	__allow_access_to_unprotected_subobjects__ = 1
42

    
43
	def __init__(self, context=None):
44
		"""
45
		Constructor
46
		"""
47
		FCKeditorConnector.__init__(self, environ=None) # call superclass constructor
48
		# Instance Attributes
49
		self.context = context
50
		self.request = FCKeditorRequest(context)
51

    
52
	def getZopeRootContext(self):
53
		if self.zopeRootContext is None:
54
			self.zopeRootContext = self.context.getPhysicalRoot()
55
		return self.zopeRootContext
56

    
57
	def getZopeUploadContext(self):
58
		if self.zopeUploadContext is None:
59
			folderNames = self.userFilesFolder.split("/")
60
			c = self.getZopeRootContext()
61
			for folderName in folderNames:
62
				if (folderName <> ""):
63
					c = c[folderName]
64
			self.zopeUploadContext = c
65
		return self.zopeUploadContext
66

    
67
	def setHeader(self, key, value):
68
		self.context.REQUEST.RESPONSE.setHeader(key, value)
69

    
70
	def getFolders(self, resourceType, currentFolder):
71
		# Open the folders node
72
		s = ""
73
		s += """<Folders>"""
74
		zopeFolder = self.findZopeFolder(resourceType, currentFolder)
75
		for (name, o) in zopeFolder.objectItems(["Folder"]):
76
			s += """<Folder name="%s" />""" % (
77
					convertToXmlAttribute(name)
78
					)
79
		# Close the folders node
80
		s += """</Folders>"""
81
		return s
82

    
83
	def getZopeFoldersAndFiles(self, resourceType, currentFolder):
84
		folders = self.getZopeFolders(resourceType, currentFolder)
85
		files = self.getZopeFiles(resourceType, currentFolder)
86
		s = folders + files
87
		return s
88

    
89
	def getZopeFiles(self, resourceType, currentFolder):
90
		# Open the files node
91
		s = ""
92
		s += """<Files>"""
93
		zopeFolder = self.findZopeFolder(resourceType, currentFolder)
94
		for (name, o) in zopeFolder.objectItems(["File","Image"]):
95
			s += """<File name="%s" size="%s" />""" % (
96
					convertToXmlAttribute(name),
97
					((o.get_size() / 1024) + 1)
98
					)
99
		# Close the files node
100
		s += """</Files>"""
101
		return s
102

    
103
	def findZopeFolder(self, resourceType, folderName):
104
		# returns the context of the resource / folder
105
		zopeFolder = self.getZopeUploadContext()
106
		folderName = self.removeFromStart(folderName, "/")
107
		folderName = self.removeFromEnd(folderName, "/")
108
		if (resourceType <> ""):
109
			try:
110
				zopeFolder = zopeFolder[resourceType]
111
			except:
112
				zopeFolder.manage_addProduct["OFSP"].manage_addFolder(id=resourceType, title=resourceType)
113
				zopeFolder = zopeFolder[resourceType]
114
		if (folderName <> ""):
115
			folderNames = folderName.split("/")
116
			for folderName in folderNames:
117
				zopeFolder = zopeFolder[folderName]
118
		return zopeFolder
119

    
120
	def createFolder(self, resourceType, currentFolder):
121
		# Find out where we are
122
		zopeFolder = self.findZopeFolder(resourceType, currentFolder)
123
		errorNo = 0
124
		errorMsg = ""
125
		if self.request.has_key("NewFolderName"):
126
			newFolder = self.request.get("NewFolderName", None)
127
			zopeFolder.manage_addProduct["OFSP"].manage_addFolder(id=newFolder, title=newFolder)
128
		else:
129
			errorNo = 102
130
		return self.sendErrorNode ( errorNo, errorMsg )
131

    
132
	def uploadFile(self, resourceType, currentFolder, count=None):
133
		zopeFolder = self.findZopeFolder(resourceType, currentFolder)
134
		file = self.request.get("NewFile", None)
135
		fileName = self.getFileName(file.filename)
136
		fileNameOnly = self.removeExtension(fileName)
137
		fileExtension = self.getExtension(fileName).lower()
138
		if (count):
139
			nid = "%s.%s.%s" % (fileNameOnly, count, fileExtension)
140
		else:
141
			nid = fileName
142
		title = nid
143
		try:
144
			zopeFolder.manage_addProduct['OFSP'].manage_addFile(
145
					id=nid,
146
					title=title,
147
					file=file.read()
148
					)
149
		except:
150
			if (count):
151
				count += 1
152
			else:
153
				count = 1
154
			return self.zopeFileUpload(resourceType, currentFolder, count)
155
		return self.sendUploadResults( 0 )
156

    
157
class FCKeditorRequest(object):
158
	"A wrapper around the request object"
159
	def __init__(self, context=None):
160
		r = context.REQUEST
161
		self.request = r
162

    
163
	def has_key(self, key):
164
		return self.request.has_key(key)
165

    
166
	def get(self, key, default=None):
167
		return self.request.get(key, default)
168

    
169
"""
170
Running from zope, you will need to modify this connector.
171
If you have uploaded the FCKeditor into Zope (like me), you need to
172
move this connector out of Zope, and replace the "connector" with an
173
alias as below.  The key to it is to pass the Zope context in, as
174
we then have a like to the Zope context.
175

    
176
## Script (Python) "connector.py"
177
##bind container=container
178
##bind context=context
179
##bind namespace=
180
##bind script=script
181
##bind subpath=traverse_subpath
182
##parameters=*args, **kws
183
##title=ALIAS
184
##
185

    
186
import Products.zope as connector
187
return connector.FCKeditorConnectorZope(context=context).doResponse()
188
"""
(10-10/10)