コード例 #1
0
    def schedule_text(self):
        """Schedule the given Text (request parameter `title`) for the current
        meeting.
        """
        self.check_editable()
        title = safe_unicode(self.request.get('title'))
        if not title:
            return JSONResponse(self.request).error(
                _('empty_proposal',
                  default=u"Proposal must not be empty.")).proceed().dump()

        if is_word_meeting_implementation_enabled():
            try:
                self.meeting.schedule_ad_hoc(title)
            except MissingAdHocTemplate:
                return JSONResponse(self.request).error(
                    _('missing_ad_hoc_template',
                      default=u"No ad-hoc agenda-item template has been "
                      u"configured.")).remain().dump()
            except MissingMeetingDossierPermissions:
                return JSONResponse(self.request).error(
                    _('error_no_permission_to_add_document',
                      default=u'Insufficient privileges to add a'
                      u' document to the meeting dossier.')).remain().dump()

        else:
            self.meeting.schedule_text(title)

        return JSONResponse(self.request).info(
            _('text_added',
              default=u"Text successfully added.")).proceed().dump()
コード例 #2
0
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)

        except (WrongAgendaItemState, CannotExecuteTransition):
            return JSONResponse(getRequest()).error(_(
                u'invalid_agenda_item_state',
                default=u'The agenda item is in an invalid state for '
                'this action.'),
                                                    status=403).dump()

        except Forbidden:
            return JSONResponse(getRequest()).error(_(
                u'editing_not_allowed', default=u'Editing is not allowed.'),
                                                    status=403).dump()

        except MissingMeetingDossierPermissions:
            return JSONResponse(getRequest()).error(_(
                'error_no_permission_to_add_document',
                default=u'Insufficient privileges to add a '
                u'document to the meeting dossier.'),
                                                    status=403).dump()

        except MissingAdHocTemplate:
            return JSONResponse(getRequest()).error(_(
                'missing_ad_hoc_template',
                default=u"No ad-hoc agenda-item template has been "
                u"configured."),
                                                    status=501).dump()
コード例 #3
0
    def edit(self):
        """Updates the title of the agendaitem, with the one given by the
        request parameter `title`.
        """
        self.require_agendalist_editable()

        title = self.request.get('title')
        if not title:
            return JSONResponse(self.request).error(
                _('agenda_item_update_empty_string',
                  default=u"Agenda Item title must not be empty.")).proceed(
                  ).dump()

        title = title.decode('utf-8')
        if self.agenda_item.has_proposal:
            if len(title) > ISubmittedProposal['title'].max_length:
                return JSONResponse(self.request).error(
                    _('agenda_item_update_too_long_title',
                      default=u"Agenda Item title is too long.")).proceed(
                      ).dump()

        self.agenda_item.set_title(title)
        return JSONResponse(self.request).info(
            _('agenda_item_updated',
              default=u"Agenda Item updated.")).proceed().dump()
コード例 #4
0
    def update(self):
        label = to_safe_html(self.request.get('label', self.mailaddress.label))
        mailaddress = to_safe_html(self.request.get('mailaddress', self.mailaddress.address))

        error_msg = self._validate(label, mailaddress)

        if error_msg:
            return JSONResponse(self.request).error(error_msg).dump()

        self.mailaddress.update(label=label, address=mailaddress)

        return JSONResponse(self.request).info(
            _('email_address_updated',
              default=u"Email address updated.")).proceed().dump()
コード例 #5
0
    def schedule_paragraph(self):
        """Schedule the given Paragraph (request parameter `title`) for the current
        meeting.
        """
        self.require_agendalist_editable()

        title = self.request.get('title')
        if not title:
            return JSONResponse(self.request).error(
                _('empty_paragraph', default=u"Paragraph must not be empty.")).proceed().dump()

        self.meeting.schedule_text(title, is_paragraph=True)
        return JSONResponse(self.request).info(
            _('paragraph_added', default=u"Paragraph successfully added.")
        ).proceed().dump()
コード例 #6
0
    def schedule_text(self):
        """Schedule the given Text (request parameter `title`) for the current
        meeting.
        """
        self.check_editable()
        title = self.request.get('title')
        if not title:
            return JSONResponse(self.request).error(
                _('empty_proposal',
                  default=u"Proposal must not be empty.")).proceed().dump()

        self.meeting.schedule_text(title)
        return JSONResponse(self.request).info(
            _('text_added',
              default=u"Text successfully added.")).proceed().dump()
コード例 #7
0
    def list(self):
        """Returns json list of all agendaitems for the current
        context (meeting).
        """

        return JSONResponse(
            self.request).data(items=self._get_agenda_items()).dump()
コード例 #8
0
    def decide(self):
        """Decide the current agendaitem and move the meeting in the
        held state.
        """
        self.require_editable()

        meeting_state = self.meeting.get_state()
        error_response = self._checkin_proposal_document_before_deciding()
        if error_response:
            return error_response

        self.agenda_item.decide()

        response = JSONResponse(self.request)
        if self.agenda_item.has_proposal:
            response.info(
                _(u'agenda_item_proposal_decided',
                  default=u'Agenda Item decided and excerpt generated.'))
        else:
            response.info(
                _(u'agenda_item_decided', default=u'Agenda Item decided.'))

        if meeting_state != self.meeting.get_state():
            response.redirect(self.context.absolute_url())
            msg = _(
                u'agenda_item_meeting_held',
                default=
                u"Agendaitem has been decided and the meeting has been held.")
            api.portal.show_message(message=msg,
                                    request=self.request,
                                    type='info')

        return response.dump()
コード例 #9
0
    def list(self):
        """Returns settings for the current user.
        """
        activities = []
        for group in ACTIVITY_GROUPS:
            for kind in group.get('activities'):

                kind_title = translate(ACTIVITY_TRANSLATIONS[kind],
                                       context=self.request)

                item = {
                    'kind_title': kind_title,
                    'edit_mode': True,
                    'css_class':
                    ResponseDescription.get(transition=kind).css_class,
                    'kind': kind,
                    'type_id': group.get('id')
                }

                activities.append(
                    self.add_values(kind, item, group.get('roles')))

        return JSONResponse(self.request).data(
            activities=activities,
            translations=self.get_role_translations()).dump()
コード例 #10
0
    def _checkin_proposal_document_before_deciding(self):
        if not is_word_meeting_implementation_enabled():
            # old implementation: there is no proposal document
            return

        if not self.agenda_item.has_proposal:
            # no proposal => no document to checkin
            return

        submitted_proposal = self.agenda_item.proposal.resolve_submitted_proposal(
        )
        document = submitted_proposal.get_proposal_document()
        checkout_manager = getMultiAdapter((document, self.request),
                                           ICheckinCheckoutManager)
        if checkout_manager.get_checked_out_by() is None:
            # document is not checked out
            return

        if not checkout_manager.is_checkin_allowed():
            return JSONResponse(self.request).error(
                _('agenda_item_cannot_decide_document_checked_out',
                  default=u'Cannot decide agenda item: someone else has'
                  u' checked out the document.')).remain().dump()

        checkout_manager.checkin()
コード例 #11
0
    def decide(self):
        """Decide the current agendaitem and move the meeting in the
        held state.
        """
        meeting_state = self.meeting.get_state()

        if not self.context.model.is_editable():
            raise Unauthorized("Editing is not allowed")

        self.agenda_item.decide()

        response = JSONResponse(self.request)
        if self.agenda_item.has_proposal:
            response.info(
                _(u'agenda_item_proposal_decided',
                  default=u'Agenda Item decided and excerpt generated.'))
        else:
            response.info(
                _(u'agenda_item_decided', default=u'Agenda Item decided.'))

        if meeting_state != self.meeting.get_state():
            response.redirect(self.context.absolute_url())
            msg = _(
                u'agenda_item_meeting_held',
                default=
                u"Agendaitem has been decided and the meeting has been held.")
            api.portal.show_message(message=msg,
                                    request=self.request,
                                    type='info')

        return response.dump()
コード例 #12
0
 def wrapper(self, *args, **kwargs):
     if not self.meeting.is_editable():
         return (JSONResponse(self.request)
                 .error(MSG_NOT_ALLOWED_TO_CHANGE_MEETING)
                 .remain()
                 .dump())
     return func(self, *args, **kwargs)
コード例 #13
0
    def __call__(self):
        """Schedule the current proposal on the current meeting.
        """
        proposals = map(lambda proposal: {
            'title': proposal.resolve_submitted_proposal().title,
            'submitted_proposal_url': proposal.get_submitted_url(),
            'schedule_url': self.schedule_url(proposal)},
                        self.context.get_unscheduled_proposals())

        return JSONResponse(self.request).data(items=proposals).dump()
コード例 #14
0
    def revise(self):
        """Revise the current agendaitem. Set the workflow state to decided
        to indicate that editing is no longer possible.
        """
        self.require_editable()

        self.agenda_item.revise()
        return JSONResponse(self.request).info(
            _(u'agenda_item_revised',
              default=u'Agenda Item revised successfully.')).dump()
コード例 #15
0
    def add(self):
        label = to_safe_html(self.request.get('label'))
        mailaddress = to_safe_html(self.request.get('mailaddress'))

        error_msg = self._validate(label, mailaddress)

        if error_msg:
            return JSONResponse(self.request).error(error_msg).dump()

        mail_object = MailAddress(label=label,
                                  address=mailaddress,
                                  contact_id=self.context.model.person_id)

        self.session.add(mail_object)

        msg = _(u'info_mailaddress_created',
                u'The email address was created successfully')

        return JSONResponse(self.request).info(msg).proceed().dump()
コード例 #16
0
    def schedule_text(self):
        """Schedule the given Text (request parameter `title`) for the current
        meeting.
        """
        self.require_agendalist_editable()

        title = safe_unicode(self.request.get('title'))
        if not title:
            return JSONResponse(self.request).error(
                _('empty_proposal',
                  default=u"Proposal must not be empty.")).proceed().dump()

        if is_word_meeting_implementation_enabled():
            self.meeting.schedule_ad_hoc(title)
        else:
            self.meeting.schedule_text(title)

        return JSONResponse(self.request).info(
            _('text_added',
              default=u"Text successfully added.")).proceed().dump()
コード例 #17
0
    def reopen(self):
        """Reopen the current agendaitem. Set the workflow state to revision
        to indicate that editing is possible again.
        """
        self.require_editable()

        self.agenda_item.reopen()

        return JSONResponse(self.request).info(
            _(u'agenda_item_reopened',
              default=u'Agenda Item successfully reopened.')).dump()
コード例 #18
0
    def render(self):
        if self._has_write_conflict:
            msg = _(u'message_write_conflict',
                    default='Your changes were not saved, the protocol has '
                            'been modified in the meantime.')
            return JSONResponse(self.request).data(hasConflict=True).dump()

        elif self._is_locked_by_another_user:
            msg = _(u'message_locked_by_another_user',
                    default='Your changes were not saved, the protocol is '
                            'locked by ${username}.',
                    mapping={'username': self.get_lock_creator_user_name()})
            return JSONResponse(self.request).error(msg).dump()

        elif self._has_successfully_saved:
            api.portal.show_message(
                _(u'message_changes_saved', default='Changes saved'),
                self.request)
            return JSONResponse(self.request).redirect(self.nextURL()).dump()

        return self.template()
コード例 #19
0
    def generate_excerpt(self):
        """Generate an excerpt of an agenda item and store it in
        the meeting dossier.
        """
        self.require_editable()

        self.agenda_item.generate_excerpt(
            title=self.request.form['excerpt_title'])

        return (JSONResponse(self.request).info(
            _('excerpt_generated',
              default=u'Excerpt was created successfully.')).proceed().dump())
コード例 #20
0
    def delete(self):
        """Unschedule the current agenda_item. If the agenda_item has no
        proposal, the agenda_item gets deleted. If there is a proposal related,
        the proposal is unscheduled.
        """
        self.require_agendalist_editable()

        self.agenda_item.remove()

        return JSONResponse(self.request).info(
            _(u'agenda_item_deleted',
              default=u'Agenda Item Successfully deleted')).dump()
コード例 #21
0
    def update_order(self):
        """Updates the order of the agendaitems. The new sortOrder is expected
        in the request parameter `sortOrder`.
        """
        self.require_agendalist_editable()

        self.meeting.reorder_agenda_items(
            json.loads(self.request.get('sortOrder')))

        return JSONResponse(self.request).info(
            _('agenda_item_order_updated',
              default=u"Agenda Item order updated.")).dump()
コード例 #22
0
    def revise(self):
        """Revise the current agendaitem. Set the workflow state to decided
        to indicate that editing is no longer possible.
        """
        if not self.context.model.is_editable():
            raise Unauthorized("Editing is not allowed")

        self.agenda_item.revise()

        return JSONResponse(self.request).info(
            _(u'agenda_item_revised',
              default=u'Agenda Item revised successfully.')).dump()
コード例 #23
0
    def schedule_proposal(self):
        """Schedule the current proposal on the current meeting.
        """
        self.require_editable()

        proposal = Proposal.get(self.proposal_id)
        if not proposal:
            raise NotFound

        self.meeting.schedule_proposal(proposal)
        return JSONResponse(self.request).info(
            _('Scheduled Successfully')).proceed().dump()
コード例 #24
0
    def generate_excerpt(self):
        """Generate an excerpt of an agenda item and store it in
        the meeting dossier.
        """
        if not self.context.model.is_editable():
            raise Unauthorized("Editing is not allowed")

        if not self.agenda_item.can_generate_excerpt():
            raise Forbidden('Generating excerpt is not allowed in this state.')

        try:
            self.agenda_item.generate_excerpt(
                title=self.request.form['excerpt_title'])
        except MissingMeetingDossierPermissions:
            return (JSONResponse(self.request).error(
                _('error_no_permission_to_add_document',
                  default=u'Insufficient privileges to add a'
                  u' document to the meeting dossier.')).remain().dump())

        return (JSONResponse(self.request).info(
            _('excerpt_generated',
              default=u'Excerpt was created successfully.')).proceed().dump())
コード例 #25
0
    def update_order(self):
        """Updates the order of the agendaitems. The new sortOrder is expected
        in the request parameter `sortOrder`.
        """
        if not self.context.model.is_editable():
            raise Unauthorized("Editing is not allowed")

        self.context.model.reorder_agenda_items(
            json.loads(self.request.get('sortOrder')))

        return JSONResponse(self.request).info(
            _('agenda_item_order_updated',
              default=u"Agenda Item order updated.")).dump()
コード例 #26
0
    def delete(self):
        """Unschedule the current agenda_item. If the agenda_item has no
        proposal, the agenda_item gets deleted. If there is a proposal related,
        the proposal is unscheduled.
        """

        if not self.context.model.is_editable():
            raise Unauthorized("Editing is not allowed")

        self.agenda_item.remove()

        return JSONResponse(self.request).info(
            _(u'agenda_item_deleted',
              default=u'Agenda Item Successfully deleted')).dump()
コード例 #27
0
    def __call__(self):
        transition = self.request.get('transition')
        if not self.is_valid_transition(transition):
            raise NotFound

        self.execute_transition(transition)
        msg = _('label_transition_executed',
                default='Transition ${transition} executed',
                mapping={
                    'transition':
                    Meeting.workflow.transitions.get(transition).title
                })

        return JSONResponse(self.request).redirect(
            self.model.get_url()).info(msg).dump()
コード例 #28
0
    def change_presence(self):
        """Change the presence of a participant.
        """
        response = JSONResponse(self.request)
        present = self.request.form.get('present', None)
        member = self.get_member()
        if not present or not member:
            return response.error(MSG_SAVE_FAILURE).remain().dump()

        present = json.loads(present)
        if present and member not in self.meeting.participants:
            self.meeting.participants.append(member)
        elif not present and member in self.meeting.participants:
            self.meeting.participants.remove(member)
        return response.proceed().dump()
コード例 #29
0
    def reset(self):
        """Reset a personal setting
        """
        kind = self.request.form['kind']

        if ALIASES.get(kind):
            kinds = ALIASES.get(kind)
        else:
            kinds = (kind, )

        for kind in kinds:
            setting = self.get_setting(kind)
            create_session().delete(setting)

        return JSONResponse(self.request).proceed().dump()
コード例 #30
0
    def return_excerpt(self):
        """Return an excerpt for a proposal to the dossier the proposal
        originated from.
        """
        doc_uuid = self.request.get('document')
        if not doc_uuid:
            raise BadRequest("No excerpt document provided.")

        document = self._get_excerpt_doc_by_uuid(doc_uuid)
        if not document:
            raise NotFound(
                "Could not find excerpt document {}".format(doc_uuid))

        self.agenda_item.return_excerpt(document)
        return (JSONResponse(self.request).info(
            _('excerpt_returned',
              default=u'Excerpt was returned to proposer.')).proceed().dump())