Beispiel #1
0
 def __call___cachekey(method, self):
     '''cachekey method for self.__call__.
        Cache is invalidated depending on :
        - current user may edit or not;
        - something is redefined for current item or not.'''
     # when using raw fields (assembly, absents, signatures, ...)
     # we invalidate if a raw value changed
     date = get_cachekey_volatile(
         'Products.PloneMeeting.browser.async.AsyncLoadItemAssemblyAndSignaturesRawFields'
     )
     tool = api.portal.get_tool('portal_plonemeeting')
     cfg = tool.getMeetingConfig(self.context)
     cfg_modified = cfg.modified()
     # cache will be invalidated if something changed about attendees on meeting
     meeting = self.context.getMeeting()
     ordered_contacts = meeting.ordered_contacts.items()
     redefined_item_attendees = meeting._get_all_redefined_attendees(
         only_keys=False)
     show_votes = self.context.show_votes()
     item_votes = self.context.get_item_votes(include_vote_number=False)
     context_uid = self.context.UID()
     item_attendees_order = meeting._get_item_attendees_order(context_uid)
     # if something redefined for context or not
     if context_uid not in str(redefined_item_attendees):
         redefined_item_attendees = []
     may_change_attendees = self.context._mayChangeAttendees()
     poll_type = self.context.getPollType()
     cache_date = self.request.get('cache_date', None)
     return (date, context_uid, cfg_modified, ordered_contacts,
             redefined_item_attendees, item_attendees_order, show_votes,
             item_votes, may_change_attendees, poll_type, cache_date)
Beispiel #2
0
 def test_get_cachekey_volatile(self):
     """Helper method that adds a volatile on the portal storing current date."""
     method_name = 'My method'
     plone_utils = api.portal.get_tool('plone_utils')
     normalized_name = plone_utils.normalizeString(method_name)
     volatile_name = '_v_{0}'.format(normalized_name)
     self.assertIsNone(getattr(self.portal, volatile_name, None))
     # calling the method will set the volatile on the portal
     date = get_cachekey_volatile(method_name)
     self.assertTrue(isinstance(date, datetime))
     self.assertTrue(isinstance(getattr(self.portal, volatile_name), datetime))
     # calling it again will still return same date
     self.assertEquals(date, get_cachekey_volatile(method_name))
     # volatiles are not removed by tearDown, remove it now to avoid
     # test isolation issues with test test_invalidate_cachekey_volatile_for
     invalidate_cachekey_volatile_for(method_name)
Beispiel #3
0
 def _check_date(item, modified_date, volatile_date):
     '''Check that item modified date was updated.'''
     new_modified_date = item.modified()
     self.assertNotEqual(modified_date, new_modified_date)
     new_volatile_date = get_cachekey_volatile(
         'Products.PloneMeeting.MeetingItem.modified')
     self.assertNotEqual(volatile_date, new_volatile_date)
     return new_modified_date, new_volatile_date
Beispiel #4
0
 def test_invalidate_cachekey_volatile_for(self):
     """Helper method that will invalidate a given volatile."""
     method_name = 'My method'
     plone_utils = api.portal.get_tool('plone_utils')
     normalized_name = plone_utils.normalizeString(method_name)
     volatile_name = '_v_{0}'.format(normalized_name)
     self.assertIsNone(getattr(self.portal, volatile_name, None))
     # calling the method if volatile does not exist does not break
     invalidate_cachekey_volatile_for(method_name)
     # set it now
     first_date = get_cachekey_volatile(method_name)
     self.assertTrue(isinstance(first_date, datetime))
     invalidate_cachekey_volatile_for(method_name)
     self.assertIsNone(getattr(self.portal, volatile_name, None))
     # if get_cachekey_volatile is called and volatile does not exist, it is created with datetime.now()
     second_date = get_cachekey_volatile(method_name)
     self.assertTrue(first_date < second_date)
Beispiel #5
0
 def test_get_cachekey_volatile(self):
     """Helper method that adds a volatile on the portal storing current date."""
     method_name = 'My method'
     plone_utils = api.portal.get_tool('plone_utils')
     normalized_name = plone_utils.normalizeString(method_name)
     volatile_name = normalized_name
     self.assertIsNone(getattr(self.portal, volatile_name, None))
     # calling the method will set the volatile on the portal
     date = get_cachekey_volatile(method_name)
     self.assertTrue(isinstance(date, datetime))
     volatiles = getattr(self.portal, VOLATILE_ATTR, {})
     self.assertTrue(isinstance(volatiles.get(volatile_name), datetime))
     # calling it again will still return same date
     self.assertEquals(date, get_cachekey_volatile(method_name))
     # volatiles are not removed by tearDown, remove it now to avoid
     # test isolation issues with test test_invalidate_cachekey_volatile_for
     invalidate_cachekey_volatile_for(method_name)
Beispiel #6
0
 def test_invalidate_cachekey_volatile_for(self):
     """Helper method that will invalidate a given volatile."""
     method_name = 'My method'
     plone_utils = api.portal.get_tool('plone_utils')
     normalized_name = plone_utils.normalizeString(method_name)
     volatile_name = normalized_name
     self.assertIsNone(getattr(self.portal, volatile_name, None))
     # calling the method if volatile does not exist does not break
     invalidate_cachekey_volatile_for(method_name)
     # set it now
     first_date = get_cachekey_volatile(method_name)
     self.assertTrue(isinstance(first_date, datetime))
     invalidate_cachekey_volatile_for(method_name)
     self.assertIsNone(getattr(self.portal, volatile_name, None))
     # if get_cachekey_volatile is called and volatile does not exist, it is created with datetime.now()
     second_date = get_cachekey_volatile(method_name)
     self.assertTrue(first_date < second_date)
Beispiel #7
0
 def __call___cachekey(method, self, context):
     '''cachekey method for self.__call__.'''
     date = get_cachekey_volatile(
         'Products.PloneMeeting.vocabularies.ftwlabelsforfacetedfiltervocabulary'
     )
     tool = api.portal.get_tool('portal_plonemeeting')
     cfg = tool.getMeetingConfig(context)
     # personal labels include current user id
     return date, cfg.getId(), cfg.modified(), get_current_user_id(
         context.REQUEST)
Beispiel #8
0
 def render_cachekey(method, self):
     '''cachekey method for self.__call__.'''
     userGroups = self.tool.get_plone_groups_for_user()
     # URL to the item can change if server URL changed
     server_url = self.request.get('SERVER_URL', None)
     # cache until an item is modified
     date = get_cachekey_volatile(
         'Products.PloneMeeting.MeetingItem.modified')
     load_portlet_todo = self.request.get('load_portlet_todo', False)
     return (repr(self.cfg), userGroups, server_url, date,
             load_portlet_todo)
Beispiel #9
0
 def __call___cachekey(method, self):
     '''cachekey method for self.__call__.'''
     tool = api.portal.get_tool('portal_plonemeeting')
     userGroups = tool.get_plone_groups_for_user()
     cfg = tool.getMeetingConfig(self.context)
     cfg_modified = cfg.modified()
     # URL to the annex_type can change if server URL changed
     server_url = self.request.get('SERVER_URL', None)
     # cache until a meeting is modified
     date = get_cachekey_volatile('Products.PloneMeeting.Meeting.modified')
     # return meeting.UID if we are on a meeting or None if not
     # as portlet is highlighting the meeting we are on
     meeting_uid = self.context.__class__.__name__ == 'Meeting' and self.context.UID(
     ) or None
     collection_uid = self.request.get('collection_uid')
     return (userGroups, cfg_modified, server_url, date, meeting_uid,
             collection_uid)
Beispiel #10
0
 def __call___cachekey(method, self):
     '''cachekey method for self.__call__.
        Cache is invalidated depending on :
        - current user may edit or not;
        - something is redefined for current item or not.'''
     date = get_cachekey_volatile(
         'Products.PloneMeeting.browser.async.AsyncLoadMeetingAssemblyAndSignatures'
     )
     tool = api.portal.get_tool('portal_plonemeeting')
     cfg = tool.getMeetingConfig(self.context)
     is_manager = tool.isManager(cfg)
     cfg_modified = cfg.modified()
     ordered_contacts = self.context.ordered_contacts.items()
     item_votes = sorted(self.context.get_item_votes().items())
     cache_date = self.request.get('cache_date', None)
     return (date, is_manager, cfg_modified, ordered_contacts, item_votes,
             repr(self.context), cache_date)
Beispiel #11
0
 def __call__(self):
     context = getContext(self.published)
     res = 'lm_0'
     if context.meta_type == 'MeetingItem':
         meeting = context.getMeeting()
         if meeting:
             res = 'lm_' + _modified(meeting)
     elif context.portal_type == 'Folder':
         # in case this is a meeting folder
         # we return last Meeting modified when using MeetingConfig.redirectToNextMeeting
         tool = api.portal.get_tool('portal_plonemeeting')
         cfg = tool.getMeetingConfig(context)
         if cfg and cfg.getRedirectToNextMeeting():
             # this changes when meeting added/removed/date changed
             meeting_date_last_modified = get_cachekey_volatile(
                 'Products.PloneMeeting.Meeting.date')
             res = 'lm_' + _modified(date=meeting_date_last_modified)
     return res
Beispiel #12
0
    def test_FinancesAdvicesWorkflow(self):
        """
           Test finances advices workflow.
        """
        def _check_date(item, modified_date, volatile_date):
            '''Check that item modified date was updated.'''
            new_modified_date = item.modified()
            self.assertNotEqual(modified_date, new_modified_date)
            new_volatile_date = get_cachekey_volatile(
                'Products.PloneMeeting.MeetingItem.modified')
            self.assertNotEqual(volatile_date, new_volatile_date)
            return new_modified_date, new_volatile_date

        cfg = self.meetingConfig
        self.changeUser('dgen')
        gic1_uid = cfg.getOrderedGroupsInCharge()[0]
        item = self.create('MeetingItem', groupsInCharge=(gic1_uid, ))
        item_uid = item.UID()
        self.assertEqual(self.transitions(item), ['proposeToValidationLevel1'])
        # ask finances advice
        fin_group_uid = finance_group_uid()
        item.setOptionalAdvisers((fin_group_uid + '__rowid__unique_id_002', ))
        item._update_after_edit()
        # advice still not askable, askable as level2 or level3
        self.assertEqual(self.transitions(item), ['proposeToValidationLevel1'])
        self.do(item, 'proposeToValidationLevel1')
        self.assertEqual(self.transitions(item),
                         ['backToItemCreated', 'proposeToValidationLevel2'])
        self.do(item, 'proposeToValidationLevel2')
        self.assertEqual(self.transitions(item), [
            'backToProposedToValidationLevel1', 'proposeToValidationLevel3',
            'wait_advices_from_proposedToValidationLevel2'
        ])
        self.do(item, 'wait_advices_from_proposedToValidationLevel2')
        # a MeetingManager is able to send back but not a normal user
        self.assertEqual(self.transitions(item), [
            'backTo_proposedToValidationLevel2_from_waiting_advices',
            'backTo_proposedToValidationLevel3_from_waiting_advices',
            'backTo_validated_from_waiting_advices'
        ])
        # but a
        self._addPrincipalToGroup('bourgmestre', self.dirgen_creators)
        self._addPrincipalToGroup('bourgmestre', self.dirgen_level1reviewers)
        self._addPrincipalToGroup('bourgmestre', self.dirgen_level2reviewers)
        self._addPrincipalToGroup('bourgmestre', self.dirgen_level3reviewers)
        self.changeUser('bourgmestre')
        self.assertTrue(self.hasPermission("View", item))
        self.assertEqual(self.transitions(item), [])

        # give advice
        self.changeUser('dfin')
        self.assertEqual(self.transitions(item), [
            'backTo_proposedToValidationLevel2_from_waiting_advices',
            'backTo_proposedToValidationLevel3_from_waiting_advices'
        ])
        # advice may be taken over
        self.assertTrue(item.adapted().mayTakeOver())
        # advice giveable when item complete
        self.assertFalse(item.adviceIndex[fin_group_uid]['advice_addable'])
        self.assertTrue(item.adapted().mayEvaluateCompleteness())
        # we will check that item modified date is invalidated when advice changed
        # this is responsible for updating collections counter in faceted portlet
        volatile_date = get_cachekey_volatile(
            'Products.PloneMeeting.MeetingItem.modified')
        item_modified = item.modified()
        item.setCompleteness('completeness_complete')
        item._update_after_edit()
        item_modified, volatile_date = _check_date(item, item_modified,
                                                   volatile_date)
        advice_portal_type = item._advicePortalTypeForAdviser(fin_group_uid)
        advice = self.addAdvice(item,
                                advice_group=fin_group_uid,
                                advice_type='positive_finance',
                                advice_portal_type=advice_portal_type)
        # item modified date was updated
        item_modified, volatile_date = _check_date(item, item_modified,
                                                   volatile_date)
        self.assertTrue(advice.advice_hide_during_redaction)
        self.assertEqual(self.transitions(advice),
                         ['proposeToFinancialController'])
        # once advice given but hidden during redaction, item may no more be sent back
        self.assertEqual(self.transitions(item), [])
        # financial controller
        self.do(advice, 'proposeToFinancialController')
        self.assertEqual(self.transitions(item), [])
        self.assertEqual(self.transitions(advice),
                         ['backToAdviceCreated', 'proposeToFinancialEditor'])
        # indexAdvisers is correctly reindexed
        advice_index_value = "delay__{0}_proposed_to_financial_controller".format(
            fin_group_uid)
        self.assertTrue(
            self.catalog(UID=item_uid, indexAdvisers=[advice_index_value]))
        # item modified date was updated
        item_modified, volatile_date = _check_date(item, item_modified,
                                                   volatile_date)
        # financial editor
        self.do(advice, 'proposeToFinancialEditor')
        self.assertEqual(self.transitions(advice), [
            'backToProposedToFinancialController', 'proposeToFinancialReviewer'
        ])
        # indexAdvisers is correctly reindexed
        advice_index_value = "delay__{0}_proposed_to_financial_editor".format(
            fin_group_uid)
        self.assertTrue(
            self.catalog(UID=item_uid, indexAdvisers=[advice_index_value]))
        # item modified date was updated
        item_modified, volatile_date = _check_date(item, item_modified,
                                                   volatile_date)
        # financial reviewer
        self.do(advice, 'proposeToFinancialReviewer')
        self.assertEqual(self.transitions(item), [])
        self.assertEqual(self.transitions(advice), [
            'backToProposedToFinancialController',
            'backToProposedToFinancialEditor', 'proposeToFinancialManager'
        ])
        # indexAdvisers is correctly reindexed
        advice_index_value = "delay__{0}_proposed_to_financial_reviewer".format(
            fin_group_uid)
        self.assertTrue(
            self.catalog(UID=item_uid, indexAdvisers=[advice_index_value]))
        # item modified date was updated
        item_modified, volatile_date = _check_date(item, item_modified,
                                                   volatile_date)
        # financial manager
        self.do(advice, 'proposeToFinancialManager')
        self.assertEqual(self.transitions(item), [])
        self.assertEqual(self.transitions(advice), [
            'backToProposedToFinancialController',
            'backToProposedToFinancialReviewer', 'signFinancialAdvice'
        ])
        # indexAdvisers is correctly reindexed
        advice_index_value = "delay__{0}_proposed_to_financial_manager".format(
            fin_group_uid)
        self.assertTrue(
            self.catalog(UID=item_uid, indexAdvisers=[advice_index_value]))
        # item modified date was updated
        item_modified, volatile_date = _check_date(item, item_modified,
                                                   volatile_date)
        # sign advice
        self.do(advice, 'signFinancialAdvice')
        self.assertEqual(self.transitions(item), [
            'backTo_proposedToValidationLevel2_from_waiting_advices',
            'backTo_proposedToValidationLevel3_from_waiting_advices',
            'backTo_validated_from_waiting_advices'
        ])
        self.assertEqual(self.transitions(advice),
                         ['backToProposedToFinancialManager'])
        self.assertFalse(advice.advice_hide_during_redaction)
        # indexAdvisers is correctly reindexed
        advice_index_value = "delay__{0}_financial_advice_signed".format(
            fin_group_uid)
        self.assertTrue(
            self.catalog(UID=item_uid, indexAdvisers=[advice_index_value]))
        # item modified date was updated
        item_modified, volatile_date = _check_date(item, item_modified,
                                                   volatile_date)
        # validate item
        self.do(item, 'backTo_validated_from_waiting_advices')
        self.assertEqual(item.query_state(), 'validated')
        # indexAdvisers is correctly reindexed
        advice_index_value = "delay__{0}_advice_given".format(fin_group_uid)
        self.assertTrue(
            self.catalog(UID=item_uid, indexAdvisers=[advice_index_value]))
        # item modified date was updated
        item_modified, volatile_date = _check_date(item, item_modified,
                                                   volatile_date)
Beispiel #13
0
def list_wf_states_cache_key(function, context, portal_type):
    return get_cachekey_volatile("%s.%s" % (function.func_name, portal_type))
Beispiel #14
0
def voc_cache_key(method, self, context):
    return get_cachekey_volatile("%s.%s" % (self.__class__.__module__, self.__class__.__name__))
Beispiel #15
0
def list_wf_states_cache_key(function, context, portal_type):
    return get_cachekey_volatile("%s.%s" % (function.func_name, portal_type))
Beispiel #16
0
def voc_cache_key(method, self, context):
    """Returns a persistent portal stored date following the given cache key.

    Must be programatically invalidated."""
    return get_cachekey_volatile(
        "%s.%s" % (self.__class__.__module__, self.__class__.__name__))
def voc_cache_key(method, self, context):
    return get_cachekey_volatile(
        "%s.%s" % (self.__class__.__module__, self.__class__.__name__))