diff --git a/SAS/TMSS/src/tmss/settings.py b/SAS/TMSS/src/tmss/settings.py index 5147510dbd5fa67b636ae40e38aa442160bf242a..12df0bce00548cfc02dd5e7122dbdc1403ac11c4 100644 --- a/SAS/TMSS/src/tmss/settings.py +++ b/SAS/TMSS/src/tmss/settings.py @@ -286,22 +286,27 @@ AUTH_PASSWORD_VALIDATORS = [ # https://docs.djangoproject.com/en/2.0/topics/i18n/ LANGUAGE_CODE = 'en-us' - TIME_ZONE = 'UTC' - USE_I18N = True - USE_L10N = True - USE_TZ = False # We don't want timezone support since everything is UTC anyway and this caused trouble in the past # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.0/howto/static-files/ - STATIC_URL = '/static/' # Setup support for proxy headers USE_X_FORWARDED_HOST = True SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') + +SWAGGER_SETTINGS = { + + 'SECURITY_DEFINITIONS': { + 'basic': { + 'type': 'basic' + } + }, + +} \ No newline at end of file diff --git a/SAS/TMSS/src/tmss/tmssapp/migrations/0001_initial.py b/SAS/TMSS/src/tmss/tmssapp/migrations/0001_initial.py index eacc7a839abe6e06dcff9f37faeab3285a44ede8..8eab06922cb36a7f1463c46cad4d76f3d4fb7b7f 100644 --- a/SAS/TMSS/src/tmss/tmssapp/migrations/0001_initial.py +++ b/SAS/TMSS/src/tmss/tmssapp/migrations/0001_initial.py @@ -376,7 +376,7 @@ class Migration(migrations.Migration): }, ), migrations.CreateModel( - name='TaskConnectors', + name='TaskConnector', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('tags', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=128), blank=True, default=list, help_text='User-defined search keywords for object.', size=8)), @@ -450,8 +450,8 @@ class Migration(migrations.Migration): ('selection_doc', django.contrib.postgres.fields.jsonb.JSONField(help_text='Filter for selecting dataproducts from the output role.')), ('consumer', models.ForeignKey(help_text='Task Draft that has the input connector.', on_delete=django.db.models.deletion.CASCADE, related_name='consumed_by', to='tmssapp.TaskDraft')), ('dataformat', models.ForeignKey(help_text='Selected data format to use. One of (MS, HDF5).', on_delete=django.db.models.deletion.PROTECT, to='tmssapp.Dataformat')), - ('input', models.ForeignKey(help_text='Input connector of consumer.', on_delete=django.db.models.deletion.CASCADE, related_name='inputs_task_relation_draft', to='tmssapp.TaskConnectors')), - ('output', models.ForeignKey(help_text='Output connector of producer.', on_delete=django.db.models.deletion.CASCADE, related_name='outputs_task_relation_draft', to='tmssapp.TaskConnectors')), + ('input', models.ForeignKey(help_text='Input connector of consumer.', on_delete=django.db.models.deletion.CASCADE, related_name='inputs_task_relation_draft', to='tmssapp.TaskConnector')), + ('output', models.ForeignKey(help_text='Output connector of producer.', on_delete=django.db.models.deletion.CASCADE, related_name='outputs_task_relation_draft', to='tmssapp.TaskConnector')), ('producer', models.ForeignKey(help_text='Task Draft that has the output connector. NOTE: The producer does typically, but not necessarily, belong to the same Scheduling Unit (or even the same Project) as the consumer.', on_delete=django.db.models.deletion.CASCADE, related_name='produced_by', to='tmssapp.TaskDraft')), ('selection_template', models.ForeignKey(help_text='Schema used for selection_doc.', on_delete=django.db.models.deletion.CASCADE, to='tmssapp.WorkRelationSelectionTemplate')), ], @@ -470,8 +470,8 @@ class Migration(migrations.Migration): ('consumer', models.ForeignKey(help_text='Task Blueprint that has the input connector.', on_delete=django.db.models.deletion.CASCADE, related_name='consumed_by', to='tmssapp.TaskBlueprint')), ('dataformat', models.ForeignKey(help_text='Selected data format to use.', on_delete=django.db.models.deletion.PROTECT, to='tmssapp.Dataformat')), ('draft', models.ForeignKey(help_text='Task Relation Draft which this work request instantiates.', on_delete=django.db.models.deletion.CASCADE, related_name='related_task_relation_blueprint', to='tmssapp.TaskRelationDraft')), - ('input', models.ForeignKey(help_text='Input connector of consumer.', on_delete=django.db.models.deletion.CASCADE, related_name='inputs_task_relation_blueprint', to='tmssapp.TaskConnectors')), - ('output', models.ForeignKey(help_text='Output connector of producer.', on_delete=django.db.models.deletion.CASCADE, related_name='outputs_task_relation_blueprint', to='tmssapp.TaskConnectors')), + ('input', models.ForeignKey(help_text='Input connector of consumer.', on_delete=django.db.models.deletion.CASCADE, related_name='inputs_task_relation_blueprint', to='tmssapp.TaskConnector')), + ('output', models.ForeignKey(help_text='Output connector of producer.', on_delete=django.db.models.deletion.CASCADE, related_name='outputs_task_relation_blueprint', to='tmssapp.TaskConnector')), ('producer', models.ForeignKey(help_text='Task Blueprint that has the output connector.', on_delete=django.db.models.deletion.CASCADE, related_name='produced_by', to='tmssapp.TaskBlueprint')), ('selection_template', models.ForeignKey(help_text='Schema used for selection_doc.', on_delete=django.db.models.deletion.CASCADE, to='tmssapp.WorkRelationSelectionTemplate')), ], @@ -485,17 +485,17 @@ class Migration(migrations.Migration): field=models.ForeignKey(help_text='Schema used for requirements_doc.', on_delete=django.db.models.deletion.CASCADE, to='tmssapp.TaskTemplate'), ), migrations.AddField( - model_name='taskconnectors', + model_name='taskconnector', name='input_of', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='inputs', to='tmssapp.TaskTemplate'), ), migrations.AddField( - model_name='taskconnectors', + model_name='taskconnector', name='output_of', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='outputs', to='tmssapp.TaskTemplate'), ), migrations.AddField( - model_name='taskconnectors', + model_name='taskconnector', name='role', field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='tmssapp.Role'), ), @@ -858,7 +858,7 @@ class Migration(migrations.Migration): index=django.contrib.postgres.indexes.GinIndex(fields=['tags'], name='tmssapp_tas_tags_256437_gin'), ), migrations.AddIndex( - model_name='taskconnectors', + model_name='taskconnector', index=django.contrib.postgres.indexes.GinIndex(fields=['tags'], name='tmssapp_tas_tags_0ebd6d_gin'), ), migrations.AddIndex( diff --git a/SAS/TMSS/src/tmss/tmssapp/models/specification.py b/SAS/TMSS/src/tmss/tmssapp/models/specification.py index 6dd29ad59246cb26fc7b44fa87baed01897ffc4c..01bdd7960e8264415f98014eb0ca4e2eecdebc93 100644 --- a/SAS/TMSS/src/tmss/tmssapp/models/specification.py +++ b/SAS/TMSS/src/tmss/tmssapp/models/specification.py @@ -89,7 +89,7 @@ class AbstractChoice(Model): class Role(AbstractChoice): - """Defines the model and predefined list of possible Role's for TaskConnectors. + """Defines the model and predefined list of possible Role's for TaskConnector. The items in the Choises class below are automagically populated into the database via a data migration.""" class Choices(Enum): CORRELATOR = "correlator" @@ -102,7 +102,7 @@ class Role(AbstractChoice): class Datatype(AbstractChoice): - """Defines the model and predefined list of possible Datatype's for TaskConnectors. + """Defines the model and predefined list of possible Datatype's for TaskConnector. The items in the Choises class below are automagically populated into the database via a data migration.""" class Choices(Enum): VISIBILITIES = "visibilities" @@ -130,7 +130,7 @@ class CopyReason(AbstractChoice): # concrete models -class TaskConnectors(BasicCommon): +class TaskConnector(BasicCommon): role = ForeignKey('Role', null=False, on_delete=PROTECT) datatype = ForeignKey('Datatype', null=False, on_delete=PROTECT) dataformats = ManyToManyField('Dataformat', blank=True) @@ -297,8 +297,8 @@ class TaskRelationDraft(BasicCommon): dataformat = ForeignKey('Dataformat', null=False, on_delete=PROTECT, help_text='Selected data format to use. One of (MS, HDF5).') producer = ForeignKey('TaskDraft', related_name='produced_by', on_delete=CASCADE, help_text='Task Draft that has the output connector. NOTE: The producer does typically, but not necessarily, belong to the same Scheduling Unit (or even the same Project) as the consumer.') consumer = ForeignKey('TaskDraft', related_name='consumed_by', on_delete=CASCADE, help_text='Task Draft that has the input connector.') - input = ForeignKey('TaskConnectors', related_name='inputs_task_relation_draft', on_delete=CASCADE, help_text='Input connector of consumer.') - output = ForeignKey('TaskConnectors', related_name='outputs_task_relation_draft', on_delete=CASCADE, help_text='Output connector of producer.') + input = ForeignKey('TaskConnector', related_name='inputs_task_relation_draft', on_delete=CASCADE, help_text='Input connector of consumer.') + output = ForeignKey('TaskConnector', related_name='outputs_task_relation_draft', on_delete=CASCADE, help_text='Output connector of producer.') selection_template = ForeignKey('WorkRelationSelectionTemplate', on_delete=CASCADE, help_text='Schema used for selection_doc.') # todo: 'schema'? def save(self, force_insert=False, force_update=False, using=None, update_fields=None): @@ -313,8 +313,8 @@ class TaskRelationBlueprint(BasicCommon): dataformat = ForeignKey('Dataformat', null=False, on_delete=PROTECT, help_text='Selected data format to use.') producer = ForeignKey('TaskBlueprint', related_name='produced_by', on_delete=CASCADE, help_text='Task Blueprint that has the output connector.') consumer = ForeignKey('TaskBlueprint', related_name='consumed_by', on_delete=CASCADE, help_text='Task Blueprint that has the input connector.') - input = ForeignKey('TaskConnectors', related_name='inputs_task_relation_blueprint', on_delete=CASCADE, help_text='Input connector of consumer.') - output = ForeignKey('TaskConnectors', related_name='outputs_task_relation_blueprint', on_delete=CASCADE, help_text='Output connector of producer.') + input = ForeignKey('TaskConnector', related_name='inputs_task_relation_blueprint', on_delete=CASCADE, help_text='Input connector of consumer.') + output = ForeignKey('TaskConnector', related_name='outputs_task_relation_blueprint', on_delete=CASCADE, help_text='Output connector of producer.') draft = ForeignKey('TaskRelationDraft', on_delete=CASCADE, related_name='related_task_relation_blueprint', help_text='Task Relation Draft which this work request instantiates.') selection_template = ForeignKey('WorkRelationSelectionTemplate', on_delete=CASCADE, help_text='Schema used for selection_doc.') # todo: 'schema'? diff --git a/SAS/TMSS/src/tmss/tmssapp/serializers/specification.py b/SAS/TMSS/src/tmss/tmssapp/serializers/specification.py index e241bb9d02ffd4c9230fa78a454fe842f84fe264..7535bad2261bb573b8df0b4aab92e262c296f810 100644 --- a/SAS/TMSS/src/tmss/tmssapp/serializers/specification.py +++ b/SAS/TMSS/src/tmss/tmssapp/serializers/specification.py @@ -105,9 +105,9 @@ class CopyReasonSerializer(serializers.ModelSerializer): -class TaskConnectorsSerializer(serializers.HyperlinkedModelSerializer): +class TaskConnectorSerializer(serializers.HyperlinkedModelSerializer): class Meta: - model = models.TaskConnectors + model = models.TaskConnector fields = '__all__' diff --git a/SAS/TMSS/src/tmss/tmssapp/viewsets/scheduling.py b/SAS/TMSS/src/tmss/tmssapp/viewsets/scheduling.py index edc9ab43d276c032739d4764e663f84d1eb0f264..8a94006668be0cdc1209348dd79f303a8089939f 100644 --- a/SAS/TMSS/src/tmss/tmssapp/viewsets/scheduling.py +++ b/SAS/TMSS/src/tmss/tmssapp/viewsets/scheduling.py @@ -11,7 +11,7 @@ from django_filters import rest_framework as filters from lofar.sas.tmss.tmss.tmssapp.models.scheduling import Subtask # Don't use Ordering class from the django_filters but use rest_framework instead !! from rest_framework.filters import OrderingFilter - +from drf_yasg import openapi class subTaskFilter(filters.FilterSet): class Meta: @@ -223,9 +223,12 @@ class SubtaskViewSetJSONeditorOnline(LOFARViewSet): else: return models.Subtask.objects.all() +#content:'text/plain; charset=utf-8'} + #reponse_200 = openapi.Response('A LOFAR parset for this subtask (as plain text, not json', schema=openapi.Schema(type=openapi.TYPE_STRING)) @swagger_auto_schema(responses={200: 'A LOFAR parset for this subtask (as plain text, not json)', 403: 'forbidden', 404: 'Not found'}, + #produces='text/plain', operation_description="Get a LOFAR parset for the specifications of this subtask") @action(methods=['get'], detail=True) def parset(self, request, pk=None): diff --git a/SAS/TMSS/src/tmss/tmssapp/viewsets/specification.py b/SAS/TMSS/src/tmss/tmssapp/viewsets/specification.py index 16f25c43c2a58715bfba2ed1fc87ac401db3a410..f46858de037bff9221cc805fcbd9c9fc08b5d1ec 100644 --- a/SAS/TMSS/src/tmss/tmssapp/viewsets/specification.py +++ b/SAS/TMSS/src/tmss/tmssapp/viewsets/specification.py @@ -104,9 +104,9 @@ class ResourceUnitViewSet(LOFARViewSet): queryset = models.ResourceUnit.objects.all() serializer_class = serializers.ResourceUnitSerializer -class TaskConnectorsViewSet(LOFARViewSet): - queryset = models.TaskConnectors.objects.all() - serializer_class = serializers.TaskConnectorsSerializer +class TaskConnectorViewSet(LOFARViewSet): + queryset = models.TaskConnector.objects.all() + serializer_class = serializers.TaskConnectorSerializer @permission_classes((DjangoModelPermissions,)) # example override of default permissions per viewset | todo: review for production diff --git a/SAS/TMSS/src/tmss/urls.py b/SAS/TMSS/src/tmss/urls.py index 8bee6c119edb7f2ebb235431de3b873d51ae39bc..78905d967b0b0665193a5a6df2e89635f1cbc9db 100644 --- a/SAS/TMSS/src/tmss/urls.py +++ b/SAS/TMSS/src/tmss/urls.py @@ -42,8 +42,9 @@ swagger_schema_view = get_schema_view( license=openapi.License(name="GPL License v3"), ), validators=['flex', 'ssv'], - public=True, - permission_classes=(permissions.AllowAny,), + public=False, + # public=True, + # permission_classes=(permissions.AllowAny,), ) urlpatterns = [ @@ -76,7 +77,7 @@ router.register(r'generator_template', viewsets.GeneratorTemplateViewSet) router.register(r'scheduling_unit_template', viewsets.SchedulingUnitTemplateViewSet) router.register(r'task_template', viewsets.TaskTemplateViewSet) router.register(r'work_relation_selection_template', viewsets.WorkRelationSelectionTemplateViewSet) -router.register(r'task_connectors', viewsets.TaskConnectorsViewSet) +router.register(r'task_connector', viewsets.TaskConnectorViewSet) router.register(r'default_generator_template', viewsets.DefaultGeneratorTemplateViewSet) router.register(r'default_scheduling_unit_template', viewsets.DefaultSchedulingUnitTemplateViewSet) router.register(r'default_task_template', viewsets.DefaultTaskTemplateViewSet) @@ -98,16 +99,16 @@ router.register(r'task_relation_draft', viewsets.TaskRelationDraftViewSet) router.register(r'task_relation_blueprint', viewsets.TaskRelationBlueprintViewSet) # nested -router.register(r'cycle/(?P<cycle_pk>[\w\-]+)/project', viewsets.ProjectViewSet) -router.register(r'scheduling_set/(?P<scheduling_set_pk>\d+)/scheduling_unit_draft', viewsets.SchedulingUnitDraftViewSet) -router.register(r'scheduling_unit_draft/(?P<scheduling_unit_draft_pk>\d+)/scheduling_unit_blueprint', viewsets.SchedulingUnitBlueprintViewSet) -#router.register(r'scheduling_unit_draft/(?P<scheduling_unit_draft_pk>\d+)/task_draft', viewsets.TaskDraftViewSet) # todo: default view, re-activate or remove the JSON editor one in bottom -router.register(r'task_draft/(?P<task_draft_pk>\d+)/task_blueprint', viewsets.TaskBlueprintViewSet) -router.register(r'task_draft/(?P<task_draft_pk>\d+)/task_relation_draft', viewsets.TaskRelationDraftViewSet) -router.register(r'task_relation_draft/(?P<task_relation_draft_pk>\d+)/task_relation_blueprint', viewsets.TaskRelationBlueprintViewSet) -router.register(r'task_blueprint/(?P<task_blueprint_pk>\d+)/task_relation_blueprint', viewsets.TaskRelationBlueprintViewSet) -router.register(r'task_blueprint/(?P<task_blueprint_pk>\d+)/subtask', viewsets.SubtaskViewSet) -router.register(r'subtask/(?P<subtask_pk>[\w\-]+)/state_log', viewsets.SubtaskStateLogViewSet) +router.register(r'cycle/(?P<cycle_id>[\w\-]+)/project', viewsets.ProjectViewSet) +router.register(r'scheduling_set/(?P<scheduling_set_id>\d+)/scheduling_unit_draft', viewsets.SchedulingUnitDraftViewSet) +router.register(r'scheduling_unit_draft/(?P<scheduling_unit_draft_id>\d+)/scheduling_unit_blueprint', viewsets.SchedulingUnitBlueprintViewSet) +#router.register(r'scheduling_unit_draft/(?P<scheduling_unit_draft_id>\d+)/task_draft', viewsets.TaskDraftViewSet) # todo: default view, re-activate or remove the JSON editor one in bottom +router.register(r'task_draft/(?P<task_draft_id>\d+)/task_blueprint', viewsets.TaskBlueprintViewSet) +router.register(r'task_draft/(?P<task_draft_id>\d+)/task_relation_draft', viewsets.TaskRelationDraftViewSet) +router.register(r'task_relation_draft/(?P<task_relation_draft_id>\d+)/task_relation_blueprint', viewsets.TaskRelationBlueprintViewSet) +router.register(r'task_blueprint/(?P<task_blueprint_id>\d+)/task_relation_blueprint', viewsets.TaskRelationBlueprintViewSet) +router.register(r'task_blueprint/(?P<task_blueprint_id>\d+)/subtask', viewsets.SubtaskViewSet) +router.register(r'subtask/(?P<subtask_id>[\w\-]+)/state_log', viewsets.SubtaskStateLogViewSet) # SCHEDULING @@ -146,7 +147,7 @@ router.register(r'user', viewsets.UserViewSet) # JSON router.register(r'task_draft', viewsets.TaskDraftViewSetJSONeditorOnline) -router.register(r'scheduling_unit_draft/(?P<scheduling_unit_draft_pk>\d+)/task_draft', viewsets.TaskDraftViewSetJSONeditorOnline) +router.register(r'scheduling_unit_draft/(?P<scheduling_unit_draft_id>\d+)/task_draft', viewsets.TaskDraftViewSetJSONeditorOnline) router.register(r'subtask', viewsets.SubtaskViewSetJSONeditorOnline) urlpatterns.extend(router.urls) diff --git a/SAS/TMSS/test/t_tmssapp_specification_REST_API.py b/SAS/TMSS/test/t_tmssapp_specification_REST_API.py index 8c51bdb7dd7f74966b898f36b02ab94f3eee33b1..b5d61be388cea5bc1baf58b4e32125ab9007139f 100755 --- a/SAS/TMSS/test/t_tmssapp_specification_REST_API.py +++ b/SAS/TMSS/test/t_tmssapp_specification_REST_API.py @@ -319,87 +319,87 @@ class WorkRelationSelectionTemplateTestCase(unittest.TestCase): GET_OK_and_assert_equal_expected_response(self, BASE_URL + '/work_relation_selection_template/' + str(id2), test_data_2) -class TaskConnectorsTestCase(unittest.TestCase): +class TaskConnectorTestCase(unittest.TestCase): @classmethod def setUpClass(cls) -> None: cls.input_of_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskTemplate(), '/task_template/') cls.output_of_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskTemplate(), '/task_template/') - def test_task_connectors_list_apiformat(self): - r = requests.get(BASE_URL + '/task_connectors/?format=api', auth=AUTH) + def test_task_connector_list_apiformat(self): + r = requests.get(BASE_URL + '/task_connector/?format=api', auth=AUTH) self.assertEqual(r.status_code, 200) self.assertTrue("Task Connectors List" in r.content.decode('utf8')) - def test_task_connectors_GET_nonexistant_raises_error(self): - GET_and_assert_equal_expected_code(self, BASE_URL + '/task_connectors/1234321/', 404) + def test_task_connector_GET_nonexistant_raises_error(self): + GET_and_assert_equal_expected_code(self, BASE_URL + '/task_connector/1234321/', 404) - def test_task_connectors_POST_and_GET(self): - tc_test_data = test_data_creator.TaskConnectors(input_of_url=self.input_of_url, output_of_url=self.output_of_url) + def test_task_connector_POST_and_GET(self): + tc_test_data = test_data_creator.TaskConnector(input_of_url=self.input_of_url, output_of_url=self.output_of_url) # POST and GET a new item and assert correctness - r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_connectors/', tc_test_data, 201, tc_test_data) + r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_connector/', tc_test_data, 201, tc_test_data) url = r_dict['url'] GET_OK_and_assert_equal_expected_response(self, url, tc_test_data) - def test_task_connectors_POST_invalid_role_raises_error(self): + def test_task_connector_POST_invalid_role_raises_error(self): # POST a new item with invalid choice - test_data_invalid_role = dict(test_data_creator.TaskConnectors(input_of_url=self.input_of_url, output_of_url=self.output_of_url)) + test_data_invalid_role = dict(test_data_creator.TaskConnector(input_of_url=self.input_of_url, output_of_url=self.output_of_url)) test_data_invalid_role['role'] = BASE_URL + '/role/forbidden/' - r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_connectors/', test_data_invalid_role, 400, {}) + r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_connector/', test_data_invalid_role, 400, {}) self.assertTrue('Invalid hyperlink' in str(r_dict['role'])) - def test_task_connectors_POST_invalid_datatype_raises_error(self): + def test_task_connector_POST_invalid_datatype_raises_error(self): # POST a new item with invalid choice - test_data_invalid = dict(test_data_creator.TaskConnectors(input_of_url=self.input_of_url, output_of_url=self.output_of_url)) + test_data_invalid = dict(test_data_creator.TaskConnector(input_of_url=self.input_of_url, output_of_url=self.output_of_url)) test_data_invalid['datatype'] = BASE_URL + '/datatype/forbidden/' - r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_connectors/', test_data_invalid, 400, {}) + r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_connector/', test_data_invalid, 400, {}) self.assertTrue('Invalid hyperlink' in str(r_dict['datatype'])) - def test_task_connectors_POST_invalid_dataformats_raises_error(self): + def test_task_connector_POST_invalid_dataformats_raises_error(self): # POST a new item with invalid choice - test_data_invalid = dict(test_data_creator.TaskConnectors(input_of_url=self.input_of_url, output_of_url=self.output_of_url)) + test_data_invalid = dict(test_data_creator.TaskConnector(input_of_url=self.input_of_url, output_of_url=self.output_of_url)) test_data_invalid['dataformats'] = [BASE_URL + '/dataformat/forbidden/'] - r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_connectors/', test_data_invalid, 400, {}) + r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_connector/', test_data_invalid, 400, {}) self.assertTrue('Invalid hyperlink' in str(r_dict['dataformats'])) - def test_task_connectors_POST_nonexistant_input_of_raises_error(self): + def test_task_connector_POST_nonexistant_input_of_raises_error(self): # POST a new item with wrong reference - test_data_invalid = dict(test_data_creator.TaskConnectors(input_of_url=self.input_of_url, output_of_url=self.output_of_url)) + test_data_invalid = dict(test_data_creator.TaskConnector(input_of_url=self.input_of_url, output_of_url=self.output_of_url)) test_data_invalid['input_of'] = BASE_URL + "/task_template/6353748/" - r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_connectors/', test_data_invalid, 400, {}) + r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_connector/', test_data_invalid, 400, {}) self.assertTrue('Invalid hyperlink' in str(r_dict['input_of'])) - def test_task_connectors_POST_nonexistant_output_of_raises_error(self): + def test_task_connector_POST_nonexistant_output_of_raises_error(self): # POST a new item with wrong reference - test_data_invalid = dict(test_data_creator.TaskConnectors(input_of_url=self.input_of_url, output_of_url=self.output_of_url)) + test_data_invalid = dict(test_data_creator.TaskConnector(input_of_url=self.input_of_url, output_of_url=self.output_of_url)) test_data_invalid['output_of'] = BASE_URL + "/task_template/6353748/" - r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_connectors/', test_data_invalid, 400, {}) + r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_connector/', test_data_invalid, 400, {}) self.assertTrue('Invalid hyperlink' in str(r_dict['output_of'])) - def test_task_connectors_POST_existing_outputs_works(self): + def test_task_connector_POST_existing_outputs_works(self): # First POST a new item to reference r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_template/', test_data_creator.TaskTemplate(), 201, test_data_creator.TaskTemplate()) url = r_dict['url'] # POST a new item with correct reference - test_data_valid = dict(test_data_creator.TaskConnectors(input_of_url=self.input_of_url, output_of_url=self.output_of_url)) + test_data_valid = dict(test_data_creator.TaskConnector(input_of_url=self.input_of_url, output_of_url=self.output_of_url)) test_data_valid['output_of'] = url - POST_and_assert_expected_response(self, BASE_URL + '/task_connectors/', test_data_valid, 201, test_data_valid) + POST_and_assert_expected_response(self, BASE_URL + '/task_connector/', test_data_valid, 201, test_data_valid) - def test_task_connectors_PUT_nonexistant_raises_error(self): - PUT_and_assert_expected_response(self, BASE_URL + '/task_connectors/9876789876/', test_data_creator.TaskConnectors(input_of_url=self.input_of_url, output_of_url=self.output_of_url), 404, {}) + def test_task_connector_PUT_nonexistant_raises_error(self): + PUT_and_assert_expected_response(self, BASE_URL + '/task_connector/9876789876/', test_data_creator.TaskConnector(input_of_url=self.input_of_url, output_of_url=self.output_of_url), 404, {}) - def test_task_connectors_PUT(self): - tc_test_data1 = test_data_creator.TaskConnectors(role="correlator", input_of_url=self.input_of_url, output_of_url=self.output_of_url) - tc_test_data2 = test_data_creator.TaskConnectors(role="beamformer", input_of_url=self.input_of_url, output_of_url=self.output_of_url) + def test_task_connector_PUT(self): + tc_test_data1 = test_data_creator.TaskConnector(role="correlator", input_of_url=self.input_of_url, output_of_url=self.output_of_url) + tc_test_data2 = test_data_creator.TaskConnector(role="beamformer", input_of_url=self.input_of_url, output_of_url=self.output_of_url) # POST new item, verify - r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_connectors/', tc_test_data1, 201, tc_test_data1) + r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_connector/', tc_test_data1, 201, tc_test_data1) url = r_dict['url'] GET_OK_and_assert_equal_expected_response(self, url, tc_test_data1) @@ -407,11 +407,11 @@ class TaskConnectorsTestCase(unittest.TestCase): PUT_and_assert_expected_response(self, url, tc_test_data2, 200, tc_test_data2) GET_OK_and_assert_equal_expected_response(self, url, tc_test_data2) - def test_task_connectors_PATCH(self): - tc_test_data = test_data_creator.TaskConnectors(input_of_url=self.input_of_url, output_of_url=self.output_of_url) + def test_task_connector_PATCH(self): + tc_test_data = test_data_creator.TaskConnector(input_of_url=self.input_of_url, output_of_url=self.output_of_url) # POST new item, verify - r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_connectors/', tc_test_data, 201, tc_test_data) + r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_connector/', tc_test_data, 201, tc_test_data) url = r_dict['url'] GET_OK_and_assert_equal_expected_response(self, url, tc_test_data) @@ -425,11 +425,11 @@ class TaskConnectorsTestCase(unittest.TestCase): expected_data.update(test_patch) GET_OK_and_assert_equal_expected_response(self, url, expected_data) - def test_task_connectors_DELETE(self): - tc_test_data = test_data_creator.TaskConnectors(input_of_url=self.input_of_url, output_of_url=self.output_of_url) + def test_task_connector_DELETE(self): + tc_test_data = test_data_creator.TaskConnector(input_of_url=self.input_of_url, output_of_url=self.output_of_url) # POST new item, verify - r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_connectors/', tc_test_data, 201, tc_test_data) + r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_connector/', tc_test_data, 201, tc_test_data) url = r_dict['url'] GET_OK_and_assert_equal_expected_response(self, url, tc_test_data) @@ -438,9 +438,9 @@ class TaskConnectorsTestCase(unittest.TestCase): def test_task_relation_blueprint_CASCADE_behavior_on_inputs_template_deleted(self): input_of_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskTemplate(), '/task_template/') - tc_test_data = test_data_creator.TaskConnectors(input_of_url=input_of_url, output_of_url=self.output_of_url) + tc_test_data = test_data_creator.TaskConnector(input_of_url=input_of_url, output_of_url=self.output_of_url) # POST new item - url = POST_and_assert_expected_response(self, BASE_URL + '/task_connectors/', tc_test_data, 201, tc_test_data)['url'] + url = POST_and_assert_expected_response(self, BASE_URL + '/task_connector/', tc_test_data, 201, tc_test_data)['url'] # verify GET_OK_and_assert_equal_expected_response(self, url, tc_test_data) # DELETE dependency @@ -450,9 +450,9 @@ class TaskConnectorsTestCase(unittest.TestCase): def test_task_relation_blueprint_CASCADE_behavior_on_outputs_template_deleted(self): output_of_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskTemplate(), '/task_template/') - tc_test_data = test_data_creator.TaskConnectors(input_of_url=self.input_of_url, output_of_url=output_of_url) + tc_test_data = test_data_creator.TaskConnector(input_of_url=self.input_of_url, output_of_url=output_of_url) # POST new item - url = POST_and_assert_expected_response(self, BASE_URL + '/task_connectors/', tc_test_data, 201, tc_test_data)['url'] + url = POST_and_assert_expected_response(self, BASE_URL + '/task_connector/', tc_test_data, 201, tc_test_data)['url'] # verify GET_OK_and_assert_equal_expected_response(self, url, tc_test_data) # DELETE dependency @@ -460,14 +460,13 @@ class TaskConnectorsTestCase(unittest.TestCase): # assert GET_and_assert_equal_expected_code(self, url, 404) - def test_GET_task_connectors_view_returns_correct_entry(self): + def test_GET_task_connector_view_returns_correct_entry(self): - test_data_1 = TaskConnectors_test_data() - test_data_2 = TaskConnectors_test_data() - id1 = models.TaskConnectors.objects.create(**test_data_1).id - id2 = models.TaskConnectors.objects.create(**test_data_2).id - GET_OK_and_assert_equal_expected_response(self, BASE_URL + '/task_connectors/' + str(id1), test_data_1) - GET_OK_and_assert_equal_expected_response(self, BASE_URL + '/task_connectors/' + str(id2), test_data_2) + test_data_1 = TaskConnector_test_data() + test_data_2 = TaskConnector_test_data() + id2 = models.TaskConnector.objects.create(**test_data_2).id + GET_OK_and_assert_equal_expected_response(self, BASE_URL + '/task_connector/' + str(id1), test_data_1) + GET_OK_and_assert_equal_expected_response(self, BASE_URL + '/task_connector/' + str(id2), test_data_2) class DefaultTemplates(unittest.TestCase): @@ -1407,8 +1406,8 @@ class TaskRelationDraftTestCase(unittest.TestCase): cls.producer_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskDraft(), '/task_draft/') cls.consumer_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskDraft(), '/task_draft/') cls.template_url = test_data_creator.post_data_and_get_url(test_data_creator.WorkRelationSelectionTemplate(), '/work_relation_selection_template/') - cls.input_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskConnectors(), '/task_connectors/') - cls.output_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskConnectors(), '/task_connectors/') + cls.input_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskConnector(), '/task_connector/') + cls.output_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskConnector(), '/task_connector/') def test_task_relation_draft_list_apiformat(self): r = requests.get(BASE_URL + '/task_relation_draft/?format=api', auth=AUTH) @@ -1521,7 +1520,7 @@ class TaskRelationDraftTestCase(unittest.TestCase): GET_and_assert_equal_expected_code(self, url, 404) def test_task_relation_draft_CASCADE_behavior_on_input_deleted(self): - input_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskConnectors(), '/task_connectors/') + input_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskConnector(), '/task_connector/') trd_test_data = test_data_creator.TaskRelationDraft(input_url=input_url, producer_url=self.producer_url, consumer_url=self.consumer_url, template_url=self.template_url, output_url=self.output_url) # POST new item @@ -1538,7 +1537,7 @@ class TaskRelationDraftTestCase(unittest.TestCase): GET_and_assert_equal_expected_code(self, url, 404) def test_task_relation_draft_CASCADE_behavior_on_output_deleted(self): - output_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskConnectors(), '/task_connectors/') + output_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskConnector(), '/task_connector/') trd_test_data = test_data_creator.TaskRelationDraft(output_url=output_url, producer_url=self.producer_url, consumer_url=self.consumer_url, template_url=self.template_url, input_url=self.input_url) # POST new item with dependency @@ -1974,8 +1973,8 @@ class TaskRelationBlueprintTestCase(unittest.TestCase): cls.producer_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskBlueprint(), '/task_blueprint/') cls.consumer_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskBlueprint(), '/task_blueprint/') cls.template_url = test_data_creator.post_data_and_get_url(test_data_creator.WorkRelationSelectionTemplate(), '/work_relation_selection_template/') - cls.input_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskConnectors(), '/task_connectors/') - cls.output_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskConnectors(), '/task_connectors/') + cls.input_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskConnector(), '/task_connector/') + cls.output_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskConnector(), '/task_connector/') def test_task_relation_blueprint_list_apiformat(self): r = requests.get(BASE_URL + '/task_relation_blueprint/?format=api', auth=AUTH) @@ -2154,7 +2153,7 @@ class TaskRelationBlueprintTestCase(unittest.TestCase): GET_and_assert_equal_expected_code(self, url, 404) def test_task_relation_blueprint_CASCADE_behavior_on_input_deleted(self): - input_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskConnectors(), '/task_connectors/') + input_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskConnector(), '/task_connector/') trb_test_data = test_data_creator.TaskRelationBlueprint(draft_url=self.draft_url, template_url=self.template_url, input_url=input_url, output_url=self.output_url, consumer_url=self.consumer_url, producer_url=self.producer_url) # POST new item @@ -2171,7 +2170,7 @@ class TaskRelationBlueprintTestCase(unittest.TestCase): GET_and_assert_equal_expected_code(self, url, 404) def test_task_relation_blueprint_CASCADE_behavior_on_output_deleted(self): - output_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskConnectors(), '/task_connectors/') + output_url = test_data_creator.post_data_and_get_url(test_data_creator.TaskConnector(), '/task_connector/') trb_test_data = test_data_creator.TaskRelationBlueprint(draft_url=self.draft_url, template_url=self.template_url, input_url=self.input_url, output_url=output_url, consumer_url=self.consumer_url, producer_url=self.producer_url) # POST new item with dependency diff --git a/SAS/TMSS/test/t_tmssapp_specification_django_API.py b/SAS/TMSS/test/t_tmssapp_specification_django_API.py index d4301723b0c597e5054c3f7de2dad64db244d8f8..6e0e78cc389bcd6e891055cf5ee9a9e956fbf7b1 100755 --- a/SAS/TMSS/test/t_tmssapp_specification_django_API.py +++ b/SAS/TMSS/test/t_tmssapp_specification_django_API.py @@ -157,27 +157,27 @@ class WorkRelationSelectionTemplateTest(unittest.TestCase): self.assertGreater(after, entry.updated_at) -class TaskConnectorsTest(unittest.TestCase): +class TaskConnectorTest(unittest.TestCase): - def test_POST_TaskConnectors_prevents_missing_input_of(self): + def test_POST_TaskConnector_prevents_missing_input_of(self): # setup - test_data_1 = dict(TaskConnectors_test_data()) + test_data_1 = dict(TaskConnector_test_data()) test_data_1['input_of'] = None # assert with self.assertRaises(IntegrityError): - models.TaskConnectors.objects.create(**test_data_1) + models.TaskConnector.objects.create(**test_data_1) - def test_POST_TaskConnectors_prevents_missing_output_of(self): + def test_POST_TaskConnector_prevents_missing_output_of(self): # setup - test_data_1 = dict(TaskConnectors_test_data()) + test_data_1 = dict(TaskConnector_test_data()) test_data_1['output_of'] = None # assert with self.assertRaises(IntegrityError): - models.TaskConnectors.objects.create(**test_data_1) + models.TaskConnector.objects.create(**test_data_1) class CycleTest(unittest.TestCase): diff --git a/SAS/TMSS/test/tmss_test_data_django_models.py b/SAS/TMSS/test/tmss_test_data_django_models.py index 0473b8c7b18a101acfb3c973adb66f55a9e263eb..1732fc53c41b36ab71d93ba51328b5c88d1bc76e 100644 --- a/SAS/TMSS/test/tmss_test_data_django_models.py +++ b/SAS/TMSS/test/tmss_test_data_django_models.py @@ -69,7 +69,7 @@ def WorkRelationSelectionTemplate_test_data(name="my_WorkRelationSelectionTempla "schema": {"mykey": "my value"}, "tags": ["TMSS", "TESTING"]} -def TaskConnectors_test_data() -> dict: +def TaskConnector_test_data() -> dict: return {"role": models.Role.objects.get(value='calibrator'), "datatype": models.Datatype.objects.get(value='instrument model'), "output_of": models.TaskTemplate.objects.create(**TaskTemplate_test_data()), @@ -159,8 +159,8 @@ def TaskRelationDraft_test_data() -> dict: "dataformat": models.Dataformat.objects.get(value='Beamformed'), "producer": models.TaskDraft.objects.create(**TaskDraft_test_data()), "consumer": models.TaskDraft.objects.create(**TaskDraft_test_data()), - "input": models.TaskConnectors.objects.create(**TaskConnectors_test_data()), - "output": models.TaskConnectors.objects.create(**TaskConnectors_test_data()), + "input": models.TaskConnector.objects.create(**TaskConnector_test_data()), + "output": models.TaskConnector.objects.create(**TaskConnector_test_data()), "selection_template": models.WorkRelationSelectionTemplate.objects.create(**WorkRelationSelectionTemplate_test_data())} def SchedulingUnitBlueprint_test_data(name='my_scheduling_unit_blueprint') -> dict: @@ -189,8 +189,8 @@ def TaskRelationBlueprint_test_data() -> dict: return { "tags": [], "selection_doc": "{}", "dataformat": models.Dataformat.objects.get(value='Beamformed'), - "input": models.TaskConnectors.objects.create(**TaskConnectors_test_data()), - "output": models.TaskConnectors.objects.create(**TaskConnectors_test_data()), + "input": models.TaskConnector.objects.create(**TaskConnector_test_data()), + "output": models.TaskConnector.objects.create(**TaskConnector_test_data()), "draft": models.TaskRelationDraft.objects.create(**TaskRelationDraft_test_data()), "selection_template": models.WorkRelationSelectionTemplate.objects.create(**WorkRelationSelectionTemplate_test_data()), "producer": models.TaskBlueprint.objects.create(**TaskBlueprint_test_data()), diff --git a/SAS/TMSS/test/tmss_test_data_rest.py b/SAS/TMSS/test/tmss_test_data_rest.py index 656a2f5cd70cf451241ab4fb0c93af52ba4600cb..2a42a4ca9dcf3b29c4a80b8fc68e20c1044d2205 100644 --- a/SAS/TMSS/test/tmss_test_data_rest.py +++ b/SAS/TMSS/test/tmss_test_data_rest.py @@ -75,7 +75,7 @@ class TMSSRESTTestDataCreator(): "schema": {"mykey": "my value"}, "tags": ["TMSS", "TESTING"]} - def TaskConnectors(self, role="correlator", input_of_url=None, output_of_url=None): + def TaskConnector(self, role="correlator", input_of_url=None, output_of_url=None): if input_of_url is None: input_of_url = self.post_data_and_get_url(self.TaskTemplate(), '/task_template/') @@ -212,10 +212,10 @@ class TMSSRESTTestDataCreator(): template_url = self.post_data_and_get_url(self.WorkRelationSelectionTemplate(), '/work_relation_selection_template/') if input_url is None: - input_url = self.post_data_and_get_url(self.TaskConnectors(), '/task_connectors/') + input_url = self.post_data_and_get_url(self.TaskConnector(), '/task_connector/') if output_url is None: - output_url = self.post_data_and_get_url(self.TaskConnectors(), '/task_connectors/') + output_url = self.post_data_and_get_url(self.TaskConnector(), '/task_connector/') return {"tags": [], "selection_doc": "{}", @@ -278,10 +278,10 @@ class TMSSRESTTestDataCreator(): template_url = self.post_data_and_get_url(self.WorkRelationSelectionTemplate(), '/work_relation_selection_template/') if input_url is None: - input_url = self.post_data_and_get_url(self.TaskConnectors(), '/task_connectors/') + input_url = self.post_data_and_get_url(self.TaskConnector(), '/task_connector/') if output_url is None: - output_url = self.post_data_and_get_url(self.TaskConnectors(), '/task_connectors/') + output_url = self.post_data_and_get_url(self.TaskConnector(), '/task_connector/') # test data return {"tags": [],