def can_access_archival_file_form(user, content): """Returns True if the user has 'Modify portal content' permission in any open dossier state. And the containing dossier is - not a templatefolder - not inactive """ assert IBaseDocument.providedBy( content), 'Content needs to provide IBaseDocument' dossier = find_parent_dossier(content) if ITemplateFolder.providedBy(dossier): return False if api.content.get_state(obj=dossier) == 'dossier-state-inactive': return False wftool = api.portal.get_tool('portal_workflow') workflow_id = wftool.getChainForPortalType(dossier.portal_type)[0] user_roles = user.getRolesInContext(dossier) for open_state in DOSSIER_STATES_OPEN: state = wftool.get(workflow_id).states.get(open_state) roles_with_modify = state.permission_roles['Modify portal content'] return bool(set(roles_with_modify).intersection(user_roles)) return False
def can_access_public_trial_edit_form(user, content): """Returns True if the user has 'Modify portal content' permission in any open dossier state. And the containing dossier is - not a templatefolder - not inactive - not an inbox """ assert IBaseDocument.providedBy( content), 'Content needs to provide IBaseDocument' wftool = getToolByName(content, 'portal_workflow') dossier = find_parent_dossier(content) if ITemplateFolder.providedBy(dossier): return False if IInbox.providedBy(dossier): return False if wftool.getInfoFor(dossier, 'review_state') == 'dossier-state-inactive': return False workflow_id = wftool.getChainForPortalType(dossier.portal_type)[0] user_roles = user.getRolesInContext(dossier) has_role = False for open_state in DOSSIER_STATES_OPEN: state = wftool.get(workflow_id).states.get(open_state) if state is None: continue roles_with_modify = state.permission_roles['Modify portal content'] has_role = bool(set(roles_with_modify) & set(user_roles)) if has_role: break else: continue return has_role
def test_find_parent_inbox(self): self.login(self.secretariat_user) self.assertEquals(self.inbox, find_parent_dossier(self.inbox_document))
def test_find_first_parent_dossier(self): dossier = create(Builder('dossier')) task = create(Builder('task').within(dossier)) document = create(Builder('document').within(task)) self.assertEquals(dossier, find_parent_dossier(document))
def test_find_parent_on_nested_dossierts(self): dossier = create(Builder('dossier')) subdossier = create(Builder('dossier').within(dossier)) document = create(Builder('document').within(subdossier)) self.assertEquals(subdossier, find_parent_dossier(document))
def test_raise_valuerror_if_plone_root_is_reached(self): document = create(Builder('document')) with self.assertRaises(ValueError): find_parent_dossier(document)
def test_raise_valuerror_if_plone_root_is_passed(self): with self.assertRaises(ValueError): find_parent_dossier(self.portal)
def test_return_itself_if_dossier_is_passed(self): dossier = create(Builder('dossier')) self.assertEquals(dossier, find_parent_dossier(dossier))
def test_find_first_parent_dossier(self): self.login(self.regular_user) self.assertEquals(self.dossier, find_parent_dossier(self.taskdocument))
def test_find_parent_on_nested_dossiers(self): self.login(self.regular_user) self.assertEquals(self.subdossier, find_parent_dossier(self.subdocument))
def test_raise_valuerror_if_plone_root_is_reached(self): self.login(self.regular_user) document = create(Builder('document')) with self.assertRaises(ValueError): find_parent_dossier(self.leaf_repofolder)
def test_raise_valuerror_if_plone_root_is_passed(self): self.login(self.regular_user) with self.assertRaises(ValueError): find_parent_dossier(self.portal)
def test_return_itself_if_dossier_is_passed(self): self.login(self.regular_user) self.assertEquals(self.dossier, find_parent_dossier(self.dossier))