Ejemplo n.º 1
0
    def __call__(self):
        # Enable border to show the zip export action also for
        # committee members. Because the plone_view's `showEditableBorder`
        # checks for `ModifyPortalContent`, we have to enable the border
        # manually.
        self.request.set('enable_border', True)

        # Check that user permissions on the meeting dossier match his permissions
        # on the meeting_dossier, as otherwise several elements in the meeting view
        # will break.
        meeting_dossier = self.model.get_dossier()
        committee = self.model.committee.resolve_committee()
        if (api.user.has_permission('Modify portal content', obj=committee) and not
                api.user.has_permission('Modify portal content', obj=meeting_dossier) and not
                self.model.is_closed()):
            self.error_message = translate(
                _("no_edit_permissions_on_meeting_dossier",
                  default="User does not have permission to edit the meeting dossier:"),
                context=self.request)
            self.meeting_dossier_link = linked(meeting_dossier,
                                               meeting_dossier.Title())
            return self.error_template()

        elif (api.user.has_permission('View', obj=committee) and not
              api.user.has_permission('View', obj=meeting_dossier)):
            self.error_message = translate(
                _("no_view_permissions_on_meeting_dossier",
                  default="User does not have permission to view the meeting dossier:"),
                context=self.request)
            self.meeting_dossier_link = linked(meeting_dossier,
                                               meeting_dossier.Title(),
                                               with_tooltip=False)
            return self.error_template()

        return self.template()
Ejemplo n.º 2
0
    def test_linked_helper_adds_uid_data_attribute_using_brain(self, browser):
        self.login(self.regular_user, browser)
        uid = IUUID(self.dossier)
        brain = self.portal.portal_catalog(UID=uid)[0]

        browser.open_html(linked(brain, 'Dummy'))
        self.assertEquals(browser.css('a').first.attrib['data-uid'], uid)
Ejemplo n.º 3
0
    def byline_items(self):
        meeting = self.context.model
        yield {
            'class':
            'byline-meeting-wf-state-{}'.format(meeting.workflow_state),
            'label': _('meeting_byline_workflow_state', default='State'),
            'content': meeting.get_state().title
        }

        yield {
            'label': _('meeting_byline_start', default='Start'),
            'content': meeting.get_start()
        }

        if meeting.get_end():
            yield {
                'label': _('meeting_byline_end', default='End'),
                'content': meeting.get_end()
            }

        yield self.get_role_item(
            'byline-presidency',
            _('meeting_byline_presidency', default='Presidency'),
            meeting.presidency)
        yield self.get_role_item(
            'byline-secretary',
            _('meeting_byline_secretary', default='Secretary'),
            meeting.secretary)

        if meeting.location:
            yield {
                'label': _('meeting_byline_location', default='Location'),
                'content': meeting.location
            }

        dossier = meeting.get_dossier()
        if api.user.has_permission('View', obj=dossier):
            dossier_html = linked(dossier, dossier.Title())
        else:
            no_access_tooltip = safe_unicode(
                translate(
                    _(u'You are not allowed to view the meeting dossier.'),
                    context=self.request))
            dossier_html = (
                u'<span class="{classes}">'
                u'<span class="no_access" title="{no_access_tooltip}">'
                u'{title}</span></span>').format(
                    classes=safe_unicode(get_css_class(dossier)),
                    no_access_tooltip=escape_html(no_access_tooltip),
                    title=escape_html(safe_unicode(dossier.Title())))

        yield {
            'label': _('meeting_byline_meetin_dossier',
                       default='Meeting dossier'),
            'content': dossier_html,
            'replace': True
        }
Ejemplo n.º 4
0
    def __call__(self):
        # Enable border to show the zip export action also for
        # committee members. Because the plone_view's `showEditableBorder`
        # checks for `ModifyPortalContent`, we have to enable the border
        # manually.
        self.request.set('enable_border', True)

        # Check that user permissions on the meeting dossier match his permissions
        # on the meeting_dossier, as otherwise several elements in the meeting view
        # will break.
        meeting_dossier = self.model.get_dossier()
        committee = self.model.committee.resolve_committee()
        if (api.user.has_permission('Modify portal content', obj=committee)
                and not api.user.has_permission('Modify portal content',
                                                obj=meeting_dossier)
                and not self.model.is_closed()):
            self.error_message = translate(_(
                "no_edit_permissions_on_meeting_dossier",
                default=
                "User does not have permission to edit the meeting dossier:"),
                                           context=self.request)
            self.meeting_dossier_link = linked(meeting_dossier,
                                               meeting_dossier.Title())
            return self.error_template()

        elif (api.user.has_permission('View', obj=committee)
              and not api.user.has_permission('View', obj=meeting_dossier)):
            self.error_message = translate(_(
                "no_view_permissions_on_meeting_dossier",
                default=
                "User does not have permission to view the meeting dossier:"),
                                           context=self.request)
            self.meeting_dossier_link = linked(meeting_dossier,
                                               meeting_dossier.Title(),
                                               with_tooltip=False)
            return self.error_template()

        return self.template()
Ejemplo n.º 5
0
    def byline_items(self):
        meeting = self.context.model
        yield {'class': 'byline-meeting-wf-state-{}'.format(meeting.workflow_state),
               'label': _('meeting_byline_workflow_state', default='State'),
               'content': meeting.get_state().title}

        yield {'label': _('meeting_byline_start', default='Start'),
               'content': meeting.get_start()}

        if meeting.get_end():
            yield {'label': _('meeting_byline_end', default='End'),
                   'content': meeting.get_end()}

        yield self.get_role_item(
            'byline-presidency',
            _('meeting_byline_presidency', default='Presidency'),
            meeting.presidency)
        yield self.get_role_item(
            'byline-secretary',
            _('meeting_byline_secretary', default='Secretary'),
            meeting.secretary)

        if meeting.location:
            yield {'label': _('meeting_byline_location', default='Location'),
                   'content': meeting.location}

        dossier = meeting.get_dossier()
        if api.user.has_permission('View', obj=dossier):
            dossier_html = linked(dossier, dossier.Title())
        else:
            no_access_tooltip = safe_unicode(translate(
                _(u'You are not allowed to view the meeting dossier.'),
                context=self.request))
            dossier_html = (
                u'<span class="{classes}">'
                u'<span class="no_access" title="{no_access_tooltip}">'
                u'{title}</span></span>').format(
                    classes=safe_unicode(get_css_class(dossier)),
                    no_access_tooltip=escape_html(no_access_tooltip),
                    title=escape_html(safe_unicode(dossier.Title())))

        yield {'label': _('meeting_byline_meetin_dossier', default='Meeting dossier'),
               'content': dossier_html,
               'replace': True}
Ejemplo n.º 6
0
    def byline_items(self):
        meeting = self.context.model
        yield {'class': 'byline-meeting-wf-state-{}'.format(meeting.workflow_state),
               'label': _('meeting_byline_workflow_state', default='State'),
               'content': meeting.get_state().title}

        yield {'label': _('meeting_byline_start', default='Start'),
               'content': meeting.get_start()}

        if meeting.get_end():
            yield {'label': _('meeting_byline_end', default='End'),
                   'content': meeting.get_end()}

        yield self.get_role_item(
            'byline-presidency',
            _('meeting_byline_presidency', default='Presidency'),
            meeting.presidency)
        yield self.get_role_item(
            'byline-secretary',
            _('meeting_byline_secretary', default='Secretary'),
            meeting.secretary)

        if meeting.location:
            yield {'label': _('meeting_byline_location', default='Location'),
                   'content': meeting.location}

        dossier = meeting.get_dossier()
        with_tooltip = False
        if api.user.has_permission('View', obj=dossier):
            with_tooltip = True

        dossier_html = linked(dossier, dossier.Title(), with_tooltip=with_tooltip)

        yield {'label': _('meeting_byline_meetin_dossier', default='Meeting dossier'),
               'content': dossier_html,
               'replace': True}
Ejemplo n.º 7
0
    def deliver_documents_and_complete_task(self, formdata, response):
        """Delivers the selected documents to the predecesser task and
        complete the task:

        - Copy the documents to the predecessor task (no new responses)
        - Execute workflow transition (no new response)
        - Add a new response indicating the workflow transition, the added
        documents and containing the entered response text.
        """

        # add documents to the response
        response.added_object = PersistentList()

        predecessor = Task.query.by_oguid(self.context.predecessor)

        transporter = Transporter()
        intids = getUtility(IIntIds)

        data = {'documents': [],
                'text': formdata['text'],
                'transition': formdata['transition']}

        related_ids = []
        if getattr(self.context, 'relatedItems'):
            related_ids = [item.to_id for item in self.context.relatedItems]

        for doc_intid in formdata['documents']:
            doc = intids.getObject(int(doc_intid))
            data['documents'].append(transporter.extract(doc))

            # add a releation when a document from the dossier was selected
            if int(doc_intid) not in related_ids:
                # check if its a relation
                if aq_parent(aq_inner(doc)) != self.context:
                    # add relation to doc on task
                    if self.context.relatedItems:
                        self.context.relatedItems.append(
                            RelationValue(int(doc_intid)))
                    else:
                        self.context.relatedItems = [
                            RelationValue(int(doc_intid))]

                    # add response change entry for this relation
                    if not response.relatedItems:
                        response.relatedItems = [RelationValue(int(doc_intid))]
                    else:
                        response.relatedItems.append(
                            RelationValue(int(doc_intid)))

                    # set relation flag
                    doc._v__is_relation = True
                    response.add_change('relatedItems',
                        _(u'label_related_items', default=u"Related Items"),
                        '',
                        linked(doc, doc.Title()))

                else:
                    # add entry to the response for this document
                    response.added_object.append(RelationValue(int(doc_intid)))
            else:
                # append only the relation on the response
                doc._v__is_relation = True
                response.add_change('relatedItems',
                    _(u'label_related_items', default=u"Related Items"),
                    '',
                    linked(doc, doc.Title()))

        request_data = {'data': json.dumps(data)}
        response = dispatch_request(
            predecessor.admin_unit_id,
            '@@complete_successor_task-receive_delivery',
            predecessor.physical_path,
            data=request_data)

        if response.read().strip() != 'OK':
            raise Exception('Delivering documents and updating task failed '
                            'on remote client %s.' % predecessor.admin_unit_id)
Ejemplo n.º 8
0
    def deliver_documents_and_complete_task(self, formdata, response):
        """Delivers the selected documents to the predecesser task and
        complete the task:

        - Copy the documents to the predecessor task (no new responses)
        - Execute workflow transition (no new response)
        - Add a new response indicating the workflow transition, the added
        documents and containing the entered response text.
        """

        predecessor = Task.query.by_oguid(self.context.predecessor)

        transporter = Transporter()
        intids = getUtility(IIntIds)

        data = {
            'documents': [],
            'text': formdata['text'],
            'transition': formdata['transition']
        }

        related_ids = []
        if getattr(self.context, 'relatedItems'):
            related_ids = [item.to_id for item in self.context.relatedItems]

        for doc_intid in formdata['documents']:
            doc = intids.getObject(int(doc_intid))
            data['documents'].append(transporter.extract(doc))

            # add a releation when a document from the dossier was selected
            if int(doc_intid) not in related_ids:
                # check if its a relation
                if aq_parent(aq_inner(doc)) != self.context:
                    # add relation to doc on task
                    if self.context.relatedItems:
                        self.context.relatedItems.append(
                            RelationValue(int(doc_intid)))
                    else:
                        self.context.relatedItems = [
                            RelationValue(int(doc_intid))
                        ]

                    # add response change entry for this relation
                    response.add_related_item(RelationValue(int(doc_intid)))

                    # set relation flag
                    doc._v__is_relation = True
                    response.add_change(
                        'relatedItems', '', linked(doc, doc.Title()),
                        _(u'label_related_items', default=u"Related Items"))

                else:
                    # add entry to the response for this document
                    response.added_objects.append(RelationValue(
                        int(doc_intid)))
            else:
                # append only the relation on the response
                doc._v__is_relation = True
                response.add_change(
                    'relatedItems', '', linked(doc, doc.Title()),
                    _(u'label_related_items', default=u"Related Items"))

        request_data = {'data': json.dumps(data)}
        response = dispatch_request(
            predecessor.admin_unit_id,
            '@@complete_successor_task-receive_delivery',
            predecessor.physical_path,
            data=request_data)

        response_body = response.read()
        if response_body.strip() != 'OK':
            raise Exception('Delivering documents and updating task failed '
                            'on remote client %s.' % predecessor.admin_unit_id)
Ejemplo n.º 9
0
    def handleSubmit(self, action):
        data, errors = self.extractData()
        if errors:
            errorMessage = '<ul>'
            for error in errors:
                if errorMessage.find(error.message):
                    errorMessage += '<li>' + error.message + '</li>'
            errorMessage += '</ul>'
            self.status = errorMessage
            return None

        else:
            new_response = Response(data.get('text'))
            #define responseTyp
            responseCreator = new_response.creator
            task = aq_inner(self.context)

            if responseCreator == '(anonymous)':
                new_response.type = 'additional'
            if responseCreator == task.Creator():
                new_response.type = 'clarification'

            if data.get('transition', None):
                new_response.transition = data.get('transition', None)

            #if util.getManagersVocab.getTerm(responseCreator):
            #   new_response.type =  'reply'
            #check transition
            if data.get('transition',
                        None) in ('task-transition-open-resolved',
                                  'task-transition-in-progress-resolved'):

                completion_date = datetime.date.today()

            else:
                completion_date = None

            #check other fields
            options = [
                # (task.deadline, data.get('deadline'), 'deadline',
                #  _('deadline')),
                (task.date_of_completion, completion_date,
                 'date_of_completion', _('date_of_completion'))
            ]
            for task_field, resp_field, option, title in options:
                if resp_field and task_field != resp_field:
                    new_response.add_change(option, title, task_field,
                                            resp_field)
                    task.__setattr__(option, resp_field)

            # save relatedItems on task
            related_ids = []
            if getattr(task, 'relatedItems'):
                related_ids = [item.to_id for item in task.relatedItems]

            relatedItems = data.get('relatedItems') or []
            intids = getUtility(IIntIds)
            for item in relatedItems:
                to_id = intids.getId(item)
                # relation allready exists
                item._v__is_relation = True
                if to_id not in related_ids:
                    if getattr(task, 'relatedItems'):
                        task.relatedItems.append(RelationValue(to_id))
                    else:
                        setattr(task, 'relatedItems', [RelationValue(to_id)])

                new_response.add_change(
                    'relatedItems',
                    _(u'label_related_items', default=u"Related Items"), '',
                    linked(item, item.Title()))

            # change workflow state of task
            if data.get('transition'):
                wftool = getToolByName(self.context, 'portal_workflow')
                before = wftool.getInfoFor(self.context, 'review_state')
                if data.get('transition') != before:
                    before = wftool.getTitleForStateOnType(before, task.Type())
                    wftool.doActionFor(self.context, data.get('transition'))
                    after = wftool.getInfoFor(self.context, 'review_state')
                    after = wftool.getTitleForStateOnType(after, task.Type())
                    new_response.add_change('review_state', _(u'Issue state'),
                                            before, after)

            container = IResponseContainer(self.context)
            container.add(new_response)

            notify(ObjectModifiedEvent(self.context))

            if data.get('transition'):
                syncer = getMultiAdapter((self.context, self.request),
                                         IWorkflowStateSyncer)
                syncer.change_remote_tasks_workflow_state(
                    data.get('transition'), text=data.get('text'))

            copy_related_documents_view = self.context.restrictedTraverse(
                '@@copy-related-documents-to-inbox')
            if copy_related_documents_view.available():
                url = os.path.join(self.context.absolute_url(),
                                   '@@copy-related-documents-to-inbox')
            else:
                url = self.context.absolute_url()
            self.request.RESPONSE.redirect(url)
            return new_response
Ejemplo n.º 10
0
 def test_linked_helper_adds_uid_data_attribute_using_obj(self, browser):
     self.login(self.regular_user, browser)
     browser.open_html(linked(self.dossier, 'Title'))
     self.assertEquals(browser.css('a').first.attrib['data-uid'],
                       IUUID(self.dossier))
Ejemplo n.º 11
0
    def handleSubmit(self, action):
        data, errors = self.extractData()
        if errors:
            errorMessage = '<ul>'
            for error in errors:
                if errorMessage.find(error.message):
                    errorMessage += '<li>' + error.message + '</li>'
            errorMessage += '</ul>'
            self.status = errorMessage
            return None

        else:
            new_response = Response(data.get('text'))
            #define responseTyp
            responseCreator = new_response.creator
            task = aq_inner(self.context)

            if responseCreator == '(anonymous)':
                new_response.type = 'additional'
            if responseCreator == task.Creator():
                new_response.type = 'clarification'

            if data.get('transition', None):
                new_response.transition = data.get('transition', None)

            #if util.getManagersVocab.getTerm(responseCreator):
            #   new_response.type =  'reply'
            #check transition
            if data.get('transition', None) in (
                'task-transition-open-resolved',
                'task-transition-in-progress-resolved'):

                completion_date = datetime.date.today()

            else:
                completion_date = None

            #check other fields
            options = [
                # (task.deadline, data.get('deadline'), 'deadline',
                #  _('deadline')),
                (task.date_of_completion, completion_date,
                 'date_of_completion', _('date_of_completion'))]
            for task_field, resp_field, option, title in options:
                if resp_field and task_field != resp_field:
                    new_response.add_change(option,
                                            title,
                                            task_field,
                                            resp_field)
                    task.__setattr__(option, resp_field)

            # save relatedItems on task
            related_ids = []
            if getattr(task, 'relatedItems'):
                related_ids = [item.to_id for item in task.relatedItems]

            relatedItems = data.get('relatedItems') or []
            intids = getUtility(IIntIds)
            for item in relatedItems:
                to_id = intids.getId(item)
                # relation allready exists
                item._v__is_relation = True
                if to_id not in related_ids:
                    if getattr(task, 'relatedItems'):
                        task.relatedItems.append(RelationValue(to_id))
                    else:
                        setattr(task, 'relatedItems', [RelationValue(to_id)])

                new_response.add_change('relatedItems',
                                        _(u'label_related_items',
                                          default=u"Related Items"),
                                        '',
                                        linked(item, item.Title()))

            # change workflow state of task
            if data.get('transition'):
                wftool = getToolByName(self.context, 'portal_workflow')
                before = wftool.getInfoFor(self.context, 'review_state')
                if data.get('transition') != before:
                    before = wftool.getTitleForStateOnType(before, task.Type())
                    wftool.doActionFor(self.context, data.get('transition'))
                    after = wftool.getInfoFor(self.context, 'review_state')
                    after = wftool.getTitleForStateOnType(after, task.Type())
                    new_response.add_change('review_state', _(u'Issue state'),
                                            before, after)

            container = IResponseContainer(self.context)
            container.add(new_response)

            notify(ObjectModifiedEvent(self.context))

            if data.get('transition'):
                syncer = getMultiAdapter((self.context, self.request),
                                         IWorkflowStateSyncer)
                syncer.change_remote_tasks_workflow_state(
                    data.get('transition'), text=data.get('text'))

            copy_related_documents_view = self.context.restrictedTraverse(
                '@@copy-related-documents-to-inbox')
            if copy_related_documents_view.available():
                url = os.path.join(self.context.absolute_url(),
                                   '@@copy-related-documents-to-inbox')
            else:
                url = self.context.absolute_url()
            self.request.RESPONSE.redirect(url)
            return new_response
Ejemplo n.º 12
0
    def deliver_documents_and_complete_task(self, formdata, response):
        """Delivers the selected documents to the predecesser task and
        complete the task:

        - Copy the documents to the predecessor task (no new responses)
        - Execute workflow transition (no new response)
        - Add a new response indicating the workflow transition, the added
        documents and containing the entered response text.
        """

        # add documents to the response
        response.added_object = PersistentList()

        predecessor = getUtility(ITaskQuery).get_task_by_oguid(self.context.predecessor)

        transporter = getUtility(ITransporter)
        intids = getUtility(IIntIds)

        data = {"documents": [], "text": formdata["text"], "transition": formdata["transition"]}

        related_ids = []
        if getattr(self.context, "relatedItems"):
            related_ids = [item.to_id for item in self.context.relatedItems]

        for doc_intid in formdata["documents"]:
            doc = intids.getObject(int(doc_intid))
            data["documents"].append(transporter._extract_data(doc))

            # add a releation when a document from the dossier was selected
            if int(doc_intid) not in related_ids:
                # check if its a relation
                if aq_parent(aq_inner(doc)) != self.context:
                    # add relation to doc on task
                    if self.context.relatedItems:
                        self.context.relatedItems.append(RelationValue(int(doc_intid)))
                    else:
                        self.context.relatedItems = [RelationValue(int(doc_intid))]

                    # add response change entry for this relation
                    if not response.relatedItems:
                        response.relatedItems = [RelationValue(int(doc_intid))]
                    else:
                        response.relatedItems.append(RelationValue(int(doc_intid)))

                    # set relation flag
                    doc._v__is_relation = True
                    response.add_change(
                        "relatedItems",
                        _(u"label_related_items", default=u"Related Items"),
                        "",
                        linked(doc, doc.Title()),
                    )

                else:
                    # add entry to the response for this document
                    response.added_object.append(RelationValue(int(doc_intid)))
            else:
                # append only the relation on the response
                doc._v__is_relation = True
                response.add_change(
                    "relatedItems", _(u"label_related_items", default=u"Related Items"), "", linked(doc, doc.Title())
                )

        request_data = {"data": json.dumps(data)}
        response = remote_request(
            predecessor.client_id,
            "@@complete_successor_task-receive_delivery",
            predecessor.physical_path,
            data=request_data,
        )

        if response.read().strip() != "OK":
            raise Exception(
                "Delivering documents and updating task failed " "on remote client %s." % predecessor.client_id
            )
    def test_linked_helper_adds_uid_data_attribute_using_brain(self, browser):
        uid = IUUID(self.dossier_c)
        brain = self.portal.portal_catalog(UID=uid)[0]

        browser.open_html(linked(brain, 'Dummy'))
        self.assertEquals(browser.css('a').first.attrib['data-uid'], uid)
 def test_linked_helper_adds_uid_data_attribute_using_obj(self, browser):
     browser.open_html(linked(self.dossier_c, 'Title'))
     self.assertEquals(browser.css('a').first.attrib['data-uid'],
                       IUUID(self.dossier_c))