def __call__(self):
        jsondata = self.request.get(REQUEST_KEY)
        data = encode_after_json(json.loads(jsondata))
        committee = Oguid.parse(data['committee_oguid']).resolve_object()
        proposal_oguid = Oguid.parse(data['proposal_oguid'])
        proposal = meeting_service().fetch_proposal_by_oguid(proposal_oguid)

        with elevated_privileges():
            submitted_proposal = SubmittedProposal.create(proposal, committee)

            # XXX use Transporter API?
            collector = getMultiAdapter((submitted_proposal,), IDataCollector,
                                        name='field-data')
            data['field-data']['ISubmittedProposal'] = data['field-data'].pop(
                'IProposal')
            collector.insert(data['field-data'])
            # XXX fix data types in transporter
            submitted_proposal.date_of_submission = date.today()

            # sync data to proposal after inserting field data
            submitted_proposal.sync_model(proposal_model=proposal)

            submitted_proposal.create_proposal_document(
                filename=data['file']['filename'],
                content_type=data['file']['contentType'].encode('utf-8'),
                data=base64.decodestring(data['file']['data']))

            history_data = advancedjson.loads(self.request.get('history_data'))
            IHistory(submitted_proposal).append_record(
                u'submitted', uuid=history_data['uuid'])

            self.request.response.setHeader("Content-type", "application/json")
            return json.dumps(
                {'path': '/'.join(submitted_proposal.getPhysicalPath())})
    def __call__(self):
        jsondata = self.request.get(REQUEST_KEY)
        data = encode_after_json(json.loads(jsondata))
        committee = Oguid.parse(data['committee_oguid']).resolve_object()
        proposal_oguid = Oguid.parse(data['proposal_oguid'])
        proposal = meeting_service().fetch_proposal_by_oguid(proposal_oguid)

        with elevated_privileges():
            submitted_proposal = SubmittedProposal.create(proposal, committee)

            # XXX use Transporter API?
            collector = getMultiAdapter((submitted_proposal, ),
                                        IDataCollector,
                                        name='field-data')
            data['field-data']['ISubmittedProposal'] = data['field-data'].pop(
                'IProposal')
            collector.insert(data['field-data'])
            # XXX fix data types in transporter
            submitted_proposal.date_of_submission = date.today()

            # sync data to proposal after inserting field data
            submitted_proposal.sync_model(proposal_model=proposal)

            submitted_proposal.create_proposal_document(
                filename=data['file']['filename'],
                content_type=data['file']['contentType'].encode('utf-8'),
                data=base64.decodestring(data['file']['data']))

            history_data = advancedjson.loads(self.request.get('history_data'))
            IHistory(submitted_proposal).append_record(
                u'submitted', uuid=history_data['uuid'])

            self.request.response.setHeader("Content-type", "application/json")
            return json.dumps(
                {'path': '/'.join(submitted_proposal.getPhysicalPath())})
Exemplo n.º 3
0
    def render(self):
        jsondata = self.request.get(REQUEST_KEY)
        data = json.loads(jsondata)
        committee = Oguid.parse(data['committee_oguid']).resolve_object()
        proposal_oguid = Oguid.parse(data['proposal_oguid'])
        proposal = meeting_service().fetch_proposal_by_oguid(proposal_oguid)

        with elevated_privileges():
            submitted_proposal = SubmittedProposal.create(proposal, committee)

            self.request.response.setHeader("Content-type", "application/json")
            return json.dumps(
                {'path': '/'.join(submitted_proposal.getPhysicalPath())})
Exemplo n.º 4
0
 def by_oguid(self, oguid):
     """Returns the task identified by the given int_id and admin_unit_id
     or None
     """
     if isinstance(oguid, basestring):
         oguid = Oguid.parse(oguid)
     return self.filter_by(oguid=oguid).first()
Exemplo n.º 5
0
    def sync_with_proposal(self, proposal):
        """Sync self with a plone proposal instance."""

        from opengever.meeting.model.committee import Committee

        reference_number = proposal.get_main_dossier_reference_number()
        repository_folder_title = safe_unicode(
            proposal.get_repository_folder_title())
        committee = Committee.get_one(
            oguid=Oguid.parse(proposal.committee_oguid))

        # temporarily use mapping from plone workflow state to model workflow
        # state
        workflow_state = api.content.get_state(proposal)
        new_sql_state = self.WORKFLOW_STATE_TO_SQL_STATE.get(workflow_state)
        if new_sql_state:
            self.workflow_state = new_sql_state

        self.committee = committee
        self.language = proposal.language
        self.physical_path = proposal.get_physical_path()
        self.dossier_reference_number = reference_number
        self.repository_folder_title = repository_folder_title
        self.title = proposal.title
        self.issuer = proposal.issuer
        self.description = proposal.description
        self.date_of_submission = proposal.date_of_submission
Exemplo n.º 6
0
 def by_oguid(self, oguid):
     """Returns the task identified by the given int_id and admin_unit_id
     or None
     """
     if isinstance(oguid, basestring):
         oguid = Oguid.parse(oguid)
     return self.filter_by(oguid=oguid).first()
Exemplo n.º 7
0
    def render(self):
        jsondata = self.request.get(REQUEST_KEY)
        data = json.loads(jsondata)
        committee = Oguid.parse(data['committee_oguid']).resolve_object()
        proposal_oguid = Oguid.parse(data['proposal_oguid'])
        proposal = meeting_service().fetch_proposal_by_oguid(proposal_oguid)

        with elevated_privileges():
            submitted_proposal = SubmittedProposal.create(proposal, committee)

            if is_word_meeting_implementation_enabled():
                submitted_proposal.create_proposal_document(
                    filename=data['file']['filename'],
                    content_type=data['file']['contentType'].encode('utf-8'),
                    data=base64.decodestring(data['file']['data']))

            self.request.response.setHeader("Content-type", "application/json")
            return json.dumps(
                {'path': '/'.join(submitted_proposal.getPhysicalPath())})
Exemplo n.º 8
0
    def render(self):
        oguid = Oguid.parse(self.request.get('oguid'))

        if self._is_on_different_admin_unit(oguid.admin_unit_id):
            admin_unit = ogds_service().fetch_admin_unit(oguid.admin_unit_id)
            url = self.url_for(oguid, admin_unit)
            return self.request.RESPONSE.redirect(url)

        obj = self._get_object(oguid.int_id)
        return self.request.RESPONSE.redirect(obj.absolute_url())
Exemplo n.º 9
0
    def render(self):
        oguid = Oguid.parse(self.request.get('oguid'))

        if self._is_on_different_admin_unit(oguid.admin_unit_id):
            admin_unit = ogds_service().fetch_admin_unit(oguid.admin_unit_id)
            url = self.url_for(oguid, admin_unit)
            return self.request.RESPONSE.redirect(url)

        obj = self._get_object(oguid.int_id)
        return self.request.RESPONSE.redirect(obj.absolute_url())
Exemplo n.º 10
0
    def get_committee(self, context):
        if isinstance(context, SchemaValidationData):
            # Proposal is being added through the REST-API.
            oguid = Oguid.parse(context.committee_oguid)
            return Committee.query.get_by_oguid(oguid)

        committees = context.REQUEST.form.get('form.widgets.committee', None)
        if committees:
            return Committee.query.filter_by(
                committee_id=int(committees[0])).one()

        return None
Exemplo n.º 11
0
    def test_add_favorite(self):
        favorite = Favorite(
            oguid=Oguid.parse('fd:123'),
            userid=self.regular_user.getId(),
            title=u'Testposition 1',
            position=2,
            portal_type='opengever.repositoryfolder.repositoryfolder',
            icon_class='contenttype-opengever-repository-repositoryfolder',
            plone_uid='127bad76e535451493bb5172c28eb38d')

        create_session().add(favorite)

        self.assertEqual(1, Favorite.query.count())
        self.assertEqual(u'Testposition 1', Favorite.query.one().title)
Exemplo n.º 12
0
    def test_add_favorite(self):
        favorite = Favorite(
            oguid=Oguid.parse('fd:123'),
            userid=self.regular_user.getId(),
            title=u'Testposition 1',
            position=2,
            portal_type='opengever.repositoryfolder.repositoryfolder',
            icon_class='contenttype-opengever-repository-repositoryfolder',
            plone_uid='127bad76e535451493bb5172c28eb38d')

        create_session().add(favorite)

        self.assertEqual(1, Favorite.query.count())
        self.assertEqual(u'Testposition 1', Favorite.query.one().title)
Exemplo n.º 13
0
    def lookup_object(dataself, data):
        if data.get('oguid'):
            oguid = Oguid.parse(data.get('oguid'))
            obj = oguid.resolve_object()
        elif data.get('uid'):
            uid = data.get('uid')
            catalog = api.portal.get_tool('portal_catalog')
            brains = catalog(UID=uid)
            if brains:
                obj = brains[0].getObject()

        if not obj:
            raise BadRequest('Invalid oguid/uid object could not be resolved.')

        return obj
Exemplo n.º 14
0
    def test_unique_constraint(self):
        data = {
            'oguid': Oguid.parse('fd:123'),
            'userid': self.regular_user.getId(),
            'title': u'Testposition 1',
            'position': 2,
            'portal_type': 'opengever.repositoryfolder.repositoryfolder',
            'icon_class': 'contenttype-opengever-repository-repositoryfolder',
            'plone_uid': '127bad76e535451493bb5172c28eb38d'}

        session = create_session()
        session.add(Favorite(**data))

        with self.assertRaises(IntegrityError):
            session.add(Favorite(**data))
            session.flush()
Exemplo n.º 15
0
    def test_unique_constraint(self):
        data = {
            'oguid': Oguid.parse('fd:123'),
            'userid': self.regular_user.getId(),
            'title': u'Testposition 1',
            'position': 2,
            'portal_type': 'opengever.repositoryfolder.repositoryfolder',
            'icon_class': 'contenttype-opengever-repository-repositoryfolder',
            'plone_uid': '127bad76e535451493bb5172c28eb38d'}

        session = create_session()
        session.add(Favorite(**data))

        with self.assertRaises(IntegrityError):
            session.add(Favorite(**data))
            session.flush()
    def serialize(self):
        data = {'principal': self.principal,
                'roles': self.roles,
                'cause': {
                    'id': self.cause,
                    'title': translate(
                        self.cause_title(), context=getRequest())},
                'reference': None}

        if self.reference:
            reference_obj = Oguid.parse(self.reference).resolve_object()
            data['reference'] = {
                'url': reference_obj.absolute_url(),
                'title': reference_obj.Title().decode('utf-8')}

        return data
Exemplo n.º 17
0
    def handle_continue(self, action):
        data, errors = self.extractData()

        if not errors:
            oguid = self.request.get('oguid')
            key = 'accept:%s' % oguid
            dm = getUtility(IWizardDataStorage)
            text = dm.get(key, 'text')

            # forwarding
            if dm.get(key, 'is_forwarding'):
                if dm.get(key, 'is_only_assign'):
                    transition_data = {
                        'text': text,
                        'dossier': IUUID(data['dossier'])}

                    wftool = api.portal.get_tool('portal_workflow')
                    task = wftool.doActionFor(
                        Oguid.parse(oguid).resolve_object(),
                        'forwarding-transition-assign-to-dossier',
                        comment=transition_data['text'],
                        transition_params=transition_data)

                    IStatusMessage(self.request).addStatusMessage(
                        _(u'The forwarding is now assigned to the dossier'),
                        'info')
                    self.request.RESPONSE.redirect(
                        '%s/edit' % task.absolute_url())

                else:
                    task = accept_forwarding_with_successor(
                        self.context, oguid, text, dossier=data['dossier'])
                    IStatusMessage(self.request).addStatusMessage(
                        _(u'The forwarding has been stored in the local inbox '
                          u'and the succesor task has been created'), 'info')
                    self.request.RESPONSE.redirect(
                        '%s/edit' % task.absolute_url())

            # task
            else:
                task = accept_task_with_successor(
                    data['dossier'], oguid, text)

                IStatusMessage(self.request).addStatusMessage(
                    _(u'The task has been copied to the selected dossier and '
                      u'accepted.'), 'info')
                self.request.RESPONSE.redirect(task.absolute_url())
Exemplo n.º 18
0
    def __call__(self):
        if not self.oguid_str:
            self.oguid_str = self.request.get('oguid')

        oguid = Oguid.parse(self.oguid_str)

        if self._is_on_different_admin_unit(oguid.admin_unit_id):
            admin_unit = ogds_service().fetch_admin_unit(oguid.admin_unit_id)
            url = self.url_for(oguid, admin_unit, self.view_name)

        else:
            obj = self._get_object(oguid.int_id)
            url = obj.absolute_url()
            if self.view_name:
                url = '/'.join((url, self.view_name))

        return self.request.RESPONSE.redirect(self.preserve_query_string(url))
Exemplo n.º 19
0
    def __call__(self):
        if not self.oguid_str:
            self.oguid_str = self.request.get('oguid')

        oguid = Oguid.parse(self.oguid_str)

        if self._is_on_different_admin_unit(oguid.admin_unit_id):
            admin_unit = ogds_service().fetch_admin_unit(oguid.admin_unit_id)
            url = self.url_for(oguid, admin_unit, self.view_name)

        else:
            obj = self._get_object(oguid.int_id)
            url = obj.absolute_url()
            if self.view_name:
                url = '/'.join((url, self.view_name))

        return self.request.RESPONSE.redirect(url)
Exemplo n.º 20
0
    def __call__(self):
        oguid_str = self.request.get('oguid')
        if not oguid_str:
            raise NotFound()

        oguid = Oguid.parse(oguid_str)

        with elevated_privileges():
            document = oguid.resolve_object()
            if document.is_checked_out():
                raise Unauthorized()

            transporter = Transporter()
            transporter.update(document, self.request)

            comment = translate(_(u"Updated with a newer excerpt version."),
                                context=self.request)
            Versioner(document).create_version(comment)
        return json.dumps({})
Exemplo n.º 21
0
    def set_predecessor(self, oguid):
        """Sets the predecessor on the adapted object to ``oguid``.
        Returns False if it failed.
        """
        oguid = Oguid.parse(oguid)

        # do we have it in our indexes?
        predecessor = Task.query.by_oguid(oguid)
        if not predecessor:
            return False

        # set the predecessor in the task object
        self.task.predecessor = oguid.id
        modified(self.task)

        # keep predecessor's issuing_org_unit
        successor = self.task.get_sql_object()
        successor.issuing_org_unit = predecessor.issuing_org_unit

        return True
Exemplo n.º 22
0
    def set_predecessor(self, oguid):
        """Sets the predecessor on the adapted object to ``oguid``.
        Returns False if it failed.
        """
        oguid = Oguid.parse(oguid)

        # do we have it in our indexes?
        predecessor = Task.query.by_oguid(oguid)
        if not predecessor:
            return False

        # set the predecessor in the task object
        self.task.predecessor = oguid.id
        modified(self.task)

        # keep predecessor's issuing_org_unit
        successor = self.task.get_sql_object()
        successor.issuing_org_unit = predecessor.issuing_org_unit

        return True
Exemplo n.º 23
0
    def render(self):
        oguid_str = self.request.get('oguid')
        if not oguid_str:
            raise NotFound()

        oguid = Oguid.parse(oguid_str)

        with elevated_privileges():
            document = oguid.resolve_object()
            if document.is_checked_out():
                raise Unauthorized()

            transporter = Transporter()
            transporter.update(document, self.request)

            repository = api.portal.get_tool('portal_repository')
            comment = translate(_(u"Updated with a newer excerpt version."),
                                context=self.request)
            repository.save(obj=document, comment=comment)
        return json.dumps({})
Exemplo n.º 24
0
    def render(self):
        oguid_str = self.request.get('oguid')
        if not oguid_str:
            raise NotFound()

        oguid = Oguid.parse(oguid_str)

        with elevated_privileges():
            document = oguid.resolve_object()
            if document.is_checked_out():
                raise Unauthorized()

            transporter = Transporter()
            transporter.update(document, self.request)

            repository = api.portal.get_tool('portal_repository')
            comment = translate(
                _(u"Updated with a newer excerpt version."),
                context=self.request)
            repository.save(obj=document, comment=comment)
        return json.dumps({})
Exemplo n.º 25
0
    def __call__(self):
        if not self.oguid_str:
            self.oguid_str = self.request.get('oguid')

        oguid = Oguid.parse(self.oguid_str)

        if self._is_on_different_admin_unit(oguid.admin_unit_id):
            admin_unit = ogds_service().fetch_admin_unit(oguid.admin_unit_id)
            url = self.url_for(oguid, admin_unit, self.view_name)

        else:
            obj = self._get_object(oguid.int_id)
            url = obj.absolute_url()
            if self.view_name:
                url = '/'.join((url, self.view_name))

        # Preserve query string
        qs = self.request.get('QUERY_STRING')
        qs = self._strip_oguid(qs)
        if qs:
            url = self._extend_with_querystring(url, qs)

        return self.request.RESPONSE.redirect(url)
Exemplo n.º 26
0
 def get_successor(self):
     return Oguid.parse(self.data['successor_oguid']).resolve_object()
Exemplo n.º 27
0
 def lookup_object(dataself, data):
     oguid = Oguid.parse(data.get('oguid'))
     obj = oguid.resolve_object()
     if not obj:
         raise BadRequest('Invalid oguid, could not be resolved.')
     return obj
Exemplo n.º 28
0
            def handleAdd(self, action):
                # create the dossier
                data, errors = self.extractData()
                if errors:
                    self.status = self.formErrorsMessage
                    return
                obj = self.createAndAdd(data)
                if obj is not None:
                    # mark only as finished if we get the new object
                    self._finishedAdd = True

                # Get a properly aq wrapped object
                dossier = self.context.get(obj.id)

                dm = getUtility(IWizardDataStorage)
                oguid = self.request.get('oguid')
                dmkey = 'accept:%s' % oguid

                # forwarding
                if dm.get(dmkey, 'is_forwarding'):
                    if dm.get(dmkey, 'is_only_assign'):
                        transition_data = {
                            'text': dm.get(dmkey, 'text'),
                            'dossier': IUUID(dossier)}
                        wftool = api.portal.get_tool('portal_workflow')
                        task = wftool.doActionFor(
                            Oguid.parse(oguid).resolve_object(),
                            'forwarding-transition-assign-to-dossier',
                            comment=transition_data['text'],
                            transition_params=transition_data)

                        IStatusMessage(self.request).addStatusMessage(
                            _(u'The forwarding is now assigned to the new '
                              'dossier'),
                            'info')

                        self.request.RESPONSE.redirect(
                            '%s/edit' % task.absolute_url())

                    else:
                        task = accept_forwarding_with_successor(
                            self.context,
                            oguid,
                            dm.get(dmkey, 'text'),
                            dossier=dossier)

                        IStatusMessage(self.request).addStatusMessage(
                            _(u'The forwarding has been stored in the '
                              u'local inbox and the succesor task has been'
                              u' created'), 'info')

                        self.request.RESPONSE.redirect(
                            '%s/edit' % task.absolute_url())

                else:
                    # create the successor task, accept the predecessor
                    task = accept_task_with_successor(
                        dossier,
                        oguid,
                        dm.get(dmkey, 'text'))

                    IStatusMessage(self.request).addStatusMessage(
                        _(u'The new dossier has been created and the task '
                          u'has been copied to the new dossier.'), 'info')

                    self.request.RESPONSE.redirect(task.absolute_url())
Exemplo n.º 29
0
 def oguid(self, oguid):
     self.arguments['oguid'] = Oguid.parse(oguid)
     return self
Exemplo n.º 30
0
def get_committee_oguid():
    return Oguid.parse(getRequest().get('committee-oguid'))
Exemplo n.º 31
0
 def lookup_object(dataself, data):
     oguid = Oguid.parse(data.get('oguid'))
     obj = oguid.resolve_object()
     if not obj:
         raise BadRequest('Invalid oguid, could not be resolved.')
     return obj
Exemplo n.º 32
0
 def test_init_with_string_oguid(self):
     oguid = Oguid.parse('foo:123')
     self.assertEqual('foo', oguid.admin_unit_id)
     self.assertEqual(123, oguid.int_id)
     self.assertEqual('foo:123', oguid.id)
Exemplo n.º 33
0
 def test_oguid_string_representation(self):
     self.assertEqual('foo:123', str(Oguid.parse('foo:123')))
Exemplo n.º 34
0
 def get_successor(self):
     return Oguid.parse(self.data['successor_oguid']).resolve_object()
Exemplo n.º 35
0
def get_committee_oguid():
    return Oguid.parse(getRequest().get('committee-oguid'))
Exemplo n.º 36
0
 def get_committee(self):
     return Oguid.parse(self.committee_oguid).resolve_object()
Exemplo n.º 37
0
def accept_forwarding_with_successor(context,
                                     predecessor_oguid,
                                     response_text,
                                     dossier=None):

    # the predessecor (the forwarding on the remote client)
    predecessor = Task.query.by_oguid(predecessor_oguid)

    # transport the remote forwarding to the inbox or actual yearfolder
    transporter = Transporter()
    inbox = get_current_inbox(context)
    if dossier:
        yearfolder = get_current_yearfolder(inbox=inbox)
        successor_forwarding = transporter.transport_from(
            yearfolder, predecessor.admin_unit_id, predecessor.physical_path)
    else:
        successor_forwarding = transporter.transport_from(
            inbox, predecessor.admin_unit_id, predecessor.physical_path)

    # Replace the issuer with the current inbox
    successor_forwarding.issuer = get_current_org_unit().inbox().id()

    # Set the "X-CREATING-SUCCESSOR" flag for preventing the event handler
    # from creating additional responses per added document.
    successor_forwarding.REQUEST.set('X-CREATING-SUCCESSOR', True)

    successor_tc = ISuccessorTaskController(successor_forwarding)

    # copy documents and map the intids
    doc_transporter = getUtility(ITaskDocumentsTransporter)

    comment = _(
        u'version_message_accept_forwarding',
        default=u'Document copied from forwarding (forwarding accepted)')
    intids_mapping = doc_transporter.copy_documents_from_remote_task(
        predecessor, successor_forwarding, comment=comment)

    # copy the responses
    response_transporter = IResponseTransporter(successor_forwarding)
    response_transporter.get_responses(predecessor.admin_unit_id,
                                       predecessor.physical_path,
                                       intids_mapping=intids_mapping)

    # Remove current responsible from predecessor and add issuer
    # and responsible to successor's watcher.
    center = notification_center()
    center.remove_task_responsible(Oguid.parse(predecessor_oguid),
                                   successor_forwarding.responsible)
    center.add_task_responsible(successor_forwarding,
                                successor_forwarding.responsible)
    center.add_task_issuer(successor_forwarding, successor_forwarding.issuer)

    # if a dossier is given means that a successor task must
    # be created in a new or a existing dossier
    if dossier:
        # we need all task field values from the forwarding
        fielddata = {}
        for fieldname in ITask.names():
            value = ITask.get(fieldname).get(successor_forwarding)
            fielddata[fieldname] = value

        # Predefine the task_type to avoid tasks with an invalid task_type
        fielddata['task_type'] = FORWARDING_SUCCESSOR_TYPE

        # lets create a new task - the successor task
        task = createContentInContainer(dossier, 'opengever.task.task',
                                        **fielddata)

        # copy documents and map the intids
        intids_mapping = _copy_documents_from_forwarding(
            successor_forwarding, task)

        # copy the responses
        response_transporter = IResponseTransporter(task)
        response_transporter.get_responses(
            get_current_admin_unit().id(),
            '/'.join(successor_forwarding.getPhysicalPath()),
            intids_mapping=intids_mapping)

        # successor
        successor_tc_task = ISuccessorTaskController(task)

    transaction.savepoint()

    # Close the predessecor forwarding
    response_text = response_text or ''
    request_data = {
        'response_text': response_text.encode('utf-8'),
        'successor_oguid': successor_tc.get_oguid(),
        'transition': 'forwarding-transition-accept'
    }

    response = dispatch_request(predecessor.admin_unit_id,
                                '@@store_forwarding_in_yearfolder',
                                path=predecessor.physical_path,
                                data=request_data)

    response_body = response.read()
    if response_body.strip() != 'OK':
        raise TaskRemoteRequestError(
            'Adding the response and changing the workflow state on the '
            'predecessor forwarding failed.')

    if dossier:
        # Update watchers for created successor forwarding and task
        center = notification_center()
        center.remove_task_responsible(successor_forwarding, task.responsible)
        center.add_task_responsible(task, task.responsible)

        # When a successor task exists, we close also the successor forwarding
        change_task_workflow_state(
            successor_forwarding,
            'forwarding-transition-accept',
            text=response_text,
            successor_oguid=successor_tc_task.get_oguid())

    # create the succssor relations
    successor_tc.set_predecessor(predecessor_oguid)
    if dossier:
        successor_tc_task.set_predecessor(successor_tc.get_oguid())
        return task
    return successor_forwarding
Exemplo n.º 38
0
def accept_forwarding_with_successor(
    context, predecessor_oguid, response_text, dossier=None):

    # the predessecor (the forwarding on the remote client)
    predecessor = Task.query.by_oguid(predecessor_oguid)

    # Set the "X-CREATING-SUCCESSOR" flag for preventing the event handler
    # from creating additional responses per added document.
    context.REQUEST.set('X-CREATING-SUCCESSOR', True)

    # transport the remote forwarding to the inbox or actual yearfolder
    transporter = Transporter()
    inbox = get_current_inbox(context)
    if dossier:
        yearfolder = get_current_yearfolder(inbox=inbox)
        successor_forwarding = transporter.transport_from(
            yearfolder, predecessor.admin_unit_id, predecessor.physical_path)
    else:
        successor_forwarding = transporter.transport_from(
            inbox, predecessor.admin_unit_id, predecessor.physical_path)

    # Replace the issuer with the current inbox
    successor_forwarding.issuer = get_current_org_unit().inbox().id()

    successor_tc = ISuccessorTaskController(successor_forwarding)

    # copy documents and map the intids
    doc_transporter = getUtility(ITaskDocumentsTransporter)

    comment = _(
        u'version_message_accept_forwarding',
        default=u'Document copied from forwarding (forwarding accepted)')
    intids_mapping = doc_transporter.copy_documents_from_remote_task(
        predecessor, successor_forwarding, comment=comment)

    # copy the responses
    response_transporter = IResponseTransporter(successor_forwarding)
    response_transporter.get_responses(predecessor.admin_unit_id,
                                       predecessor.physical_path,
                                       intids_mapping=intids_mapping)

    # Remove current responsible from predecessor and add issuer
    # and responsible to successor's watcher.
    center = notification_center()
    center.remove_task_responsible(Oguid.parse(predecessor_oguid),
                                   successor_forwarding.responsible)
    center.add_task_responsible(successor_forwarding,
                                successor_forwarding.responsible)
    center.add_task_issuer(successor_forwarding, successor_forwarding.issuer)

    # if a dossier is given means that a successor task must
    # be created in a new or a existing dossier
    if dossier:
        # we need all task field values from the forwarding
        fielddata = {}
        for fieldname in ITask.names():
            value = ITask.get(fieldname).get(successor_forwarding)
            fielddata[fieldname] = value

        # Predefine the task_type to avoid tasks with an invalid task_type
        fielddata['task_type'] = FORWARDING_SUCCESSOR_TYPE

        # lets create a new task - the successor task
        task = createContentInContainer(
            dossier, 'opengever.task.task', **fielddata)

        # copy documents and map the intids
        intids_mapping = _copy_documents_from_forwarding(
            successor_forwarding, task)

        # copy the responses
        response_transporter = IResponseTransporter(task)
        response_transporter.get_responses(
            get_current_admin_unit().id(),
            '/'.join(successor_forwarding.getPhysicalPath()),
            intids_mapping=intids_mapping)

        # successor
        successor_tc_task = ISuccessorTaskController(task)

    transaction.savepoint()

    # Close the predessecor forwarding
    response_text = response_text or ''
    request_data = {'response_text': response_text.encode('utf-8'),
                    'successor_oguid': successor_tc.get_oguid(),
                    'transition': 'forwarding-transition-accept'}

    response = dispatch_request(predecessor.admin_unit_id,
                                '@@store_forwarding_in_yearfolder',
                                path=predecessor.physical_path,
                                data=request_data)

    response_body = response.read()
    if response_body.strip() != 'OK':
        raise TaskRemoteRequestError(
            'Adding the response and changing the workflow state on the '
            'predecessor forwarding failed.')

    if dossier:
        # Update watchers for created successor forwarding and task
        center = notification_center()
        center.remove_task_responsible(successor_forwarding, task.responsible)
        center.add_task_responsible(task, task.responsible)

        # When a successor task exists, we close also the successor forwarding
        change_task_workflow_state(
            successor_forwarding,
            'forwarding-transition-accept',
            text=response_text,
            successor_oguid=successor_tc_task.get_oguid())

    # create the succssor relations
    successor_tc.set_predecessor(predecessor_oguid)
    if dossier:
        successor_tc_task.set_predecessor(successor_tc.get_oguid())
        return task
    return successor_forwarding