def prepare_site(context, check_marker=True):
    # We check from our GenericSetup context whether we are running
    # add-on installation for our own or any other product
    if check_marker and context.readDataFile('cnrd.vctypes.marker') is None:
        # Not our add-on
        return

    try:
        site = context.getSite()
        from zope.site.hooks import setSite
        setSite(site)
    except:
        from zope.site.hooks import getSite
        site = getSite()

    # make shure we have a default workflow, this may be needed for tests:
    portal_workflow = getToolByName(site, 'portal_workflow')
    if not portal_workflow.getDefaultChain():
        portal_workflow.setDefaultChain('simple_publication_workflow')

    print '### Preparing site "%s" ###' % site

    objects = [
        {'id': 'home', 'title': u'CNRD Virtual Center',
            'portal_type': 'cnrd.Homepage', 'exclude': True},
        {'id': 'challenges', 'title': u'Challenges',
            'portal_type': 'cnrd.ChallengeFolder'},
        {'id': 'workspaces', 'title': u'Workspaces',
            'portal_type': 'cnrd.WorkspaceFolder', 'publish': False},
        {'id': 'universities', 'title': u'Universities',
            'portal_type': 'cnrd.UniversityFolder'},
        {'id': 'welcome', 'title': u'Welcome',
            'portal_type': 'Document', 'exclude': True},
        {'id': 'people', 'title': u'People',
            'portal_type': 'cnrd.MemberFolder', 'publish': False},
        {'id': 'library', 'title': u'Library',
            'portal_type': 'LibrarySearch'},
        {'id': 'news', 'exclude': True},
        {'id': 'events', 'exclude': True},
        {'id': 'Members', 'exclude': True}, ]

    for i, o in enumerate(objects):
        if not o['id'] in site:
            if 'portal_type' in o:
                print "  - Creating '%s'." % o['id']
                replicator.add_content(
                    parent=site,
                    portal_type=o['portal_type'],
                    id=o['id'],
                    title=o.get('title', o['id']),
                    publish=o.get('publish', True)
                )
            else:
                print "  - '%s' does not exist and can't be created." % o['id']
                continue
        else:
            print "  - '%s' exists." % o['id']

        print "    Moving '%s' to position %i." % (o['id'], i)
        site.moveObjectToPosition(o['id'], i)

        if o.get('exclude'):
            print "    Excluding '%s' from navigation." % o['id']
            site[o['id']].exclude_from_nav = True

        print "    Reindexing '%s'." % o['id']
        site[o['id']].reindexObject()

    # set the homepage as default view for the site-root
    site.setDefaultPage('home')
    # delete plones standard front-page
    if 'front-page' in site:
        site.manage_delObjects(['front-page'])

    # configure the member-folder:
    intids = getUtility(IIntIds)
    site['people'].welcomePage = RelationValue(intids.getId(site['welcome']))

    # set the the scope for the library-search:
    site['library'].librarySearchScope = [RelationValue(
        intids.getId(site['workspaces']))]
    site['library'].libraryExtraSearchArgs = {
        'review_state': 'published'}

    # add groups:
    groupPrefs = [
        {'id': 'Students', 'roles': ['Member', 'Student']},
        {'id': 'Teachers', 'roles': ['Member', 'Teacher']},
        {'id': 'Externs', 'roles': ['Extern']},
        {'id': 'Alumni'}, ]
    groups_tool = getToolByName(site, 'portal_groups')
    for prefs in groupPrefs:
        if not prefs['id'] in groups_tool.getGroupIds():
            groups_tool.addGroup(prefs['id'], roles=prefs.get('roles', []))
Beispiel #2
0
def migrate_workspaces(context):
    fields = [
        'autoAcceptNewMembers',
        'challenges',
        'creation_date',
        'description',
        'effective_date',
        'fromDate',
        'goals',
        'images',
        'invitedExterns',
        'invitedManagers',
        'invitedMembers',
        'lecture',
        'librarySearchScope',
        'location',
        'managers',
        'maxMembers',
        'members',
        'previouslyEdited',
        'tillDate',
        'title',
    ]

    MARKER = '#marker#'

    catalog = getToolByName(context, 'portal_catalog')
    pw = getToolByName(context, 'portal_workflow')

    query = {'object_provides': IWorkspace.__identifier__, }

    wsbs = catalog(query)

    for wsb in wsbs:
        old_ws = wsb.getObject()
        ws_id = old_ws.id
        ws_old_id = 'old_stuff_' + old_ws.id
        owner_id = old_ws.getOwnerTuple()[1]
        parent = old_ws.aq_parent
        review_state = pw.getInfoFor(old_ws, 'review_state')

        print '  updating %s ("%s") owned by %s' % (ws_id, old_ws.title, owner_id)

        if review_state == 'draft' and old_ws.title == 'Workspace Draft':
            parent.manage_delObjects(ws_old_id)
            print "  ^ removed draft"
            continue

        attributes = {}
        for key in fields:
            value = getattr(old_ws, key, MARKER)
            if value != MARKER:
                attributes[key] = value

        parent.manage_renameObjects([ws_id], [ws_old_id])

        if owner_id != 'admin':
            new_ws = add_content(parent, portal_type='ixds.Workspace', id=ws_id,
                publish=False, as_user=owner_id, **attributes)
        else:
            new_ws = add_content(parent, portal_type='ixds.Workspace', id=ws_id,
                publish=False, **attributes)

        new_ws.update_image_fields()
        pw.doActionFor(new_ws, 'publish-for-site-members')
        modified(new_ws)

        clip = old_ws.manage_cutObjects(old_ws.keys())
        new_ws.manage_pasteObjects(clip)

        parent.manage_delObjects(ws_old_id)