def create_subtask_response(context, event): """When adding a new task object within a task(subtask), it adds a response to the maintask. """ # the event is fired multiple times when the task was transported, so we # need to verify that the request was not called by another client. request = context.REQUEST if request.get_header('X-OGDS-AC', None) or \ request.get_header('X-OGDS-AUID', None) or \ request.get('X-CREATING-SUCCESSOR', None): return parent = aq_parent(aq_inner(context)) if ITask.providedBy(parent): if ITask.providedBy(context): transition = 'transition-add-subtask' # If the the added object is a subtask we have to make sure # that the subtask is already synced to the globalindex if not context.get_sql_object(): TaskSqlSyncer(context, event).sync() elif IBaseDocument.providedBy(context): transition = 'transition-add-document' # add a response with a link to the object add_simple_response(parent, added_object=context, transition=transition)
def test_syncing_response_changes(self): add_simple_response( self.task, text=u'Neu zugewiesen', field_changes=[(ITask['responsible'], 'peter.mueller'), (ITask['responsible_client'], 'client2')], transition='task-transition-reassign', ) copy = create(Builder('task').in_state('task-state-in-progress')) IResponseTransporter(self.task).send_responses( 'client1', copy.get_physical_path()) self.assertEquals([{ u'after': u'peter.mueller', u'id': u'responsible', u'name': u'label_responsible', u'before': u'hugo.boss' }, { u'after': u'client2', u'id': u'responsible_client', u'name': u'label_resonsible_client', u'before': u'client1' }], IResponseContainer(copy)[1].changes)
def add_response(self, **kwargs): add_simple_response( self.context, text=kwargs.get('text'), field_changes=( (ITask['responsible'], kwargs.get('responsible')), (ITask['responsible_client'], kwargs.get('responsible_client')),), transition=kwargs.get('transition'))
def update_deadline(self, new_deadline, text, transition): add_simple_response(self.context, text=text, field_changes=((ITask['deadline'], new_deadline), ), transition=transition) self.context.deadline = new_deadline notify(ObjectModifiedEvent(self.context))
def update_deadline(self, new_deadline, text): add_simple_response( self.context, text=text, field_changes=( (ITask['deadline'], new_deadline), ), ) self.context.deadline = new_deadline notify(ObjectModifiedEvent(self.context))
def update_deadline(self, new_deadline, text, transition): add_simple_response( self.context, text=text, field_changes=( (ITask['deadline'], new_deadline), ), transition=transition, supress_events=True) self.context.deadline = new_deadline notify(ObjectModifiedEvent(self.context)) self.context.update_reminder_trigger_dates()
def after_transition_hook(self, transition, disable_sync, transition_params): successor_task = self.create_successor_task(transition_params['dossier']) add_simple_response( self.context, transition=transition, text=transition_params.get('text'), successor_oguid=Oguid.for_object(successor_task).id) # set predecessor on successor task successor_tc_task = ISuccessorTaskController(successor_task) successor_tc_task.set_predecessor(Oguid.for_object(self.context).id) IYearfolderStorer(self.context).store_in_yearfolder() return successor_task
def after_transition_hook(self, transition, disable_sync, transition_params): # Revoke local roles for current responsible, except if # revoke_permissions is set to False. # the roles for the new responsible will be assigned afterwards # in set_roles_after_modifying on the ObjectModifiedEvent. if self.context.revoke_permissions: LocalRolesSetter(self.context).revoke_roles() former_responsible = ITask['responsible'] former_responsible_client = ITask['responsible_client'] self.context.clear_reminder(self.context.responsible) changes = ( (former_responsible, transition_params.get('responsible')), (former_responsible_client, transition_params.get('responsible_client'))) response = add_simple_response( self.context, transition=transition, text=transition_params.get('text'), field_changes=changes, supress_events=True) self.save_related_items(response, transition_params.get('relatedItems')) self.change_responsible(transition_params) notify(ObjectModifiedEvent(self.context)) self.record_activity(response) if not disable_sync: sync_task_response( self.context, getRequest(), 'workflow', transition, transition_params.get('text'), responsible=transition_params.get('responsible'), responsible_client=transition_params.get('responsible_client'))
def after_transition_hook(self, transition, disable_sync, transition_params): response = add_simple_response( self.context, transition=transition, text=transition_params.get('text')) self.save_related_items(response, transition_params.get('relatedItems')) self.sync_change(transition, transition_params.get('text'), disable_sync)
def after_transition_hook(self, transition, disable_sync, transition_params): # Revoke local roles for current responsible, except if # revoke_permissions is set to False. # the roles for the new responsible will be assigned afterwards # in set_roles_after_modifying on the ObjectModifiedEvent. if self.context.revoke_permissions: LocalRolesSetter(self.context).revoke_roles() former_responsible = ITask['responsible'] former_responsible_client = ITask['responsible_client'] TaskReminder().clear_reminder(self.context, self.context.responsible) changes = ( (former_responsible, transition_params.get('responsible')), (former_responsible_client, transition_params.get('responsible_client'))) response = add_simple_response( self.context, transition=transition, text=transition_params.get('text'), field_changes=changes, supress_events=True) self.save_related_items(response, transition_params.get('relatedItems')) self.change_responsible(transition_params) notify(ObjectModifiedEvent(self.context)) self.record_activity(response) if not disable_sync: sync_task_response( self.context, getRequest(), 'workflow', transition, transition_params.get('text'), responsible=transition_params.get('responsible'), responsible_client=transition_params.get('responsible_client'))
def setUp(self): super(TestResponeTransporter, self).setUp() create(Builder('ogds_user') .having(userid=u'peter.mueller', firstname=u'Peter', lastname=u'M\xfcller')) create(Builder('ogds_user') .having(userid=u'hugo.boss', firstname=u'Hugo', lastname=u'B\xf6ss')) self.task = create(Builder('task') .having(responsible=u'hugo.boss', deadline=date(2016, 03, 27)) .in_state('task-state-in-progress')) add_simple_response(self.task, text=u'Ich \xfcbernehme diese Aufgabe', transition='task-transition-open-in-progress')
def create_subtask_response(context, event): """When adding a new task object within a task(subtask), it adds a response to the maintask. """ # the event is fired multiple times when the task was transported, so we # need to verify that the request was not called by another client. request = context.REQUEST if request.get_header('X-OGDS-AC', None) or \ request.get_header('X-OGDS-CID', None) or \ request.get('X-CREATING-SUCCESSOR', None): return parent = aq_parent(aq_inner(context)) if ITask.providedBy(parent): # add a response with a link to the object add_simple_response(parent, added_object=context)
def setUp(self): super(TestResponeTransporter, self).setUp() create(Builder('ogds_user') .having(userid=u'peter.mueller', firstname=u'Peter', lastname=u'M\xfcller')) create(Builder('ogds_user') .having(userid=u'hugo.boss', firstname=u'Hugo', lastname=u'B\xf6ss')) self.task = create(Builder('task') .having(responsible=u'hugo.boss', responsible_client=u'org-unit-1', deadline=date(2016, 03, 27)) .in_state('task-state-in-progress')) add_simple_response(self.task, text=u'Ich \xfcbernehme diese Aufgabe', transition='task-transition-open-in-progress')
def add_response(self, **kwargs): return add_simple_response( self.context, text=kwargs.get('text'), field_changes=( (ITask['responsible'], kwargs.get('responsible')), (ITask['responsible_client'], kwargs.get('responsible_client')),), transition=kwargs.get('transition'))
def render(self): # set responsible self.context.responsible_client = get_client_id() self.context.responsible = u'inbox:%s' % ( self.context.responsible_client) # create a response in the task add_simple_response( self.context, field_changes=( (ITask['responsible'], self.context.responsible), (ITask['responsible_client'], self.context.responsible_client),), transition=u'forwarding-transition-refuse') notify(ObjectModifiedEvent(self.context)) return self.request.RESPONSE.redirect('.')
def render(self): # set responsible org_unit = get_current_org_unit() self.context.responsible_client = org_unit.id() self.context.responsible = org_unit.inbox().id() # create a response in the task add_simple_response( self.context, field_changes=( (ITask['responsible'], self.context.responsible), (ITask['responsible_client'], self.context.responsible_client),), transition=u'forwarding-transition-refuse') notify(ObjectModifiedEvent(self.context)) return self.request.RESPONSE.redirect('.')
def add_reassign_response(self, data): return add_simple_response( self.context, text=None, field_changes=( (ITask['responsible'], data.get('responsible')), (ITask['responsible_client'], data.get('responsible_client')),), transition=REASSIGN_TRANSITION, supress_events=True)
def after_transition_hook(self, transition, disable_sync, transition_params): response = add_simple_response(self.context, transition=transition, text=transition_params.get('text'), supress_activity=True) TaskAddedActivity( self.context, getRequest(), aq_parent(self.context)).record() self.save_related_items(response, transition_params.get('relatedItems')) self.sync_change(transition, transition_params.get('text'), disable_sync)
def __call__(self): # set responsible org_unit = get_current_org_unit() self.context.responsible_client = org_unit.id() self.context.responsible = org_unit.inbox().id() # create a response in the task add_simple_response(self.context, field_changes=( (ITask['responsible'], self.context.responsible), (ITask['responsible_client'], self.context.responsible_client), ), transition=u'forwarding-transition-refuse') notify(ObjectModifiedEvent(self.context)) return self.request.RESPONSE.redirect('.')
def add_reassign_response(self, data): return add_simple_response(self.context, text=None, field_changes=( (ITask['responsible'], data.get('responsible')), (ITask['responsible_client'], data.get('responsible_client')), ), transition=REASSIGN_TRANSITION)
def test_syncing_response_changes(self): add_simple_response(self.task, text=u'Neu zugewiesen', field_changes=[(ITask['responsible'], 'peter.mueller'), (ITask['responsible_client'], 'client2')], transition='task-transition-reassign',) copy = create(Builder('task').in_state('task-state-in-progress')) IResponseTransporter(self.task).send_responses( 'client1', copy.get_physical_path()) self.assertEquals([{u'after': u'peter.mueller', u'id': u'responsible', u'name': u'label_responsible', u'before': u'hugo.boss'}, {u'after': u'client2', u'id': u'responsible_client', u'name': u'label_resonsible_client', u'before': u'client1'}], IResponseContainer(copy)[1].changes)
def render(self): if not IInternalOpengeverRequestLayer.providedBy(self.request): raise Forbidden() transition = self.request.get('transition') text = self.request.get('text') responsible = self.request.get('responsible') responsible_client = self.request.get('responsible_client') if self.is_already_done(transition, text): # Set correct content type for text response self.request.response.setHeader("Content-type", "text/plain") return 'OK' wftool = getToolByName(self.context, 'portal_workflow') # change workflow state before = wftool.getInfoFor(self.context, 'review_state') before = wftool.getTitleForStateOnType(before, self.context.Type()) wftool.doActionFor(self.context, transition) after = wftool.getInfoFor(self.context, 'review_state') after = wftool.getTitleForStateOnType(after, self.context.Type()) # create response response = add_simple_response( self.context, transition=transition, text=text) if responsible and responsible is not 'None': # special handling for reassign response.add_change( 'reponsible', _(u"label_responsible", default=u"Responsible"), ITask(self.context).responsible, responsible) ITask(self.context).responsible_client = responsible_client ITask(self.context).responsible = responsible notify(ObjectModifiedEvent(self.context)) response.add_change('review_state', _(u'Issue state'), before, after) # Set correct content type for text response self.request.response.setHeader("Content-type", "text/plain") return 'OK'
def test_response_view(self): # test added objects info add_simple_response(self.task, text=u'field', added_object=[self.doc1, self.doc2]) # test field changes info add_simple_response(self.task, text=u'field', field_changes=( (ITask['responsible'], TEST_USER_ID), (ITask['responsible_client'], 'plone'), ), transition=u'task-transition-open-in-progress') # test successsor info successor_oguid = ISuccessorTaskController(self.successor).get_oguid() add_simple_response(self.task, successor_oguid=successor_oguid) transaction.commit() self.assertEquals(len(IResponseContainer(self.task)), 3) # test different responeses and their infos self.browser.open('%s/tabbedview_view-overview' % self.task.absolute_url()) # TODO: replace with OGBrowse API. What is it looking for? self.assertEquals( 'Added successor task', self.browser.css('div.response-info div span.label') [0].plain_text()) successor_info = """<span class="issueChange"><span class="wf-task-state-open"><a href="http://nohost/plone/dossier-1/task-2" title="[Plone] > dossier-1 > Test task 1"><span class="rollover-breadcrumb icon-task-remote-task">Test task 1</span></a> <span class="discreet">(Client2 / <a href="http://nohost/plone/@@user-details/testuser2">User 2 Test (testuser2)</a>)</span></span></span>""" self.assertTrue(successor_info in self.browser.contents) responsible_container = self.browser.xpath( "//div[@class='response-info']/div[descendant-or-self::*[contains(text(), 'label_responsible')]]" )[0] links = responsible_container.xpath("./*/a") self.assertEquals( ['User 2 Test (testuser2)', 'User Test (test_user_1_)'], [l.text for l in links]) self.assertEquals([ 'http://nohost/plone/@@user-details/testuser2', 'http://nohost/plone/@@user-details/test_user_1_' ], [l.attrib["href"] for l in links]) documents = self.browser.css( ".contenttype-opengever-document-document") self.assertEquals(['Doc 1', 'Doc 2'], [d.plain_text() for d in documents]) self.assertEquals([ 'http://nohost/plone/dossier-1/document-1', 'http://nohost/plone/dossier-1/document-2' ], [d.attrib["href"] for d in documents]) # edit and delete should not be possible self.assertEquals([], self.browser.css("input[type='submit']"))
def after_transition_hook(self, transition, disable_sync, transition_params): self.update_watchers() response = add_simple_response( self.context, transition=transition, text=transition_params.get('text')) response.add_change( 'responsible', _(u"label_responsible", default=u"Responsible"), ITask(self.context).responsible, ITask(self.context).issuer) self.save_related_items(response, transition_params.get('relatedItems')) self.switch_responsible()
def after_transition_hook(self, transition, disable_sync, transition_params): self.update_watchers() response = add_simple_response( self.context, transition=transition, text=transition_params.get('text')) response.add_change( 'responsible', ITask(self.context).responsible, ITask(self.context).issuer, _(u"label_responsible", default=u"Responsible")) self.save_related_items(response, transition_params.get('relatedItems')) self.switch_responsible()
def test_response_view(self): # test added objects info add_simple_response( self.task, text=u'field', added_object=[self.doc1, self.doc2]) # test field changes info add_simple_response( self.task, text=u'field', field_changes=( (ITask['responsible'], TEST_USER_ID), (ITask['responsible_client'], 'plone'), ), transition=u'task-transition-open-in-progress') # test successsor info successor_oguid = ISuccessorTaskController(self.successor).get_oguid() add_simple_response(self.task, successor_oguid=successor_oguid) transaction.commit() self.assertEquals(len(IResponseContainer(self.task)), 3) # test different responeses and their infos self.browser.open( '%s/tabbedview_view-overview' % self.task.absolute_url()) # TODO: replace with OGBrowse API. What is it looking for? self.assertEquals( 'Added successor task', self.browser.css('div.response-info div span.label')[0].plain_text()) successor_info = """<span class="issueChange"><span class="wf-task-state-open"><a href="http://nohost/plone/dossier-1/task-2" title="[Plone] > dossier-1 > Test task 1"><span class="rollover-breadcrumb icon-task-remote-task">Test task 1</span></a> <span class="discreet">(Client2 / <a href="http://nohost/plone/@@user-details/testuser2">User 2 Test (testuser2)</a>)</span></span></span>""" self.assertTrue(successor_info in self.browser.contents) responsible_container = self.browser.xpath("//div[@class='response-info']/div[descendant-or-self::*[contains(text(), 'label_responsible')]]")[0] links = responsible_container.xpath("./*/a") self.assertEquals(['User 2 Test (testuser2)', 'User Test (test_user_1_)'], [l.text for l in links]) self.assertEquals(['http://nohost/plone/@@user-details/testuser2', 'http://nohost/plone/@@user-details/test_user_1_'], [l.attrib["href"] for l in links]) documents = self.browser.css(".contenttype-opengever-document-document") self.assertEquals(['Doc 1', 'Doc 2'], [d.plain_text() for d in documents]) self.assertEquals(['http://nohost/plone/dossier-1/document-1', 'http://nohost/plone/dossier-1/document-2'], [d.attrib["href"] for d in documents]) # edit and delete should not be possible self.assertEquals([], self.browser.css("input[type='submit']"))
def render(self): self.check_internal_request() transition = self.request.get("transition") text = self.request.get("text") responsible = self.request.get("responsible") responsible_client = self.request.get("responsible_client") if self.is_already_done(transition, text): return ok_response(self.request) wftool = getToolByName(self.context, "portal_workflow") # change workflow state before = wftool.getInfoFor(self.context, "review_state") before = wftool.getTitleForStateOnType(before, self.context.Type()) wftool.doActionFor(self.context, transition) after = wftool.getInfoFor(self.context, "review_state") after = wftool.getTitleForStateOnType(after, self.context.Type()) # create response response = add_simple_response(self.context, transition=transition, text=text) if responsible and responsible is not "None": # special handling for reassign response.add_change( "responsible", _(u"label_responsible", default=u"Responsible"), ITask(self.context).responsible, responsible, ) ITask(self.context).responsible_client = responsible_client ITask(self.context).responsible = responsible notify(ObjectModifiedEvent(self.context)) response.add_change("review_state", _(u"Issue state"), before, after) return ok_response(self.request)
def _update(self, transition, text): """Updates the current task with the received data """ return add_simple_response(self.context, transition=transition, text=text)
def after_transition_hook(self, transition, disable_sync, transition_params): add_simple_response( self.context, transition=transition, text=transition_params.get('text')) IYearfolderStorer(self.context).store_in_yearfolder()
def add_response(self, response_text): add_simple_response( self.context, text=response_text, transition=u'forwarding-transition-refuse', supress_events=True)
def add_response(self, response_text): add_simple_response( self.context, text=response_text, transition=u'forwarding-transition-refuse')
def add_response(self, response_text): add_simple_response(self.context, text=response_text, transition=u'forwarding-transition-refuse')
def add_response(self, response_text): add_simple_response(self.context, text=response_text, transition=u'forwarding-transition-refuse', supress_events=True)