예제 #1
0
def configura_menu_apoio(portal):
    folder = portal["menu-de-apoio"]
    behavior = ISelectableConstrainTypes(folder)
    behavior.setConstrainTypesMode(constrains.ENABLED)
    # Permitimos apenas links
    behavior.setImmediatelyAddableTypes(["Link"])
    folder.setLayout("folder_summary_view")
예제 #2
0
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])
예제 #3
0
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)
예제 #4
0
def configura_servicos(portal):
    folder = portal.servicos
    behavior = ISelectableConstrainTypes(folder)
    behavior.setConstrainTypesMode(constrains.ENABLED)
    # Permitimos apenas links
    behavior.setImmediatelyAddableTypes(['Link'])
    folder.setLayout('summary_view')
예제 #5
0
def _createObjects(parent, new_object):

    LOG.info("Creating %s in %s" % (new_object, parent))

    existing = parent.objectIds()
    if new_object['id'] in existing:
        LOG.info("%s exists, skipping" % new_object['id'])
    else:
        _createObjectByType(
            new_object['type'],
            parent,
            id=new_object['id'],
            title=new_object['title']
        )
    LOG.info("Now to modify the new_object...")

    obj = parent.get(new_object['id'], None)
    if obj is None:
        msg = "can't get new_object %s to modify it!" % new_object['id']
        LOG.info(msg)
    else:
        if obj.Type() != new_object['type']:
            LOG.info("types don't match!")
        else:
            if 'layout' in new_object:
                obj.setLayout(new_object['layout'])
            if 'exclude_from_nav' in new_object:
                obj.setExcludeFromNav(new_object['exclude_from_nav'])
            obj.reindexObject()

    aspect = ISelectableConstrainTypes(obj)
    addable = aspect.getImmediatelyAddableTypes()
    if "collective.history.useraction" not in addable:
        aspect.setConstrainTypesMode(1)  # select manually
        aspect.setImmediatelyAddableTypes(["collective.history.useraction"])
예제 #6
0
def configura_imagens(portal):
    folder = portal.imagens
    behavior = ISelectableConstrainTypes(folder)
    behavior.setConstrainTypesMode(constrains.ENABLED)
    # Permitimos apenas imagens
    behavior.setImmediatelyAddableTypes(['Image'])
    folder.setLayout('summary_view')
예제 #7
0
    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!'
예제 #8
0
def configura_menu_relevancia(portal):
    folder = portal['menu-de-relevancia']
    behavior = ISelectableConstrainTypes(folder)
    behavior.setConstrainTypesMode(constrains.ENABLED)
    # Permitimos apenas links
    behavior.setImmediatelyAddableTypes(['Link'])
    folder.setLayout('summary_view')
예제 #9
0
    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())
예제 #10
0
    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.'
예제 #11
0
    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!'
예제 #12
0
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 __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
예제 #14
0
    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'])
예제 #15
0
    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'])
예제 #16
0
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')
예제 #17
0
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)
예제 #18
0
    def get_dashboard(self):
        write = False
        with api.env.adopt_roles(['Manager']):
            if 'dashboards' not in self.context.objectIds():
                write = True
                api.content.create(type='Folder',
                                   title='Dashboards',
                                   id='dashboards',
                                   container=self.context,
                                   exclude_from_nav=True)
            dashboards = self.context['dashboards']
            if not IHideFromBreadcrumbs.providedBy(dashboards):
                alsoProvides(dashboards, IHideFromBreadcrumbs)
            if api.content.get_state(
                    obj=dashboards,
                    default='Unknown') not in ('published',
                                               'publish_internally'):
                write = True
                publish_content(dashboards)

        member = api.user.get_current()
        user_id = member.getId()
        if user_id not in dashboards.objectIds():
            with api.env.adopt_roles(['Manager']):
                write = True
                # first make sure it is in allowed types...
                pts = api.portal.get_tool('portal_types')
                Folder = pts['Folder']
                if 'Dashboard' not in Folder.allowed_content_types:
                    allowed = list(Folder.allowed_content_types)
                    allowed.append('Dashboard')
                    Folder.allowed_content_types = tuple(allowed)

                aspect = ISelectableConstrainTypes(dashboards)
                if (aspect.getConstrainTypesMode() != 1 or
                    ['Dashboard'] != aspect.getImmediatelyAddableTypes()):
                    aspect.setConstrainTypesMode(1)
                    aspect.setImmediatelyAddableTypes(['Dashboard'])

                api.content.create(type='Dashboard',
                                   title='Dashboard',
                                   id=user_id,
                                   container=dashboards,
                                   exclude_from_nav=True)

        dashboard = dashboards[user_id]
        if dashboard.getOwner().getId() != user_id:
            with api.env.adopt_roles(['Manager']):
                write = True
                dashboard.changeOwnership(member.getUser(), recursive=False)
                dashboard.reindexObjectSecurity()
        if write:
            alsoProvides(self.request, IDisableCSRFProtection)

        return dashboard
예제 #19
0
파일: ens.py 프로젝트: UPCnet/genweb.ens
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 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 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 test_template_not_addable(self):
     # Normal folder => image is allowed to add
     self._create_templates([{'id': 'i1',
                              'type': 'Image',
                              'title': 'Image1'}])
     self._open_url("%s/create_from_template" % self.folder.absolute_url())
     self.assertIn('>Image1</label>', self.browser.contents)
     # Image is not allowed anymore in this folder
     constrain = ISelectableConstrainTypes(self.folder)
     constrain.setConstrainTypesMode(constraintypes.ENABLED)
     constrain.setImmediatelyAddableTypes([self.folder_type])
     transaction.commit()
     self._open_url("%s/create_from_template" % self.folder.absolute_url())
     self.assertIn('No templates', self.browser.contents)
예제 #23
0
def create_event_event(obj, event):
    if IRegistration.providedBy(obj.aq_parent):
        parent = obj.aq_parent
        parent.setDefaultPage(obj.id)
        create_registration_form(parent)
        behavior = ISelectableConstrainTypes(parent)
        behavior.setConstrainTypesMode(1)
        behavior.setImmediatelyAddableTypes(("period", ))

        request = getattr(event.object, "REQUEST", getRequest())
        link_translations(request, parent)

        url = obj.aq_parent.absolute_url()
        obj.REQUEST.RESPONSE.redirect(url)
예제 #24
0
 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 test_immediatelyAllowedTypesDefaultWhenDisabled(self):
        """
        Constrain Mode Disabled.
        We get the default addables, independent of what our parent folder
        or we ourselves defined
        """
        behavior = ISelectableConstrainTypes(self.inner_folder)
        behavior.setConstrainTypesMode(constrains.DISABLED)
        behavior.setImmediatelyAddableTypes([])

        outer_behavior = ISelectableConstrainTypes(self.folder)
        outer_behavior.setConstrainTypesMode(constrains.ENABLED)
        outer_behavior.setImmediatelyAddableTypes([])

        types = [t.getId() for t in self.default_types]

        self.assertEqual(types, behavior.getImmediatelyAddableTypes())
    def test_immediatelyAllowedTypesDefaultWhenEnabled(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.setImmediatelyAddableTypes(self.types_id_subset)

        outer_behavior = ISelectableConstrainTypes(self.folder)
        outer_behavior.setConstrainTypesMode(constrains.ENABLED)
        outer_behavior.setImmediatelyAddableTypes([])

        types = self.types_id_subset

        self.assertEqual(types, behavior.getImmediatelyAddableTypes())
    def test_immediatelyAllowedTypesDefaultWhenDisabled(self):
        """
        Constrain Mode Disabled.
        We get the default addables, independent of what our parent folder
        or we ourselves defined
        """
        behavior = ISelectableConstrainTypes(self.inner_folder)
        behavior.setConstrainTypesMode(constrains.DISABLED)
        behavior.setImmediatelyAddableTypes([])

        outer_behavior = ISelectableConstrainTypes(self.folder)
        outer_behavior.setConstrainTypesMode(constrains.ENABLED)
        outer_behavior.setImmediatelyAddableTypes([])

        types = [t.getId() for t in self.default_types]

        self.assertEqual(types, behavior.getImmediatelyAddableTypes())
    def test_immediatelyAllowedTypesDefaultWhenEnabled(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.setImmediatelyAddableTypes(self.types_id_subset)

        outer_behavior = ISelectableConstrainTypes(self.folder)
        outer_behavior.setConstrainTypesMode(constrains.ENABLED)
        outer_behavior.setImmediatelyAddableTypes([])

        types = self.types_id_subset

        self.assertEqual(types, behavior.getImmediatelyAddableTypes())
예제 #29
0
def updateContainer(container, layout, ptypes):
    container.unindexObject()
    container.setLayout(layout)
    if IExcludeFromNavigation.providedBy(container):
        container.exclude_from_nav = True
    else:
        container.setExcludeFromNav(True)

    aspect = ISelectableConstrainTypes(container)
    addable = aspect.getImmediatelyAddableTypes()
    for ptype in ptypes:
        if ptype not in addable:
            aspect.setConstrainTypesMode(1)  # select manually
        if IDexterityContainer.providedBy(container):
            #bypass check for available types
            container.immediately_addable_types = ptypes
        else:
            aspect.setImmediatelyAddableTypes(ptypes)
예제 #30
0
def updateHistoryContainer(obj):
    obj.unindexObject()
    obj.setLayout("collective_history_view")
    if IExcludeFromNavigation.providedBy(obj):
        obj.exclude_from_nav = True
    else:
        obj.setExcludeFromNav(True)

    aspect = ISelectableConstrainTypes(obj)
    addable = aspect.getImmediatelyAddableTypes()
    if "collective.history.useraction" not in addable:
        aspect.setConstrainTypesMode(1)  # select manually
        types = ["collective.history.useraction"]
        if IDexterityContainer.providedBy(obj):
            #bypass check for available types
            obj.immediately_addable_types = types
        else:
            aspect.setImmediatelyAddableTypes(types)
예제 #31
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()
예제 #32
0
    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))
예제 #33
0
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]
예제 #34
0
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]
예제 #35
0
 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.')
예제 #36
0
    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)
예제 #37
0
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())
예제 #38
0
    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)
예제 #39
0
    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 test_immediatelyAllowedTypesDefaultWhenAcquired(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.setImmediatelyAddableTypes([])

        outer_behavior = ISelectableConstrainTypes(self.folder)
        outer_behavior.setConstrainTypesMode(constrains.ENABLED)
        outer_behavior.setImmediatelyAddableTypes(self.types_id_subset)

        types = self.types_id_subset

        self.assertEqual(types, behavior.getImmediatelyAddableTypes())

        outer_behavior.setConstrainTypesMode(constrains.ACQUIRE)

        types = [t.getId() for t in self.default_types]

        self.assertEqual(types, outer_behavior.getImmediatelyAddableTypes())
예제 #41
0
파일: setup.py 프로젝트: UPCnet/ulearn.core
    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',))
예제 #42
0
    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 test_immediatelyAllowedTypesDefaultWhenAcquired(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.setImmediatelyAddableTypes([])

        outer_behavior = ISelectableConstrainTypes(self.folder)
        outer_behavior.setConstrainTypesMode(constrains.ENABLED)
        outer_behavior.setImmediatelyAddableTypes(self.types_id_subset)

        types = self.types_id_subset

        self.assertEqual(types, behavior.getImmediatelyAddableTypes())

        outer_behavior.setConstrainTypesMode(constrains.ACQUIRE)

        types = [t.getId() for t in self.default_types]

        self.assertEqual(types, outer_behavior.getImmediatelyAddableTypes())
예제 #44
0
    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.'
예제 #45
0
    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 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
예제 #47
0
def _setup_constrains(container, allowed_types):
    if DEXTERITY_WITH_CONSTRAINS:
        behavior = ISelectableConstrainTypes(container)
        behavior.setConstrainTypesMode(constrains.ENABLED)
        behavior.setImmediatelyAddableTypes(allowed_types)
        return True
예제 #48
0
def _constrain(context, allowed_types):
    behavior = ISelectableConstrainTypes(context)
    behavior.setConstrainTypesMode(constrains.ENABLED)
    behavior.setLocallyAllowedTypes(allowed_types)
    behavior.setImmediatelyAddableTypes(allowed_types)
예제 #49
0
    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'
예제 #50
0
def set_constrain_types(obj, list_contraint):
    behavior = ISelectableConstrainTypes(obj)
    behavior.setConstrainTypesMode(1)
    behavior.setImmediatelyAddableTypes(list_contraint)
    behavior.setLocallyAllowedTypes(list_contraint)
예제 #51
0
def _setup_constrains(container, allowed_types):
    behavior = ISelectableConstrainTypes(container)
    behavior.setConstrainTypesMode(constrains.ENABLED)
    behavior.setImmediatelyAddableTypes(allowed_types)
    return True
예제 #52
0
    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'