From sidnei at x3ng.com.br Tue Feb 11 13:41:52 2003
From: sidnei at x3ng.com.br (Sidnei da Silva)
Date: Sun Aug 10 17:02:10 2008
Subject: [zopeorg-checkins] CVS: Products/ZopeOrg-NV - ZopeOrgWorkflow.py:1.18 __init__.py:1.19
Message-ID: <200302111841.h1BIfqB07035@cvs.baymountain.com>
Update of /cvs-zopeorg/Products/ZopeOrg-NV
In directory cvs.zope.org:/tmp/cvs-serv7019
Modified Files:
ZopeOrgWorkflow.py __init__.py
Log Message:
Ouch. Forgot to commit this before going to Paris. :(
=== Products/ZopeOrg-NV/ZopeOrgWorkflow.py 1.17 => 1.18 ===
-"""
-A specialized workflow for zope.org which defines a variety of new states
-and transition conditions
-"""
-__version__='$Revision$'[11:-2]
-
-
-from Products.CMFCore.WorkflowTool import addWorkflowClass
-from Globals import InitializeClass
-from Products.CMFCore.WorkflowCore import ObjectDeleted, ObjectMoved
-from Products.CMFCore.utils import getToolByName, _checkPermission
-from Products.CMFCore.utils import _modifyPermissionMappings
-from Products.CMFDefault.DefaultWorkflow import DefaultWorkflowDefinition
-from Products.CMFDefault.Favorite import Favorite
-from Acquisition import aq_base, aq_inner, aq_parent
-from string import replace
-
-
-class ZopeOrgWorkflowDefinition( DefaultWorkflowDefinition ):
- id = 'zopeorg_workflow'
- title = 'General Zope.org Workflow'
- _isAWorkflow = 1
-
-
- def __init__(self, id):
- self.id = id
-
-
- def listObjectActions(self, info):
- '''
- Allows this workflow to
- include actions to be displayed in the actions box.
- Called only when this workflow is applicable to
- info.content.
- Returns the actions to be displayed to the user.
- '''
- if info.isAnonymous:
- return None
-
- # The following operation is quite expensive.
- # We don't need to perform it if the user
- # doesn't have the required permission.
- content = info.content
- content_url = info.content_url
- content_creator = content.Creator()
- pm = getToolByName(self, 'portal_membership')
- current_user = pm.getAuthenticatedMember().getUserName()
- review_state = self.getReviewStateOf(content)
- actions = []
-
- allow_review = _checkPermission('Review portal content', content)
- allow_request = _checkPermission('Request review', content)
- allow_change = _checkPermission('Manage properties', content)
- is_owner = current_user == content_creator
- is_sitemanager = _checkPermission('Manage portal', content)
- append_action = (lambda name, p, url=content_url, a=actions.append:
- a({'name': name,
- 'url': url + '/' + p,
- 'permissions': (),
- 'category': 'workflow'}))
-
- show_reject = 0
- show_retract = 0
- show_obsolete = 0
-
- if review_state == 'private':
- if allow_request:
- if is_sitemanager:
- append_action('Publish', 'content_publish_form')
- else:
- append_action('Submit', 'content_submit_form')
- if is_owner:
- show_obsolete = 1
-
- elif review_state == 'pending':
- if is_owner and allow_request:
- show_retract = 1
- if is_sitemanager or ( allow_review and not is_owner ):
- append_action('Publish', 'content_publish_form')
- show_reject = 1
-
- elif review_state == 'published':
- if is_owner and allow_request:
- show_retract = 1
- show_obsolete = 1
- if allow_review and not is_owner:
- show_reject = 1
-
- elif review_state == 'obsolete':
- if allow_request or allow_review:
- append_action('Restore', 'content_refresh_form')
-
- if show_retract:
- append_action('Retract', 'content_retract_form')
- if show_obsolete:
- append_action('Obsolete', 'content_obsolete_form')
- if show_reject:
- append_action('Reject', 'content_reject_form')
- if allow_review or allow_request:
- append_action('Status history', 'content_status_history')
-
- return actions
-
-
- def listGlobalActions(self, info):
- '''
- Allows this workflow to
- include actions to be displayed in the actions box.
- Called on every request.
- Returns the actions to be displayed to the user.
- '''
- if (info.isAnonymous or not _checkPermission(
- 'Review portal content', info.portal)):
- return None
-
- actions = []
- return actions
-
-
- def isActionSupported(self, ob, action):
- '''
- Returns a true value if the given action name is supported.
- '''
- return (action in ( 'submit'
- , 'retract'
- , 'publish'
- , 'reject'
- , 'obsolete'
- , 'refresh'
- ))
-
-
- def doActionFor(self, ob, action, comment='', **kw):
- '''
- Allows the user to request a workflow action. This method
- must perform its own security checks.
- '''
- allow_review = _checkPermission('Review portal content', ob)
- allow_request = _checkPermission('Request review', ob)
- allow_change = _checkPermission('Manage properties', ob)
- is_sitemanager = _checkPermission('Manage portal', ob)
- content_creator = ob.Creator()
- pm = getToolByName(self, 'portal_membership')
- current_user = pm.getAuthenticatedMember().getUserName()
- is_owner = current_user == content_creator
- review_state = self.getReviewStateOf(ob)
- tool = aq_parent(aq_inner(self))
-
- if action == 'submit':
- if not allow_request:
- raise 'Unauthorized', 'Not authorized'
- elif review_state != 'private':
- raise 'Unauthorized', 'Already in submit state'
- self.setReviewStateOf(ob, 'pending', action, comment)
-
- elif action == 'retract':
- if not allow_request:
- raise 'Unauthorized', 'Not authorized'
- elif review_state == 'private':
- raise 'Unauthorized', 'Already private'
-
- if (not is_owner) and not allow_review:
- raise 'Unauthorized', 'Not creator or reviewer'
- self.setReviewStateOf(ob, 'private', action, comment)
-
- elif action == 'publish':
- if ( not allow_review or is_owner ) and not is_sitemanager:
- raise 'Unauthorized', 'Not authorized'
- self.setReviewStateOf(ob, 'published', action, comment)
-
- elif action == 'reject':
- if not allow_review or is_owner:
- raise 'Unauthorized', 'Not authorized'
-
- self.setReviewStateOf(ob, 'private', action, comment)
-
- elif action == 'obsolete':
- if not allow_change:
- raise 'Unauthorized', 'Not authorized'
- self.setReviewStateOf(ob, 'obsolete', action, comment)
- self.unindexObject()
- raise ObjectDeleted
-
- elif action == 'refresh':
- if review_state != 'obsolete':
- msg = 'Only "obsolete" content can be refreshed'
- raise 'Unauthorized', msg
- wf_tool = getToolByName(self, 'portal_workflow')
- wf_chain = wf_tool.getChainFor(ob)
- if wf_chain:
- wf_id = wf_chain[0]
- wf_history = wf_tool.getHistoryOf(wf_id, ob)
- if len(wf_history) > 1:
- prev_status = wf_history[-2]['review_state']
- else:
- prev_status = 'private'
-
- self.setReviewStateOf(ob, prev_status, action, comment)
-
-
- def updateRoleMappingsFor(self, ob):
- '''
- Changes the object permissions according to the current
- review_state.
- '''
- review_state = self.getReviewStateOf(ob)
- if review_state == 'private':
- anon_view = 0
- owner_modify = 1
- reviewer_view = 0
- elif review_state == 'pending':
- anon_view = 0
- owner_modify = 0 # Require a retraction for editing.
- reviewer_view = 1
- elif review_state == 'published':
- anon_view = 1
- owner_modify = 0
- reviewer_view = 1
- elif review_state == 'obsolete':
- anon_view = 1
- owner_modify = 1
- reviewer_view = 1
-
- # Modify role to permission mappings directly.
-
- return _modifyPermissionMappings(ob,
- {'View': {'Anonymous': anon_view,
- 'Reviewer': reviewer_view,
- 'Owner': 1,
- },
- 'Modify portal content': {'Owner': owner_modify}})
-
-
-InitializeClass( ZopeOrgWorkflowDefinition )
-
-addWorkflowClass( ZopeOrgWorkflowDefinition )
+from Products.CMFCore.WorkflowTool import addWorkflowFactory
+from Products.DCWorkflow.Default import createDefaultWorkflowClassic
+from Products.PythonScripts.PythonScript import PythonScript
+from Products.CMFCore.CMFCorePermissions import ReviewPortalContent, \
+ RequestReview
+
+obsolete_script_id = 'obsoleteObject'
+obsolete_script = '''
+## Script (Python) "%s"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=state_change
+##title=Uncatalog an obsolete object
+state_change.object.unindexObject()
+''' % obsolete_script_id
+
+refresh_script_id = 'refreshObject'
+refresh_script = '''
+## Script (Python) "%s"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=state_change
+##title=Revert an object to previous state, and recatalog it
+state_change.object.reindexObject()
+''' % refresh_script_id
+
+def createZopeOrgWorkflow(id):
+ wf = createDefaultWorkflowClassic(id)
+ setupZopeOrgWorkflow(wf)
+ return wf
+
+addWorkflowFactory( createZopeOrgWorkflow, id='zopeorg_default_workflow'
+ , title='Default Zope.org Workflow')
+
+obsoletable_states = ('private', 'published')
+obsolete_state = 'obsolete'
+obsolete_trans = obsolete_state
+refresh_trans = 'refresh'
+
+def setupZopeOrgWorkflow(wf):
+ '''
+ Add obsoleting/refreshing transitions and state to classic wf
+ '''
+ wf.setProperties(title='Zope.org workflow')
+
+ wf.transitions.addTransition(obsolete_trans)
+ wf.transitions.addTransition(refresh_trans)
+
+ wf.states.addState(obsolete_state)
+ wf.states[obsolete_state].setProperties(
+ title='Obsolete (uncataloged)',
+ transitions=(refresh_trans,))
+
+ for state in obsoletable_states:
+ wf.states[state].transitions += (obsolete_trans,)
+
+ # eek! why no addScript() method?
+ wf.scripts._setObject(obsolete_script_id,
+ PythonScript(obsolete_script_id))
+ getattr(wf.scripts, obsolete_script_id).write(obsolete_script)
+ wf.scripts._setObject(refresh_script_id, PythonScript(refresh_script_id))
+ getattr(wf.scripts, refresh_script_id).write(refresh_script)
+
+ wf.transitions[obsolete_trans].setProperties(
+ title = 'Make content obsolete',
+ new_state_id = obsolete_state,
+ actbox_name = 'Obsolete',
+ actbox_url = '%(content_url)s/content_obsolete_form',
+ props = {'guard_permissions': '%s;%s' % (ReviewPortalContent,
+ RequestReview)},
+ after_script_name = obsolete_script_id)
+
+ wf.transitions[refresh_trans].setProperties(
+ title = 'Re-enable obsolete content',
+ new_state_id = 'private',
+ actbox_name = 'Refresh',
+ actbox_url = '%(content_url)s/content_refresh_form',
+ props = {'guard_permissions': '%s;%s' % (ReviewPortalContent,
+ RequestReview)},
+ after_script_name = refresh_script_id)
=== Products/ZopeOrg-NV/__init__.py 1.18 => 1.19 ===
from Products.CMFCore.utils import registerIcon, ToolInit, ContentInit
from Products.CMFCore.CMFCorePermissions import AddPortalContent
from Products.CMFCore import PortalFolder
-#import SoftwareProduct
-import NewsItemWorkflow
import ZopeOrgWorkflow
-#import ZopeOrgMemberDataTool
-#import ZopeOrgMembershipTool
import ContentList
import Acquisition
import CaseStudy
import ZopeServiceProvider
+#import SoftwareProduct
+#import ZopeOrgMemberDataTool
+#import ZopeOrgMembershipTool
#Hackish workaround to allow accesing the broken ZODB on ZopeOrg
class ImplicitAcquirerWrapper:
@@ -37,21 +36,24 @@
def initialize( context ):
""" Initialize the ZopeOrg components """
- registerIcon( NewsItemWorkflow.NewsItemWorkflowDefinition
- , 'images/org_workflow.gif'
- , globals()
- )
-
- registerIcon( ZopeOrgWorkflow.ZopeOrgWorkflowDefinition
- , 'images/org_workflow.gif'
- , globals()
- )
context.registerClass( ContentList.ContentList
, constructors=CL_CTORS
, permission='Manage portal'
)
+ ContentInit(
+ 'Zope.org Content',
+ content_types = ( CaseStudy.CaseStudy
+ , ZopeServiceProvider.ZopeServiceProvider
+ ),
+ permission = AddPortalContent,
+ extra_constructors = ( CaseStudy.addCaseStudy
+ , ZopeServiceProvider.addZSP
+ ),
+ fti = ftis ,
+ ).initialize(context)
+
#ToolInit(
# 'Zope.Org Tools',
# tools = ( ZopeOrgMemberDataTool.ZopeOrgMemberDataTool
@@ -72,15 +74,3 @@
# ),
# fti = ftis ,
# ).initialize(context)
-
- ContentInit(
- 'Zope.org Content',
- content_types = ( CaseStudy.CaseStudy
- , ZopeServiceProvider.ZopeServiceProvider
- ),
- permission = AddPortalContent,
- extra_constructors = ( CaseStudy.addCaseStudy
- , ZopeServiceProvider.addZSP
- ),
- fti = ftis ,
- ).initialize(context)
From sidnei at x3ng.com.br Wed Feb 12 10:25:27 2003
From: sidnei at x3ng.com.br (Sidnei da Silva)
Date: Sun Aug 10 17:02:10 2008
Subject: [zopeorg-checkins] CVS: Products/ZopeOrg-NV/skins/zopeorg_types Products/ZopeOrg-NV/skins/zopeorg_types - New directory
Message-ID: <200302121525.h1CFPRb31537@cvs.baymountain.com>
Update of /cvs-zopeorg/Products/ZopeOrg-NV/skins/zopeorg_types
In directory cvs.zope.org:/tmp/cvs-serv31522/zopeorg_types
Log Message:
Directory /cvs-zopeorg/Products/ZopeOrg-NV/skins/zopeorg_types added to the repository
=== Added directory Products/ZopeOrg-NV/skins/zopeorg_types ===
From sidnei at x3ng.com.br Wed Feb 12 10:26:50 2003
From: sidnei at x3ng.com.br (Sidnei da Silva)
Date: Sun Aug 10 17:02:10 2008
Subject: [zopeorg-checkins] CVS: Products/ZopeOrg-NV/skins/zopeorg_products - casestudy_edit.py:NONE casestudy_edit_form.pt:NONE casestudy_view.pt:NONE howto_edit.py:NONE howto_edit_form.pt:NONE howto_view.pt:NONE tip_edit.py:NONE tip_edit_form.pt:NONE tip_view.pt:NONE zsp_edit.py:NONE zsp_edit_form.pt:NONE zsp_view.pt:NONE
Message-ID: <200302121526.h1CFQo331774@cvs.baymountain.com>
Update of /cvs-zopeorg/Products/ZopeOrg-NV/skins/zopeorg_products
In directory cvs.zope.org:/tmp/cvs-serv31743/zopeorg_products
Removed Files:
casestudy_edit.py casestudy_edit_form.pt casestudy_view.pt
howto_edit.py howto_edit_form.pt howto_view.pt tip_edit.py
tip_edit_form.pt tip_view.pt zsp_edit.py zsp_edit_form.pt
zsp_view.pt
Log Message:
Gaak! You cant have a skin path with `products` in the url on CMF from CVS.
=== Removed File Products/ZopeOrg-NV/skins/zopeorg_products/casestudy_edit.py ===
=== Removed File Products/ZopeOrg-NV/skins/zopeorg_products/casestudy_edit_form.pt ===
=== Removed File Products/ZopeOrg-NV/skins/zopeorg_products/casestudy_view.pt ===
=== Removed File Products/ZopeOrg-NV/skins/zopeorg_products/howto_edit.py ===
=== Removed File Products/ZopeOrg-NV/skins/zopeorg_products/howto_edit_form.pt ===
=== Removed File Products/ZopeOrg-NV/skins/zopeorg_products/howto_view.pt ===
=== Removed File Products/ZopeOrg-NV/skins/zopeorg_products/tip_edit.py ===
=== Removed File Products/ZopeOrg-NV/skins/zopeorg_products/tip_edit_form.pt ===
=== Removed File Products/ZopeOrg-NV/skins/zopeorg_products/tip_view.pt ===
=== Removed File Products/ZopeOrg-NV/skins/zopeorg_products/zsp_edit.py ===
=== Removed File Products/ZopeOrg-NV/skins/zopeorg_products/zsp_edit_form.pt ===
=== Removed File Products/ZopeOrg-NV/skins/zopeorg_products/zsp_view.pt ===
From sidnei at x3ng.com.br Wed Feb 12 10:26:51 2003
From: sidnei at x3ng.com.br (Sidnei da Silva)
Date: Sun Aug 10 17:02:10 2008
Subject: [zopeorg-checkins] CVS: Products/ZopeOrg-NV/skins/zopeorg_types - casestudy_edit.py:1.1 casestudy_edit_form.pt:1.1 casestudy_view.pt:1.1 howto_edit.py:1.1 howto_edit_form.pt:1.1 howto_view.pt:1.1 tip_edit.py:1.1 tip_edit_form.pt:1.1 tip_view.pt:1.1 zsp_edit.py:1.1 zsp_edit_form.pt:1.1 zsp_view.pt:1.1
Message-ID: <200302121526.h1CFQp231805@cvs.baymountain.com>
Update of /cvs-zopeorg/Products/ZopeOrg-NV/skins/zopeorg_types
In directory cvs.zope.org:/tmp/cvs-serv31743/zopeorg_types
Added Files:
casestudy_edit.py casestudy_edit_form.pt casestudy_view.pt
howto_edit.py howto_edit_form.pt howto_view.pt tip_edit.py
tip_edit_form.pt tip_view.pt zsp_edit.py zsp_edit_form.pt
zsp_view.pt
Log Message:
Gaak! You cant have a skin path with `products` in the url on CMF from CVS.
=== Added File Products/ZopeOrg-NV/skins/zopeorg_types/casestudy_edit.py ===
## Script (Python) "casestudy_edit"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=title, summary, logo, external_url, text_format, case_facts, case_facts_file, problem, problem_file, solution, solution_file, SafetyBelt
##title=
##
context.setTitle(title)
context.setSummary(summary)
context.setLogo(logo)
context.setExternalURL(external_url)
context.setCaseFacts(text_format, case_facts, case_facts_file, SafetyBelt)
context.setProblem(text_format, problem, problem_file, SafetyBelt)
context.setSolution(text_format, solution, solution_file, SafetyBelt)
context.REQUEST.RESPONSE.redirect(context.REQUEST.URL1 +
'/casestudy_edit_form?portal_status_message=Case%20Study%20changed.')
=== Added File Products/ZopeOrg-NV/skins/zopeorg_types/casestudy_edit_form.pt ===
Case Study Edit Form
=== Added File Products/ZopeOrg-NV/skins/zopeorg_types/casestudy_view.pt ===
Master Template
=== Added File Products/ZopeOrg-NV/skins/zopeorg_types/howto_edit.py ===
## Script (Python) "howto_edit"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=text_format, text, file, SafetyBelt
##title=
##
context.edit(text_format, text, file, SafetyBelt)
context.REQUEST.RESPONSE.redirect(context.REQUEST.URL1 +
'/howto_edit_form?portal_status_message=Document%20changed.')
=== Added File Products/ZopeOrg-NV/skins/zopeorg_types/howto_edit_form.pt ===
Howto Edit Form
=== Added File Products/ZopeOrg-NV/skins/zopeorg_types/howto_view.pt ===
Document Title |
|
|
By Me |
|
Cooked Body |
|
=== Added File Products/ZopeOrg-NV/skins/zopeorg_types/tip_edit.py ===
## Script (Python) "tip_edit"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=text_format, text, file, SafetyBelt
##title=
##
context.edit(text_format, text, file, SafetyBelt)
context.REQUEST.RESPONSE.redirect(context.REQUEST.URL1 +
'/tip_edit_form?portal_status_message=Document%20changed.')
=== Added File Products/ZopeOrg-NV/skins/zopeorg_types/tip_edit_form.pt ===
Howto Edit Form
=== Added File Products/ZopeOrg-NV/skins/zopeorg_types/tip_view.pt ===
Master Template
this will be a navbar, some day |
by bob
bob's news
bob sucks.
powered by that z thing
=== Added File Products/ZopeOrg-NV/skins/zopeorg_types/zsp_edit.py ===
## Script (Python) "zsp_edit"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=company, summary, location, text_format, logo, external_url, contact_info=None, phone_info=None, service_info, service_info_file, SafetyBelt
##title=
##
context.setCompany(company)
context.setSummary(summary)
context.setLocation(location)
context.setLogo(logo)
context.setExternalURL(external_url)
context.setContactInfo(contact_info)
context.setPhoneInfo(phone_info)
context.setServiceInfo(text_format, service_info, service_info_file, SafetyBelt)
context.REQUEST.RESPONSE.redirect(context.REQUEST.URL1 +
'/zsp_edit_form?portal_status_message=ZSP%20changed.')
=== Added File Products/ZopeOrg-NV/skins/zopeorg_types/zsp_edit_form.pt ===
ZSP Edit Form
=== Added File Products/ZopeOrg-NV/skins/zopeorg_types/zsp_view.pt ===
Master Template
From sidnei at x3ng.com.br Wed Feb 12 10:34:45 2003
From: sidnei at x3ng.com.br (Sidnei da Silva)
Date: Sun Aug 10 17:02:10 2008
Subject: [zopeorg-checkins] CVS: Products/ZopeOrg-NV/skins/plone_nzo - bullet.gif:NONE header.pt:NONE linkOpaque.gif:NONE logo.jpg:NONE ploneCustom.css.dtml:NONE stylesheet_properties.props:NONE user.gif:NONE
Message-ID: <200302121534.h1CFYjM01048@cvs.baymountain.com>
Update of /cvs-zopeorg/Products/ZopeOrg-NV/skins/plone_nzo
In directory cvs.zope.org:/tmp/cvs-serv997/plone_nzo
Removed Files:
bullet.gif header.pt linkOpaque.gif logo.jpg
ploneCustom.css.dtml stylesheet_properties.props user.gif
Log Message:
not needed anymore
=== Removed File Products/ZopeOrg-NV/skins/plone_nzo/bullet.gif ===
=== Removed File Products/ZopeOrg-NV/skins/plone_nzo/header.pt ===
=== Removed File Products/ZopeOrg-NV/skins/plone_nzo/linkOpaque.gif ===
=== Removed File Products/ZopeOrg-NV/skins/plone_nzo/logo.jpg ===
=== Removed File Products/ZopeOrg-NV/skins/plone_nzo/ploneCustom.css.dtml ===
=== Removed File Products/ZopeOrg-NV/skins/plone_nzo/stylesheet_properties.props ===
=== Removed File Products/ZopeOrg-NV/skins/plone_nzo/user.gif ===
From sidnei at x3ng.com.br Wed Feb 12 10:34:24 2003
From: sidnei at x3ng.com.br (Sidnei da Silva)
Date: Sun Aug 10 17:02:10 2008
Subject: [zopeorg-checkins] CVS: Products/ZopeOrg-NV/skins/zwiki_dtml - backlinks.dtml:NONE editform.dtml:NONE subscribeform.dtml:NONE wikipage_view.pt:NONE
Message-ID: <200302121534.h1CFYO700667@cvs.baymountain.com>
Update of /cvs-zopeorg/Products/ZopeOrg-NV/skins/zwiki_dtml
In directory cvs.zope.org:/tmp/cvs-serv646/zwiki_dtml
Removed Files:
backlinks.dtml editform.dtml subscribeform.dtml
wikipage_view.pt
Log Message:
not needed anymore
=== Removed File Products/ZopeOrg-NV/skins/zwiki_dtml/backlinks.dtml ===
=== Removed File Products/ZopeOrg-NV/skins/zwiki_dtml/editform.dtml ===
=== Removed File Products/ZopeOrg-NV/skins/zwiki_dtml/subscribeform.dtml ===
=== Removed File Products/ZopeOrg-NV/skins/zwiki_dtml/wikipage_view.pt ===
From sidnei at x3ng.com.br Wed Feb 12 11:58:14 2003
From: sidnei at x3ng.com.br (Sidnei da Silva)
Date: Sun Aug 10 17:02:10 2008
Subject: [zopeorg-checkins] CVS: Products/ZopeOrg-NV/Extensions - NZOMigrate.py:1.10 setupZopeOrg.py:1.65
Message-ID: <200302121658.h1CGwEr18584@cvs.baymountain.com>
Update of /cvs-zopeorg/Products/ZopeOrg-NV/Extensions
In directory cvs.zope.org:/tmp/cvs-serv18555/Extensions
Modified Files:
NZOMigrate.py setupZopeOrg.py
Log Message:
latest fixes on ownership
=== Products/ZopeOrg-NV/Extensions/NZOMigrate.py 1.9 => 1.10 ===
try: changed = ob._p_changed
except: changed = 0
- owner = getattr(ob, '_owner', None)
+ owner = ob.getOwner(info=1)
if owner:
udb, uid = owner
#res.append('Owner of %s is %s!%s' % (
@@ -498,11 +498,11 @@
return ignore_path
def fixOwnership(self, orig, new):
- owner = getattr(orig, '_owner', None)
+ owner = orig.getOwner()
if owner is not None:
try:
# Retain ownership.
- new._owner = owner
+ new.changeOwnership(owner)
except: pass
return new
=== Products/ZopeOrg-NV/Extensions/setupZopeOrg.py 1.64 => 1.65 ===
)
SKINS = ( 'nzo',
- 'zopeorg_products'
+ 'zopeorg_types'
)
ADD_INDEXES = ()
@@ -232,14 +232,14 @@
setupFeedbackActions(portal)
# Create a Members BTreeFolder
- log.append('\n * Creating a Members BTreeFolder')
+ #log.append('\n * Creating a Members BTreeFolder')
- if ( 'Members' in portal.objectIds() and
- getattr( portal, 'Members' ).meta_type in ( 'Folder',
- 'Portal Folder',
- 'Plone Folder') ):
- portal._delObject( 'Members' )
- manage_addCMFBTreeFolder( portal, 'Members', 'Member Folder' )
+ #if ( 'Members' in portal.objectIds() and
+ # getattr( portal, 'Members' ).meta_type in ( 'Folder',
+ # 'Portal Folder',
+ # 'Plone Folder') ):
+ # portal._delObject( 'Members' )
+ # manage_addCMFBTreeFolder( portal, 'Members', 'Member Folder' )
# Setting up other external methods for conversion and synchronization
log.append('\n * Setting up external methods')
From sidnei at x3ng.com.br Wed Feb 12 11:58:43 2003
From: sidnei at x3ng.com.br (Sidnei da Silva)
Date: Sun Aug 10 17:02:10 2008
Subject: [zopeorg-checkins] CVS: Products/ZopeOrg-NV - __init__.py:1.20
Message-ID: <200302121658.h1CGwhW18591@cvs.baymountain.com>
Update of /cvs-zopeorg/Products/ZopeOrg-NV
In directory cvs.zope.org:/tmp/cvs-serv18555
Modified Files:
__init__.py
Log Message:
latest fixes on ownership
=== Products/ZopeOrg-NV/__init__.py 1.19 => 1.20 ===
import Acquisition
import CaseStudy
import ZopeServiceProvider
+import ZPublisher.Publish
+from string import rfind
#import SoftwareProduct
#import ZopeOrgMemberDataTool
#import ZopeOrgMembershipTool
@@ -16,14 +18,12 @@
pass
Acquisition.ImplicitAcquirerWrapper = ImplicitAcquirerWrapper
+ZPublisher.Publish.rfind = rfind
zopeorg_globals = globals()
# Make the skins available as DirectoryViews
-registerDirectory('skins', globals())
-registerDirectory('skins/zopeorg', globals())
-registerDirectory('skins/zopeorg_products', globals())
-registerDirectory('skins/zopeorg_membership', globals())
+registerDirectory('skins', zopeorg_globals)
#ftis = SoftwareProduct.factory_type_information
From sidnei at x3ng.com.br Thu Feb 13 06:27:36 2003
From: sidnei at x3ng.com.br (Sidnei da Silva)
Date: Sun Aug 10 17:02:10 2008
Subject: [zopeorg-checkins] CVS: Products/ZopeOrg-NV/Extensions - NZOMigrate.py:1.11
Message-ID: <200302131127.h1DBRav13075@cvs.baymountain.com>
Update of /cvs-zopeorg/Products/ZopeOrg-NV/Extensions
In directory cvs.zope.org:/tmp/cvs-serv13059/Extensions
Modified Files:
NZOMigrate.py
Log Message:
now the migration is running smoothly
=== Products/ZopeOrg-NV/Extensions/NZOMigrate.py 1.10 => 1.11 ===
"BTree Folder": "CMF BTree Folder",
"ZWiki Page": "ZWiki Page",
"Broken Because Product is Gone": "BBR",
- "XML Document": "XML Document",
+ "XML Document": "Parsed XML",
"BackTalk Book": "CMF BackTalk Book",
"BackTalk Document": "CMF BackTalk Document"
}
@@ -59,6 +59,9 @@
try: changed = ob._p_changed
except: changed = 0
+ if ob is None:
+ return res
+
owner = ob.getOwner(info=1)
if owner:
udb, uid = owner
@@ -130,6 +133,38 @@
alist.sort()
return alist
+def migrateCaseStudies(src, dest):
+ dest.invokeFactory(id='index_html', title=dest.title, \
+ type_name='Case Study')
+ new_obj = getattr(dest, 'index_html', None)
+ if new_obj is None:
+ return
+ values = {}
+ for id in ['case_facts', 'problem', 'solution', 'summary', \
+ 'external_url', 'title']:
+ values[id] = ''
+ prop = getattr(src, id, None)
+ if prop is not None:
+ if callable(prop):
+ try:
+ values[id] = prop(src)
+ except:
+ try:
+ values['id'] = prop.raw()
+ except:
+ values['id'] = str(prop)
+ else:
+ values[id] = prop
+ new_obj.setSummary(values['summary'])
+ new_obj.setCaseFacts('text/html', values['case_facts'])
+ new_obj.setProblem('text/html', values['problem'])
+ new_obj.setSolution('text/html', values['solution'])
+ new_obj.setExternalURL(values['external_url'])
+ new_obj.setTitle(values['title'])
+ if hasattr(aq_base(src), 'logo'):
+ new_obj.setLogo('logo')
+ return new_obj
+
def migrateZSP(root, obj):
entries = obj[0].objectValues('ENTRY')
for entry in entries:
@@ -286,11 +321,18 @@
self.log('Ignoring Tracker for now.\n')
return None
- def XMLDocument2XMLDocument(self, obj, source, dest):
- id = obj.getId()
- if id == 'zsp.xml':
+ def XMLDocument2ParsedXML(self, obj, source, dest):
+ # Exception: ZSP will be converted to objects
+ url = obj.absolute_url(relative=1)
+ if url == 'Resources/ZSP/zsp.xml':
return migrateZSP(dest, obj)
- return None
+ try:
+ parsed = dest.manage_addProduct['ParsedXML']
+ parsed.manage_addParsedXML(dest, obj.getId(), obj.title, \
+ obj.toXML())
+ except:
+ return None
+ return getattr(aq_base(dest), obj.getId(), None)
def BackTalkBook2CMFBackTalkBook(self, obj, source, dest):
dest.invokeFactory(id=obj.getId(), type_name='BackTalk Book')
@@ -430,15 +472,21 @@
return howto
def Folder2CMFPortalFolder(self, obj, source, dest):
+
if dest is None or obj is None: return None
try:
- dest.invokeFactory(id=obj.getId(), type_name="Folder")
- dest.setTitle(obj.title)
- except: pass
+ dest.invokeFactory(id=obj.getId(), title=obj.title, \
+ type_name="Folder")
+ except:
+ pass
if not hasattr(aq_base(dest), obj.getId()):
return None
new = getattr(dest, obj.getId())
if hasattr(aq_base(new), 'objectValues'):
+ # Exception: CaseStudies content will be converted to 1 object.
+ url = obj.absolute_url(relative=1)
+ if url.find('Resources/CaseStudies/') == 0:
+ migrateCaseStudies(obj, new)
return new
return None
@@ -448,9 +496,11 @@
bt2 = dest.manage_addProduct['BTreeFolder2']
bt2.manage_addCMFBTreeFolder(obj.getId(), obj.title)
except: pass
- new = getattr(aq_base(dest), obj.getId(), None)
+ if not hasattr(aq_base(dest), obj.getId()):
+ return None
+ new = getattr(dest, obj.getId(), None)
if new is not None and hasattr(aq_base(new), 'objectValues'):
- return new.__of__(dest)
+ return new
return None
def WikiMethodsCleanup(self, obj, ignore_path):
@@ -487,21 +537,29 @@
elif hasattr(obj, 'objectIds'):
obj_ids = obj.objectIds()
+ obj_path = obj.getPhysicalPath()
if obj_ids:
- obj_path = obj.getPhysicalPath()
for dm in ('local_nav', 'page_title',
'standard_html_footer', 'standard_html_header',
'custom_html_header',
'custom_html_footer', 'local_exit'):
if dm in obj_ids:
ignore_path.append(obj_path + (dm,))
+ # Exception: when migrating case studies we dont want to bring
+ # the dtml methods to the new site. Only images and files.
+ url = obj.absolute_url(relative=1)
+ if url.find('Resources/CaseStudies/') == 0:
+ for o in obj.objectValues():
+ if o.meta_type not in ['Image', 'File']:
+ ignore_path.append(obj_path + (o.getId(),))
return ignore_path
def fixOwnership(self, orig, new):
+ if orig is None or new is None:
+ return None
owner = orig.getOwner()
if owner is not None:
try:
- # Retain ownership.
new.changeOwnership(owner)
except: pass
return new
@@ -567,7 +625,10 @@
try:
new_obj = mm(obj, source, dest)
except: new_obj = None
-
+ if obj is None:
+ self.log('Something wicked happened to %s ' % oid +\
+ 'on %s.\n' % '/'.join(path))
+ continue
if new_obj is None or not new_obj:
self.log('Result of conversion of' +\
' %s: Failed.\n' % obj.absolute_url(relative=1))
From sidnei at x3ng.com.br Thu Feb 13 09:57:10 2003
From: sidnei at x3ng.com.br (Sidnei da Silva)
Date: Sun Aug 10 17:02:10 2008
Subject: [zopeorg-checkins] CVS: Products/ZopeOrg-NV/Extensions - NZOMigrate.py:1.12
Message-ID: <200302131457.h1DEvAA10205@cvs.baymountain.com>
Update of /cvs-zopeorg/Products/ZopeOrg-NV/Extensions
In directory cvs.zope.org:/tmp/cvs-serv10191/Extensions
Modified Files:
NZOMigrate.py
Log Message:
Ops! Too many parameters
=== Products/ZopeOrg-NV/Extensions/NZOMigrate.py 1.11 => 1.12 ===
return migrateZSP(dest, obj)
try:
parsed = dest.manage_addProduct['ParsedXML']
- parsed.manage_addParsedXML(dest, obj.getId(), obj.title, \
+ parsed.manage_addParsedXML(obj.getId(), obj.title, \
obj.toXML())
except:
return None
From sidnei at x3ng.com.br Thu Feb 13 10:06:28 2003
From: sidnei at x3ng.com.br (Sidnei da Silva)
Date: Sun Aug 10 17:02:10 2008
Subject: [zopeorg-checkins] CVS: Products/ZopeOrg-NV/Extensions - NZOMigrate.py:1.13
Message-ID: <200302131506.h1DF6S411565@cvs.baymountain.com>
Update of /cvs-zopeorg/Products/ZopeOrg-NV/Extensions
In directory cvs.zope.org:/tmp/cvs-serv11549/Extensions
Modified Files:
NZOMigrate.py
Log Message:
now the migration is running smoothly
=== Products/ZopeOrg-NV/Extensions/NZOMigrate.py 1.12 => 1.13 ===
if ob is None:
return res
- owner = ob.getOwner(info=1)
+ try:
+ owner = ob.getOwner(info=1)
+ except:
+ owner = None
if owner:
udb, uid = owner
#res.append('Owner of %s is %s!%s' % (
@@ -557,11 +560,13 @@
def fixOwnership(self, orig, new):
if orig is None or new is None:
return None
- owner = orig.getOwner()
- if owner is not None:
- try:
- new.changeOwnership(owner)
- except: pass
+ try:
+ owner = orig.getOwner()
+ except:
+ owner = None
+ try:
+ new.changeOwnership(owner)
+ except: pass
return new
def fixModificationDate(self, orig, new):
From sidnei at x3ng.com.br Thu Feb 13 10:08:10 2003
From: sidnei at x3ng.com.br (Sidnei da Silva)
Date: Sun Aug 10 17:02:10 2008
Subject: [zopeorg-checkins] CVS: Products/ZopeOrg-NV - CaseStudy.py:1.3 ZopeOrgTypes.py:1.5 __init__.py:1.21
Message-ID: <200302131508.h1DF8A011924@cvs.baymountain.com>
Update of /cvs-zopeorg/Products/ZopeOrg-NV
In directory cvs.zope.org:/tmp/cvs-serv11879
Modified Files:
CaseStudy.py ZopeOrgTypes.py __init__.py
Log Message:
now the migration is running smoothly
=== Products/ZopeOrg-NV/CaseStudy.py 1.2 => 1.3 ===
return self._getCookedText('_problem')
security.declareProtected(ModifyPortalContent, 'setProblem')
- def setProblem(self, text_format, problem, file, safety_belt):
+ def setProblem(self, text_format='structured-text', \
+ problem='', file='', safety_belt=''):
self._editText(text_format, problem, file, safety_belt, '_problem')
security.declareProtected(View, 'editableSolution')
@@ -113,7 +114,8 @@
return self._getCookedText('_solution')
security.declareProtected(ModifyPortalContent, 'setSolution')
- def setSolution(self, text_format, solution, file, safety_belt):
+ def setSolution(self, text_format='structured-text', \
+ solution='', file='', safety_belt=''):
self._editText(text_format, solution, file, safety_belt, '_solution')
def _getCookedText(self, property, stx_level=None, set_level=0):
=== Products/ZopeOrg-NV/ZopeOrgTypes.py 1.4 => 1.5 ===
#
from Products.CMFCore import CMFCorePermissions
+import CaseStudy
+import ZopeServiceProvider
ftis = (
@@ -56,34 +58,11 @@
}
,
)
-,
-( { 'id' : 'Member Folder'
- , 'meta_type' : 'Skinned Folder'
- , 'description' : """ Specialized Skinned Folder for Member homes"""
- , 'icon' : 'folder_icon.gif'
- , 'product' : ''
- , 'factory' : ''
- , 'filter_content_types' : 0
- , 'immediate_view' : ''
- , 'actions' : ( { 'name' : 'View'
- , 'action' : 'memberfolder_view'
- , 'permissions' : (CMFCorePermissions.View,)
- , 'category' : 'folder'
- }
- , { 'name' : 'Edit'
- , 'action' : 'folder_edit_form'
- , 'permissions' : (CMFCorePermissions.ManageProperties,)
- , 'category' : 'folder'
- }
- , { 'name' : 'Syndication'
- , 'action' : 'synPropertiesForm'
- , 'permissions' : (CMFCorePermissions.ManageProperties,)
- , 'category' : 'folder'
- }
- )
- }
- ,
-)
)
+
+ftis = list(ftis)
+ftis.append(CaseStudy.factory_type_information)
+ftis.append(ZopeServiceProvider.factory_type_information)
+ftis = tuple(ftis)
=== Products/ZopeOrg-NV/__init__.py 1.20 => 1.21 ===
import Acquisition
import CaseStudy
import ZopeServiceProvider
+import ZopeOrgTypes
import ZPublisher.Publish
from string import rfind
#import SoftwareProduct
From sidnei at x3ng.com.br Thu Feb 13 12:02:22 2003
From: sidnei at x3ng.com.br (Sidnei da Silva)
Date: Sun Aug 10 17:02:10 2008
Subject: [zopeorg-checkins] CVS: Products/ZopeOrg-NV/Extensions - NZOMigrate.py:1.14
Message-ID: <200302131702.h1DH2MA31261@cvs.baymountain.com>
Update of /cvs-zopeorg/Products/ZopeOrg-NV/Extensions
In directory cvs.zope.org:/tmp/cvs-serv31247/Extensions
Modified Files:
NZOMigrate.py
Log Message:
wtf! identation may bite you.
=== Products/ZopeOrg-NV/Extensions/NZOMigrate.py 1.13 => 1.14 ===
(prop, type, value, msg))
else:
new._setPropValue(prop, orig.getProperty(prop))
- return new
+ return new
def run(self):
source = self._source
From sidnei at x3ng.com.br Thu Feb 13 20:09:50 2003
From: sidnei at x3ng.com.br (Sidnei da Silva)
Date: Sun Aug 10 17:02:10 2008
Subject: [zopeorg-checkins] CVS: Products/ZopeOrg-NV/Extensions - NZOMigrate.py:1.15
Message-ID: <200302140109.h1E19oM30866@cvs.baymountain.com>
Update of /cvs-zopeorg/Products/ZopeOrg-NV/Extensions
In directory cvs.zope.org:/tmp/cvs-serv30852/Extensions
Modified Files:
NZOMigrate.py
Log Message:
Late night commit. Just to make sure we dont have to redo everything if the server explodes. Now, migration is running even more smoothtly.
=== Products/ZopeOrg-NV/Extensions/NZOMigrate.py 1.14 => 1.15 ===
new_obj.setTitle(values['title'])
if hasattr(aq_base(src), 'logo'):
new_obj.setLogo('logo')
- return new_obj
+ return (new_obj, dest)
def migrateZSP(root, obj):
entries = obj[0].objectValues('ENTRY')
+ result = []
for entry in entries:
id = getattr(entry, 'LOGO', entry.getId())
if hasattr(aq_base(root), id):
logo_id = '%s_logo' % id
root.manage_renameObject(id=id, new_id=logo_id)
- root.invokeFactory(id=id, type_name='Zope Service Provider')
+ try:
+ root.invokeFactory(id=id, type_name='Zope Service Provider')
+ except:
+ pass
+ if not hasattr(aq_base(root), id):
+ result.append(None)
+ continue
new_obj = getattr(root, id, None)
- if new_obj is None:
- return
new_obj.setCompany(getattr(entry, 'COMPANY', ''))
new_obj.setSummary('')
new_obj.setExternalURL(getattr(entry, 'URL', ''))
@@ -204,7 +209,8 @@
phone['info'] = getattr(p, 'INFO', '')
new_phones.append(phone.copy())
new_obj.setPhoneInfo(new_phones)
- return new_obj
+ result.append(new_obj)
+ return tuple(result)
class Transmutator:
@@ -239,8 +245,8 @@
nmt = normalizeMetaType
mmt = '%s2%s' % (nmt(mt), nmt(dt))
obj_url = obj.absolute_url(relative=1)
- self.log('Will use %s to migrate %s (%s)\n' % \
- (mmt, obj_url, mt))
+ self.log('%s (%s) -> %s \n' % \
+ (obj_url, mt, mmt))
return getattr(self, mmt, self.defaultMigrationMethod)
def defaultMigrationMethod(self, obj, source, dest):
@@ -248,10 +254,12 @@
copy = obj._getCopy(dest)
dest._setObject(obj.getId(), copy)
except:
- self.log('Could not copy %s (%s). Possibly duplicate id.\n'\
+ self.log('%s (%s) failed. Possibly duplicate id.\n'\
% (obj.getId(), obj.absolute_url(relative=1)))
return None
- return getattr(dest, obj.getId())
+ if not hasattr(aq_base(dest), obj.getId()):
+ return None
+ return getattr(dest, obj.getId(), None)
def BrokenBecauseProductisGone2BBR(self, obj, source, dest):
self.log('Ignoring Broken Beyond Repair.\n')
@@ -274,7 +282,12 @@
return None
def SoftwareProduct2CMFSoftwarePackage(self, obj, source, dest):
- dest.invokeFactory(id=obj.getId(), type_name='Software Package')
+ try:
+ dest.invokeFactory(id=obj.getId(), type_name='Software Package')
+ except:
+ pass
+ if not hasattr(aq_base(dest), obj.getId()):
+ return None
f = getattr(dest, obj.getId())
title = obj.title or ''
description = obj.description or ''
@@ -288,14 +301,24 @@
return f
def ProductRelease2CMFSoftwareRelease(self, obj, source, dest):
- dest.invokeFactory(id=obj.getId(), type_name='Software Release')
- f = getattr(dest, obj.getId())
+ version = obj.version or 'default'
+ try:
+ dest.invokeFactory(id=version, type_name='Software Release')
+ except:
+ pass
+ if not hasattr(aq_base(dest), version):
+ return None
+ f = getattr(dest, version)
title = obj.title or ''
- version = obj.version
f.setTitle(title)
f.setVersion(version)
- f.invokeFactory(id=obj.getId(), type_name='Software Release File')
+ try:
+ f.invokeFactory(id=obj.getId(), type_name='Software Release File')
+ except:
+ pass
+ if not hasattr(aq_base(f), obj.getId()):
+ return (f, None)
r = getattr(f, obj.getId())
platform = obj.platform
maturity = obj.status
@@ -310,6 +333,7 @@
'application/octet-stream')
r.update_data(data, content_type, size)
+ r._calculateMD5()
r.setPlatform(platform)
f.setMaturity(maturity)
f.setInfoURL(info_url)
@@ -317,8 +341,8 @@
f.setChangesURL(changes_url)
f.setInstallationURL(installation_url)
f.setLicense(license)
-
- return f
+
+ return (f, r)
def Tracker2CMFCollector(self, obj, source, dest):
self.log('Ignoring Tracker for now.\n')
@@ -334,12 +358,19 @@
parsed.manage_addParsedXML(obj.getId(), obj.title, \
obj.toXML())
except:
+ pass
+ if not hasattr(aq_base(dest), obj.getId()):
return None
- return getattr(aq_base(dest), obj.getId(), None)
+ return getattr(dest, obj.getId(), None)
def BackTalkBook2CMFBackTalkBook(self, obj, source, dest):
- dest.invokeFactory(id=obj.getId(), type_name='BackTalk Book')
- book = getattr(dest, obj.getId())
+ try:
+ dest.invokeFactory(id=obj.getId(), type_name='BackTalk Book')
+ except:
+ pass
+ if not hasattr(aq_base(dest), obj.getId()):
+ return None
+ book = getattr(dest, obj.getId(), None)
for prop in obj.propertyIds():
if prop in ['header', 'summary']:
continue
@@ -353,7 +384,12 @@
return book
def BackTalkDocument2CMFBackTalkDocument(self, obj, source, dest):
- dest.invokeFactory(id=obj.getId(), type_name='BackTalk Document')
+ try:
+ dest.invokeFactory(id=obj.getId(), type_name='BackTalk Document')
+ except:
+ pass
+ if not hasattr(aq_base(dest), obj.getId()):
+ return None
doc = getattr(dest, obj.getId())
for prop in obj.propertyIds():
if prop in ['summary']:
@@ -367,8 +403,13 @@
return doc
def File2CMFDefaultFile(self, obj, source, dest):
- dest.invokeFactory(id=obj.getId(), type_name='File')
- f = getattr(dest, obj.getId())
+ try:
+ dest.invokeFactory(id=obj.getId(), type_name='File')
+ except:
+ pass
+ if not hasattr(aq_base(dest), obj.getId()):
+ return None
+ f = getattr(dest, obj.getId(), None)
title = obj.title or ''
content_type = obj.content_type
data = str(obj.data)
@@ -379,8 +420,13 @@
return f
def Image2CMFDefaultImage(self, obj, source, dest):
- dest.invokeFactory(id=obj.getId(), type_name='Image')
- f = getattr(dest, obj.getId())
+ try:
+ dest.invokeFactory(id=obj.getId(), type_name='Image')
+ except:
+ pass
+ if not hasattr(aq_base(dest), obj.getId()):
+ return None
+ f = getattr(dest, obj.getId(), None)
title = obj.title or ''
content_type = obj.content_type
data = str(obj.data)
@@ -391,8 +437,13 @@
return f
def NewsItem2CMFDefaultNewsItem(self, obj, source, dest):
- dest.invokeFactory(id=obj.getId(), type_name='News Item')
- news = getattr(dest, obj.getId())
+ try:
+ dest.invokeFactory(id=obj.getId(), type_name='News Item')
+ except:
+ pass
+ if not hasattr(aq_base(dest), obj.getId()):
+ return None
+ news = getattr(dest, obj.getId(), None)
title = obj.title or ''
text = obj.text
format = obj.format
@@ -406,8 +457,13 @@
return news
def Link2CMFDefaultLink(self, obj, source, dest):
- dest.invokeFactory(id=obj.getId(), type_name='Link')
- link = getattr(dest, obj.getId())
+ try:
+ dest.invokeFactory(id=obj.getId(), type_name='Link')
+ except:
+ pass
+ if not hasattr(aq_base(dest), obj.getId()):
+ return None
+ link = getattr(dest, obj.getId(), None)
title = obj.title or ''
description = (type(obj.description) == type('')) and \
obj.description or ''
@@ -425,8 +481,13 @@
return link
def FormattedDocument2CMFDefaultDocument(self, obj, source, dest):
- dest.invokeFactory(id=obj.getId(), type_name='Document')
- doc = getattr(dest, obj.getId())
+ try:
+ dest.invokeFactory(id=obj.getId(), type_name='Document')
+ except:
+ pass
+ if not hasattr(aq_base(dest), obj.getId()):
+ return None
+ doc = getattr(dest, obj.getId(), None)
title = obj.title or ''
description = (type(obj.description) == type('')) and \
obj.description or ''
@@ -445,8 +506,13 @@
HTMLDocument2CMFDefaultDocument = FormattedDocument2CMFDefaultDocument
def Tip2ZopeOrgTip(self, obj, source, dest):
- dest.invokeFactory(id=obj.getId(), type_name='Tip')
- tip = getattr(dest, obj.getId())
+ try:
+ dest.invokeFactory(id=obj.getId(), type_name='Tip')
+ except:
+ pass
+ if not hasattr(aq_base(dest), obj.getId()):
+ return None
+ tip = getattr(dest, obj.getId(), None)
title = obj.tip or ''
text = obj.details or ''
format = 'html'
@@ -460,8 +526,13 @@
return tip
def HowTo2ZopeOrgHowTo(self, obj, source, dest):
- dest.invokeFactory(id=obj.getId(), type_name='HowTo')
- howto = getattr(dest, obj.getId())
+ try:
+ dest.invokeFactory(id=obj.getId(), type_name='HowTo')
+ except:
+ pass
+ if not hasattr(aq_base(dest), obj.getId()):
+ return None
+ howto = getattr(dest, obj.getId(), None)
title = obj.title or ''
text = obj.content
format = obj.format
@@ -475,7 +546,6 @@
return howto
def Folder2CMFPortalFolder(self, obj, source, dest):
-
if dest is None or obj is None: return None
try:
dest.invokeFactory(id=obj.getId(), title=obj.title, \
@@ -484,12 +554,12 @@
pass
if not hasattr(aq_base(dest), obj.getId()):
return None
- new = getattr(dest, obj.getId())
+ new = getattr(dest, obj.getId(), None)
if hasattr(aq_base(new), 'objectValues'):
# Exception: CaseStudies content will be converted to 1 object.
url = obj.absolute_url(relative=1)
if url.find('Resources/CaseStudies/') == 0:
- migrateCaseStudies(obj, new)
+ return migrateCaseStudies(obj, new)
return new
return None
@@ -588,14 +658,28 @@
value = p['select_variable']
if not hasattr(new, value):
setattr(new, value, [])
- else: value = orig.getProperty(prop)
+ else:
+ try:
+ value = orig.getProperty(prop)
+ except:
+ value = ''
try: new._setProperty(prop, value, type)
except Exception, msg:
self.log('Could not set property ' + \
'%s of type %s to %s.\n %s\n' % \
(prop, type, value, msg))
else:
- new._setPropValue(prop, orig.getProperty(prop))
+ try:
+ value = orig.getProperty(prop)
+ except:
+ value = ''
+ try:
+ new._setPropValue(prop, value)
+ except Exception, msg:
+ self.log('Could not set property ' + \
+ '%s to %s.\n %s\n' % \
+ (prop, value, msg))
+
return new
def run(self):
@@ -623,21 +707,24 @@
obj_url = obj.absolute_url(relative=1)
except POSKeyError:
# Skip this object
- self.log('POSKeyError while trying to access' +\
+ self.log('POSKeyError on' +\
' %s.\n' % '/'.join(path + (oid, )))
continue
mm = self.getMigrationMethod(obj)
try:
- new_obj = mm(obj, source, dest)
- except: new_obj = None
+ new_objs = mm(obj, source, dest)
+ except: new_objs = None
if obj is None:
self.log('Something wicked happened to %s ' % oid +\
'on %s.\n' % '/'.join(path))
continue
- if new_obj is None or not new_obj:
+ if new_objs is None:
self.log('Result of conversion of' +\
' %s: Failed.\n' % obj.absolute_url(relative=1))
- else:
+ continue
+ if type(new_objs) != type(()):
+ new_objs = (new_objs, )
+ for new_obj in new_objs:
new_obj = self.fixOwnership(obj, new_obj)
new_obj = self.copyProperties(obj, new_obj)
res = []
@@ -650,19 +737,18 @@
if ct is not None:
try: ct.reindexObject(obj)
except: pass
- self.log('Result of conversion of' +\
- ' %s: Success.\n' % obj.absolute_url(relative=1))
+ self.log('%s: Success.\n' % obj.absolute_url(relative=1))
- if hasattr(obj, 'objectIds') and new_obj is not None:
- ignore = self.WikiMethodsCleanup(obj, ignore)
- ignore = self.DefaultDTMLCleanup(obj, ignore)
- self.log(Transmutator(obj, new_obj, \
+ if hasattr(obj, 'objectIds') and new_obj is not None:
+ ignore = self.WikiMethodsCleanup(obj, ignore)
+ ignore = self.DefaultDTMLCleanup(obj, ignore)
+ self.log(Transmutator(obj, new_obj, \
ignore, self._type_map, \
self._level + 1).run(), dup=0)
- if self._level <= 2:
- get_transaction().commit()
- else:
- get_transaction().commit(1)
+ if self._level <= 2:
+ get_transaction().commit()
+ else:
+ get_transaction().commit(1)
return 'Ok.\n'
From sidnei at x3ng.com.br Tue Feb 18 15:47:14 2003
From: sidnei at x3ng.com.br (Sidnei da Silva)
Date: Sun Aug 10 17:02:10 2008
Subject: [zopeorg-checkins] CVS: Products/ZopeOrg-NV/Extensions - NZOMigrate.py:1.16
Message-ID: <200302182047.h1IKlEM17030@cvs.baymountain.com>
Update of /cvs-zopeorg/Products/ZopeOrg-NV/Extensions
In directory cvs.zope.org:/tmp/cvs-serv17016/Extensions
Modified Files:
NZOMigrate.py
Log Message:
More fixes to migration. New helper methods to fix ownership and publishing. A typo (HowTo -> How-To).
=== Products/ZopeOrg-NV/Extensions/NZOMigrate.py 1.15 => 1.16 ===
"Image": "CMF Default Image",
"File": "CMF Default File",
"Tip": "ZopeOrg Tip",
- "HowTo": "ZopeOrg HowTo",
+ "How-To": "ZopeOrg HowTo",
"Software Product": "CMF Software Package",
"Product Release": "CMF Software Release",
"Tracker": "CMF Collector",
@@ -120,12 +120,120 @@
return res
+def recursiveOwnerFix(ob, new_uid=None, fix_children=0):
+ try: changed = ob._p_changed
+ except: changed = 0
+
+ if ob is None:
+ return
+
+ try:
+ owner = ob.getOwner(info=1)
+ except:
+ owner = None
+
+ udb = None
+ uid = None
+ root = ob.getPhysicalRoot()
+ if owner:
+ udb, uid = owner
+ if not new_uid: return
+ p = ob
+ old_udb = udb
+ udb = None
+ if new_uid != uid:
+ while p is not None:
+ if hasattr(p, 'acl_users'):
+ acl_users = getattr(p, 'acl_users')
+ try:
+ user = acl_users.getUserById(new_uid).__of__(acl_users)
+ except:
+ user = None
+ if user is not None:
+ # Found the right database.
+ udb = acl_users.getPhysicalPath()[1:]
+ break
+ p = aq_parent(aq_inner(p))
+ if udb is not None:
+ ob.changeOwnership(user)
+ log('Changed ownership of %s from %s!%s to %s!%s.\n' %
+ ('/'.join(ob.getPhysicalPath()),
+ '/'.join(old_udb), uid,
+ '/'.join(udb), user,))
+ else:
+ log('Could not fix the ownership of %s, '
+ 'which is set to %s!%s.\n' %
+ ('/'.join(ob.getPhysicalPath()),
+ '/'.join(old_udb), uid,))
+
+ if fix_children:
+ if hasattr(ob, 'objectValues'):
+ for subob in ob.objectValues():
+ recursiveOwnerFix(subob, new_uid, 1)
+ # Deactivate object if possible.
+ if changed is None: ob._p_deactivate()
+
+ return
+
+def log(message, summary='', severity=0, dup=1):
+ zLOG.LOG('NZOMigration: ',severity,summary,message)
+
+def setLocalRoles(self, ids, role):
+ pm = getToolByName(self, 'portal_membership')
+ try:
+ pm.setLocalRoles( self
+ , member_ids=ids
+ , member_role=role
+ )
+ log('Set roles %s for %s on %s.\n' %
+ (role, ids, self.absolute_url(relative=1)))
+ except:
+ log('Failed to set roles %s for %s on %s.\n' %
+ (role, ids, self.absolute_url(relative=1)))
+
+
+def fixMembers(self, skip=None):
+ members = self.Members.objectIds()
+ if skip is None:
+ skip = []
+ members = [id for id in members if not id in skip]
+ members.sort()
+ for id in members:
+ log('Starting recursiveFixOwnership in Members/%s. \n' % id)
+ folder = getattr(self.Members, id, None)
+ if folder.meta_type not in ['Folder', 'Portal Folder', 'BTreeFolder2', 'Plone Folder']:
+ continue
+ res = recursiveOwnerFix(folder, id, 1)
+ setLocalRoles(folder, (id, ), 'Owner')
+ updateRoleMappings(folder)
+ massPublish(folder)
+ log('Finished recursiveFixOwnership in Members/%s. \n' % id)
+ get_transaction().commit()
+ return 'Done!'
+
+def updateRoleMappings(self):
+
+ """ Allow workflows to update the role-permission mappings.
+ """
+ wfs = {}
+ wf_tool = getToolByName(self, 'portal_workflow')
+ for id in wf_tool.objectIds():
+ wf = wf_tool.getWorkflowById(id)
+ if hasattr(aq_base(wf), 'updateRoleMappingsFor'):
+ wfs[id] = wf
+ count = wf_tool._recursiveUpdateRoleMappings(self, wfs)
+ log('updateRoleMappings: %d object(s) updated.\n' % count)
+ return count
+
def massPublish(self):
wf_tool = getToolByName(self, 'portal_workflow')
+ try:
+ wf_tool.doActionFor(self, 'publish')
+ log('Published %s.\n' % self.getId())
+ except: pass
+ get_transaction().commit()
if hasattr(self, 'objectValues'):
for subob in self.objectValues():
- try: wf_tool.doActionFor(subob, 'publish')
- except: pass
massPublish(subob)
def filterList(alist):
@@ -176,6 +284,8 @@
if hasattr(aq_base(root), id):
logo_id = '%s_logo' % id
root.manage_renameObject(id=id, new_id=logo_id)
+ else:
+ logo_id = ''
try:
root.invokeFactory(id=id, type_name='Zope Service Provider')
except:
@@ -655,9 +765,10 @@
if type in ('selection', 'multiple selection'):
for p in orig._properties:
if p['id'] == prop:
- value = p['select_variable']
- if not hasattr(new, value):
- setattr(new, value, [])
+ value = str(p['select_variable'])
+ break
+ if not hasattr(aq_base(new), value):
+ setattr(new, str(value), [])
else:
try:
value = orig.getProperty(prop)