diff --git a/SAS/TMSS/src/tmss/tmssapp/models/specification.py b/SAS/TMSS/src/tmss/tmssapp/models/specification.py index 2956c3e09c58785fe0948e66f72a0cce770d5ad0..225dde5cefcf7e9b2118ad68d047fac1c10df8a2 100644 --- a/SAS/TMSS/src/tmss/tmssapp/models/specification.py +++ b/SAS/TMSS/src/tmss/tmssapp/models/specification.py @@ -131,6 +131,15 @@ class CopyReason(AbstractChoice): REPEATED = "repeated" +class SchedulingRelationPlacement(AbstractChoice): + """Defines how "first" must be places with respect to "second". One of BEFORE, AFTER, PARALLEL.""" + class Choices(Enum): + BEFORE = "before" + AFTER = "after" + PARALLEL = "paralle" + + + # concrete models class TaskConnector(BasicCommon): @@ -382,3 +391,16 @@ class TaskRelationBlueprint(BasicCommon): super().save(force_insert, force_update, using, update_fields) + +class TaskSchedulingRelationBlueprint(BasicCommon): + first = ForeignKey('TaskBlueprint', related_name='first_to_connect', on_delete=CASCADE, help_text='First Task Blueprint to connect.') + second = ForeignKey('TaskBlueprint', related_name='second_to_connect', on_delete=CASCADE, help_text='Second Task Blueprint to connect.') + placement = ForeignKey('SchedulingRelationPlacement', null=False, on_delete=PROTECT, help_text='Task scheduling relation placement.') + time_offset = IntegerField(default=0, help_text='Time offset of start of second task with respect to start of first task.') + +class TaskSchedulingRelationDraft(BasicCommon): + fist = ForeignKey('TaskDraft', related_name='first_to_connect', on_delete=CASCADE, help_text='First Task Draft to connect.') + second = ForeignKey('TaskDraft', related_name='second_to_connect', on_delete=CASCADE, help_text='Secind Task Draftto connect.') + placement = ForeignKey('SchedulingRelationPlacement', null=False, on_delete=PROTECT, help_text='Task scheduling relation placement.') + + time_offset = IntegerField(default=0, help_text='Time offset of start of second task with respect to start of first task.') \ No newline at end of file diff --git a/SAS/TMSS/src/tmss/tmssapp/serializers/specification.py b/SAS/TMSS/src/tmss/tmssapp/serializers/specification.py index a745c8e18e36f4995e1e2a75020b5d4142010258..6c02a2680173bc4047a34645bebbd6035e4da2df 100644 --- a/SAS/TMSS/src/tmss/tmssapp/serializers/specification.py +++ b/SAS/TMSS/src/tmss/tmssapp/serializers/specification.py @@ -267,3 +267,24 @@ class TaskRelationBlueprintSerializer(serializers.HyperlinkedModelSerializer): +class TaskSchedulingRelationDraftSerializer(RelationalHyperlinkedModelSerializer): + pass + +class TaskSchedulingRelationBlueprintSerializer(RelationalHyperlinkedModelSerializer): + # Create a JSON editor form to replace the simple text field based on the schema in the template that this + # draft refers to. If that fails, the JSONField remains a standard text input. + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + try: + self.fields['first'] = JSONEditorField(self.instance.selection_template.schema) + except Exception as e: + pass + + class Meta: + model = models.TaskSchedulingRelationBlueprint + fields = '__all__' + + + + + diff --git a/SAS/TMSS/src/tmss/tmssapp/viewsets/specification.py b/SAS/TMSS/src/tmss/tmssapp/viewsets/specification.py index 4516d434acbf9e031a0c6daad5d01a019668cea2..f84917c922c6e077f229290644b9ee0dc408846b 100644 --- a/SAS/TMSS/src/tmss/tmssapp/viewsets/specification.py +++ b/SAS/TMSS/src/tmss/tmssapp/viewsets/specification.py @@ -401,6 +401,15 @@ class TaskRelationBlueprintViewSet(LOFARViewSet): serializer_class = serializers.TaskRelationBlueprintSerializer +class TaskSchedulingRelationBlueprintViewSet(LOFARViewSet): + queryset = models.TaskSchedulingRelationBlueprint.objects.all() + serializer_class = serializers.TaskSchedulingRelationBlueprintSerializer + +class TaskSchedulingRelationDraftViewSet(LOFARViewSet): + queryset = models.TaskSchedulingRelationDraft.objects.all() + serializer_class = serializers.TaskSchedulingRelationDraftSerializer + + class TaskRelationBlueprintNestedViewSet(LOFARNestedViewSet): queryset = models.TaskRelationBlueprint.objects.all() @@ -416,4 +425,3 @@ class TaskRelationBlueprintNestedViewSet(LOFARNestedViewSet): return task_relation_draft.related_task_relation_blueprint.all() else: return models.TaskRelationBlueprint.objects.all() - diff --git a/SAS/TMSS/src/tmss/urls.py b/SAS/TMSS/src/tmss/urls.py index 364d521a0b15de2aabcef524a0d8d840ab77809d..a10c90d99c03835317b3555b9c9e42673b9703c7 100644 --- a/SAS/TMSS/src/tmss/urls.py +++ b/SAS/TMSS/src/tmss/urls.py @@ -97,6 +97,8 @@ router.register(r'task_draft', viewsets.TaskDraftViewSet) router.register(r'task_blueprint', viewsets.TaskBlueprintViewSet) router.register(r'task_relation_draft', viewsets.TaskRelationDraftViewSet) router.register(r'task_relation_blueprint', viewsets.TaskRelationBlueprintViewSet) +router.register(r'task_scheduling_relation_draft', viewsets.TaskSchedulingRelationDraftViewSet) +router.register(r'task_scheduling_relation_blueprint', viewsets.TaskSchedulingRelationBlueprintViewSet) # nested router.register(r'cycle/(?P<cycle_id>[\w\-]+)/project', viewsets.ProjectNestedViewSet)