--- /dev/null
+#!/usr/bin/env python\r
+\r
+"""\r
+FCKeditor - The text editor for Internet - http://www.fckeditor.net\r
+Copyright (C) 2003-2008 Frederico Caldeira Knabben\r
+\r
+== BEGIN LICENSE ==\r
+\r
+Licensed under the terms of any of the following licenses at your\r
+choice:\r
+\r
+- GNU General Public License Version 2 or later (the "GPL")\r
+http://www.gnu.org/licenses/gpl.html\r
+\r
+- GNU Lesser General Public License Version 2.1 or later (the "LGPL")\r
+http://www.gnu.org/licenses/lgpl.html\r
+\r
+- Mozilla Public License Version 1.1 or later (the "MPL")\r
+http://www.mozilla.org/MPL/MPL-1.1.html\r
+\r
+== END LICENSE ==\r
+\r
+Connector for Python and Zope.\r
+\r
+This code was not tested at all.\r
+It just was ported from pre 2.5 release, so for further reference see\r
+\editor\filemanager\browser\default\connectors\py\connector.py in previous\r
+releases.\r
+\r
+"""\r
+\r
+from fckutil import *\r
+from connector import *\r
+import config as Config\r
+\r
+class FCKeditorConnectorZope(FCKeditorConnector):\r
+ """\r
+ Zope versiof FCKeditorConnector\r
+ """\r
+ # Allow access (Zope)\r
+ __allow_access_to_unprotected_subobjects__ = 1\r
+\r
+ def __init__(self, context=None):\r
+ """\r
+ Constructor\r
+ """\r
+ FCKeditorConnector.__init__(self, environ=None) # call superclass constructor\r
+ # Instance Attributes\r
+ self.context = context\r
+ self.request = FCKeditorRequest(context)\r
+\r
+ def getZopeRootContext(self):\r
+ if self.zopeRootContext is None:\r
+ self.zopeRootContext = self.context.getPhysicalRoot()\r
+ return self.zopeRootContext\r
+\r
+ def getZopeUploadContext(self):\r
+ if self.zopeUploadContext is None:\r
+ folderNames = self.userFilesFolder.split("/")\r
+ c = self.getZopeRootContext()\r
+ for folderName in folderNames:\r
+ if (folderName <> ""):\r
+ c = c[folderName]\r
+ self.zopeUploadContext = c\r
+ return self.zopeUploadContext\r
+\r
+ def setHeader(self, key, value):\r
+ self.context.REQUEST.RESPONSE.setHeader(key, value)\r
+\r
+ def getFolders(self, resourceType, currentFolder):\r
+ # Open the folders node\r
+ s = ""\r
+ s += """<Folders>"""\r
+ zopeFolder = self.findZopeFolder(resourceType, currentFolder)\r
+ for (name, o) in zopeFolder.objectItems(["Folder"]):\r
+ s += """<Folder name="%s" />""" % (\r
+ convertToXmlAttribute(name)\r
+ )\r
+ # Close the folders node\r
+ s += """</Folders>"""\r
+ return s\r
+\r
+ def getZopeFoldersAndFiles(self, resourceType, currentFolder):\r
+ folders = self.getZopeFolders(resourceType, currentFolder)\r
+ files = self.getZopeFiles(resourceType, currentFolder)\r
+ s = folders + files\r
+ return s\r
+\r
+ def getZopeFiles(self, resourceType, currentFolder):\r
+ # Open the files node\r
+ s = ""\r
+ s += """<Files>"""\r
+ zopeFolder = self.findZopeFolder(resourceType, currentFolder)\r
+ for (name, o) in zopeFolder.objectItems(["File","Image"]):\r
+ s += """<File name="%s" size="%s" />""" % (\r
+ convertToXmlAttribute(name),\r
+ ((o.get_size() / 1024) + 1)\r
+ )\r
+ # Close the files node\r
+ s += """</Files>"""\r
+ return s\r
+\r
+ def findZopeFolder(self, resourceType, folderName):\r
+ # returns the context of the resource / folder\r
+ zopeFolder = self.getZopeUploadContext()\r
+ folderName = self.removeFromStart(folderName, "/")\r
+ folderName = self.removeFromEnd(folderName, "/")\r
+ if (resourceType <> ""):\r
+ try:\r
+ zopeFolder = zopeFolder[resourceType]\r
+ except:\r
+ zopeFolder.manage_addProduct["OFSP"].manage_addFolder(id=resourceType, title=resourceType)\r
+ zopeFolder = zopeFolder[resourceType]\r
+ if (folderName <> ""):\r
+ folderNames = folderName.split("/")\r
+ for folderName in folderNames:\r
+ zopeFolder = zopeFolder[folderName]\r
+ return zopeFolder\r
+\r
+ def createFolder(self, resourceType, currentFolder):\r
+ # Find out where we are\r
+ zopeFolder = self.findZopeFolder(resourceType, currentFolder)\r
+ errorNo = 0\r
+ errorMsg = ""\r
+ if self.request.has_key("NewFolderName"):\r
+ newFolder = self.request.get("NewFolderName", None)\r
+ zopeFolder.manage_addProduct["OFSP"].manage_addFolder(id=newFolder, title=newFolder)\r
+ else:\r
+ errorNo = 102\r
+ return self.sendErrorNode ( errorNo, errorMsg )\r
+\r
+ def uploadFile(self, resourceType, currentFolder, count=None):\r
+ zopeFolder = self.findZopeFolder(resourceType, currentFolder)\r
+ file = self.request.get("NewFile", None)\r
+ fileName = self.getFileName(file.filename)\r
+ fileNameOnly = self.removeExtension(fileName)\r
+ fileExtension = self.getExtension(fileName).lower()\r
+ if (count):\r
+ nid = "%s.%s.%s" % (fileNameOnly, count, fileExtension)\r
+ else:\r
+ nid = fileName\r
+ title = nid\r
+ try:\r
+ zopeFolder.manage_addProduct['OFSP'].manage_addFile(\r
+ id=nid,\r
+ title=title,\r
+ file=file.read()\r
+ )\r
+ except:\r
+ if (count):\r
+ count += 1\r
+ else:\r
+ count = 1\r
+ return self.zopeFileUpload(resourceType, currentFolder, count)\r
+ return self.sendUploadResults( 0 )\r
+\r
+class FCKeditorRequest(object):\r
+ "A wrapper around the request object"\r
+ def __init__(self, context=None):\r
+ r = context.REQUEST\r
+ self.request = r\r
+\r
+ def has_key(self, key):\r
+ return self.request.has_key(key)\r
+\r
+ def get(self, key, default=None):\r
+ return self.request.get(key, default)\r
+\r
+"""\r
+Running from zope, you will need to modify this connector.\r
+If you have uploaded the FCKeditor into Zope (like me), you need to\r
+move this connector out of Zope, and replace the "connector" with an\r
+alias as below. The key to it is to pass the Zope context in, as\r
+we then have a like to the Zope context.\r
+\r
+## Script (Python) "connector.py"\r
+##bind container=container\r
+##bind context=context\r
+##bind namespace=\r
+##bind script=script\r
+##bind subpath=traverse_subpath\r
+##parameters=*args, **kws\r
+##title=ALIAS\r
+##\r
+\r
+import Products.zope as connector\r
+return connector.FCKeditorConnectorZope(context=context).doResponse()\r
+"""\r