コード例 #1
0
 def test_pm_DevPackages(self):
     """Display a log message with packages found in dev.
        This is useful for the bin/testprod that should have 0 dev packages."""
     dev_package_paths = [package.path for package in iter_importers()
                          if hasattr(package, "path") and
                          package.path and
                          "/src/" in package.path]
     pm_logger.info("Number of dev packages: %d" % len(dev_package_paths))
     for dev_package_path in dev_package_paths:
         pm_logger.info("Dev package: %s" % dev_package_path)
コード例 #2
0
 def test_pm_EnsureSolrActivated(self):
     """ """
     pm_logger.info("HAS_SOLR %s" % HAS_SOLR)
     cfg = self.meetingConfig
     self.changeUser('pmManager')
     self.create('MeetingItem')
     brains = self.catalog(portal_type=cfg.getItemTypeName())
     if HAS_SOLR:
         self.assertTrue(self.portal.portal_quickinstaller.isProductInstalled('collective.solr'),
                         msg="collective.solr is not installed")
         self.assertTrue(api.portal.get_registry_record('collective.solr.active'),
                         msg="collective.solr is not active")
         self.assertEqual(api.portal.get_registry_record('collective.solr.port'), int(os.environ['SOLR_PORT']))
         self.assertEqual(api.portal.get_registry_record('collective.solr.required'), [u''])
         self.assertEqual(brains[0].__class__.__name__, 'PloneFlare')
     else:
         self.assertEqual(brains[0].__class__.__name__, 'mybrains')
         pm_logger.info("HAS_SOLR is False so there is nothing more to check")
コード例 #3
0
 def test_pm_WorkflowsRemovedOnReinstall(self):
     '''This will test that remove=True is used in the workflows.xml, indeed
        if it is not the case, the workflows are updated instead of being removed/re-added
        and that can lead to some weird behaviors because WFAdaptations add some
        transitions/states and these are left in the workflows.'''
     DUMMY_STATE = 'dummy_state'
     # add a state to the workflows then reinstall it
     wfTool = api.portal.get_tool('portal_workflow')
     for cfg in self.tool.objectValues('MeetingConfig'):
         # warning, here we get the real WF added by workflows.xml
         itemBaseWF = wfTool.getWorkflowById(cfg.getItemWorkflow())
         # this is necessary in case we use same WF for several MeetingConfigs
         if DUMMY_STATE not in itemBaseWF.states:
             itemBaseWF.states.addState(DUMMY_STATE)
         self.assertTrue(DUMMY_STATE in itemBaseWF.states)
         # same for Meeting workflow
         meetingBaseWF = wfTool.getWorkflowById(cfg.getMeetingWorkflow())
         if DUMMY_STATE not in meetingBaseWF.states:
             meetingBaseWF.states.addState(DUMMY_STATE)
         self.assertTrue(DUMMY_STATE in meetingBaseWF.states)
     # re-apply the workflows step from the :default profile
     item_wf_time = float(itemBaseWF._p_mtime)
     meeting_wf_time = float(meetingBaseWF._p_mtime)
     profile_name = [pn for pn in self._currentSetupProfileNames() if pn.endswith(':default')][0]
     if not profile_name.startswith(u'profile-'):
         profile_name = u'profile-' + profile_name
     self.portal.portal_setup.runImportStepFromProfile(
         profile_name, 'workflow')
     # now make sure WFs are clean
     for cfg in self.tool.objectValues('MeetingConfig'):
         itemBaseWF = wfTool.getWorkflowById(cfg.getItemWorkflow())
         if itemBaseWF._p_mtime != item_wf_time:
             self.assertFalse(DUMMY_STATE in itemBaseWF.states)
         else:
             pm_logger.info('test_pm_WorkflowsRemovedOnReinstall: item workflow not updated using '
                            'profile_name {0} for MeetingConfig {1}?'.format(profile_name, cfg.getId()))
         meetingBaseWF = wfTool.getWorkflowById(cfg.getMeetingWorkflow())
         if meetingBaseWF._p_mtime != meeting_wf_time:
             self.assertFalse(DUMMY_STATE in meetingBaseWF.states)
         else:
             pm_logger.info('test_pm_WorkflowsRemovedOnReinstall: meeting workflow not updated using '
                            'profile_name {0} for MeetingConfig {1}?'.format(profile_name, cfg.getId()))
コード例 #4
0
 def test_pm_WorkflowPermissions(self):
     """Bypass this test..."""
     pm_logger.info("Bypassing , {0} not used in MeetingSeraing".format(
         self._testMethodName))
コード例 #5
0
 def test_pm_SearchItemsToCorrectToValidateOfEveryReviewerGroups(self):
     '''Not used yet...'''
     pm_logger.info("Bypassing , {0} not used in MeetingSeraing".format(
         self._testMethodName))
コード例 #6
0
 def test_pm_SearchItemsToCorrectToValidateOfHighestHierarchicLevel(self):
     '''Not used yet...'''
     pm_logger.info("Bypassing , {0} not used in MeetingSeraing".format(
         self._testMethodName))
コード例 #7
0
    def test_pm_CanNotRemoveUsedMeetingConfig(self):
        '''While removing a MeetingConfig, it should raise if it is used somewhere...'''
        # work with cfg2 where meetingConfigsToCloneTo and other_mc_correspondences are defined
        cfg = self.meetingConfig
        cfgId = cfg.getId()
        cfg2 = self.meetingConfig2
        cfg2Id = cfg2.getId()
        cfg2.setMeetingConfigsToCloneTo(({
            'meeting_config':
            cfgId,
            'trigger_workflow_transitions_until':
            '__nothing__'
        }, ))

        # a user can not delete the MeetingConfig
        self.changeUser('pmManager')
        self.assertRaises(Unauthorized, self.tool.manage_delObjects, [
            cfgId,
        ])

        # fails if a meeting exists
        self.changeUser('pmManager')
        meeting = self.create('Meeting', date='2008/06/23 15:39:00')
        self.changeUser('admin')
        with self.assertRaises(BeforeDeleteException) as cm:
            self.tool.manage_delObjects([
                cfgId,
            ])
        can_not_delete_meetingconfig_meeting = \
            translate('can_not_delete_meetingconfig_meeting',
                      domain="plone",
                      context=self.request)
        self.assertEquals(cm.exception.message,
                          can_not_delete_meetingconfig_meeting)
        self.portal.restrictedTraverse('@@delete_givenuid')(meeting.UID())

        # fails if an item exists
        self.changeUser('pmManager')
        item = self.create('MeetingItem')
        self.changeUser('admin')
        with self.assertRaises(BeforeDeleteException) as cm:
            self.tool.manage_delObjects([
                cfgId,
            ])
        can_not_delete_meetingconfig_meetingitem = \
            translate('can_not_delete_meetingconfig_meetingitem',
                      domain="plone",
                      context=self.request)
        self.assertEquals(cm.exception.message,
                          can_not_delete_meetingconfig_meetingitem)
        self.portal.restrictedTraverse('@@delete_givenuid')(item.UID())

        # fails if another element than searches_xxx folder exists in the pmFolders
        self.changeUser('pmManager')
        pmFolder = self.tool.getPloneMeetingFolder(cfgId)
        afileId = pmFolder.invokeFactory('File', id='afile')
        afile = getattr(pmFolder, afileId)
        self.changeUser('admin')
        with self.assertRaises(BeforeDeleteException) as cm:
            self.tool.manage_delObjects([
                cfgId,
            ])
        can_not_delete_meetingconfig_meetingfolder = \
            translate('can_not_delete_meetingconfig_meetingfolder',
                      domain="plone",
                      context=self.request)
        self.assertEquals(cm.exception.message,
                          can_not_delete_meetingconfig_meetingfolder)
        self.portal.restrictedTraverse('@@delete_givenuid')(afile.UID())

        # fails if used in another MeetingConfig (meetingConfigsToCloneTo)
        with self.assertRaises(BeforeDeleteException) as cm:
            self.tool.manage_delObjects([
                cfgId,
            ])
        can_not_delete_meetingconfig_meetingconfig = \
            translate('can_not_delete_meetingconfig_meetingconfig',
                      mapping={'other_config_title': cfg2.Title()},
                      domain="plone",
                      context=self.request)
        self.assertEquals(cm.exception.message,
                          can_not_delete_meetingconfig_meetingconfig)
        cfg2.setMeetingConfigsToCloneTo(())

        # fails if an annex_type is used by another MeetingConfig annex_type in other_mc_correspondences
        # here we use cfg2 where correspondences are defined
        self._removeConfigObjectsFor(cfg2)
        cfg.setMeetingConfigsToCloneTo(())
        with self.assertRaises(BeforeDeleteException) as cm:
            self.tool.manage_delObjects([
                cfg2Id,
            ])
        can_not_delete_meetingconfig_annex_types = \
            translate('can_not_delete_meetingconfig_annex_types',
                      mapping={'other_config_title': safe_unicode(cfg.Title())},
                      domain="plone",
                      context=self.request)
        self.assertEquals(cm.exception.message,
                          can_not_delete_meetingconfig_annex_types)
        annex_types = _itemAnnexTypes(cfg)
        for annex_type in annex_types:
            annex_type.other_mc_correspondences = set()

        # items stored in MeetingConfig (recurring, itemtemplates) do not avoid removal
        self.assertTrue(cfg.recurringitems.objectIds())
        self.assertTrue(cfg.itemtemplates.objectIds())
        # everything ok, MeetingConfig may be deleted
        self.assertTrue(cfgId in self.tool.objectIds()
                        and cfg2Id in self.tool.objectIds())
        self.tool.manage_delObjects([cfgId, cfg2Id])
        self.assertFalse(cfgId in self.tool.objectIds()
                         or cfg2Id in self.tool.objectIds())
        # elements created by MeetingConfig were deleted (portal_types, groups, metingFolders)
        # portal_types
        all_portal_type_ids = self.portal.portal_types.listContentTypes()
        self.assertEqual([
            pt for pt in all_portal_type_ids if pt.endswith(cfg.getShortName())
        ], [])
        self.assertEqual([
            pt
            for pt in all_portal_type_ids if pt.endswith(cfg2.getShortName())
        ], [])
        # groups, cfg id is suffixed with different values
        all_group_ids = self.portal.portal_groups.listGroupIds()
        # for Seraing we have a global rôle : powereditor
        all_group_ids.remove('meeting-config-college_powereditors')
        all_group_ids.remove('meeting-config-council_powereditors')
        self.assertEqual([
            gr for gr in all_group_ids if gr.startswith('{0}_'.format(cfgId))
        ], [])
        self.assertEqual([
            gr for gr in all_group_ids if gr.startswith('{0}_'.format(cfg2Id))
        ], [])
        # meetingFolders
        for member_folder in self.portal.Members.objectValues():
            mymeetings = member_folder.get('mymeetings', None)
            if mymeetings:
                self.assertEqual(mymeetings.objectIds(), [])
            else:
                pm_logger.info(
                    "{0}: no 'mymeetings' folder for user '{1}'".format(
                        self._testMethodName, member_folder.id))
コード例 #8
0
 def test_pm_WFA_no_proposal(self):
     '''No sense...'''
     pm_logger.info("Bypassing , {0} not used in MeetingSeraing".format(
         self._testMethodName))
コード例 #9
0
 def test_pm_WFA_return_to_proposing_group_with_all_validations(self):
     '''Not used yet...'''
     pm_logger.info("Bypassing , {0} not used in MeetingSeraing".format(
         self._testMethodName))
コード例 #10
0
 def test_pm_WFA_add_published_state(self):
     '''No sense...'''
     pm_logger.info("Bypassing , {0} not used in MeetingSeraing".format(
         self._testMethodName))
コード例 #11
0
 def test_pm_WFA_creator_edits_unless_closed(self):
     '''No sense...'''
     pm_logger.info("Bypassing , {0} not used in MeetingSeraing".format(
         self._testMethodName))
コード例 #12
0
 def test_pm_WFA_everyone_reads_all(self):
     '''No sense...'''
     pm_logger.info("Bypassing , {0} not used in MeetingSeraing".format(
         self._testMethodName))
コード例 #13
0
 def test_pm_WFA_no_global_observation(self):
     '''No sense...'''
     pm_logger.info("Bypassing , {0} not used in MeetingSeraing".format(
         self._testMethodName))
コード例 #14
0
 def test_pm_WFA_only_creator_may_delete(self):
     '''No sense...'''
     pm_logger.info("Bypassing , {0} not used in MeetingSeraing".format(
         self._testMethodName))
コード例 #15
0
 def test_pm_WFA_items_come_validated(self):
     '''No sense...'''
     pm_logger.info("Bypassing , {0} not used in MeetingSeraing".format(
         self._testMethodName))
コード例 #16
0
 def test_pm_RecurringItems(self):
     """Bypass this test..."""
     pm_logger.info("Bypassing , {0} not used in MeetingSeraing".format(
         self._testMethodName))
コード例 #17
0
 def test_pm_WorkflowsRemovedOnReinstall(self):
     """Bypass test as we do not control workflows, we use MeetingCommunes ones."""
     pm_logger.info("Bypassing test test_pm_WorkflowsRemovedOnReinstall")
コード例 #18
0
 def test_pm_WFA_hide_decisions_when_under_writing(self):
     '''No sense...'''
     pm_logger.info("Bypassing , {0} not used in MeetingSeraing".format(
         self._testMethodName))
コード例 #19
0
 def test_pm_searchItemsToPrevalidate(self):
     '''No sense...'''
     pm_logger.info("Bypassing , {0} not used in MeetingSeraing".format(
         self._testMethodName))
コード例 #20
0
 def test_pm_searchReviewableItems(self):
     '''Test the searchReviewableItems search.'''
     pm_logger.info("Bypassing , {0} not used in MeetingSeraing".format(
         self._testMethodName))
コード例 #21
0
    def test_pm_InstallAvailableProfiles(self):
        """This is made for subpackages to test that defined profiles
           containing an import_data works as expected."""
        ToolInitializer.getProfileData = getProfileData
        self.changeUser('admin')

        api.portal.set_registry_record(
            'collective.documentgenerator.browser.controlpanel.'
            'IDocumentGeneratorControlPanelSchema.raiseOnError_for_non_managers',
            True)

        # get current package name based on testing layer
        profile_names = self._currentSetupProfileNames(excluded=(':default', ':testing'))
        for profile_name in profile_names:
            pm_logger.info("Applying import_data of profile '%s'" % profile_name)
            # delete existing organizations and MeetingConfigs
            for cfg in self.tool.objectValues('MeetingConfig'):
                self._deleteItemAndMeetings()
                self._removeConfigObjectsFor(cfg)
                self.tool.manage_delObjects(ids=cfg.getId())
            self._removeOrganizations()
            # remove every DashboardPODTemplates stored in contacts
            to_remove = [obj.getId() for obj in self.portal.contacts.objectValues()
                         if obj.portal_type in ('person', 'DashboardPODTemplate')]
            self.portal.contacts.manage_delObjects(ids=to_remove)

            self.portal.portal_setup.runAllImportStepsFromProfile(u'profile-' + profile_name)
            # check that configured Pod templates are correctly rendered
            # there should be no message of type 'error' or 'no_pod_portal_types'
            tool = api.portal.get_tool('portal_plonemeeting')
            for cfg in tool.objectValues('MeetingConfig'):
                view = cfg.restrictedTraverse('@@check-pod-templates')
                view()
                self.assertEqual(view.messages['check_pod_template_error'], {})
                # ignore DashboardPODTemplate, it has a pod_portal_types attribute
                # but it is omitted in the form
                no_pod_portal_types = view.no_pod_portal_types.copy()
                if no_pod_portal_types:
                    no_pod_portal_types = [
                        pod_template for pod_template, dummy, dummy in
                        view.no_pod_portal_types.values()[0]
                        if pod_template.portal_type != 'DashboardPODTemplate']
                self.assertFalse(no_pod_portal_types)
                # check that there are no new keys in messages
                self.assertEqual(view.messages.keys(),
                                 ['check_pod_template_error',
                                  'check_pod_template_no_obj_found',
                                  'check_pod_template_no_pod_portal_types',
                                  'check_pod_template_not_enabled',
                                  'check_pod_template_not_managed',
                                  'check_pod_template_clean'])
                # access application to check that not errors are raised,
                # especially regarding the searches displayed in the collection portlet
                # make sure extra searches are added
                cfg.createSearches(cfg._searchesInfo())
                self.changeUser('pmCreator1')
                searches_items = self.getMeetingFolder(cfg).searches_items
                self.assertFalse('There was an error while rendering the portlet.' in searches_items())
                self.changeUser('admin')
            # clean memoize between each site because the same REQUEST especially
            # is used for every sites and this can lead to problems...
            cleanMemoize(self.portal)
        ToolInitializer.getProfileData = old__getProfileData
コード例 #22
0
    def test_pm_AnnexToPrintBehaviourWhenCloned(self):
        """When cloning an item with annexes, to the same or another MeetingConfig, the 'toPrint' field
           is kept depending on MeetingConfig.keepOriginalToPrintOfClonedItems.
           If it is True, the original value is kept, if it is False, it will use the
           MeetingConfig.annexToPrintDefault value."""
        cfg = self.meetingConfig
        cfg2 = self.meetingConfig2
        cfg2Id = cfg2.getId()
        cfg.setKeepOriginalToPrintOfClonedItems(False)
        cfg2.setKeepOriginalToPrintOfClonedItems(False)
        self.changeUser('pmManager')
        meeting = self.create('Meeting', date=DateTime('2016/02/02'))
        item = self.create('MeetingItem')
        annex = self.addAnnex(item)
        annex_config = get_config_root(annex)
        annex_group = get_group(annex_config, annex)
        self.assertFalse(annex_group.to_be_printed_activated)
        self.assertFalse(annex.to_print)
        annex.to_print = True
        self.assertTrue(annex.to_print)
        # decide the item so we may add decision annex
        item.setDecision(self.decisionText)
        self.presentItem(item)
        self.decideMeeting(meeting)
        self.do(item, 'accept')
        self.assertEquals(item.queryState(), 'accepted')
        annexDec = self.addAnnex(item, relatedTo='item_decision')
        annexDec_config = get_config_root(annexDec)
        annexDec_group = get_group(annexDec_config, annexDec)
        self.assertFalse(annexDec_group.to_be_printed_activated)
        self.assertFalse(annexDec.to_print)
        annexDec.to_print = True
        self.assertTrue(annexDec.to_print)

        # clone item locally, as keepOriginalToPrintOfClonedItems is False
        # default values defined in the config will be used
        self.assertFalse(cfg.getKeepOriginalToPrintOfClonedItems())
        clonedItem = item.clone()
        annexes = get_annexes(clonedItem, portal_types=['annex'])
        if not annexes:
            pm_logger.info('No annexes found on duplicated item clonedItem')
        cloneItemAnnex = annexes and annexes[0]
        annexesDec = get_annexes(clonedItem, portal_types=['annexDecision'])
        if not annexesDec:
            pm_logger.info(
                'No decision annexes found on duplicated item clonedItem')
        cloneItemAnnexDec = annexesDec and annexesDec[0]
        self.assertFalse(cloneItemAnnex and cloneItemAnnex.to_print)
        self.assertFalse(cloneItemAnnexDec and cloneItemAnnexDec.to_print)

        # enable keepOriginalToPrintOfClonedItems
        # some plugins remove annexes/decision annexes on duplication
        # so make sure we test if an annex is there...
        self.changeUser('siteadmin')
        cfg.setKeepOriginalToPrintOfClonedItems(True)
        self.changeUser('pmManager')
        clonedItem2 = item.clone()
        annexes = get_annexes(clonedItem2, portal_types=['annex'])
        if not annexes:
            pm_logger.info('No annexes found on duplicated item clonedItem2')
        cloneItem2Annex = annexes and annexes[0]
        annexesDec = get_annexes(clonedItem2, portal_types=['annexDecision'])
        if not annexesDec:
            pm_logger.info(
                'No decision annexes found on duplicated item clonedItem2')
        cloneItem2AnnexDec = annexesDec and annexesDec[0]
        self.assertTrue(cloneItem2Annex and cloneItem2Annex.to_print or True)
        self.assertTrue(cloneItem2AnnexDec and cloneItem2AnnexDec.to_print
                        or True)

        # clone item to another MC and test again
        # cfg2.keepOriginalToPrintOfClonedItems is True
        self.assertFalse(cfg2.getKeepOriginalToPrintOfClonedItems())
        item.setOtherMeetingConfigsClonableTo((cfg2Id, ))
        clonedToCfg2 = item.cloneToOtherMeetingConfig(cfg2Id)
        annexes = get_annexes(clonedToCfg2, portal_types=['annex'])
        if not annexes:
            pm_logger.info('No annexes found on duplicated item clonedToCfg2')
        clonedToCfg2Annex = annexes and annexes[0]
        annexesDec = get_annexes(clonedToCfg2, portal_types=['annexDecision'])
        if not annexesDec:
            pm_logger.info(
                'No decision annexes found on duplicated item clonedToCfg2')
        self.assertFalse(clonedToCfg2Annex and clonedToCfg2Annex.to_print)

        # enable keepOriginalToPrintOfClonedItems
        self.changeUser('siteadmin')
        cfg2.setKeepOriginalToPrintOfClonedItems(True)
        self.deleteAsManager(clonedToCfg2.UID())
        # send to cfg2 again
        self.changeUser('pmManager')
        clonedToCfg2Again = item.cloneToOtherMeetingConfig(cfg2Id)
        annexes = get_annexes(clonedToCfg2Again, portal_types=['annex'])
        if not annexes:
            pm_logger.info(
                'No annexes found on duplicated item clonedToCfg2Again')
        clonedToCfg2AgainAnnex = annexes and annexes[0]
        annexesDec = get_annexes(clonedToCfg2Again,
                                 portal_types=['annexDecision'])
        if not annexesDec:
            pm_logger.info(
                'No decision annexes found on duplicated item clonedToCfg2Again'
            )
        self.assertTrue(
            clonedToCfg2AgainAnnex and clonedToCfg2AgainAnnex.to_print or True)