diff --git a/CMFPlone-2.0-final.tar.gz b/CMFPlone-2.0-final.tar.gz new file mode 100644 index 0000000..3813242 --- /dev/null +++ b/CMFPlone-2.0-final.tar.gz Binary files differ diff --git a/CMFPlone1.0.5.tar.gz b/CMFPlone1.0.5.tar.gz deleted file mode 100644 index bce8685..0000000 --- a/CMFPlone1.0.5.tar.gz +++ /dev/null Binary files differ diff --git a/cmfplone.spec b/cmfplone.spec index 4c1b0ff..efc2ba5 100644 --- a/cmfplone.spec +++ b/cmfplone.spec @@ -1,15 +1,14 @@ Summary: A user friendly and powerful Content Management System Name: CMFPlone -Version: 1.0.5 -Release: 2 +Version: 2.0 +Release: 1 URL: http://plone.org -Source0: http://prdownloads.sourceforge.net/plone/%{name}%{version}.tar.gz -Patch: homepage-bugfix.patch +Source: http://prdownloads.sourceforge.net/plone/%{name}-%{version}-final.tar.gz License: GPL version 2 Group: Development/Web Applications BuildRoot: %{_tmppath}/%{name}-root Packager: Alex Tucker -Requires: Zope-webserver >= 2.6.1, CMF = 1.3.2 +Requires: Zope-webserver >= 2.6.2, CMF >= 1.4.2, DCWorkflow >= 0.5, Formulator >= 1.4.0, CMFActionIcons >= 0.9, CMFQuickInstallerTool >= 1.4, GroupUserFolder >= 2.0, BTreeFolder2 >= 1.0, CMFFormController >= 1.0.1 %description Plone is a user friendly implementation of the Content Management Framework @@ -21,10 +20,116 @@ and you can hack it to enable SOAP. Turn it into a distributed application system by installing ZEO. -%prep -%setup -q -%patch +%package -n CMF +Summary: The Zope Content Management Framework +Group: Development/Web Applications +License: Zope Public License (ZPL) Version 2.0 +URL: http://cmf.zope.org/download +Version: 1.4.2 +%description -n CMF +The Zope Content Management Framework provides a set of services and +content objects useful for building highly dynamic, content-oriented +portal sites. As packaged, the CMF generates a site much like the +Zope.org site. The CMF is intended to be easily customizable, in +terms of both the types of content used and the policies and services +it provides. +%package -n DCWorkflow +Summary: A workflow tool for Zope +Group: Development/Web Applications +License: Zope Public License (ZPL) Version 2.0 +URL: http://cvs.zope.org/Products/DCWorkflow/ +Version: 0.5 +%description -n DCWorkflow +DCWorkflow makes it easy to implement workflows where: tasks are assigned to user roles, not individuals; every object of a given type goes through the same workflow; tasks are assigned to user roles, not individuals. + +%package -n Formulator +Summary: Zope tool for form validation. +Group: Development/Web Applications +License: Unknown +URL: http://www.zope.org/Members/infrae/Formulator +Version: 1.6.2 +%description -n Formulator +Formulator is a tool to help with the creation and validation of web +forms. Form fields are stored as objects in Zope, in a special Form +folder. + +%package -n CMFActionIcons +Summary: Zope tool for mapping actions to icons +Group: Development/Web Applications +License: Zope Public License (ZPL) Version 2.0 +URL: http://cvs.zope.org/Products/CMFActionIcons/ +Version: 0.9 +%description -n CMFActionIcons +Map CMF actions to icons, for ease of building icon-centric toolbars. + +%package -n CMFQuickInstallerTool +Summary: Zope tool for easy installation of CMF products. +Group: Development/Web Applications +License: GPL +URL: http://sf.net/projects/collective +Version: 1.4 +%description -n CMFQuickInstallerTool +CMFQuickInstallerTool is a facility for comfortable activation/deactivation +of CMF compliant products inside a CMF site. + +%package -n GroupUserFolder +Summary: Zope Product to manage users and groups +Group: Development/Web Applications +License: http://www.gnu.org/copyleft/gpl.html +URL: http://sf.net/projects/collective +Version: 2.0a +%description -n GroupUserFolder +GroupUserFolder is a kind of user folder that provides a special kind +of user management. Some users are "flagged" as GROUP and then normal +users will be able to belong to one or serveral groups. + +%package -n BTreeFolder2 +Summary: BTreeFolders are used for efficient storage of large numbers of objects in one folder +Group: Development/Web Applications +License: ZPL2 +URL: http://cvs.zope.org/Products/BTreeFolder2/ +Version: 1.0 +%description -n BTreeFolder2 +BTree Folders are useful for situations where you need to store a lot +of objects in a single folder, usually of the same type. They make use +of Zope's optimized BTree implementation. They also provide a user +interface optimized for a large number of objects. + +%package -n CMFFormController +Summary: Zope packages for form validation. +Group: Development/Web Applications +License: ZPL2 +URL: http://sf.net/projects/collective +Version: 1.0.1 +%description -n CMFFormController +CMFFormController replaces the portal_form form validation mechanism +from Plone. It should work just fine in plain CMF as well. + +%package -n PlacelessTranslationService +Summary: Zope support for multilingual interface and access keys +Group: Development/Web Applications +License: GPL2 +URL: http://plone.org/development/i18n/existing-translations +Version: 1.0fork_rc3 +%description -n PlacelessTranslationService +Full unicode support for multilingual interface and access keys. + +%package -n archetypes +Summary: A Zope/CMF product for developing new content types +Group: Development/Web Applications +License: ZPL +URL: http://sourceforge.net/projects/archetypes/ +Version: 1.2.5rc4 +Requires: Zope-webserver >= 2.6.2, CMF >= 1.4.2, CMFPlone >= 2.0, CMFFormController >= 1.0 +%description -n archetypes +Framework for the development of new Content Types in +Zope/CMF/Plone. Schema driven automatic form generation, simple +integration with rich content types, and a lower entry bar to the +complex requirements Zope places on new content objects. + +%prep +%setup -n CMFPlone-2.0-final %build %install @@ -32,16 +137,67 @@ install -m0755 --directory $RPM_BUILD_ROOT/usr/share/zope/lib/python/Products -cp -Rdp CMFPlone DCWorkflow Formulator i18n $RPM_BUILD_ROOT/usr/share/zope/lib/python/Products/ +cp -Rdp * $RPM_BUILD_ROOT/usr/share/zope/lib/python/Products/ +chmod 644 $RPM_BUILD_ROOT/usr/share/zope/lib/python/Products/GroupUserFolder/doc/py2htmldoc.py %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) -/usr/share/zope/lib/python/Products +/usr/share/zope/lib/python/Products/CMFPlone +/usr/share/zope/lib/python/Products/PloneErrorReporting +/usr/share/zope/lib/python/Products/PortalTransforms + +%files -n CMF +%defattr(-,root,root) +/usr/share/zope/lib/python/Products/CMFCalendar +/usr/share/zope/lib/python/Products/CMFCore +/usr/share/zope/lib/python/Products/CMFDefault +/usr/share/zope/lib/python/Products/CMFTopic + +%files -n DCWorkflow +%defattr(-,root,root) +/usr/share/zope/lib/python/Products/DCWorkflow + +%files -n Formulator +%defattr(-,root,root) +/usr/share/zope/lib/python/Products/Formulator + +%files -n CMFActionIcons +%defattr(-,root,root) +/usr/share/zope/lib/python/Products/CMFActionIcons + +%files -n CMFQuickInstallerTool +%defattr(-,root,root) +/usr/share/zope/lib/python/Products/CMFQuickInstallerTool + +%files -n GroupUserFolder +%defattr(-,root,root) +/usr/share/zope/lib/python/Products/GroupUserFolder + +%files -n BTreeFolder2 +%defattr(-,root,root) +/usr/share/zope/lib/python/Products/BTreeFolder2 + +%files -n CMFFormController +%defattr(-,root,root) +/usr/share/zope/lib/python/Products/CMFFormController + +%files -n PlacelessTranslationService +%defattr(-,root,root) +/usr/share/zope/lib/python/Products/PlacelessTranslationService + +%files -n archetypes +%defattr(-,root,root) +/usr/share/zope/lib/python/Products/Archetypes +/usr/share/zope/lib/python/Products/generator +/usr/share/zope/lib/python/Products/validation %changelog +* Mon May 10 2004 Alex Tucker 2.0-1 +- Updated to version 2.0. Subpackaged included zope pacakges. + * Sat Jan 10 2004 Alex Tucker 1.0.5-2 - Fixed default homepage bug. diff --git a/homepage-bugfix.patch b/homepage-bugfix.patch deleted file mode 100644 index d80a052..0000000 --- a/homepage-bugfix.patch +++ /dev/null @@ -1,227 +0,0 @@ -diff -uNr CMFPlone.orig/MembershipTool.py CMFPlone/MembershipTool.py ---- CMFPlone.orig/MembershipTool.py 2003-09-09 05:42:53.000000000 +0100 -+++ CMFPlone/MembershipTool.py 2004-01-10 16:16:10.000000000 +0000 -@@ -115,7 +115,7 @@ - # Create Member's home page. - # go get the home page text from the skin - try: -- member_content = self.homePageText() -+ member_content = self.homePageText() % member_id - except: - member_content = DEFAULT_MEMBER_CONTENT % member_id - -diff -uNr CMFPlone.orig/MembershipTool.py~ CMFPlone/MembershipTool.py~ ---- CMFPlone.orig/MembershipTool.py~ 1970-01-01 01:00:00.000000000 +0100 -+++ CMFPlone/MembershipTool.py~ 2003-09-09 05:42:53.000000000 +0100 -@@ -0,0 +1,211 @@ -+from Products.CMFCore.utils import getToolByName, _checkPermission -+from Products.CMFDefault.MembershipTool import MembershipTool as BaseTool -+from Products.CMFDefault.Document import addDocument -+from Products.CMFPlone.PloneFolder import addPloneFolder -+from Acquisition import aq_base -+ -+default_portrait = 'defaultUser.gif' -+ -+DEFAULT_MEMBER_CONTENT = """\ -+Default page for %s -+ -+ This is the default document created for you when -+ you joined this community. -+ -+ To change the content just click the 'edit' -+ tab above. -+""" -+ -+class MembershipTool( BaseTool ): -+ """ Plone customized Membership Tool """ -+ meta_type='Plone Membership Tool' -+ plone_tool = 1 -+ personal_id = '.personal' -+ portrait_id = 'MyPortrait' -+ default_portrait = 'defaultUser.gif' -+ -+ def getPersonalPortrait(self, member_id=None, verifyPermission=0): -+ """ -+ returns the Portait for a member_id -+ """ -+ portrait=None -+ personal=self.getPersonalFolder(member_id) -+ -+ if personal: -+ portrait=getattr( personal -+ , self.portrait_id -+ , None ) -+ if verifyPermission and not _checkPermission('View', portrait): -+ return None -+ if portrait is None: -+ portal = getToolByName(self, 'portal_url').getPortalObject() -+ portrait = getattr(portal, default_portrait) -+ -+ return portrait -+ -+ def getPersonalFolder(self, member_id=None): -+ """ -+ returns the Personal Item folder for a member -+ if no Personal Folder exists will return None -+ """ -+ home=self.getHomeFolder(member_id) -+ personal=None -+ if home: -+ personal=getattr( home -+ , self.personal_id -+ , None ) -+ return personal -+ -+ def changeMemberPortrait(self, portrait, member_id=None): -+ """ -+ given a portrait we will modify the users portrait -+ we put this method here because we do not want -+ .personal or portrait in the catalog -+ -+ portraits are $MemberHomeFolder/.personal/MyPortrait -+ """ -+ if portrait and portrait.filename: -+ catalog=getToolByName(self, 'portal_catalog') -+ personal=self.getPersonalFolder(member_id) -+ if not personal: -+ home=self.getHomeFolder(member_id) -+ home.invokeFactory(id=self.personal_id, type_name='Folder') -+ personal=getattr(home, self.personal_id) -+ catalog.unindexObject(personal) #remove persona folder from catalog -+ if hasattr(personal, self.portrait_id): -+ personal.manage_delObjects(self.portrait_id) -+ personal.invokeFactory(id=self.portrait_id, type_name='Image') -+ portrait_obj=getattr(personal, self.portrait_id, None) -+ portrait_obj.edit(file=portrait) -+ catalog.unindexObject(portrait_obj) #remove portrait image from catalog -+ -+ def createMemberarea(self, member_id): -+ """ -+ since we arent using PortalFolders and invokeFactory will not work -+ we must do all of this ourself. ;( -+ """ -+ parent = self.aq_inner.aq_parent -+ members = getattr(parent, 'Members', None) -+ -+ if members is None: -+ parent.manage_addPloneFolder(id='Members', title='Members') -+ members = getattr(parent, 'Members', None) -+ -+ if members is not None and not hasattr(members, member_id): -+ f_title = "%s's Home" % member_id -+ try: -+ addPloneFolder(members, id=member_id, title=f_title) -+ except: -+ members.manage_addPloneFolder(id=member_id, title=f_title) -+ f=getattr(members, member_id) -+ # Grant ownership to Member -+ acl_users = self.__getPUS() -+ user = acl_users.getUser(member_id) -+ if user is not None: -+ user= user.__of__(acl_users) -+ else: -+ from AccessControl import getSecurityManager -+ user= getSecurityManager().getUser() -+ # check that we do not do something wrong -+ if user.getUserName() != member_id: -+ raise NotImplementedError, \ -+ 'cannot get user for member area creation' -+ f.changeOwnership(user) -+ f.manage_setLocalRoles(member_id, ['Owner']) -+ # Create Member's home page. -+ # go get the home page text from the skin -+ try: -+ member_content = self.homePageText() -+ except: -+ member_content = DEFAULT_MEMBER_CONTENT % member_id -+ -+ addDocument( f -+ , 'index_html' -+ , member_id+"'s Home Page" -+ , member_id+"'s front page" -+ , "structured-text" -+ , member_content -+ ) -+ -+ f.index_html._setPortalTypeName( 'Document' ) -+ # Overcome an apparent catalog bug. -+ f.index_html.reindexObject() -+ wftool = getToolByName( f, 'portal_workflow' ) -+ wftool.notifyCreated( f.index_html ) -+ #XXX the above is copy/pasted from CMFDefault.MembershipTool only because -+ #its not using invokeFactory('Folder') -- FIX IT! -+ -+ #XXX Below is what really is Plone customizations -+ member_folder=self.getHomeFolder(member_id) -+ member_folder.description = 'Home page area that contains the items created and ' \ -+ + 'collected by %s' % member_id -+ -+ member_folder.manage_addPloneFolder('.personal', 'Personal Items') -+ personal=getattr(member_folder, '.personal') -+ personal.description = "contains personal workarea items for %s" % member_id -+ personal.changeOwnership(user) -+ personal.manage_setLocalRoles(member_id, ['Owner']) -+ -+ catalog = getToolByName(self, 'portal_catalog') -+ catalog.unindexObject(personal) #dont add .personal folders to catalog -+ -+ # Hook to allow doing other things after memberarea creation. -+ notify_script = getattr(member_folder, 'notifyMemberAreaCreated', None) -+ -+ if notify_script is not None: -+ notify_script() -+ -+ # this should probably be in MemberDataTool.py -+ #security.declarePublic( 'searchForMembers' ) -+ def searchForMembers( self, REQUEST=None, **kw ): -+ """ """ -+ if REQUEST: -+ dict = REQUEST -+ else: -+ dict = kw -+ -+ name = dict.get('name', None) -+ email = dict.get('email', None) -+ roles = dict.get('roles', None) -+ last_login_time = dict.get('last_login_time', None) -+ is_manager = self.checkPermission('Manage portal', self) -+ -+ if name: -+ name = name.strip().lower() -+ if not name: -+ name = None -+ if email: -+ email = email.strip().lower() -+ if not email: -+ email = None -+ -+ -+ md = self.portal_memberdata -+ -+ res = [] -+ portal = self.portal_url.getPortalObject() -+ for u in portal.acl_users.getUsers(): -+ user = md.wrapUser(u) -+ if not (user.listed or is_manager): -+ continue -+ if name: -+ if (u.getUserName().lower().find(name) == -1) and (user.fullname.lower().find(name) == -1): -+ continue -+ if email: -+ if user.email.lower().find(email) == -1: -+ continue -+ if roles: -+ user_roles = user.getRoles() -+ found = 0 -+ for r in roles: -+ if r in user_roles: -+ found = 1 -+ break -+ if not found: -+ continue -+ if last_login_time: -+ if user.last_login_time < last_login_time: -+ continue -+ res.append(user) -+ -+ return res