diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/populate.py b/SAS/TMSS/backend/src/tmss/tmssapp/populate.py index 8e0b5f493d05f8adbf40a007b307b15a2e3a6b93..c580d08418eb236fc419acc297bbc4b010bc58a4 100644 --- a/SAS/TMSS/backend/src/tmss/tmssapp/populate.py +++ b/SAS/TMSS/backend/src/tmss/tmssapp/populate.py @@ -1384,6 +1384,17 @@ def assign_system_permissions(): admin_group.permissions.add(perm) maintenance_group.permissions.add(perm) + extra_actions = view.get_extra_actions() + if extra_actions: + for action in extra_actions: + perm = Permission.objects.get(codename='%s_%s' % (action.__name__, name)) + if 'get' in action.mapping and perm not in already_handled: + operator_group.permissions.add(perm) + support_group.permissions.add(perm) + developer_group.permissions.add(perm) + admin_group.permissions.add(perm) + maintenance_group.permissions.add(perm) + # Note: we only grant view permissions, since alteration is only permitted to users who are superuser anyway. # operational diff --git a/SAS/TMSS/backend/test/t_permissions_system_roles.py b/SAS/TMSS/backend/test/t_permissions_system_roles.py index b5e7042e4c4afeb4a2f3ad5e4408484ed71c0324..c3b662abfb6c82b0c03bdfe86797a16512624041 100755 --- a/SAS/TMSS/backend/test/t_permissions_system_roles.py +++ b/SAS/TMSS/backend/test/t_permissions_system_roles.py @@ -68,8 +68,11 @@ class SystemPermissionTestCase(unittest.TestCase): ''' @classmethod - def create_subtask(cls) -> int: - # Create preparatory data + def create_subtask(cls) -> (int, int): + """ + returns ids of the created Subtask and its related TaskBlueprint + """ + # Create preparatory data, with tmss_test_env.create_tmss_client() as client: test_data_creator.wipe_cache() @@ -92,13 +95,13 @@ class SystemPermissionTestCase(unittest.TestCase): obs_subtask_output_url = test_data_creator.post_data_and_get_url(test_data_creator.SubtaskOutput(subtask_url=obs_subtask['url']), '/subtask_output/') test_data_creator.post_data_and_get_url(test_data_creator.Dataproduct(filename="L%s_SB000.MS" % obs_subtask['id'], subtask_output_url=obs_subtask_output_url), '/dataproduct/') - return obs_subtask['id'] + return obs_subtask['id'], obs_task_blueprint['id'] @classmethod def setUpClass(cls) -> None: super().setUpClass() - cls.obs_subtask_id = cls.create_subtask() + cls.obs_subtask_id, cls.obs_taskblueprint_id = cls.create_subtask() # Create test_data_creator as regular user cls.test_data_creator = TMSSRESTTestDataCreator(BASE_URL, requests.auth.HTTPBasicAuth('paulus', 'pauluspass')) @@ -107,8 +110,9 @@ class SystemPermissionTestCase(unittest.TestCase): # Populate permissions tmss_test_env.populate_permissions() - # Retrieve operator system role + # Retrieve operator and support system roles cls.operator_group = Group.objects.get(name='operator') + cls.support_group = Group.objects.get(name='support') def setUp(self): super().setUp() @@ -328,7 +332,6 @@ class SystemPermissionTestCase(unittest.TestCase): 200, auth=self.test_data_creator.auth) - def test_Subtask_cannot_process_feedback_and_set_to_finished_if_complete_without_operator_group(self): user = User.objects.get(username='paulus') user.groups.set([]) @@ -362,7 +365,7 @@ class SystemPermissionTestCase(unittest.TestCase): # Assert Paulus has the process_feedback_and_set_to_finished_if_complete_subtask permission self.assertTrue(user.has_perm('tmssapp.process_feedback_and_set_to_finished_if_complete_subtask')) - obs_subtask_id = self.create_subtask() + obs_subtask_id, _ = self.create_subtask() # Set subtask status to finishing, so it can process feedback and set to finished. set_subtask_state_following_allowed_transitions(Subtask.objects.get(id=obs_subtask_id), 'finishing') @@ -410,7 +413,7 @@ class SystemPermissionTestCase(unittest.TestCase): # Assert Paulus has the schedule_subtask permission self.assertTrue(user.has_perm('tmssapp.schedule_subtask')) - obs_subtask_id = self.create_subtask() + obs_subtask_id, _ = self.create_subtask() # Set subtask status to defined, so it can be scheduled. set_subtask_state_following_allowed_transitions(Subtask.objects.get(id=obs_subtask_id), 'defined') @@ -583,7 +586,7 @@ class SystemPermissionTestCase(unittest.TestCase): # Assert Paulus has the unschedule_subtask permission self.assertTrue(user.has_perm('tmssapp.unschedule_subtask')) - obs_subtask_id = self.create_subtask() + obs_subtask_id, _ = self.create_subtask() # Set subtask status to scheduled, so it can be unscheduled. set_subtask_state_following_allowed_transitions(Subtask.objects.get(id=obs_subtask_id), 'scheduled') @@ -594,6 +597,45 @@ class SystemPermissionTestCase(unittest.TestCase): None, auth=self.test_data_creator.auth) + def test_TaskBlueprint_cannot_predecessors_without_support_group(self): + user = User.objects.get(username='paulus') + user.groups.set([]) + + # refresh user to update cache, see: https://docs.djangoproject.com/en/3.0/topics/auth/default/#permission-caching + user = User.objects.get(username='paulus') + while user.has_perm('tmssapp.predecessors_taskblueprint'): + user = User.objects.get(username='paulus') + + # Assert support group has the predecessors_taskblueprint permission + self.assertIsNotNone(self.support_group.permissions.all().filter(codename='predecessors_taskblueprint')) + # Assert Paulus does not have the predecessors_taskblueprint permission + self.assertFalse(user.has_perm('tmssapp.predecessors_taskblueprint')) + + # Try to predecessors taskblueprint and assert Paulus can't do it without the support group permissions. + response = GET_and_assert_equal_expected_code(self, + BASE_URL + '/task_blueprint/%s/predecessors/' % self.obs_taskblueprint_id, + 403, + auth=self.test_data_creator.auth) + + def test_TaskBlueprint_can_predecessors_with_support_group(self): + user = User.objects.get(username='paulus') + user.groups.set([self.support_group]) + + # refresh user to update cache, see: https://docs.djangoproject.com/en/3.0/topics/auth/default/#permission-caching + user = User.objects.get(username='paulus') + while not user.has_perm('tmssapp.predecessors_taskblueprint'): + user = User.objects.get(username='paulus') + + # Assert support group has the predecessors_taskblueprint permission + self.assertIsNotNone(self.support_group.permissions.all().filter(codename='predecessors_taskblueprint')) + # Assert Paulus does not have the predecessors_taskblueprint permission + self.assertTrue(user.has_perm('tmssapp.predecessors_taskblueprint')) + + # Try to predecessors taskblueprint and assert Paulus can't do it without the support group permissions. + response = GET_and_assert_equal_expected_code(self, + BASE_URL + '/task_blueprint/%s/predecessors/' % self.obs_taskblueprint_id, + 200, + auth=self.test_data_creator.auth) if __name__ == "__main__": logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s',