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

Edit This

Title
Summary
Logo
External URL
Format
Case Facts
Upload Case Facts
Problem
Upload Problem
Solution
Upload Solution

=== Added File Products/ZopeOrg-NV/skins/zopeorg_types/casestudy_view.pt === Master Template

External URL

Summary

Summary

Case Facts

Problem

Solution

=== 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

Edit This

TitleHowto Title
DescriptionThis is a good HowTo.
Format
Upload
Edit

=== 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

Edit This

TitleHowto Title
Description This is a good Tip.
Format
Upload
Edit

=== 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

Edit This

Company
Summary
Logo
External URL
Location
Contact Info
Name
Email
Info

Name
Email
Info
Phone Info
Phone Info
Phone Info
Format
Service Info
Upload Service Info

=== Added File Products/ZopeOrg-NV/skins/zopeorg_types/zsp_view.pt === Master Template

Company

External URL

Summary

Summary

Contact

Service Info

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)