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()
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)
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 }
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()
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}
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}
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)
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)
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
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))
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
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))