def createFolderAndContents(folder_directori, folder_data): # Create folder folder_props = { 'title': folder_data[0], 'checkConstraints': False, 'exclude_from_nav': folder_data[2], 'allow_discussion': folder_data[3] } if folder_data[5] is not None: folder_props['layout'] = folder_data[5] folder = createContentInContainer(folder_directori, folder_data[1], **folder_props) behavior = ISelectableConstrainTypes(folder) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(folder_data[4]) behavior.setImmediatelyAddableTypes(folder_data[4]) folder.reindexObject() # Create a contents for folder_content in folder_data[7]: createContentInFolder(folder, folder_content) if folder_data[6] is not None: folder.setDefaultPage(folder_data[6])
def createContentInFolder(folder_directori, folder_content): # Create content if folder_content[1] != "Folder": content_props = { 'title': folder_content[0], 'checkConstraints': False, 'exclude_from_nav': folder_content[2], 'allow_discussion': folder_content[3] } if folder_content[6] is not None: content_props['description'] = folder_content[6] if folder_content[7] is not None: content_props['text'] = IRichText['text'].fromUnicode( folder_content[7]) if folder_content[5] is not None: content_props['layout'] = folder_content[5] content = createContentInContainer(folder_directori, folder_content[1], **content_props) if folder_content[4] is not None: behavior = ISelectableConstrainTypes(content) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(folder_content[4]) behavior.setImmediatelyAddableTypes(folder_content[4]) else: createFolderAndContents(folder_directori, folder_content)
def render(self): try: from plone.protect.interfaces import IDisableCSRFProtection alsoProvides(self.request, IDisableCSRFProtection) except: pass portal = api.portal.get() pc = api.portal.get_tool(name='portal_catalog') communities = pc.searchResults(portal_type='ulearn.community') text = [] for community_brain in communities: # We assume that there will be only communities in Portal Site Root community = portal[community_brain.id] # Set on them the allowable content types behavior = ISelectableConstrainTypes(community['documents']) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Document', 'File', 'Folder', 'Link', 'Image', 'privateFolder', 'ulearn.video', 'ulearn.video_embed')) behavior.setImmediatelyAddableTypes(('Document', 'File', 'Folder', 'Link', 'Image', 'privateFolder', 'ulearn.video', 'ulearn.video_embed')) community.reindexObject() text.append('Migrated types community {}\n'.format(community.absolute_url())) return ''.join(text) + '\nDone!'
def test_data_getter(self): self.maxDiff = None folder = create(Builder('folder').titled(u'The Folder')) constrain_types = ISelectableConstrainTypes(folder) constrain_types.setConstrainTypesMode(ENABLED) allowed_types = ['Collection', 'Folder'] immediately_addable_types = ['Collection'] constrain_types.setLocallyAllowedTypes(allowed_types) constrain_types.setImmediatelyAddableTypes(immediately_addable_types) adapter = getAdapter(folder, IDataCollector, name='constrain_types_adapter') expected_data = { 'mode': ENABLED, 'locally_allowed': allowed_types, 'immediately_addable': immediately_addable_types } self.assertEquals(expected_data, adapter.getData()) constrain_types.setConstrainTypesMode(DISABLED) expected_data = {'mode': DISABLED} self.assertEquals(expected_data, adapter.getData()) constrain_types.setConstrainTypesMode(ACQUIRE) expected_data = {'mode': ACQUIRE} self.assertEquals(expected_data, adapter.getData())
def render(self): try: from plone.protect.interfaces import IDisableCSRFProtection alsoProvides(self.request, IDisableCSRFProtection) except: pass portal = api.portal.get() pc = api.portal.get_tool(name='portal_catalog') communities = pc.searchResults(portal_type='ulearn.community') text = [] for community_brain in communities: # We assume that there will be only communities in Portal Site Root community = portal[community_brain.id] # Set on them the allowable content types behavior = ISelectableConstrainTypes(community['documents']) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes( ('Document', 'File', 'Folder', 'Link', 'Image', 'privateFolder', 'ulearn.video', 'ulearn.video_embed')) behavior.setImmediatelyAddableTypes( ('Document', 'File', 'Folder', 'Link', 'Image', 'privateFolder', 'ulearn.video', 'ulearn.video_embed')) community.reindexObject() text.append('Migrated types community {}\n'.format( community.absolute_url())) return ''.join(text) + '\nDone!'
def post_install(context): """Post install script""" #if context.readDataFile('polklibraryslider_default.txt') is None: # return print "Running Post Install" # Add Group plone.app.portlets.ManagePortlets # plone.api.group.create(groupname='slider_image_editor', title='Slider Image Editor', description='Can edit and manage slider content') # Add Slider Folder site = api.portal.get() obj = api.content.create( type='Folder', title='Slider Images', description= 'This folder contains all the banner sliding images of your site. DO NOT DELETE, MOVE OR RENAME!', container=site) api.content.transition(obj, 'publish') obj.exclude_from_nav = True behavior = ISelectableConstrainTypes(obj) behavior.setConstrainTypesMode(constrains.ENABLED) behavior.setLocallyAllowedTypes(('linkable_image', )) behavior.setImmediatelyAddableTypes(('linkable_image', )) obj.reindexObject()
def render(self): pc = api.portal.get_tool(name='portal_catalog') communities = pc.searchResults(portal_type='ulearn.community') for community in communities: community = community.getObject() if 'discussion' not in community.objectIds(): # Create the default discussion container and set title discussion = createContentInContainer(community, 'Folder', title='discussion', checkConstraints=False) discussion.setTitle(community.translate(_(u'Discussion'))) discussion.setLayout('discussion_folder_view') alsoProvides(discussion, IDiscussionFolder) behavior = ISelectableConstrainTypes(discussion) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('ulearn.discussion', 'Folder')) behavior.setImmediatelyAddableTypes(('ulearn.discussion', 'Folder')) # Blacklist the right column portlets on discussion right_manager = queryUtility(IPortletManager, name=u'plone.rightcolumn') blacklist = getMultiAdapter((discussion, right_manager), ILocalPortletAssignmentManager) blacklist.setBlacklistStatus(CONTEXT_CATEGORY, True) discussion.reindexObject() logger.info('Created discussion folder in {}'.format(community.absolute_url())) return 'Done.'
def __iter__(self): for item in self.previous: pathkey = self.pathkey(*item.keys())[0] constrainkey = self.constrainkey(*item.keys())[0] if not pathkey or not constrainkey or \ constrainkey not in item: # not enough info yield item continue obj = self.context.unrestrictedTraverse(item[pathkey].lstrip('/'), None) if obj is None: # path doesn't exist yield item continue constr = ISelectableConstrainTypes(obj, None) if constr is not None: constrain_dict = item[constrainkey] mode = constrain_dict['mode'] allowedtypes = constrain_dict['locallyallowedtypes'] addabletypes = constrain_dict['immediatelyaddabletypes'] if mode not in (constrains.ACQUIRE, constrains.DISABLED, constrains.ENABLED): # mode not valid [-1, 0, 1] yield item continue constr.setConstrainTypesMode(mode) if allowedtypes: constr.setLocallyAllowedTypes(allowedtypes) if addabletypes: constr.setImmediatelyAddableTypes(addabletypes) yield item
def set_constraintypes_config(self, obj, config): self.assertEquals({'mode', 'locally allowed', 'immediately addable'}, set(config)) ctypes = ISelectableConstrainTypes(obj) ctypes.setConstrainTypesMode(config['mode']) ctypes.setLocallyAllowedTypes(config['locally allowed']) ctypes.setImmediatelyAddableTypes(config['immediately addable'])
def set_constraintypes_config(self, obj, config): self.assertEquals( {'mode', 'locally allowed', 'immediately addable'}, set(config)) ctypes = ISelectableConstrainTypes(obj) ctypes.setConstrainTypesMode(config['mode']) ctypes.setLocallyAllowedTypes(config['locally allowed']) ctypes.setImmediatelyAddableTypes(config['immediately addable'])
def initialize_servei(serveitic, event): # Configure portlets assignments = get_portlet_assignments( serveitic, 'plone.leftcolumn') assignments['banners_global'] = BannersAssignment(banner_type=u"Global") assignments['banners_local'] = BannersAssignment(banner_type=u"Local") assignments = get_portlet_assignments( serveitic, 'genweb.portlets.HomePortletManager3') assignments['notificacions'] = NotificacionsAssignment() assignments = get_portlet_assignments( serveitic, 'genweb.portlets.HomePortletManager4') assignments['problemes'] = ProblemesAssignment() assignments = get_portlet_assignments( serveitic, 'genweb.portlets.HomePortletManager5') assignments['indicadors'] = IndicadorsAssignment() # Create folder structure for folder_data in folder_structure: folder_props = { 'title': folder_data[0], 'checkConstraints': False, 'exclude_from_nav': folder_data[2], 'allow_discussion': folder_data[3]} if folder_data[5] is not None: folder_props['layout'] = folder_data[5] folder = createContentInContainer( serveitic, folder_data[1], **folder_props) for folder_content in folder_data[6]: content_props = { 'title': folder_content[0], 'checkConstraints': False, 'exclude_from_nav': folder_content[2], 'allow_discussion': folder_content[3]} if folder_content[5] is not None: content_props['layout'] = folder_content[5] content = createContentInContainer( folder, folder_content[1], **content_props) if folder_content[4] is not None: behavior = ISelectableConstrainTypes(content) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(folder_content[4]) behavior.setImmediatelyAddableTypes(folder_content[4]) behavior = ISelectableConstrainTypes(folder) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(folder_data[4]) behavior.setImmediatelyAddableTypes(folder_data[4]) folder.reindexObject() # Mark ServeiTIC as initialized to prevent previous folder creations from # triggering the modify event alsoProvides(serveitic, IInitializedServeiTIC)
def onEventsFolderCreate(context, event, sample=True): # restrict what this folder can contain behavior = ISelectableConstrainTypes(context) behavior.setConstrainTypesMode(constrains.ENABLED) behavior.setImmediatelyAddableTypes(['Event']) behavior.setLocallyAllowedTypes(['Event', 'Collection']) # Create sample event and set publishing date to 01-01-YYYY if sample: # Calculate dates now = DateTime() start_date = DateTime() + 30 end_date = start_date + 1.0 / 24 item = createContentInContainer(context, "Event", id="sample", title="Sample Event", description="This is a sample Event", checkConstraints=False) item.text = RichTextValue(raw='<p>You may delete this item</p>', mimeType=u'text/html', outputMimeType='text/x-html-safe') item.setEffectiveDate(now) acc = IEventAccessor(item) acc.start = localize(start_date) acc.end = localize(end_date) # create 'upcoming' collection if 'upcoming' not in context.objectIds(): item = createContentInContainer( context, "Collection", id="upcoming", title='Upcoming Events', ) item.setQuery([{ u'i': u'path', u'o': u'plone.app.querystring.operation.string.absolutePath', u'v': u'%s::1' % context.UID() }, { u'i': u'portal_type', u'o': u'plone.app.querystring.operation.selection.any', u'v': [u'Event'] }]) item.setSort_on('start') # Set default page to the latest news collection context.setDefaultPage('upcoming')
def test_allowedContentTypesExit4(self): """ Constrains are enabled """ behavior = ISelectableConstrainTypes(self.folder) behavior.setLocallyAllowedTypes(self.types_id_subset) behavior.setConstrainTypesMode(constrains.ENABLED) self.assertEqual(self.types_id_subset, [x.getId() for x in behavior.allowedContentTypes()])
def test_allowedContentTypesExit4(self): """ Constrains are enabled """ behavior = ISelectableConstrainTypes(self.folder) behavior.setLocallyAllowedTypes(self.types_id_subset) behavior.setConstrainTypesMode(constrains.ENABLED) self.assertEqual(self.types_id_subset, [x.getId() for x in behavior.allowedContentTypes()])
def create_folder(container, id, title, addable_types): folder = createContentInContainer( container, "Folder", id=id, title=title, exclude_from_nav=True) folder_constraints = ISelectableConstrainTypes(folder) folder_constraints.setConstrainTypesMode(1) folder_constraints.setLocallyAllowedTypes(addable_types) folder_constraints.setImmediatelyAddableTypes(addable_types)
def import_constrains(self, obj, item): if not item.get("exportimport.constrains"): return constrains = ISelectableConstrainTypes(obj, None) if constrains is None: return constrains.setConstrainTypesMode(ENABLED) locally_allowed_types = item["exportimport.constrains"][ "locally_allowed_types"] constrains.setLocallyAllowedTypes(locally_allowed_types) immediately_addable_types = item["exportimport.constrains"][ "immediately_addable_types"] constrains.setImmediatelyAddableTypes(immediately_addable_types)
def set_up_content(site): """Create and configure some initial content""" if "talks" in site: return talks = api.content.create(container=site, type="Folder", id="talks", title="Talks") api.content.transition(talks, "publish") api.group.grant_roles(groupname="AuthenticatedUsers", roles=["Contributor"], obj=talks) # Enable constraining behavior = ISelectableConstrainTypes(talks) behavior.setConstrainTypesMode(constrains.ENABLED) behavior.setLocallyAllowedTypes(["talk"]) behavior.setImmediatelyAddableTypes(["talk"]) logger.info("Created and configured %s" % talks.absolute_url())
def test_allowedContentTypesExit3(self): """ Constrains are acquired, parent folder is of same type """ outer_behavior = ISelectableConstrainTypes(self.folder) assert len(outer_behavior.getLocallyAllowedTypes()) > 2 outer_behavior.setLocallyAllowedTypes(self.types_id_subset) outer_behavior.setConstrainTypesMode(constrains.ENABLED) behavior = ISelectableConstrainTypes(self.inner_folder) behavior.setConstrainTypesMode(constrains.ACQUIRE) self.assertEquals(self.types_id_subset, [x.getId() for x in behavior.allowedContentTypes()])
def test_allowedContentTypesExit3(self): """ Constrains are acquired, parent folder is of same type """ outer_behavior = ISelectableConstrainTypes(self.folder) assert len(outer_behavior.getLocallyAllowedTypes()) > 2 outer_behavior.setLocallyAllowedTypes(self.types_id_subset) outer_behavior.setConstrainTypesMode(constrains.ENABLED) behavior = ISelectableConstrainTypes(self.inner_folder) behavior.setConstrainTypesMode(constrains.ACQUIRE) self.assertEqual(self.types_id_subset, [x.getId() for x in behavior.allowedContentTypes()])
def various_update(self): # replace front-page frontpage = getattr(self.portal, 'front-page') frontpage.title = _translate("front_page_title") frontpage.description = _translate("front_page_descr") frontpage.text = richtextval(_translate("front_page_text")) transitions(frontpage, ('retract', 'publish_internally')) frontpage.reindexObject() self.portal.templates.layout = 'dg-templates-listing' # plonegroup-organization pgo = get_own_organization() behaviour = ISelectableConstrainTypes(pgo) behaviour.setConstrainTypesMode(1) behaviour.setLocallyAllowedTypes([]) behaviour.setImmediatelyAddableTypes([]) ISelectableConstrainTypes(pgo['echevins']).setConstrainTypesMode(0) ISelectableConstrainTypes(pgo['services']).setConstrainTypesMode(0)
def setUp(self): self.app = self.layer['app'] self.portal = self.layer['portal'] self.request = self.layer['request'] self.browser = Browser(self.app) # Create default GW directories setupview = getMultiAdapter((self.portal, self.request), name='setup-view') setupview.apply_default_language_settings() setupview.setup_multilingual() setupview.createContent('n4') # Enable the possibility to add Organs folder from Products.CMFPlone.interfaces.constrains import ISelectableConstrainTypes behavior = ISelectableConstrainTypes(self.portal['ca']) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(['genweb.organs.organsfolder']) behavior.setImmediatelyAddableTypes(['genweb.organs.organsfolder']) # Create Base folder to create base test folders try: api.content.delete(obj=self.portal['ca']['testingfolder'], check_linkintegrity=False) except: pass # Create default Organs Test Folder og_unit = api.content.create(type='genweb.organs.organsfolder', id='testingfolder', title='Organ Tests', container=self.portal['ca']) tools.create_organ_content(og_unit, 'open_organ', 'OG.OPEN', 'Organ TEST Obert', 'obert') tools.create_organ_content(og_unit, 'restricted_to_affected_organ', 'OG.AFFECTED', 'Organ TEST restringit a AFECTATS', 'afectats') tools.create_organ_content(og_unit, 'restricted_to_members_organ', 'OG.MEMBERS', 'Organ TEST restringit a MEMBRES', 'membres') logout()
def _addFileTypeToProjectSpaceConstrainedTypes(self): """We want to be able to add 'Files' in the 'pst' projectspace.""" logger.info( "Adding 'File' to constrained types of projectspace 'pst'...") projectspace = self.portal.pst # we do not publish because, in published state, editors cannot more modify # do_transitions(projectspace, transitions=['publish_internally'], logger=logger) # set locally allowed types behaviour = ISelectableConstrainTypes(projectspace) behaviour.setConstrainTypesMode(1) behaviour.setLocallyAllowedTypes([ 'strategicobjective', 'File', ]) behaviour.setImmediatelyAddableTypes([ 'strategicobjective', 'File', ]) logger.info('Done.')
def test_locallyAllowedTypesDefaultWhenDisabled(self): """ Constrain Mode Disabled. We get the default constrains, independent of what our parent folder or we ourselves defined """ behavior = ISelectableConstrainTypes(self.inner_folder) behavior.setConstrainTypesMode(constrains.DISABLED) behavior.setLocallyAllowedTypes([]) outer_behavior = ISelectableConstrainTypes(self.folder) outer_behavior.setConstrainTypesMode(constrains.ENABLED) outer_behavior.setLocallyAllowedTypes([]) types = self.default_types type_ids = [t.getId() for t in types] self.assertEqual(types, behavior.allowedContentTypes()) self.assertEqual(type_ids, behavior.getLocallyAllowedTypes())
def migrate(self, old, new): new_path = "/".join(new.getPhysicalPath()) for iface in interfaces: if iface.providedBy(old): alsoProvides(new, iface) logger.warn("{0} also provides {1}".format(new_path, str(iface))) if old.getConstrainTypesMode() != 0: behaviour = ISelectableConstrainTypes(new) behaviour.setConstrainTypesMode(1) if old.getConstrainTypesMode() == 1: behaviour.setLocallyAllowedTypes(old.getLocallyAllowedTypes()) behaviour.setImmediatelyAddableTypes(old.getImmediatelyAddableTypes()) if IFacetedNavigable.providedBy(old): criteria = Criteria(new) criteria._update(ICriteria(old).criteria) IFacetedLayout(new).update_layout('faceted-table-items') logger.warn("Added faceted criteria and layout to {0}".format(new_path))
def render(self): pc = api.portal.get_tool(name='portal_catalog') communities = pc.searchResults(portal_type='ulearn.community') text = [] for community in communities: community = community.getObject() media_folder = community.media behavior = ISelectableConstrainTypes(media_folder) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Image', 'ulearn.video', 'Folder')) behavior.setImmediatelyAddableTypes(('Image', 'ulearn.video', 'Folder')) if media_folder.title != 'Media': media_folder.setTitle(community.translate(_(u'Media'))) text.append('Added type video to {}\n'.format(community.absolute_url())) return ''.join(text)
def add_container(container, type, title, allowed_types=None, exclude_from_nav=False): folder_id = getUtility(IIDNormalizer).normalize(title) if folder_id not in container: folder = api.content.create(type=type, id=folder_id, title=title, container=container) api.content.transition(obj=folder, transition='publish') if allowed_types: behavior = ISelectableConstrainTypes(folder) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(allowed_types) behavior.setImmediatelyAddableTypes(allowed_types) folder.exclude_from_nav = exclude_from_nav return container[folder_id]
def test_locallyAllowedTypesDefaultWhenDisabled(self): """ Constrain Mode Disabled. We get the default constrains, independent of what our parent folder or we ourselves defined """ behavior = ISelectableConstrainTypes(self.inner_folder) behavior.setConstrainTypesMode(constrains.DISABLED) behavior.setLocallyAllowedTypes([]) outer_behavior = ISelectableConstrainTypes(self.folder) outer_behavior.setConstrainTypesMode(constrains.ENABLED) outer_behavior.setLocallyAllowedTypes([]) types = self.default_types type_ids = [t.getId() for t in types] self.assertEqual(types, behavior.allowedContentTypes()) self.assertEqual(type_ids, behavior.getLocallyAllowedTypes())
def add_container(container, type, title, allowed_types=None, exclude_from_nav=False): folder_id = getUtility(IIDNormalizer).normalize(title) if folder_id not in container: folder = api.content.create( type=type, id=folder_id, title=title, container=container) api.content.transition( obj=folder, transition='publish') if allowed_types: behavior = ISelectableConstrainTypes(folder) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(allowed_types) behavior.setImmediatelyAddableTypes(allowed_types) folder.exclude_from_nav = exclude_from_nav return container[folder_id]
def set_up_content(site): """Create and configure some initial content""" if 'talks' in site: return talks = api.content.create( container=site, type='Folder', id='talks', title='Talks') api.content.transition(talks, 'publish') api.group.grant_roles( groupname='AuthenticatedUsers', roles=['Contributor'], obj=talks) # Enable constraining behavior = ISelectableConstrainTypes(talks) behavior.setConstrainTypesMode(constrains.ENABLED) behavior.setLocallyAllowedTypes(['talk']) behavior.setImmediatelyAddableTypes(['talk']) logger.info("Created and configured %s" % talks.absolute_url())
def test_locallyAllowedTypesDefaultWhenEnabled(self): """ Constrain Mode enabled We get the set constrains, independent of what our parent folder defined """ behavior = ISelectableConstrainTypes(self.inner_folder) behavior.setConstrainTypesMode(constrains.ENABLED) behavior.setLocallyAllowedTypes(self.types_id_subset) outer_behavior = ISelectableConstrainTypes(self.folder) outer_behavior.setConstrainTypesMode(constrains.ENABLED) outer_behavior.setLocallyAllowedTypes([]) types = [t for t in self.default_types if t.getId() in self.types_id_subset] type_ids = self.types_id_subset self.assertEqual(types, behavior.allowedContentTypes()) self.assertEqual(type_ids, behavior.getLocallyAllowedTypes())
def test_locallyAllowedTypesDefaultWhenEnabled(self): """ Constrain Mode enabled We get the set constrains, independent of what our parent folder defined """ behavior = ISelectableConstrainTypes(self.inner_folder) behavior.setConstrainTypesMode(constrains.ENABLED) behavior.setLocallyAllowedTypes(self.types_id_subset) outer_behavior = ISelectableConstrainTypes(self.folder) outer_behavior.setConstrainTypesMode(constrains.ENABLED) outer_behavior.setLocallyAllowedTypes([]) types = [ t for t in self.default_types if t.getId() in self.types_id_subset ] type_ids = self.types_id_subset self.assertEqual(types, behavior.allowedContentTypes()) self.assertEqual(type_ids, behavior.getLocallyAllowedTypes())
def update(self, obj, data): if IS_PLONE_5 or IS_PLONE_APP_MULTILINGUAL_2: constrains = ISelectableConstrainTypes(obj) if constrains: constrains.setConstrainTypesMode(constraintypes.ENABLED) immediately = tuple(data['immediately']) constrains.setImmediatelyAddableTypes(immediately) locally = tuple(data['locally']) constrains.setLocallyAllowedTypes(locally) else: if base_hasattr(obj, 'getConstrainTypesMode'): obj.setConstrainTypesMode(constraintypes.ENABLED) immediately = tuple(data['immediately']) obj.setImmediatelyAddableTypes(immediately) locally = tuple(data['locally']) obj.setLocallyAllowedTypes(locally)
def test_contextual_constrains(self): content = api.content.create( container=self.portal, id="images", type="Folder", title="Image Bank", ) # Enable the ISelectableConstrainTypes behavior behavior = ISelectableConstrainTypes(content) behavior.setConstrainTypesMode(constrains.ENABLED) # Allow only Image and File to be added behavior.setLocallyAllowedTypes(["Image", "File"]) # Only Images are immediately addable behavior.setImmediatelyAddableTypes(["Image"]) transaction.commit() # response = self.api_session.get("/images/@types") response = response.json() self.assertEqual(len([a for a in response if a["immediately_addable"]]), 1) self.assertEqual(len([a for a in response if a["addable"]]), 2)
def render(self): portal = getSite() gestion = self.newPrivateFolder(portal, 'gestion', u'Gestión') gestion.exclude_from_nav = False gestion.setLayout('folder_listing') behavior = ISelectableConstrainTypes(gestion) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Folder', 'privateFolder',)) behavior.setImmediatelyAddableTypes(('Folder', 'privateFolder',)) enlaces_cabecera = self.newPrivateFolder(gestion, 'menu', u'Menu') enlaces_cabecera.exclude_from_nav = False enlaces_cabecera.reindexObject() for language in portal['portal_languages'].getSupportedLanguages(): language_folder = self.newPrivateFolder(enlaces_cabecera, language, language) language_folder.exclude_from_nav = False language_folder.reindexObject() behavior = ISelectableConstrainTypes(language_folder) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Folder', 'privateFolder', 'Link',)) behavior.setImmediatelyAddableTypes(('Folder', 'privateFolder', 'Link',))
def render(self): pc = api.portal.get_tool(name='portal_catalog') communities = pc.searchResults(portal_type='ulearn.community') text = [] for community in communities: community = community.getObject() media_folder = community.media behavior = ISelectableConstrainTypes(media_folder) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes( ('Image', 'ulearn.video', 'Folder')) behavior.setImmediatelyAddableTypes( ('Image', 'ulearn.video', 'Folder')) if media_folder.title != 'Media': media_folder.setTitle(community.translate(_(u'Media'))) text.append('Added type video to {}\n'.format( community.absolute_url())) return ''.join(text)
def render(self): pc = api.portal.get_tool(name='portal_catalog') communities = pc.searchResults(portal_type='ulearn.community') for community in communities: community = community.getObject() if 'discussion' not in community.objectIds(): # Create the default discussion container and set title discussion = createContentInContainer(community, 'Folder', title='discussion', checkConstraints=False) discussion.setTitle(community.translate(_(u'Discussion'))) discussion.setLayout('discussion_folder_view') alsoProvides(discussion, IDiscussionFolder) behavior = ISelectableConstrainTypes(discussion) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes( ('ulearn.discussion', 'Folder')) behavior.setImmediatelyAddableTypes( ('ulearn.discussion', 'Folder')) # Blacklist the right column portlets on discussion right_manager = queryUtility(IPortletManager, name=u'plone.rightcolumn') blacklist = getMultiAdapter((discussion, right_manager), ILocalPortletAssignmentManager) blacklist.setBlacklistStatus(CONTEXT_CATEGORY, True) discussion.reindexObject() logger.info('Created discussion folder in {}'.format( community.absolute_url())) return 'Done.'
def render(self): portal = getSite() gestion = self.newPrivateFolder(portal, 'gestion', u'Gestión') gestion.exclude_from_nav = False gestion.setLayout('folder_listing') behavior = ISelectableConstrainTypes(gestion) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(( 'Folder', 'privateFolder', )) behavior.setImmediatelyAddableTypes(( 'Folder', 'privateFolder', )) enlaces_cabecera = self.newPrivateFolder(gestion, 'menu', u'Menu') enlaces_cabecera.exclude_from_nav = False enlaces_cabecera.reindexObject() for language in portal['portal_languages'].getSupportedLanguages(): language_folder = self.newPrivateFolder(enlaces_cabecera, language, language) language_folder.exclude_from_nav = False language_folder.reindexObject() behavior = ISelectableConstrainTypes(language_folder) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(( 'Folder', 'privateFolder', 'Link', )) behavior.setImmediatelyAddableTypes(( 'Folder', 'privateFolder', 'Link', ))
def test_locallyAllowedTypesDefaultWhenAcquired(self): """ Constrain Mode set to ACQUIRE Try to acquire the constrains, if that fails, use the defaults """ behavior = ISelectableConstrainTypes(self.inner_folder) behavior.setConstrainTypesMode(constrains.ACQUIRE) behavior.setLocallyAllowedTypes([]) outer_behavior = ISelectableConstrainTypes(self.folder) outer_behavior.setConstrainTypesMode(constrains.ENABLED) outer_behavior.setLocallyAllowedTypes(self.types_id_subset) types = self.types_id_subset self.assertEqual(types, behavior.getLocallyAllowedTypes()) outer_behavior.setConstrainTypesMode(constrains.ACQUIRE) types = self.default_types type_ids = [t.getId() for t in types] self.assertEqual(types, behavior.allowedContentTypes()) self.assertEqual(type_ids, behavior.getLocallyAllowedTypes())
def test_locallyAllowedTypesDefaultWhenAcquired(self): """ Constrain Mode set to ACQUIRE Try to acquire the constrains, if that fails, use the defaults """ behavior = ISelectableConstrainTypes(self.inner_folder) behavior.setConstrainTypesMode(constrains.ACQUIRE) behavior.setLocallyAllowedTypes([]) outer_behavior = ISelectableConstrainTypes(self.folder) outer_behavior.setConstrainTypesMode(constrains.ENABLED) outer_behavior.setLocallyAllowedTypes(self.types_id_subset) types = self.types_id_subset self.assertEqual(types, behavior.getLocallyAllowedTypes()) outer_behavior.setConstrainTypesMode(constrains.ACQUIRE) types = self.default_types type_ids = [t.getId() for t in types] self.assertEqual(types, behavior.allowedContentTypes()) self.assertEqual(type_ids, behavior.getLocallyAllowedTypes())
def createArea(self, id, title, portal_type, types=[]): """ Create an area with the given parameters """ area_id = api.content.create( container=self.context, type=portal_type, id=id, title=title, language=self.language ) if not area_id: logger.error("Problem creating Area: %s" % title) return "" logger.info("Created Area: %s" % title) area_id_path = [x for x in area_id.getPhysicalPath()] area_obj = self.context.restrictedTraverse(area_id_path) # create topic before disallowing this type if portal_type not in ["PloneboardForum", "Blog", "DocumentsArea"]: portal_types = [] if portal_type == "NewsArea": portal_types = [u'Folder', u'News Item'] elif portal_type == "EventsArea": portal_types = [u'Event', u'Folder'] elif portal_type == "PollsArea": portal_types = [u'Folder', u'PlonePopoll'] self.createCollection(folder=area_obj, id=id, title=title, set_as_default_view=True, portal_types=portal_types) if portal_type == "DocumentsArea": self.createCollection(folder=area_obj, id=id, title=title, set_recurse="True", set_as_default_view=False, portal_types=[u'Document', u'File', u'Image']) self.createCollection(folder=area_obj, id=translate( _("documents-and-folders"), context=self.context.REQUEST, target_language=self.language), title=translate( _("Documents and folders"), context=self.context.REQUEST, target_language=self.language), set_as_default_view=True, portal_types=[u'Document', u'File', u'Image', u'Folder']) # set allowed types if types: behavior = ISelectableConstrainTypes(area_obj) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(types) behavior.setImmediatelyAddableTypes(types) alsoProvides(area_obj, IRoomArea) area_obj.reindexObject() return area_id
def projectAdded(content, event): """ Project created handler to assign geolocation. Copy value from behaviour fields to project fields.projectAnd create current year """ logger.info('Create add project {} id {}'.format(content.title, content.id)) # Grant Editor/Reader role to members in project if content.members: for user in content.members: api.user.grant_roles(username=user, obj=content, roles=['Reader']) if content.project_manager: for user in content.project_manager: api.user.grant_roles(username=user, obj=content, roles=['Reader']) if content.project_manager_admin: api.user.grant_roles(username=content.project_manager_admin, obj=content, roles=['Contributor', 'Editor', 'Reader']) logger.info('Permissions to members in project {} id {}'.format(content.title, content.id)) wop_partners = getUsersRegionalWOPPlatform(content.wop_platform) if wop_partners: for user in wop_partners: api.user.grant_roles(username=user, obj=content, roles=['Editor', 'Reader']) logger.info('Permissions to wop_partners in project {} id {}'.format(content.title, content.id)) wop_programs = getUsersWOPProgram(content.wop_program) if wop_programs: for user in wop_programs: api.user.grant_roles(username=user, obj=content, roles=['Editor', 'Reader']) logger.info('Permissions to wop_programs in project {} id {}'.format(content.title, content.id)) # Assign fases to internal field content.gwopa_year_phases = int( math.ceil(float((content.completionactual - content.startactual).days) / float(365))) # Asign default image if not set if content.image is None: data = requests.get(api.portal.get().aq_parent.absolute_url( ) + '/++theme++gwopa.theme/assets/images/default_image.jpg', verify=False, timeout=10).content default_image = NamedBlobImage(data=data, filename=u'image.jpg', contentType='image/jpeg') content.image = default_image # Assign values to fases fases = int(math.ceil(float((content.completionactual - content.startactual).days) / float(365))) date1 = content.startactual date2 = content.completionactual if date2.month < date1.month or (date2.month == date1.month and date2.day < date1.day): rangeDates = range(date2.year - date1.year) else: rangeDates = range(date2.year - date1.year + 1) datas = [(date1 + relativedelta(years=i)).strftime("%B %d, %Y") for i in rangeDates] + [date2.strftime("%B %d, %Y")] isodate = [(date1 + relativedelta(years=i)).strftime("%Y-%m-%d") for i in rangeDates] + [date2.strftime("%Y-%m-%d")] patterndate = [(date1 - dateutil.relativedelta.relativedelta(months=1) + relativedelta(years=i)).strftime( "%Y %m %d").replace(' 0', ' ').replace(' ', ',') for i in rangeDates] patterndate.append((date2 - dateutil.relativedelta.relativedelta(months=1) ).strftime("%Y %m %d").replace(' 0', ' ').replace(' ', ',')) results = [] if fases > 1: count = 0 while count != fases: results.append(dict( start=datas[0 + count], end=datas[1 + count], start_iso=isodate[0 + count], end_iso=isodate[1 + count], pattern_start=patterndate[0 + count], pattern_end=patterndate[1 + count], fase=count + 1 )) count = count + 1 else: count = 0 results.append(dict( start=datas[0], end=datas[1], start_iso=isodate[0], end_iso=isodate[1], pattern_start=patterndate[0], pattern_end=patterndate[1], fase=1 )) content.gwopa_year_phases = results logger.info('Fases project {} id {}'.format(content.title, content.id)) measuring_frequency = content.measuring_frequency if measuring_frequency: frequency = int(measuring_frequency[-1]) if frequency == 4: N_MONTHS = 3 elif frequency == 2: N_MONTHS = 6 elif frequency == 1: N_MONTHS = 12 reports = [] N_DAYS_AGO = 15 if content.project_manager_admin: user = api.user.get(content.project_manager_admin) email = user.getProperty('email') if fases > 1: count = 0 while count != fases: count = count + 1 date_start_year = datetime.strptime(results[count-1]['start'], "%B %d, %Y").date() for i in range(frequency): date_generate_report = date_start_year + relativedelta(months=N_MONTHS) if date2 >= date_generate_report and date2 != date_start_year: data_email_report = date_generate_report - relativedelta(days=N_DAYS_AGO) reports.append(dict( date_generate_report=date_generate_report.strftime("%B %d, %Y"), date_email_report=data_email_report.strftime("%B %d, %Y"), num_report=i + 1, project_year=count, project_url=content.absolute_url(), project_title=content.title, email=email, frequency=measuring_frequency[:-2], )) date_start_year = date_generate_report elif date2 == date_start_year: break else: date_generate_report = date2 data_email_report = date_generate_report - relativedelta(days=N_DAYS_AGO) reports.append(dict( date_generate_report=date_generate_report.strftime("%B %d, %Y"), date_email_report=data_email_report.strftime("%B %d, %Y"), num_report=i + 1, project_year=count, project_url=content.absolute_url(), project_title=content.title, email=email, frequency=measuring_frequency[:-2], )) break else: count = 0 for i in range(frequency): date_generate_report = date1 + relativedelta(months=N_MONTHS) if date2 > date_generate_report: data_email_report = date_generate_report - relativedelta(days=N_DAYS_AGO) reports.append(dict( date_generate_report=date_generate_report.strftime("%B %d, %Y"), date_email_report=data_email_report.strftime("%B %d, %Y"), num_report=i + 1, project_year=count + 1, project_url=content.absolute_url(), project_title=content.title, email=email, frequency=measuring_frequency[:-2], )) date1 = date_generate_report elif date2 == date1: break else: date_generate_report = date2 data_email_report = date_generate_report - relativedelta(days=N_DAYS_AGO) reports.append(dict( date_generate_report=date_generate_report.strftime("%B %d, %Y"), date_email_report=data_email_report.strftime("%B %d, %Y"), num_report=i + 1, project_year=count + 1, project_url=content.absolute_url(), project_title=content.title, email=email, frequency=measuring_frequency[:-2], )) break content.gwopa_reporting = reports logger.info('Dates to reporting project {} id {}'.format(content.title, content.id)) # Create default needed folders in the new project api.content.create( type='Folder', id='files', title='Files', container=content) logger.info('Create folder files in project {} id {}'.format(content.title, content.id)) api.content.create( type='Folder', id='contribs', title='Contributors', container=content) logger.info('Create folder contributors in project {} id {}'.format(content.title, content.id)) reports = api.content.create( type='Folder', id='reports', title='Reports', container=content) logger.info('Create folder reports in project {} id {}'.format(content.title, content.id)) partnerships = api.content.create( type='Folder', id='partnerships', title='Partnerships', container=content) logger.info('Create folder partnerships in project {} id {}'.format(content.title, content.id)) behavior = ISelectableConstrainTypes(reports) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('File', 'Report')) behavior.setImmediatelyAddableTypes(('File', 'Report')) behaviorp = ISelectableConstrainTypes(partnerships) behaviorp.setConstrainTypesMode(1) behaviorp.setLocallyAllowedTypes(('PartnershipPractice', 'Folder')) behaviorp.setImmediatelyAddableTypes(('PartnershipPractice', 'Folder')) # Create Working Areas areas = content.areas if areas: for area in areas: data = api.content.find(portal_type="ItemArea", Title=quote_chars(area))[0] obj = api.content.create( type='ImprovementArea', title=data.Title, title_es=data.title_es, title_fr=data.title_fr, description=data.Description, image=data.getObject().image, container=content) logger.info('Create working area {} in project {} id {}'.format(data.Title, content.title, content.id)) logger.info('Finish create working areas in project {} id {}'.format(content.title, content.id)) partners = content.partners if partners: for partner in partners: obj = api.content.create( type='ContribPartner', title=partner, container=content.contribs) obj.incash = 0 obj.inkind = 0 logger.info('Create partner {} in project {} id {}'.format(partner, content.title, content.id)) content.total_budget = 0 donors = content.donors if donors: for donor in donors: obj = api.content.create( type='ContribDonor', title=donor, container=content.contribs) obj.incash = 0 obj.inkind = 0 logger.info('Create donor {} in project {} id {}'.format(donor, content.title, content.id)) path_files = '/'.join(content.files.getPhysicalPath()) folder_files = api.content.find(portal_type="Folder", path=path_files) obj_files = folder_files[0].getObject() # Grant Contributor role to members in folder files project if content.members: for user in content.members: api.user.grant_roles(username=user, obj=obj_files, roles=['Contributor']) if content.project_manager: for user in content.project_manager: api.user.grant_roles(username=user, obj=obj_files, roles=['Contributor']) # Create Partnership Practice config_folder = api.content.find(type='Folder',id='partnershippractice') config_folder = config_folder[0].getObject() items = api.content.find( portal_type=['PartnershipPractice'], context=config_folder, sort_on='getObjPositionInParent') if items: for item in items: partnership = item.getObject() obj = api.content.create( type='PartnershipPractice', title=partnership.title, title_es=partnership.title_es, title_fr=partnership.title_fr, description=partnership.description, description_es=partnership.description_es, description_fr=partnership.description_fr, container=content.partnerships) logger.info('Create parthership practice {} in project {} id {}'.format(data.Title, content.title, content.id)) logger.info('Finish create parthership practice in project {} id {}'.format(content.title, content.id)) logger.info('Finish add project {} id {}'.format(content.title, content.id))
def projectModified(content, event): """ Project modified handler. Create new areas.newSometimes this code is executed and the project is not edited. In example, changing permissions, this hook is executed. We check the transition when edit, and seems to be: zope.lifecycleevent.ObjectModifiedEvent """ # Really check if project is modified if 'zope.lifecycleevent.ObjectModifiedEvent' in str(event): # Grant Editor/Reader role to members in project if content.members: for user in content.members: api.user.grant_roles(username=user, obj=content, roles=['Reader']) if content.project_manager: for user in content.project_manager: api.user.grant_roles(username=user, obj=content, roles=['Reader']) if content.project_manager_admin: api.user.grant_roles(username=content.project_manager_admin, obj=content, roles=['Contributor', 'Editor', 'Reader']) wop_partners = getUsersRegionalWOPPlatform(content.wop_platform) if wop_partners: for user in wop_partners: api.user.grant_roles(username=user, obj=content, roles=['Editor', 'Reader']) wop_programs = getUsersWOPProgram(content.wop_program) if wop_programs: for user in wop_programs: api.user.grant_roles(username=user, obj=content, roles=['Editor', 'Reader']) users = [perm[0] for perm in content.get_local_roles()] for user in users: members = [] if content.members == None else content.members project_manager = [] if content.project_manager == None else content.project_manager project_manager_admin = [] if content.project_manager_admin == None else content.project_manager_admin if user not in members and user not in project_manager and user not in project_manager_admin and user not in wop_partners and user not in wop_programs: api.user.revoke_roles(username=user, obj=content, roles=['Contributor', 'Editor', 'Reader']) # Asign default image if not set if content.image is None: data = requests.get(api.portal.get().aq_parent.absolute_url( ) + '/++theme++gwopa.theme/assets/images/default_image.jpg', verify=False, timeout=10).content default_image = NamedBlobImage(data=data, filename=u'image.jpg', contentType='image/jpeg') content.image = default_image # Assign values to fases fases = int(math.ceil(float((content.completionactual - content.startactual).days) / float(365))) date1 = content.startactual date2 = content.completionactual if date2.month < date1.month or (date2.month == date1.month and date2.day < date1.day): rangeDates = range(date2.year - date1.year) else: rangeDates = range(date2.year - date1.year + 1) datas = [(date1 + relativedelta(years=i)).strftime("%B %d, %Y") for i in rangeDates] + [date2.strftime("%B %d, %Y")] isodate = [(date1 + relativedelta(years=i)).strftime("%Y-%m-%d") for i in rangeDates] + [date2.strftime("%Y-%m-%d")] patterndate = [(date1 - dateutil.relativedelta.relativedelta(months=1) + relativedelta(years=i)).strftime( "%Y %m %d").replace(' 0', ' ').replace(' ', ',') for i in rangeDates] patterndate.append((date2 - dateutil.relativedelta.relativedelta(months=1) ).strftime("%Y %m %d").replace(' 0', ' ').replace(' ', ',')) results = [] if fases > 1: count = 0 while count != fases: results.append(dict( start=datas[0 + count], end=datas[1 + count], start_iso=isodate[0 + count], end_iso=isodate[1 + count], pattern_start=patterndate[0 + count], pattern_end=patterndate[1 + count], fase=count + 1 )) count = count + 1 else: count = 0 results.append(dict( start=datas[0], end=datas[1], start_iso=isodate[0], end_iso=isodate[1], pattern_start=patterndate[0], pattern_end=patterndate[1], fase=1 )) content.gwopa_year_phases = results measuring_frequency = content.measuring_frequency if measuring_frequency: frequency = int(measuring_frequency[-1]) if frequency == 4: N_MONTHS = 3 elif frequency == 2: N_MONTHS = 6 elif frequency == 1: N_MONTHS = 12 reports = [] N_DAYS_AGO = 15 if content.project_manager_admin: user = api.user.get(content.project_manager_admin) email = user.getProperty('email') if fases > 1: count = 0 while count != fases: count = count + 1 date_start_year = datetime.strptime(results[count-1]['start'], "%B %d, %Y").date() # date_end_year = datetime.strptime(results[count-1]['end'], "%B %d, %Y").date() for i in range(frequency): date_generate_report = date_start_year + relativedelta(months=N_MONTHS) if date2 >= date_generate_report and date2 != date_start_year: data_email_report = date_generate_report - relativedelta(days=N_DAYS_AGO) reports.append(dict( date_generate_report=date_generate_report.strftime("%B %d, %Y"), date_email_report=data_email_report.strftime("%B %d, %Y"), num_report=i + 1, project_year=count, project_url=content.absolute_url(), project_title=content.title, email=email, frequency=measuring_frequency[:-2], )) date_start_year = date_generate_report elif date2 == date_start_year: break else: date_generate_report = date2 data_email_report = date_generate_report - relativedelta(days=N_DAYS_AGO) reports.append(dict( date_generate_report=date_generate_report.strftime("%B %d, %Y"), date_email_report=data_email_report.strftime("%B %d, %Y"), num_report=i + 1, project_year=count, project_url=content.absolute_url(), project_title=content.title, email=email, frequency=measuring_frequency[:-2], )) break else: count = 0 for i in range(frequency): date_generate_report = date1 + relativedelta(months=N_MONTHS) if date2 > date_generate_report: data_email_report = date_generate_report - relativedelta(days=N_DAYS_AGO) reports.append(dict( date_generate_report=date_generate_report.strftime("%B %d, %Y"), date_email_report=data_email_report.strftime("%B %d, %Y"), num_report=i + 1, project_year=count + 1, project_url=content.absolute_url(), project_title=content.title, email=email, frequency=measuring_frequency[:-2], )) date1 = date_generate_report elif date2 == date1: break else: date_generate_report = date2 data_email_report = date_generate_report - relativedelta(days=N_DAYS_AGO) reports.append(dict( date_generate_report=date_generate_report.strftime("%B %d, %Y"), date_email_report=data_email_report.strftime("%B %d, %Y"), num_report=i + 1, project_year=count + 1, project_url=content.absolute_url(), project_title=content.title, email=email, frequency=measuring_frequency[:-2], )) break content.gwopa_reporting = reports logger.info('Dates to reporting project {} id {}'.format(content.title.encode('utf-8'), content.id)) # Assign Areas new_areas = content.areas current = [a.id for a in api.content.find( portal_type="ImprovementArea", context=content, depth=1)] new_areas = content.areas if new_areas is None: return else: for area in new_areas: if area not in current: data = api.content.find(portal_type="ItemArea", id=quote_chars(area))[0] if data.id not in content: api.content.create( type=u'ImprovementArea', id=data.id, title=data.Title.decode('utf-8'), title_es=data.title_es, title_fr=data.title_fr, description=data.Description, image=data.getObject().image, container=content) # Delete Areas delete_areas = list(set(current) - set(new_areas)) for area in delete_areas: item = api.content.find(portal_type="ImprovementArea", id=quote_chars(area), context=content) if item: api.content.delete(obj=item[0].getObject(), check_linkintegrity=False) # Modify project_dates and currency project_path = '/'.join(content.getPhysicalPath()) activities = api.content.find(portal_type="Activity", path=project_path) for activity in activities: item = activity.getObject() project_dates = "The dates must be between the limits of this Project. Start: " + str(content.startactual) + " End: " + str(content.completionactual) if item.project_dates != project_dates: item.project_dates = project_dates item.currency = project_currency(content) item.reindexObject() path = '/'.join(content.contribs.getPhysicalPath()) partners = content.partners if partners: for partner in partners: item = api.content.find( portal_type='ContribPartner', Title=quote_chars(partner), path=path) if not item: obj = api.content.create( type='ContribPartner', title=partner, container=content.contribs) obj.incash = 0 obj.inkind = 0 else: partners = [] all_partners = [] items_partners = api.content.find( portal_type='ContribPartner', path=path) for item_partner in items_partners: item_partner_obj = item_partner.getObject() all_partners.append(item_partner_obj.title) for item in all_partners: if item not in partners: obj = api.content.find( portal_type='ContribPartner', Title=quote_chars(item), path=path) api.content.delete(obj=obj[0].getObject(), check_linkintegrity=False) donors = content.donors if donors: for donor in donors: item = api.content.find( portal_type='ContribDonor', Title=quote_chars(donor), path=path) if not item: obj = api.content.create( type='ContribDonor', title=donor, container=content.contribs) obj.incash = 0 obj.inkind = 0 else: donors = [] all_donors = [] items_donors = api.content.find( portal_type='ContribDonor', path=path) for item_donor in items_donors: item_donor_obj = item_donor.getObject() all_donors.append(item_donor_obj.title) for item in all_donors: if item not in donors: obj = api.content.find( portal_type='ContribDonor', Title=quote_chars(item), path=path) api.content.delete(obj=obj[0].getObject(), check_linkintegrity=False) path_files = '/'.join(content.files.getPhysicalPath()) folder_files = api.content.find(portal_type="Folder", path=path_files) obj_files = folder_files[0].getObject() # Grant Contributor role to members in folder files project if content.members: for user in content.members: api.user.grant_roles(username=user, obj=obj_files, roles=['Contributor']) if content.project_manager: for user in content.project_manager: api.user.grant_roles(username=user, obj=obj_files, roles=['Contributor']) # Partnership practice try: partnerships = content.partnerships except: partnerships = api.content.create( type='Folder', id='partnerships', title='Partnerships', container=content) logger.info('Create folder partnerships in project {} id {}'.format(content.title, content.id)) behaviorp = ISelectableConstrainTypes(partnerships) behaviorp.setConstrainTypesMode(1) behaviorp.setLocallyAllowedTypes(('PartnershipPractice', 'Folder')) behaviorp.setImmediatelyAddableTypes(('PartnershipPractice', 'Folder')) current_partnerships = [a.id for a in api.content.find( portal_type="PartnershipPractice", context=content.partnerships, depth=1)] config_folder = api.content.find(type='Folder',id='partnershippractice') config_folder = config_folder[0].getObject() partnerships_default = api.content.find( portal_type=['PartnershipPractice'], context=config_folder, sort_on='getObjPositionInParent') for partnership in partnerships_default: if partnership.id not in current_partnerships: partnership = partnership.getObject() obj = api.content.create( type='PartnershipPractice', title=partnership.title, title_es=partnership.title_es, title_fr=partnership.title_fr, description=partnership.description, description_es=partnership.description_es, description_fr=partnership.description_fr, container=content.partnerships)
def _constrain(context, allowed_types): behavior = ISelectableConstrainTypes(context) behavior.setConstrainTypesMode(constrains.ENABLED) behavior.setLocallyAllowedTypes(allowed_types) behavior.setImmediatelyAddableTypes(allowed_types)
def _constrain(context, allowed_types): behavior = ISelectableConstrainTypes(context) behavior.setConstrainTypesMode(constrains.ENABLED) behavior.setLocallyAllowedTypes(allowed_types) behavior.setImmediatelyAddableTypes(allowed_types)
def create_item_runner( container, content_structure, auto_id=False, default_lang=None, default_wf_action=None, ignore_wf_types=['Image', 'File'], logger=logger): """Create Dexterity contents from plone.restapi compatible structures. :param container: The context in which the item should be created. :type container: Plone content object :param content_structure: Python dictionary with content structure. :type content_structure: dict :param default_lang: Default language. :type default_lang: string :param default_wf_action: Default workflow transition action. :type default_wf_action: string :param ignore_wf_types: Ignore to apply the workflow transition if item is one of these types. :type ignore_wf_types: list (default: ['Image', 'File']) :param logger: Logger to use. :type logger: Python logging instance. The datastructure of content defined by plone.restapi: https://plonerestapi.readthedocs.io/en/latest/content.html#creating-a-resource-with-post [ { "type": "", "id": "", "title": "", "description": "" "items": [], "opts": { "default_page": "", "locally_allowed_types": [], "immediately_allowed_types": [], } } ] Use the same structure for each child. Leave out, what you don't need. """ request = getRequest() for data in content_structure: type_ = data.get('@type', None) id_ = data.get('id', None) title = data.get('title', None) if not type_: raise BadRequest("Property '@type' is required") obj = create(container, type_, id_=id_, title=title) # Acquisition wrap temporarily to satisfy things like vocabularies # depending on tools temporarily_wrapped = False if IAcquirer.providedBy(obj) and not safe_hasattr(obj, 'aq_base'): obj = obj.__of__(container) temporarily_wrapped = True deserializer = queryMultiAdapter((obj, request), IDeserializeFromJson) if deserializer is None: raise BadRequest( 'Canno deserialize type {}'.format(obj.portal_type)) # defaults if not data.get('language'): data['language'] = default_lang if not data.get('review_state'): data['review_state'] = default_wf_action deserializer(validate_all=True, data=data, create=True) if temporarily_wrapped: obj = aq_base(obj) if not getattr(deserializer, 'notifies_create', False): notify(ObjectCreatedEvent(obj)) obj = add(container, obj, rename=not bool(id_)) # set default opts = data.get('opts', {}) if opts.get('default_page', False): container.setDefaultPage(obj.id) # CONSTRAIN TYPES locally_allowed_types = opts.get('locally_allowed_types', False) immediately_allowed_types = opts.get('immediately_allowed_types', False) if locally_allowed_types or immediately_allowed_types: be = ISelectableConstrainTypes(obj, None) if be: be.setConstrainTypesMode(behaviors.constrains.ENABLED) if locally_allowed_types: be.setLocallyAllowedTypes = locally_allowed_types logger.debug('{0}: locally_allowed_types {1}'.format(path, locally_allowed_types)) # noqa if immediately_allowed_types: be.setImmediatelyAddableTypes = immediately_allowed_types logger.debug('{0}: immediately_allowed_types {1}'.format(path, immediately_allowed_types)) # noqa id_ = obj.id # get the real id path = '/'.join(obj.getPhysicalPath()) logger.info('{0}: created'.format(path)) # Call recursively create_item_runner( obj, content_structure=data.get('items', []), default_lang=default_lang, default_wf_action=default_wf_action, logger=logger, )
def set_constrain_types(obj, list_contraint): behavior = ISelectableConstrainTypes(obj) behavior.setConstrainTypesMode(1) behavior.setImmediatelyAddableTypes(list_contraint) behavior.setLocallyAllowedTypes(list_contraint)
def render(self): """ """ portal = getSite() frontpage = portal['front-page'] urltool = getToolByName(portal, 'portal_url') portal_catalog = getToolByName(portal, 'portal_catalog') path = urltool.getPortalPath() workflowTool = getToolByName(portal, "portal_workflow") pl = getToolByName(portal, 'portal_languages') obj = portal_catalog.searchResults(portal_type='Folder', path=path + '/noticies') if obj.actual_result_count == 0: noticies = self.newFolder(portal, 'noticies', 'Noticies') noticies.description = 'Noticies del lloc' noticies.exclude_from_nav = True self.publish(noticies) behavior = ISelectableConstrainTypes(noticies) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Collection', 'News Item')) behavior.setImmediatelyAddableTypes(('Collection', 'News Item')) noticies_destacades = self.newCollection( noticies, 'noticies-destacades', u'Noticies Destacades', query=[{ u'i': u'portal_type', u'o': u'plone.app.querystring.operation.selection.is', u'v': [u'News Item'] }, { u'i': u'review_state', u'o': u'plone.app.querystring.operation.selection.is', u'v': u'published' }, { u'i': u'destacat', u'o': u'plone.app.querystring.operation.boolean.isTrue', u'v': u'Sí' }]) self.publish(noticies_destacades) noticies = self.newCollection( noticies, 'noticies', u'Noticies', query=[{ u'i': u'portal_type', u'o': u'plone.app.querystring.operation.selection.is', u'v': [u'News Item'] }, { u'i': u'review_state', u'o': u'plone.app.querystring.operation.selection.is', u'v': u'published' }]) self.publish(noticies) obj = portal_catalog.searchResults(portal_type='Folder', path=path + '/esdeveniments') if obj.actual_result_count == 0: esdeveniments = self.newFolder(portal, 'esdeveniments', 'Esdeveniments') esdeveniments.description = 'Esdeveniments del lloc' esdeveniments.exclude_from_nav = True self.publish(esdeveniments) behavior = ISelectableConstrainTypes(esdeveniments) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Collection', 'Event')) behavior.setImmediatelyAddableTypes(('Collection', 'Event')) esdeveniments = self.newCollection( esdeveniments, 'esdeveniments', u'Esdeveniments', query=[{ u'i': u'portal_type', u'o': u'plone.app.querystring.operation.selection.is', u'v': [u'Event'] }, { u'i': u'review_state', u'o': u'plone.app.querystring.operation.selection.is', u'v': u'published' }]) self.publish(esdeveniments) #Menú principal obj = portal_catalog.searchResults(portal_type='Folder', path=path + '/menu-principal') if obj.actual_result_count == 0: menu_principal = self.newFolder(portal, 'menu-principal', u'Menú principal') menu_principal.language = pl.getDefaultLanguage() menu_principal.exclude_from_nav = True self.publish(menu_principal) alsoProvides(menu_principal, IHideFromBreadcrumbs) menu_principal.reindexObject() ajuntament = self.newFolder(menu_principal, 'ajuntament', u'Ajuntament') ajuntament.language = pl.getDefaultLanguage() self.publish(ajuntament) ajuntament.reindexObject() informacio_municipal = self.newFolder(menu_principal, 'informacio-municipal', u'Informació Municipal') informacio_municipal.language = pl.getDefaultLanguage() self.publish(informacio_municipal) informacio_municipal.reindexObject() seu_electronica = self.newFolder(menu_principal, 'seu-electronica', u'Seu electrònica') seu_electronica.language = pl.getDefaultLanguage() self.publish(seu_electronica) seu_electronica.reindexObject() guia_de_la_ciutat = self.newFolder(menu_principal, 'guia-de-la-ciutat', u'Guia de la ciutat') guia_de_la_ciutat.language = pl.getDefaultLanguage() self.publish(guia_de_la_ciutat) guia_de_la_ciutat.reindexObject() borsa_de_treball = self.newFolder(menu_principal, 'borsa-de-treball', u'Borsa de treball') borsa_de_treball.language = pl.getDefaultLanguage() self.publish(borsa_de_treball) borsa_de_treball.reindexObject() #Menú Lateral obj = portal_catalog.searchResults(portal_type='Folder', path=path + '/menu-lateral') if obj.actual_result_count == 0: menu_lateral = self.newFolder(portal, 'menu-lateral', u'Menú lateral') menu_lateral.language = pl.getDefaultLanguage() menu_lateral.exclude_from_nav = True self.publish(menu_lateral) alsoProvides(menu_lateral, IHideFromBreadcrumbs) menu_lateral.reindexObject() la_ciutat_per_temes = self.newFolder(menu_lateral, 'la-ciutat-per-temes', u'La ciutat per temes') la_ciutat_per_temes.language = pl.getDefaultLanguage() self.publish(la_ciutat_per_temes) la_ciutat_per_temes.reindexObject() la_ciutat_per_les_persones = self.newFolder( menu_lateral, 'la-ciutat-per-les-persones', u'La ciutat i les persones') la_ciutat_per_les_persones.language = pl.getDefaultLanguage() self.publish(la_ciutat_per_les_persones) la_ciutat_per_les_persones.reindexObject() la_ciutat_en_xifres = self.newFolder(menu_lateral, 'la-ciutat-en-xifres', u'La ciutat en xifres') la_ciutat_en_xifres.language = pl.getDefaultLanguage() self.publish(la_ciutat_en_xifres) la_ciutat_en_xifres.reindexObject() la_ciutat_per_districtes = self.newFolder( menu_lateral, 'la-ciutat-per-districtes', u'La ciutat per districtes') la_ciutat_per_districtes.language = pl.getDefaultLanguage() self.publish(la_ciutat_per_districtes) la_ciutat_per_districtes.reindexObject() #Material multimèdia obj = portal_catalog.searchResults(portal_type='Folder', path=path + '/material-multimedia') if obj.actual_result_count == 0: material_multimedia = self.newFolder(portal, 'material-multimedia', u'Material multimèdia') material_multimedia.language = pl.getDefaultLanguage() material_multimedia.exclude_from_nav = True self.publish(material_multimedia) material_multimedia.reindexObject() #Slider obj = portal_catalog.searchResults(portal_type='Folder', path=path + '/material-multimedia/sliders') if obj.actual_result_count == 0: res = portal_catalog.searchResults(id='material-multimedia') if res: material_multimedia = res[0].getObject() slider = self.newFolder(material_multimedia, 'sliders', u'Sliders') slider.language = pl.getDefaultLanguage() slider.exclude_from_nav = True self.publish(slider) slider.reindexObject() behavior = ISelectableConstrainTypes(slider) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Folder', 'Slider')) behavior.setImmediatelyAddableTypes(('Folder', 'Slider')) #Banners obj = portal_catalog.searchResults(portal_type='Folder', path=path + '/material-multimedia/banners') if obj.actual_result_count == 0: res = portal_catalog.searchResults(id='material-multimedia') if res: material_multimedia = res[0].getObject() banners = self.newFolder(material_multimedia, 'banners', u'Banners') banners.language = pl.getDefaultLanguage() banners.exclude_from_nav = True self.publish(banners) banners.reindexObject() behavior = ISelectableConstrainTypes(banners) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Banner', 'BannerContainer')) behavior.setImmediatelyAddableTypes(('Banner', 'BannerContainer')) #Carrousel obj = portal_catalog.searchResults(portal_type='Folder', path=path + '/material-multimedia/carroussel') if obj.actual_result_count == 0: res = portal_catalog.searchResults(id='material-multimedia') if res: material_multimedia = res[0].getObject() carroussel = self.newFolder(material_multimedia, 'carroussel', u'Carroussel') carroussel.language = pl.getDefaultLanguage() carroussel.exclude_from_nav = True self.publish(carroussel) carroussel.reindexObject() behavior = ISelectableConstrainTypes(carroussel) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Carrousel', 'Folder')) behavior.setImmediatelyAddableTypes(('Carrousel', 'Folder')) #Imatges Capçalera obj = portal_catalog.searchResults( portal_type='Folder', path=path + '/material-multimedia/imatges-capcalera') if obj.actual_result_count == 0: res = portal_catalog.searchResults(id='material-multimedia') if res: material_multimedia = res[0].getObject() imatges_capcalera = self.newFolder(material_multimedia, 'imatges-capcalera', u'Imatges capçalera') imatges_capcalera.language = pl.getDefaultLanguage() imatges_capcalera.exclude_from_nav = True self.publish(imatges_capcalera) imatges_capcalera.reindexObject() behavior = ISelectableConstrainTypes(imatges_capcalera) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Folder', 'Image')) behavior.setImmediatelyAddableTypes(('Folder', 'Image')) #Banners dreta obj = portal_catalog.searchResults( portal_type='BannerContainer', path=path + '/material-multimedia/banners/banners_dreta') if obj.actual_result_count == 0: _createObjectByType('BannerContainer', banners, 'banners_dreta') banners['banners_dreta'].exclude_from_nav = True banners['banners_dreta'].setTitle('Banners-dreta') banners['banners_dreta'].reindexObject() workflowTool.doActionFor(banners.banners_dreta, "publish") #Banners esquerra obj = portal_catalog.searchResults( portal_type='BannerContainer', path=path + '/material-multimedia/banners/banners_esquerra') if obj.actual_result_count == 0: _createObjectByType('BannerContainer', banners, 'banners_esquerra') banners['banners_esquerra'].exclude_from_nav = True banners['banners_esquerra'].setTitle('Banners-esquerra') banners['banners_esquerra'].reindexObject() workflowTool.doActionFor(banners.banners_esquerra, "publish") #Documents obj = portal_catalog.searchResults(portal_type='Folder', path=path + '/documents') if obj.actual_result_count == 0: documents = self.newFolder(portal, 'documents', u'Documents') documents.language = pl.getDefaultLanguage() documents.exclude_from_nav = True self.publish(documents) documents.reindexObject() #Directori equipaments obj = portal_catalog.searchResults(portal_type='Folder', path=path + '/directori-equipaments') if obj.actual_result_count == 0: directori_equipaments = self.newFolder(portal, 'directori-equipaments', u'Directori equipaments') directori_equipaments.language = pl.getDefaultLanguage() directori_equipaments.exclude_from_nav = True self.publish(directori_equipaments) directori_equipaments.reindexObject() behavior = ISelectableConstrainTypes(directori_equipaments) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Folder', 'Equipament')) behavior.setImmediatelyAddableTypes(('Folder', 'Equipament')) #Tràmits obj = portal_catalog.searchResults(portal_type='Folder', path=path + '/tramits') if obj.actual_result_count == 0: tramits = self.newFolder(portal, 'tramits', u'Tràmits') tramits.language = pl.getDefaultLanguage() tramits.exclude_from_nav = True self.publish(tramits) tramits.reindexObject() behavior = ISelectableConstrainTypes(tramits) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Folder', 'Tramit')) behavior.setImmediatelyAddableTypes(('Folder', 'Tramit')) # # Add portlets programatically # from vilaix.theme.portlets.noticiaDestacada import Assignment as noticiaDestacadaAssignment # from vilaix.theme.portlets.news import Assignment as noticiaAssignment # from vilaix.theme.portlets.bannersportlet import Assignment as bannersVilaixAssignment # from vilaix.theme.portlets.agendaVilaix import Assignment as agendaVilaixAssignment # from vilaix.theme.portlets.navigationfixed import Assignment as navigationfixedAssignment # from plone.app.event.portlets.portlet_calendar import Assignment as calendarAssignment # target_manager = queryUtility(IPortletManager, name='genweb.portlets.HomePortletManager1', context=frontpage) # target_manager_assignments = getMultiAdapter((frontpage, target_manager), IPortletAssignmentMapping) # target_manager_assignments['navigationfixed'] = navigationfixedAssignment(root='/menu-lateral') # target_manager_assignments['bannersVilaix'] = bannersVilaixAssignment(content='/material-multimedia/banners/banners_esquerra') # target_manager = queryUtility(IPortletManager, name='genweb.portlets.HomePortletManager2', context=frontpage) # target_manager_assignments = getMultiAdapter((frontpage, target_manager), IPortletAssignmentMapping) # target_manager_assignments['noticiaDestacada'] = noticiaDestacadaAssignment() # target_manager = queryUtility(IPortletManager, name='genweb.portlets.HomePortletManager3', context=frontpage) # target_manager_assignments = getMultiAdapter((frontpage, target_manager), IPortletAssignmentMapping) # target_manager_assignments['noticies'] = noticiaAssignment() # target_manager = queryUtility(IPortletManager, name='genweb.portlets.HomePortletManager6', context=frontpage) # target_manager_assignments = getMultiAdapter((frontpage, target_manager), IPortletAssignmentMapping) # target_manager_assignments['bannersVilaix'] = bannersVilaixAssignment(content='/material-multimedia/banners/banners_dreta') # target_manager = queryUtility(IPortletManager, name='genweb.portlets.HomePortletManager7', context=frontpage) # target_manager_assignments = getMultiAdapter((frontpage, target_manager), IPortletAssignmentMapping) # target_manager_assignments['agendaVilaix'] = agendaVilaixAssignment() # target_manager = queryUtility(IPortletManager, name='genweb.portlets.HomePortletManager10', context=frontpage) # target_manager_assignments = getMultiAdapter((frontpage, target_manager), IPortletAssignmentMapping) # target_manager_assignments['calendari'] = calendarAssignment(state='published') # portletManager = getUtility(IPortletManager, 'genweb.portlets.HomePortletManager3') # spanstorage = getMultiAdapter((frontpage, portletManager), ISpanStorage) # spanstorage.span = '8' # portletManager = getUtility(IPortletManager, 'genweb.portlets.HomePortletManager6') # spanstorage = getMultiAdapter((frontpage, portletManager), ISpanStorage) # spanstorage.span = '4' # portletManager = getUtility(IPortletManager, 'genweb.portlets.HomePortletManager7') # spanstorage = getMultiAdapter((frontpage, portletManager), ISpanStorage) # spanstorage.span = '8' # portletManager = getUtility(IPortletManager, 'genweb.portlets.HomePortletManager10') # spanstorage = getMultiAdapter((frontpage, portletManager), ISpanStorage) # spanstorage.span = '4' return 'Created'
def render(self): """ """ portal = getSite() frontpage = portal['front-page'] urltool = getToolByName(portal, 'portal_url') portal_catalog = getToolByName(portal, 'portal_catalog') path = urltool.getPortalPath() workflowTool = getToolByName(portal, "portal_workflow") pl = getToolByName(portal, 'portal_languages') obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/noticies') if obj.actual_result_count == 0: noticies = self.newFolder(portal, 'noticies', 'Noticies') noticies.description = 'Noticies del lloc' noticies.exclude_from_nav = True self.publish(noticies) behavior = ISelectableConstrainTypes(noticies) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Collection', 'News Item')) behavior.setImmediatelyAddableTypes(('Collection', 'News Item')) noticies_destacades = self.newCollection(noticies, 'noticies-destacades', u'Noticies Destacades', query = [{u'i': u'portal_type', u'o': u'plone.app.querystring.operation.selection.is', u'v': [u'News Item']}, {u'i': u'review_state', u'o': u'plone.app.querystring.operation.selection.is', u'v': u'published'}, {u'i': u'destacat', u'o': u'plone.app.querystring.operation.boolean.isTrue', u'v': u'Sí'}]) self.publish(noticies_destacades) noticies = self.newCollection(noticies, 'noticies', u'Noticies', query = [{u'i': u'portal_type', u'o': u'plone.app.querystring.operation.selection.is', u'v': [u'News Item']}, {u'i': u'review_state', u'o': u'plone.app.querystring.operation.selection.is', u'v': u'published'}]) self.publish(noticies) obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/esdeveniments') if obj.actual_result_count == 0: esdeveniments = self.newFolder(portal, 'esdeveniments', 'Esdeveniments') esdeveniments.description = 'Esdeveniments del lloc' esdeveniments.exclude_from_nav = True self.publish(esdeveniments) behavior = ISelectableConstrainTypes(esdeveniments) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Collection', 'Event')) behavior.setImmediatelyAddableTypes(('Collection', 'Event')) esdeveniments = self.newCollection(esdeveniments, 'esdeveniments', u'Esdeveniments', query = [{u'i': u'portal_type', u'o': u'plone.app.querystring.operation.selection.is', u'v': [u'Event']}, {u'i': u'review_state', u'o': u'plone.app.querystring.operation.selection.is', u'v': u'published'}]) self.publish(esdeveniments) #Menú principal obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/menu-principal') if obj.actual_result_count == 0: menu_principal = self.newFolder(portal, 'menu-principal', u'Menú principal') menu_principal.language = pl.getDefaultLanguage() menu_principal.exclude_from_nav = True self.publish(menu_principal) alsoProvides(menu_principal, IHideFromBreadcrumbs) menu_principal.reindexObject() ajuntament = self.newFolder(menu_principal, 'ajuntament', u'Ajuntament') ajuntament.language = pl.getDefaultLanguage() self.publish(ajuntament) ajuntament.reindexObject() informacio_municipal = self.newFolder(menu_principal, 'informacio-municipal', u'Informació Municipal') informacio_municipal.language = pl.getDefaultLanguage() self.publish(informacio_municipal) informacio_municipal.reindexObject() seu_electronica = self.newFolder(menu_principal, 'seu-electronica', u'Seu electrònica') seu_electronica.language = pl.getDefaultLanguage() self.publish(seu_electronica) seu_electronica.reindexObject() guia_de_la_ciutat = self.newFolder(menu_principal, 'guia-de-la-ciutat', u'Guia de la ciutat') guia_de_la_ciutat.language = pl.getDefaultLanguage() self.publish(guia_de_la_ciutat) guia_de_la_ciutat.reindexObject() borsa_de_treball = self.newFolder(menu_principal, 'borsa-de-treball', u'Borsa de treball') borsa_de_treball.language = pl.getDefaultLanguage() self.publish(borsa_de_treball) borsa_de_treball.reindexObject() #Menú Lateral obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/menu-lateral') if obj.actual_result_count == 0: menu_lateral = self.newFolder(portal, 'menu-lateral', u'Menú lateral') menu_lateral.language = pl.getDefaultLanguage() menu_lateral.exclude_from_nav = True self.publish(menu_lateral) alsoProvides(menu_lateral, IHideFromBreadcrumbs) menu_lateral.reindexObject() la_ciutat_per_temes = self.newFolder(menu_lateral, 'la-ciutat-per-temes', u'La ciutat per temes') la_ciutat_per_temes.language = pl.getDefaultLanguage() self.publish(la_ciutat_per_temes) la_ciutat_per_temes.reindexObject() la_ciutat_per_les_persones = self.newFolder(menu_lateral, 'la-ciutat-per-les-persones', u'La ciutat i les persones') la_ciutat_per_les_persones.language = pl.getDefaultLanguage() self.publish(la_ciutat_per_les_persones) la_ciutat_per_les_persones.reindexObject() la_ciutat_en_xifres = self.newFolder(menu_lateral, 'la-ciutat-en-xifres', u'La ciutat en xifres') la_ciutat_en_xifres.language = pl.getDefaultLanguage() self.publish(la_ciutat_en_xifres) la_ciutat_en_xifres.reindexObject() la_ciutat_per_districtes = self.newFolder(menu_lateral, 'la-ciutat-per-districtes', u'La ciutat per districtes') la_ciutat_per_districtes.language = pl.getDefaultLanguage() self.publish(la_ciutat_per_districtes) la_ciutat_per_districtes.reindexObject() #Material multimèdia obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/material-multimedia') if obj.actual_result_count == 0: material_multimedia = self.newFolder(portal, 'material-multimedia', u'Material multimèdia') material_multimedia.language = pl.getDefaultLanguage() material_multimedia.exclude_from_nav = True self.publish(material_multimedia) material_multimedia.reindexObject() #Slider obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/material-multimedia/sliders') if obj.actual_result_count == 0: res = portal_catalog.searchResults(id = 'material-multimedia') if res: material_multimedia = res[0].getObject() slider = self.newFolder(material_multimedia, 'sliders', u'Sliders') slider.language = pl.getDefaultLanguage() slider.exclude_from_nav = True self.publish(slider) slider.reindexObject() behavior = ISelectableConstrainTypes(slider) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Folder', 'Slider')) behavior.setImmediatelyAddableTypes(('Folder', 'Slider')) #Banners obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/material-multimedia/banners') if obj.actual_result_count == 0: res = portal_catalog.searchResults(id = 'material-multimedia') if res: material_multimedia = res[0].getObject() banners = self.newFolder(material_multimedia, 'banners', u'Banners') banners.language = pl.getDefaultLanguage() banners.exclude_from_nav = True self.publish(banners) banners.reindexObject() behavior = ISelectableConstrainTypes(banners) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Banner', 'BannerContainer')) behavior.setImmediatelyAddableTypes(('Banner', 'BannerContainer')) #Carrousel obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/material-multimedia/carroussel') if obj.actual_result_count == 0: res = portal_catalog.searchResults(id = 'material-multimedia') if res: material_multimedia = res[0].getObject() carroussel = self.newFolder(material_multimedia, 'carroussel', u'Carroussel') carroussel.language = pl.getDefaultLanguage() carroussel.exclude_from_nav = True self.publish(carroussel) carroussel.reindexObject() behavior = ISelectableConstrainTypes(carroussel) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Carrousel', 'Folder')) behavior.setImmediatelyAddableTypes(('Carrousel', 'Folder')) #Imatges Capçalera obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/material-multimedia/imatges-capcalera') if obj.actual_result_count == 0: res = portal_catalog.searchResults(id = 'material-multimedia') if res: material_multimedia = res[0].getObject() imatges_capcalera = self.newFolder(material_multimedia, 'imatges-capcalera', u'Imatges capçalera') imatges_capcalera.language = pl.getDefaultLanguage() imatges_capcalera.exclude_from_nav = True self.publish(imatges_capcalera) imatges_capcalera.reindexObject() behavior = ISelectableConstrainTypes(imatges_capcalera) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Folder', 'Image')) behavior.setImmediatelyAddableTypes(('Folder', 'Image')) #Banners dreta obj = portal_catalog.searchResults(portal_type = 'BannerContainer', path = path + '/material-multimedia/banners/banners_dreta') if obj.actual_result_count == 0: _createObjectByType('BannerContainer', banners, 'banners_dreta') banners['banners_dreta'].exclude_from_nav = True banners['banners_dreta'].setTitle('Banners-dreta') banners['banners_dreta'].reindexObject() workflowTool.doActionFor(banners.banners_dreta, "publish") #Banners esquerra obj = portal_catalog.searchResults(portal_type = 'BannerContainer', path = path + '/material-multimedia/banners/banners_esquerra') if obj.actual_result_count == 0: _createObjectByType('BannerContainer', banners, 'banners_esquerra') banners['banners_esquerra'].exclude_from_nav = True banners['banners_esquerra'].setTitle('Banners-esquerra') banners['banners_esquerra'].reindexObject() workflowTool.doActionFor(banners.banners_esquerra, "publish") #Documents obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/documents') if obj.actual_result_count == 0: documents = self.newFolder(portal, 'documents', u'Documents') documents.language = pl.getDefaultLanguage() documents.exclude_from_nav = True self.publish(documents) documents.reindexObject() #Directori equipaments obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/directori-equipaments') if obj.actual_result_count == 0: directori_equipaments = self.newFolder(portal, 'directori-equipaments', u'Directori equipaments') directori_equipaments.language = pl.getDefaultLanguage() directori_equipaments.exclude_from_nav = True self.publish(directori_equipaments) directori_equipaments.reindexObject() behavior = ISelectableConstrainTypes(directori_equipaments) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Folder', 'Equipament')) behavior.setImmediatelyAddableTypes(('Folder', 'Equipament')) #Tràmits obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/tramits') if obj.actual_result_count == 0: tramits = self.newFolder(portal, 'tramits', u'Tràmits') tramits.language = pl.getDefaultLanguage() tramits.exclude_from_nav = True self.publish(tramits) tramits.reindexObject() behavior = ISelectableConstrainTypes(tramits) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Folder', 'Tramit')) behavior.setImmediatelyAddableTypes(('Folder', 'Tramit')) # # Add portlets programatically # from vilaix.theme.portlets.noticiaDestacada import Assignment as noticiaDestacadaAssignment # from vilaix.theme.portlets.news import Assignment as noticiaAssignment # from vilaix.theme.portlets.bannersportlet import Assignment as bannersVilaixAssignment # from vilaix.theme.portlets.agendaVilaix import Assignment as agendaVilaixAssignment # from vilaix.theme.portlets.navigationfixed import Assignment as navigationfixedAssignment # from plone.app.event.portlets.portlet_calendar import Assignment as calendarAssignment # target_manager = queryUtility(IPortletManager, name='genweb.portlets.HomePortletManager1', context=frontpage) # target_manager_assignments = getMultiAdapter((frontpage, target_manager), IPortletAssignmentMapping) # target_manager_assignments['navigationfixed'] = navigationfixedAssignment(root='/menu-lateral') # target_manager_assignments['bannersVilaix'] = bannersVilaixAssignment(content='/material-multimedia/banners/banners_esquerra') # target_manager = queryUtility(IPortletManager, name='genweb.portlets.HomePortletManager2', context=frontpage) # target_manager_assignments = getMultiAdapter((frontpage, target_manager), IPortletAssignmentMapping) # target_manager_assignments['noticiaDestacada'] = noticiaDestacadaAssignment() # target_manager = queryUtility(IPortletManager, name='genweb.portlets.HomePortletManager3', context=frontpage) # target_manager_assignments = getMultiAdapter((frontpage, target_manager), IPortletAssignmentMapping) # target_manager_assignments['noticies'] = noticiaAssignment() # target_manager = queryUtility(IPortletManager, name='genweb.portlets.HomePortletManager6', context=frontpage) # target_manager_assignments = getMultiAdapter((frontpage, target_manager), IPortletAssignmentMapping) # target_manager_assignments['bannersVilaix'] = bannersVilaixAssignment(content='/material-multimedia/banners/banners_dreta') # target_manager = queryUtility(IPortletManager, name='genweb.portlets.HomePortletManager7', context=frontpage) # target_manager_assignments = getMultiAdapter((frontpage, target_manager), IPortletAssignmentMapping) # target_manager_assignments['agendaVilaix'] = agendaVilaixAssignment() # target_manager = queryUtility(IPortletManager, name='genweb.portlets.HomePortletManager10', context=frontpage) # target_manager_assignments = getMultiAdapter((frontpage, target_manager), IPortletAssignmentMapping) # target_manager_assignments['calendari'] = calendarAssignment(state='published') # portletManager = getUtility(IPortletManager, 'genweb.portlets.HomePortletManager3') # spanstorage = getMultiAdapter((frontpage, portletManager), ISpanStorage) # spanstorage.span = '8' # portletManager = getUtility(IPortletManager, 'genweb.portlets.HomePortletManager6') # spanstorage = getMultiAdapter((frontpage, portletManager), ISpanStorage) # spanstorage.span = '4' # portletManager = getUtility(IPortletManager, 'genweb.portlets.HomePortletManager7') # spanstorage = getMultiAdapter((frontpage, portletManager), ISpanStorage) # spanstorage.span = '8' # portletManager = getUtility(IPortletManager, 'genweb.portlets.HomePortletManager10') # spanstorage = getMultiAdapter((frontpage, portletManager), ISpanStorage) # spanstorage.span = '4' return 'Created'
def render(self): """ """ portal = getSite() frontpage = portal['front-page'] urltool = getToolByName(portal, 'portal_url') portal_catalog = getToolByName(portal, 'portal_catalog') path = urltool.getPortalPath() workflowTool = getToolByName(portal, "portal_workflow") pl = getToolByName(portal, 'portal_languages') # Delete old AT folders if getattr(portal, 'events', None): if portal.events.portal_type == 'Folder': portal.manage_delObjects(['events']) if getattr(portal, 'news', None): if portal.news.portal_type== 'Folder': portal.manage_delObjects(['news']) obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/noticies') if obj.actual_result_count == 0: noticies = self.newFolder(portal, 'noticies', 'Noticies') noticies.description = 'Noticies del lloc' noticies.exclude_from_nav = True self.publish(noticies) # Set on them the allowable content types behavior = ISelectableConstrainTypes(noticies) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('News Item', 'Collection')) behavior.setImmediatelyAddableTypes(('News Item', 'Collection')) noticies_destacades = self.newCollection(noticies, 'noticies-destacades', u'Noticies Destacades', query = [{u'i': u'portal_type', u'o': u'plone.app.querystring.operation.selection.is', u'v': [u'News Item']}, {u'i': u'review_state', u'o': u'plone.app.querystring.operation.selection.is', u'v': u'published'}, {u'i': u'destacat', u'o': u'plone.app.querystring.operation.boolean.isTrue', u'v': u'Sí'}]) self.publish(noticies_destacades) noticies = self.newCollection(noticies, 'noticies', u'Noticies', query = [{u'i': u'portal_type', u'o': u'plone.app.querystring.operation.selection.is', u'v': [u'News Item']}, {u'i': u'review_state', u'o': u'plone.app.querystring.operation.selection.is', u'v': u'published'}]) self.publish(noticies) #Menú Lateral obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/menu-lateral') if obj.actual_result_count == 0: menu_lateral = self.newFolder(portal, 'menu-lateral', u'Menú lateral') menu_lateral.language = pl.getDefaultLanguage() menu_lateral.exclude_from_nav = True self.publish(menu_lateral) alsoProvides(menu_lateral, IHideFromBreadcrumbs) menu_lateral.reindexObject() lalcaldessa_per_la_transparencia = self.newFolder(menu_lateral, 'lalcaldessa-per-la-transparencia', u'L\'alcaldessa per la transparència') lalcaldessa_per_la_transparencia .language = pl.getDefaultLanguage() self.publish(lalcaldessa_per_la_transparencia ) lalcaldessa_per_la_transparencia .reindexObject() els_carrecs_electes_municipals = self.newFolder(menu_lateral, 'els-carrecs-electes-municipals', u'Els càrrecs electes municipals') els_carrecs_electes_municipals.language = pl.getDefaultLanguage() self.publish(els_carrecs_electes_municipals) els_carrecs_electes_municipals.reindexObject() els_carrecs_de_lliure_designacio = self.newFolder(menu_lateral, 'els-carrecs-de-lliure-designacio', u'Els càrrecs de lliure designació') els_carrecs_de_lliure_designacio.language = pl.getDefaultLanguage() self.publish(els_carrecs_de_lliure_designacio) els_carrecs_de_lliure_designacio.reindexObject() indicadors_de_transparencia = self.newFolder(menu_lateral, 'indicadors-de-transparencia', u'Indicadors de transparència') indicadors_de_transparencia.language = pl.getDefaultLanguage() self.publish(indicadors_de_transparencia) indicadors_de_transparencia.reindexObject() pressupostos_municipals = self.newFolder(menu_lateral, 'pressupostos-municipals', u'Pressupostos municipals') pressupostos_municipals.language = pl.getDefaultLanguage() self.publish(pressupostos_municipals) pressupostos_municipals.reindexObject() patrimoni_municipal = self.newFolder(menu_lateral, 'patrimoni-municipal', u'Patrimoni municipal') patrimoni_municipal.language = pl.getDefaultLanguage() self.publish(patrimoni_municipal) patrimoni_municipal.reindexObject() retiment_de_comptes = self.newFolder(menu_lateral, 'retiment-de-comptes', u'Retiment de comptes') retiment_de_comptes.language = pl.getDefaultLanguage() self.publish(retiment_de_comptes) retiment_de_comptes.reindexObject() dret_dacces_a_la_informacio = self.newFolder(menu_lateral, 'dret-dacces-a-la-informacio', u'Dret d\'accés a la informació') dret_dacces_a_la_informacio.language = pl.getDefaultLanguage() self.publish(dret_dacces_a_la_informacio) dret_dacces_a_la_informacio.reindexObject() dret_dacces_a_la_informacio = self.newFolder(menu_lateral, 'dret-dacces-a-la-informacio', u'Dret d\'accés a la informació') dret_dacces_a_la_informacio.language = pl.getDefaultLanguage() self.publish(dret_dacces_a_la_informacio) dret_dacces_a_la_informacio.reindexObject() llei_de_transparencia = self.newFolder(menu_lateral, 'llei-de-transparencia', u'Llei de transparència') llei_de_transparencia.language = pl.getDefaultLanguage() self.publish(llei_de_transparencia) llei_de_transparencia.reindexObject() novetats = self.newFolder(menu_lateral, 'novetats', u'Novetats') novetats.language = pl.getDefaultLanguage() self.publish(novetats) novetats.reindexObject() enllacos_dinteres = self.newFolder(menu_lateral, 'enllacos-dinteres', u'Enllaços d\'interès') enllacos_dinteres.language = pl.getDefaultLanguage() self.publish(enllacos_dinteres) enllacos_dinteres.reindexObject() #Material multimèdia obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/material-multimedia') if obj.actual_result_count == 0: material_multimedia = self.newFolder(portal, 'material-multimedia', u'Material multimèdia') material_multimedia.language = pl.getDefaultLanguage() material_multimedia.exclude_from_nav = True self.publish(material_multimedia) material_multimedia.reindexObject() #Apartats obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/material-multimedia/apartats') if obj.actual_result_count == 0: res = portal_catalog.searchResults(id = 'material-multimedia') if res: material_multimedia = res[0].getObject() apartats = self.newFolder(material_multimedia, 'apartats', u'Apartats') apartats.language = pl.getDefaultLanguage() apartats.exclude_from_nav = True self.publish(apartats) apartats.reindexObject() # Set on them the allowable content types behavior = ISelectableConstrainTypes(apartats) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Apartat', 'Folder')) behavior.setImmediatelyAddableTypes(('Apartat', 'Folder')) #Slider obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/material-multimedia/sliders') if obj.actual_result_count == 0: res = portal_catalog.searchResults(id = 'material-multimedia') if res: material_multimedia = res[0].getObject() slider = self.newFolder(material_multimedia, 'sliders', u'Sliders') slider.language = pl.getDefaultLanguage() slider.exclude_from_nav = True self.publish(slider) slider.reindexObject() # Set on them the allowable content types behavior = ISelectableConstrainTypes(slider) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Slider', 'Folder')) behavior.setImmediatelyAddableTypes(('Slider', 'Folder')) # #Banners # obj = portal_catalog.searchResults(portal_type = 'Folder', # path = path + '/material-multimedia/banners') # if obj.actual_result_count == 0: # res = portal_catalog.searchResults(id = 'material-multimedia') # if res: # material_multimedia = res[0].getObject() # banners = self.newFolder(material_multimedia, 'banners', u'Banners') # banners.language = pl.getDefaultLanguage() # banners.exclude_from_nav = True # self.publish(banners) # banners.reindexObject() # #Carrousel # obj = portal_catalog.searchResults(portal_type = 'Folder', # path = path + '/material-multimedia/carroussel') # if obj.actual_result_count == 0: # res = portal_catalog.searchResults(id = 'material-multimedia') # if res: # material_multimedia = res[0].getObject() # carroussel = self.newFolder(material_multimedia, 'carroussel', u'Carroussel') # carroussel.language = pl.getDefaultLanguage() # carroussel.exclude_from_nav = True # self.publish(carroussel) # carroussel.reindexObject() #Imatges Capçalera obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/material-multimedia/imatges-capcalera') if obj.actual_result_count == 0: res = portal_catalog.searchResults(id = 'material-multimedia') if res: material_multimedia = res[0].getObject() imatges_capcalera = self.newFolder(material_multimedia, 'imatges-capcalera', u'Imatges capçalera') imatges_capcalera.language = pl.getDefaultLanguage() imatges_capcalera.exclude_from_nav = True self.publish(imatges_capcalera) imatges_capcalera.reindexObject() # Set on them the allowable content types behavior = ISelectableConstrainTypes(imatges_capcalera) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Image', 'Folder')) behavior.setImmediatelyAddableTypes(('Image', 'Folder')) # #Banners dreta # obj = portal_catalog.searchResults(portal_type = 'BannerContainer', # path = path + '/material-multimedia/banners/banners_dreta') # if obj.actual_result_count == 0: # _createObjectByType('BannerContainer', banners, 'banners_dreta') # banners['banners_dreta'].setExcludeFromNav(True) # banners['banners_dreta'].setTitle('Banners-dreta') # banners['banners_dreta'].reindexObject() # workflowTool.doActionFor(banners.banners_dreta, "publish") # #Banners esquerra # obj = portal_catalog.searchResults(portal_type = 'BannerContainer', # path = path + '/material-multimedia/banners/banners_esquerra') # if obj.actual_result_count == 0: # _createObjectByType('BannerContainer', banners, 'banners_esquerra') # banners['banners_esquerra'].setExcludeFromNav(True) # banners['banners_esquerra'].setTitle('Banners-esquerra') # banners['banners_esquerra'].reindexObject() # workflowTool.doActionFor(banners.banners_esquerra, "publish") # #Documents # obj = portal_catalog.searchResults(portal_type = 'Folder', # path = path + '/documents') # if obj.actual_result_count == 0: # documents = self.newFolder(portal, 'documents', u'Documents') # documents.language = pl.getDefaultLanguage() # documents.exclude_from_nav = True # self.publish(documents) # documents.reindexObject() # #Directori equipaments # obj = portal_catalog.searchResults(portal_type = 'Folder', # path = path + '/directori-equipaments') # if obj.actual_result_count == 0: # directori_equipaments = self.newFolder(portal, 'directori-equipaments', u'Directori equipaments') # directori_equipaments.language = pl.getDefaultLanguage() # directori_equipaments.exclude_from_nav = True # self.publish(directori_equipaments) # directori_equipaments.reindexObject() # #Tràmits # obj = portal_catalog.searchResults(portal_type = 'Folder', # path = path + '/tramits') # if obj.actual_result_count == 0: # tramits = self.newFolder(portal, 'tramits', u'Tràmits') # tramits.language = pl.getDefaultLanguage() # tramits.exclude_from_nav = True # self.publish(tramits) # tramits.reindexObject() #Categories obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/categories') if obj.actual_result_count == 0: categories = self.newFolder(portal, 'categories', u'Categories') categories.language = pl.getDefaultLanguage() categories.exclude_from_nav = True self.publish(categories) categories.reindexObject() # Set on them the allowable content types behavior = ISelectableConstrainTypes(categories) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Categoria', 'Folder')) behavior.setImmediatelyAddableTypes(('Categoria', 'Folder')) #Lleis obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/lleis') if obj.actual_result_count == 0: lleis = self.newFolder(portal, 'lleis', u'Lleis') lleis.language = pl.getDefaultLanguage() lleis.exclude_from_nav = True self.publish(lleis) lleis.reindexObject() # Set on them the allowable content types behavior = ISelectableConstrainTypes(lleis) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Llei', 'Folder')) behavior.setImmediatelyAddableTypes(('Llei', 'Folder')) #Indicadors obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/indicadors') if obj.actual_result_count == 0: indicadors = self.newFolder(portal, 'indicadors', u'Indicadors') indicadors.language = pl.getDefaultLanguage() indicadors.exclude_from_nav = True self.publish(indicadors) indicadors.reindexObject() # Set on them the allowable content types behavior = ISelectableConstrainTypes(indicadors) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Indicador', 'Folder')) behavior.setImmediatelyAddableTypes(('Indicador', 'Folder')) #Col·leccions Indicadors obj = portal_catalog.searchResults(portal_type = 'Folder', path = path + '/col-leccions-indicadors') if obj.actual_result_count == 0: coleccions_indicadors = self.newFolder(portal, 'col-leccions-indicadors', u'Col·leccions Indicadors') coleccions_indicadors.language = pl.getDefaultLanguage() coleccions_indicadors.exclude_from_nav = True self.publish(coleccions_indicadors) coleccions_indicadors.reindexObject() # Set on them the allowable content types behavior = ISelectableConstrainTypes(coleccions_indicadors) behavior.setConstrainTypesMode(1) behavior.setLocallyAllowedTypes(('Collection', 'Folder')) behavior.setImmediatelyAddableTypes(('Collection', 'Folder')) return 'Created'