Example #1
0
 def createItemFromTemplate(self, templateUID):
     '''The user wants to create an item from a item template that lies in
        this meeting configuration. Item id is in the request.'''
     templateItem = uuidToObject(templateUID, unrestricted=True)
     # Create the new item by duplicating the template item
     member_id = get_current_user_id()
     template_path_and_title = safe_unicode(
         self._template_path_and_title(templateItem))
     cloneEventActionLabel = translate(
         'create_meeting_item_from_template_label_comments',
         domain='imio.history',
         mapping={
             'template_path_and_title': template_path_and_title,
         },
         context=self.request)
     # if a proposingGroup is defined on itemTemplate and current user is creator
     # for this proposingGroup, we keep it
     keepProposingGroup = False
     proposingGroup = templateItem.getProposingGroup()
     if get_plone_group_id(
             proposingGroup,
             'creators') in self.tool.get_plone_groups_for_user():
         keepProposingGroup = True
     newItem = templateItem.clone(
         newOwnerId=member_id,
         cloneEventAction='create_meeting_item_from_template',
         cloneEventActionLabel=cloneEventActionLabel,
         destFolder=self.context,
         newPortalType=self.cfg.getItemTypeName(),
         keepProposingGroup=keepProposingGroup,
         keep_ftw_labels=True)
     # set _at_creation_flag to True so if user cancel first edit, it will be removed
     newItem._at_creation_flag = True
     return newItem
Example #2
0
    def _changeCompleteness(self,
                            new_completeness_value,
                            bypassSecurityCheck=False,
                            comment=''):
        '''Helper method that change completeness and manage completeness history.'''
        # make sure new_completeness_value exists in MeetingItem.listCompleteness vocabulary
        if new_completeness_value not in self.context.listCompleteness():
            raise KeyError(
                "New value %s does not correspond to a value of MeetingItem.listCompleteness"
            )

        if not bypassSecurityCheck and new_completeness_value not in \
           self.context.unrestrictedTraverse('@@item-completeness').listSelectableCompleteness():
            raise Unauthorized
        self.context.setCompleteness(new_completeness_value)
        # add a line to the item's completeness_changes_history
        member_id = get_current_user_id()
        history_data = {
            'action': new_completeness_value,
            'actor': member_id,
            'time': DateTime(),
            'comments': comment
        }
        self.context.completeness_changes_history.append(history_data)
        self.context._update_after_edit(idxs=['getCompleteness'])
Example #3
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)
Example #4
0
    def handleSaveAdviceDelay(self, action):
        data, errors = self.extractData()
        if errors:
            self.status = self.formErrorsMessage
            return

        # check that given 'new_advice_delay' is available
        # if not available, just raise Unauthorized
        tool = api.portal.get_tool('portal_plonemeeting')
        cfg = tool.getMeetingConfig(self.context)
        newAdviceData = self.getDataForRowId(data['new_delay_row_id'])
        currentAdviceData = self.getDataForRowId(data['current_delay_row_id'])
        listAvailableDelaysView = self.context.unrestrictedTraverse('@@advice-available-delays')
        listAvailableDelaysView._initAttributes(currentAdviceData['org'])
        isAutomatic, linkedRows = cfg._findLinkedRowsFor(data['current_delay_row_id'])
        selectableDelays = listAvailableDelaysView.listSelectableDelays()
        # selectableDelays is a list of tuple containing 3 elements, the first is the row_id
        selectableDelays = [selectableDelay[0] for selectableDelay in selectableDelays]
        if not data['new_delay_row_id'] in selectableDelays:
            raise Unauthorized
        # update the advice with new delay and relevant data

        # just keep relevant infos
        dataToUpdate = ('delay',
                        'delay_label',
                        'gives_auto_advice_on_help_message',
                        'row_id')
        for elt in dataToUpdate:
            self.context.adviceIndex[currentAdviceData['org']][elt] = newAdviceData[elt]
        # if the advice was already given, we need to update row_id on the given advice object too
        if not self.context.adviceIndex[currentAdviceData['org']]['type'] == NOT_GIVEN_ADVICE_VALUE:
            adviceObj = getattr(self.context, self.context.adviceIndex[currentAdviceData['org']]['advice_id'])
            adviceObj.advice_row_id = newAdviceData['row_id']
        # if it is an optional advice, update the MeetingItem.optionalAdvisers
        if not isAutomatic:
            optionalAdvisers = list(self.context.getOptionalAdvisers(computed=True))
            # remove old value
            optionalAdvisers.remove('%s__rowid__%s' % (currentAdviceData['org'],
                                                       currentAdviceData['row_id']))
            # append new value
            optionalAdvisers.append('%s__rowid__%s' % (newAdviceData['org'],
                                                       newAdviceData['row_id']))
            self.context.setOptionalAdvisers(tuple(optionalAdvisers))
        else:
            # if it is an automatic advice, set the 'delay_for_automatic_adviser_changed_manually' to True
            self.context.adviceIndex[currentAdviceData['org']]['delay_for_automatic_adviser_changed_manually'] = True
        self.context.update_local_roles()
        # add a line to the item's adviceIndex advice delay_changes_history
        member_id = get_current_user_id()
        history_data = {'action': (currentAdviceData['delay'], newAdviceData['delay']),
                        'actor': member_id,
                        'time': DateTime(),
                        'comments': data['comment']}
        self.context.adviceIndex[currentAdviceData['org']]['delay_changes_history'].append(history_data)
        self.request.response.redirect(self.context.absolute_url() + '/#adviceAndAnnexes')
Example #5
0
    def __call__(self, context):
        context = get_context_with_request(context)
        tool = api.portal.get_tool('portal_plonemeeting')
        cfg = tool.getMeetingConfig(context)
        member_id = get_current_user_id(context.REQUEST)

        res = []
        labels = ILabelJar(cfg).list()
        for label in labels:
            if label['by_user']:
                res.append(
                    SimpleTerm('{0}:{1}'.format(member_id, label['label_id']),
                               '{0}:{1}'.format(member_id, label['label_id']),
                               '{0} (*)'.format(label['title'])))
            else:
                res.append(
                    SimpleTerm(label['label_id'], label['label_id'],
                               label['title']))
        return SimpleVocabulary(res)
Example #6
0
 def __call__(self):
     ''' '''
     delayChangesView = self.context.unrestrictedTraverse('@@advice-available-delays')
     advice_uid = self.request.get('advice')
     if not delayChangesView._mayReinitializeDelay(advice_uid):
         raise Unauthorized
     # reinit delay and add a line to the item's adviceIndex advice delay_changes_history
     _reinit_advice_delay(self.context, advice_uid)
     member_id = get_current_user_id()
     history_data = {'action': 'Reinitiatlize delay',
                     'actor': member_id,
                     'time': DateTime(),
                     'comments': None}
     adviceInfos = self.context.adviceIndex[advice_uid]
     adviceInfos['delay_changes_history'].append(history_data)
     # update local roles that will update adviceIndex
     self.context.update_local_roles()
     api.portal.show_message(_('Advice delay have been reinitialized for advice "${advice}"',
                               mapping={'advice': adviceInfos['name']}), request=self.request)
Example #7
0
    def _doApply(self, data):
        """ """
        tool = api.portal.get_tool('portal_plonemeeting')
        user_id = get_current_user_id()
        cloneEventAction = DUPLICATE_EVENT_ACTION
        setCurrentAsPredecessor = False
        manualLinkToPredecessor = False
        if data['keep_link']:
            cloneEventAction = DUPLICATE_AND_KEEP_LINK_EVENT_ACTION
            setCurrentAsPredecessor = True
            manualLinkToPredecessor = True
        # make sure data is correct
        self._check_data(data)

        # as passing empty keptAnnexIds/keptDecisionAnnexIds ignores it
        # if we unselect every annexes, we force copyAnnexes/copyDecisionAnnexes to False
        copyAnnexes = data['annex_ids'] and True or False
        copyDecisionAnnexes = data['annex_decision_ids'] and True or False
        # keep proposingGroup if current user creator for it
        keepProposingGroup = False
        proposingGroup = self.context.getProposingGroup()
        if get_plone_group_id(proposingGroup,
                              'creators') in tool.get_plone_groups_for_user():
            keepProposingGroup = True
        newItem = self.context.clone(
            copyAnnexes=copyAnnexes,
            copyDecisionAnnexes=copyDecisionAnnexes,
            newOwnerId=user_id,
            cloneEventAction=cloneEventAction,
            keepProposingGroup=keepProposingGroup,
            setCurrentAsPredecessor=setCurrentAsPredecessor,
            manualLinkToPredecessor=manualLinkToPredecessor,
            keptAnnexIds=data['annex_ids'],
            keptDecisionAnnexIds=data['annex_decision_ids'])
        self.new_item_url = newItem.absolute_url()
        api.portal.show_message(translate('item_duplicated',
                                          domain='PloneMeeting',
                                          context=self.request),
                                request=self.request)
        self._finished = True
        return newItem
Example #8
0
 def _utilsGetCurrentUserId(self, times=1):
     ''' '''
     for time in range(times):
         get_current_user_id()
Example #9
0
    def toggle(self, takenOverByFrom):
        if not self.context.adapted().mayTakeOver():
            raise Unauthorized

        memberId = get_current_user_id()

        tool = api.portal.get_tool('portal_plonemeeting')
        currentlyTakenOverBy = self.context.getTakenOverBy()
        if currentlyTakenOverBy and \
           not currentlyTakenOverBy == takenOverByFrom and \
           not currentlyTakenOverBy == memberId:
            plone_utils = api.portal.get_tool('plone_utils')
            plone_utils.addPortalMessage(self.context.translate(
                "The item you tried to take over was already taken "
                "over in between by ${fullname}. You can take it over "
                "now if you are sure that the other user do not handle it.",
                mapping={
                    'fullname':
                    unicode(tool.getUserName(currentlyTakenOverBy), 'utf-8')
                },
                domain="PloneMeeting"),
                                         type='warning')
            self.request.RESPONSE.status = 500
            return

        # toggle value
        if not currentlyTakenOverBy:
            self.context.setTakenOverBy(memberId)
            newlyTakenOverBy = memberId
        else:
            self.context.setTakenOverBy('')
            newlyTakenOverBy = ''

        css_class = 'takenOverByNobody'
        name = 'takenOverByNo'
        title_msgid = 'taken_over_by_no_edit'
        if newlyTakenOverBy:
            if memberId == newlyTakenOverBy:
                css_class = 'takenOverByCurrentUser'
            else:
                css_class = 'takenOverByOtherUser'
            name = 'takenOverByYes'
            title_msgid = 'taken_over_by_yes_edit'

        title = translate(title_msgid,
                          domain="PloneMeeting",
                          context=self.request)

        if newlyTakenOverBy:
            taken_over_by = translate('Taken over by ${fullname}',
                                      mapping={
                                          'fullname':
                                          unicode(tool.getUserName(memberId),
                                                  'utf-8')
                                      },
                                      domain="PloneMeeting",
                                      default="Taken over by ${fullname}",
                                      context=self.request)
        else:
            taken_over_by = translate('(Nobody)',
                                      domain="PloneMeeting",
                                      default="(Nobody)",
                                      context=self.request)

        html = self.IMG_TEMPLATE % (css_class, title, name, taken_over_by)
        # do not notifyModifiedAndReindex because an item may be taken over
        # when it is decided, by members of the proposingGroup
        # and in this case item must not be modified
        # cache will be invalidated because we check for modified and _p_mtime
        reindex_object(self.context,
                       idxs=['getTakenOverBy'],
                       update_metadata=False)
        return html