diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000000000000000000000000000000000..cad7657dfa543e02eca53f1ecc7545c92bc0a550 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "cmake.configureOnOpen": false +} \ No newline at end of file diff --git a/SAS/TMSS/src/tmss/urls.py b/SAS/TMSS/src/tmss/urls.py index 781e6af696a5bc3f0827c84b8c60286fa898112f..4da12093c1a60461d210a3441bca7c86b8409b9b 100644 --- a/SAS/TMSS/src/tmss/urls.py +++ b/SAS/TMSS/src/tmss/urls.py @@ -31,7 +31,9 @@ from drf_yasg import openapi from datetime import datetime import os from material.frontend import urls as frontend_urls + from viewflow.flow.viewset import FlowViewSet +from .workflowapp import viewsets as workflow_viewsets # @@ -202,7 +204,21 @@ router.register(r'user', viewsets.UserViewSet) router.register(r'sap', viewsets.SAPViewSet) router.register(r'sip_identifier', viewsets.SIPidentifierViewSet) -# --- +# --- +# QA Workflow steps +viewflow_urlpatterns = [] + +viewflow_router = OptionalSlashRouter() +viewflow_router.APIRootView = TMSSAPIRootView + +viewflow_router.register('scheduling_unit_flow/su', workflow_viewsets.SchedulingUnitFlowViewSet, basename='su') +viewflow_router.register('scheduling_unit_flow/qa_reporting_to', workflow_viewsets.QAReportingTOViewSet, basename='qa_reporting_to') +viewflow_router.register('scheduling_unit_flow/qa_reporting_sos', workflow_viewsets.QAReportingSOSViewSet, basename='qa_reporting_sos') +viewflow_router.register('scheduling_unit_flow/qa_pi_verification', workflow_viewsets.PIVerificationViewSet, basename='qa_pi_verification') +viewflow_router.register('scheduling_unit_flow/qa_decide_acceptance', workflow_viewsets.DecideAcceptanceViewSet, basename='qa_decide_acceptance') +viewflow_router.register('scheduling_unit_flow/qa_scheduling_unit_process', workflow_viewsets.SchedulingUnitProcessViewSet, basename='qa_scheduling_unit_process') + +viewflow_urlpatterns.extend(viewflow_router.urls) urlpatterns.extend(router.urls) @@ -210,12 +226,12 @@ frontend_urlpatterns = [ path("", views.index, name="index") ] - -urlpatterns = [url(r'^api$', RedirectView.as_view(url='/api/')), - url(r'^api/', include(urlpatterns)), url(r'^oidc$', - RedirectView.as_view(url='/oidc/')), +urlpatterns = [ url(r'^api$', RedirectView.as_view(url='/api/')), + url(r'^api/', include(urlpatterns)), + url(r'^oidc$', RedirectView.as_view(url='/oidc/')), url(r'^oidc/', include('mozilla_django_oidc.urls')), url(r'^workflow$', RedirectView.as_view(url='/workflow/', permanent=False)), + url(r'^workflow_api/', include(viewflow_urlpatterns)), url(r'', include(frontend_urls)), url(r'^.*', include(frontend_urlpatterns)), ] diff --git a/SAS/TMSS/src/tmss/workflowapp/CMakeLists.txt b/SAS/TMSS/src/tmss/workflowapp/CMakeLists.txt index 94b72e83e35a77ab9b16f84b7647f8ab0c8af94a..e7c3171661a6fd3927e6b4214251c21f0240d0b1 100644 --- a/SAS/TMSS/src/tmss/workflowapp/CMakeLists.txt +++ b/SAS/TMSS/src/tmss/workflowapp/CMakeLists.txt @@ -15,3 +15,6 @@ add_subdirectory(migrations) add_subdirectory(models) add_subdirectory(flows) add_subdirectory(viewsets) +add_subdirectory(forms) +add_subdirectory(templates) +add_subdirectory(serializers) diff --git a/SAS/TMSS/src/tmss/workflowapp/flows/CMakeLists.txt b/SAS/TMSS/src/tmss/workflowapp/flows/CMakeLists.txt index 769f922e4781a912f1c0488c3655f6ab61363d3a..ba35dcf6abd1341333f5da54b43b2977805ef628 100644 --- a/SAS/TMSS/src/tmss/workflowapp/flows/CMakeLists.txt +++ b/SAS/TMSS/src/tmss/workflowapp/flows/CMakeLists.txt @@ -4,7 +4,7 @@ include(PythonInstall) set(_py_files __init__.py helloworldflow.py - schedulingunitdemoflow.py + schedulingunitflow.py ) python_install(${_py_files} diff --git a/SAS/TMSS/src/tmss/workflowapp/flows/__init__.py b/SAS/TMSS/src/tmss/workflowapp/flows/__init__.py index 45516795a25730483ebfa40c1fbdb5f533df8ebe..a0ae3713747c0b28c5595736d06f4bcb800da5b5 100644 --- a/SAS/TMSS/src/tmss/workflowapp/flows/__init__.py +++ b/SAS/TMSS/src/tmss/workflowapp/flows/__init__.py @@ -1,2 +1,2 @@ from .helloworldflow import * -from .schedulingunitdemoflow import * \ No newline at end of file +from .schedulingunitflow import * \ No newline at end of file diff --git a/SAS/TMSS/src/tmss/workflowapp/flows/schedulingunitdemoflow.py b/SAS/TMSS/src/tmss/workflowapp/flows/schedulingunitflow.py similarity index 57% rename from SAS/TMSS/src/tmss/workflowapp/flows/schedulingunitdemoflow.py rename to SAS/TMSS/src/tmss/workflowapp/flows/schedulingunitflow.py index 0a2882d7a4550ef3ff8e60b190c4074f60356795..8d01c51a15bc840bdb775acce1297938234a1611 100644 --- a/SAS/TMSS/src/tmss/workflowapp/flows/schedulingunitdemoflow.py +++ b/SAS/TMSS/src/tmss/workflowapp/flows/schedulingunitflow.py @@ -9,6 +9,7 @@ from viewflow.flow.nodes import Signal from viewflow import mixins from .. import models +from .. import viewsets from viewflow import frontend, ThisObject from viewflow.activation import STATUS @@ -26,7 +27,7 @@ class ConditionActivation(FuncActivation): return activation class Condition(Signal): - #task_type = "HUMAN" # makes it show up in the unassigned task lists + task_type = "HUMAN" # makes it show up in the unassigned task lists activation_class = ConditionActivation def __init__(self, condition_check, signal, sender=None, task_loader=None, **kwargs): @@ -65,55 +66,14 @@ class Condition(Signal): super(Condition, self).ready() @frontend.register -class SchedulingUnitDemoFlow(Flow): - process_class = models.SchedulingUnitDemoProcess - - # 0. Start on SU instantiation - # 1. To be Manually scheduled? -> Go to 1a - # 1a. Present view to manually schedule. - # 2. Wait on signal SU got finished/error/cancelled (might have already!!) -> - # - Wait for assignment to RO user - # View: - Present any quality plots - # - Present any error info - # - Present fixing options - # - Present choice to fix & redo, discard, or continue. - # Continue: - # View: - Present any quality plots - # - Present any error info - # - Submit quality report/score - # - Submit recommendation - # 3. - Assign ticket to Contact Author - # - Present quality plots to user - # - Present quality report/score, and recommendation - # - Submit acceptance & report - # 4. - Assign ticket to owner in step 2. - # - Present quality report/score, and recommendation - # - Present acceptance & report - # - Present choice to ingest or discard. - # Ingest: - # Set ingestable flag on SU. - # Discard: - Cancel SU (triggering garbage collection - # - # Fix & Redo: - # - Wait for user to confirm SU is fixed - # - Go to 2 - # - - # Consider adding to any/all views: - # - Present any opened JIRA tickets - # - Present opportunity to open JIRA ticket - # Note that previously submitted info can be found by clicking through the task. So - # we only need to show whats nominally needed. - # Note that orthogonally to the above flow: - # - Users need to be informed tasks are assigned to them (e-mail?) - # - Users already have an overview in viewflow of tickets assigned to them - # - We likely want to control what e-mails are sent. +class SchedulingUnitFlow(Flow): + process_class = models.SchedulingUnitProcess start = ( flow.StartSignal( post_save, this.on_save_can_start, - sender=models.SchedulingUnitDemo + sender=models.SchedulingUnit ).Next(this.wait_schedulable) ) @@ -121,39 +81,77 @@ class SchedulingUnitDemoFlow(Flow): Condition( this.check_condition, post_save, - sender=models.SchedulingUnitDemo, + sender=models.SchedulingUnit, task_loader=this.get_scheduling_unit_task ) - .Next(this.form) + .Next(this.qa_reporting_to) ) - form = ( + #QA Reporting (TO) + qa_reporting_to = ( flow.View( - UpdateProcessView, - fields=["text"] + viewsets.QAReportingTOView, + task_description='QA Reporting (TO)' ).Permission( auto_create=True - ).Next(this.approve) + ).Next(this.check_operator_accept) + ) + + #Quality Acceptable + check_operator_accept = ( + flow.If(lambda activation: activation.process.qa_reporting_to.operator_accept) + .Then(this.qa_reporting_sos) + .Else(this.mark_sub) ) - approve = ( + #QA Reporting (SOS) + qa_reporting_sos = ( flow.View( - UpdateProcessView, - fields=["approved"] + viewsets.QAReportingSOSView, + task_description='QA Reporting (SOS)' ).Permission( auto_create=True - ).Next(this.check_approve) + ).Next(this.check_sos_accept_show_pi) + ) + + #Quality Acceptable + check_sos_accept_show_pi = ( + flow.If(lambda activation: activation.process.qa_reporting_sos.sos_accept_show_pi) + .Then(this.pi_verification) + .Else(this.mark_sub) ) - check_approve = ( - flow.If(lambda activation: activation.process.approved) - .Then(this.send) - .Else(this.end) + #PI Verification + pi_verification = ( + flow.View( + viewsets.PIVerificationView, + task_description='PI Verification' + ).Permission( + auto_create=True + ).Next(this.decide_acceptance) ) - send = ( + #Decide Acceptance + decide_acceptance = ( + flow.View( + viewsets.DecideAcceptanceView, + task_description='Decide Acceptance' + ).Permission( + auto_create=True + ).Next(this.check_sos_accept_after_pi) + ) + + #Quality Acceptable + check_sos_accept_after_pi = ( + flow.If(lambda activation: activation.process.decide_acceptance.sos_accept_after_pi) + .Then(this.mark_sub) + .Else(this.mark_sub) + ) + + #Mark SUB Successful/failed + mark_sub = ( flow.Handler( - this.send_hello_world_request + this.do_mark_sub ).Next(this.end) ) @@ -164,14 +162,29 @@ class SchedulingUnitDemoFlow(Flow): if created: activation.prepare() activation.process.su = instance + activation.done() print("workflow started") else: print("no workflow started") return activation - def send_hello_world_request(self, activation): - print(activation.process.text) + + def do_mark_sub(self, activation): + + activation.process.can_delete = True + activation.process.results_accepted = ((activation.process.qa_reporting_to is not None and activation.process.qa_reporting_to.operator_accept) + and (activation.process.qa_reporting_sos is not None and activation.process.qa_reporting_sos.sos_accept_show_pi) + and (activation.process.decide_acceptance is not None and activation.process.decide_acceptance.sos_accept_after_pi)) + + print("!!!!!!!!!!!END FLOW!!!!!!!!!!!") + print ("can_delete:") + print (activation.process.can_delete) + print ("results_accepted:") + print (activation.process.results_accepted) + + return activation + def check_condition(self, activation, instance): if instance is None: @@ -183,5 +196,5 @@ class SchedulingUnitDemoFlow(Flow): def get_scheduling_unit_task(self, flow_task, sender, instance, **kwargs): print(kwargs) - process = models.SchedulingUnitDemoProcess.objects.get(su=instance) + process = models.SchedulingUnitProcess.objects.get(su=instance) return Task.objects.get(process=process,flow_task=flow_task) diff --git a/SAS/TMSS/src/tmss/workflowapp/forms/CMakeLists.txt b/SAS/TMSS/src/tmss/workflowapp/forms/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..42b8a34fd53a59e7a7a15885e307a27d4874296a --- /dev/null +++ b/SAS/TMSS/src/tmss/workflowapp/forms/CMakeLists.txt @@ -0,0 +1,10 @@ + +include(PythonInstall) + +set(_py_files + __init__.py + schedulingunitflow.py + ) + +python_install(${_py_files} + DESTINATION lofar/sas/tmss/tmss/workflowapp/forms) diff --git a/SAS/TMSS/src/tmss/workflowapp/forms/__init__.py b/SAS/TMSS/src/tmss/workflowapp/forms/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..bfdfbc84e07beb363937412fd7fb6d5788c684d0 --- /dev/null +++ b/SAS/TMSS/src/tmss/workflowapp/forms/__init__.py @@ -0,0 +1 @@ +from .schedulingunitflow import * \ No newline at end of file diff --git a/SAS/TMSS/src/tmss/workflowapp/forms/schedulingunitflow.py b/SAS/TMSS/src/tmss/workflowapp/forms/schedulingunitflow.py new file mode 100644 index 0000000000000000000000000000000000000000..a967367b38ff77d43ffdf08fb3b30e0f824907ab --- /dev/null +++ b/SAS/TMSS/src/tmss/workflowapp/forms/schedulingunitflow.py @@ -0,0 +1,16 @@ +from django import forms +from material import Layout, Row, Span2 + +from .. import models + + +class QAReportingTO(forms.ModelForm): + layout = Layout( + Row('operator_report'), + Row('operator_accept'), + ) + + class Meta: + model = models.QAReportingTO + fields = ['operator_report','operator_accept'] + #fields = '__all__' \ No newline at end of file diff --git a/SAS/TMSS/src/tmss/workflowapp/migrations/0001_initial.py b/SAS/TMSS/src/tmss/workflowapp/migrations/0001_initial.py index 2e95b97379265e5eb14cfd44e85357218eb63948..1da372c3f5a8ea06e95f13d9861676f8bcdf8636 100644 --- a/SAS/TMSS/src/tmss/workflowapp/migrations/0001_initial.py +++ b/SAS/TMSS/src/tmss/workflowapp/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.0.9 on 2020-10-01 12:30 +# Generated by Django 3.0.9 on 2020-11-02 14:31 from django.db import migrations, models import django.db.models.deletion @@ -14,7 +14,39 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name='SchedulingUnitDemo', + name='DecideAcceptance', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sos_accept_after_pi', models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + name='PIVerification', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('pi_report', models.CharField(max_length=150)), + ('pi_accept', models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + name='QAReportingSOS', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('sos_report', models.CharField(max_length=150)), + ('quality_within_policy', models.CharField(max_length=150)), + ('sos_accept_show_pi', models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + name='QAReportingTO', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('operator_report', models.CharField(max_length=150)), + ('operator_accept', models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + name='SchedulingUnit', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=50)), @@ -35,12 +67,16 @@ class Migration(migrations.Migration): bases=('viewflow.process',), ), migrations.CreateModel( - name='SchedulingUnitDemoProcess', + name='SchedulingUnitProcess', fields=[ ('process_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='viewflow.Process')), - ('text', models.CharField(max_length=150)), - ('approved', models.BooleanField(default=False)), - ('su', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='workflowapp.SchedulingUnitDemo')), + ('can_delete', models.BooleanField(default=False)), + ('results_accepted', models.BooleanField(default=False)), + ('decide_acceptance', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='workflowapp.DecideAcceptance')), + ('pi_verification', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='workflowapp.PIVerification')), + ('qa_reporting_sos', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='workflowapp.QAReportingSOS')), + ('qa_reporting_to', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='workflowapp.QAReportingTO')), + ('su', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='workflowapp.SchedulingUnit')), ], options={ 'abstract': False, diff --git a/SAS/TMSS/src/tmss/workflowapp/models/CMakeLists.txt b/SAS/TMSS/src/tmss/workflowapp/models/CMakeLists.txt index 1c94f0a15d5ade684111945ce5bb79dfe25f7a91..57e7e39aac465b8acf7b209fa3dc901ae4c2076f 100644 --- a/SAS/TMSS/src/tmss/workflowapp/models/CMakeLists.txt +++ b/SAS/TMSS/src/tmss/workflowapp/models/CMakeLists.txt @@ -4,7 +4,7 @@ include(PythonInstall) set(_py_files __init__.py helloworldflow.py - schedulingunitdemoflow.py + schedulingunitflow.py ) python_install(${_py_files} diff --git a/SAS/TMSS/src/tmss/workflowapp/models/__init__.py b/SAS/TMSS/src/tmss/workflowapp/models/__init__.py index 45516795a25730483ebfa40c1fbdb5f533df8ebe..a0ae3713747c0b28c5595736d06f4bcb800da5b5 100644 --- a/SAS/TMSS/src/tmss/workflowapp/models/__init__.py +++ b/SAS/TMSS/src/tmss/workflowapp/models/__init__.py @@ -1,2 +1,2 @@ from .helloworldflow import * -from .schedulingunitdemoflow import * \ No newline at end of file +from .schedulingunitflow import * \ No newline at end of file diff --git a/SAS/TMSS/src/tmss/workflowapp/models/schedulingunitdemoflow.py b/SAS/TMSS/src/tmss/workflowapp/models/schedulingunitdemoflow.py deleted file mode 100644 index b9797a0b12e56ffb6f284da503f43263561522c4..0000000000000000000000000000000000000000 --- a/SAS/TMSS/src/tmss/workflowapp/models/schedulingunitdemoflow.py +++ /dev/null @@ -1,13 +0,0 @@ -# Create your models here. - -from django.db.models import CharField, IntegerField,BooleanField, ForeignKey, CASCADE, Model -from viewflow.models import Process - -class SchedulingUnitDemo(Model): - name = CharField(max_length=50) - state = IntegerField() - -class SchedulingUnitDemoProcess(Process): - text = CharField(max_length=150) - approved = BooleanField(default=False) - su = ForeignKey(SchedulingUnitDemo, blank=True, null=True, on_delete=CASCADE) diff --git a/SAS/TMSS/src/tmss/workflowapp/models/schedulingunitflow.py b/SAS/TMSS/src/tmss/workflowapp/models/schedulingunitflow.py new file mode 100644 index 0000000000000000000000000000000000000000..3e340fbf8c9713fbd37daec0dc977e3d453eb69f --- /dev/null +++ b/SAS/TMSS/src/tmss/workflowapp/models/schedulingunitflow.py @@ -0,0 +1,38 @@ +# Create your models here. + +from django.db.models import CharField, IntegerField,BooleanField, ForeignKey, CASCADE, Model,NullBooleanField +from viewflow.models import Process + +class QAReportingTO(Model): + operator_report = CharField(max_length=150) + operator_accept = BooleanField(default=False) + + +class QAReportingSOS(Model): + sos_report = CharField(max_length=150) + quality_within_policy = CharField(max_length=150) + sos_accept_show_pi = BooleanField(default=False) + + +class PIVerification(Model): + pi_report = CharField(max_length=150) + pi_accept = BooleanField(default=False) + + +class DecideAcceptance(Model): + sos_accept_after_pi = BooleanField(default=False) + + +class SchedulingUnit(Model): + name = CharField(max_length=50) + state = IntegerField() + + +class SchedulingUnitProcess(Process): + su = ForeignKey(SchedulingUnit, blank=True, null=True, on_delete=CASCADE) + qa_reporting_to=ForeignKey(QAReportingTO, blank=True, null=True, on_delete=CASCADE) + qa_reporting_sos=ForeignKey(QAReportingSOS, blank=True, null=True, on_delete=CASCADE) + pi_verification=ForeignKey(PIVerification, blank=True, null=True, on_delete=CASCADE) + decide_acceptance=ForeignKey(DecideAcceptance, blank=True, null=True, on_delete=CASCADE) + can_delete = BooleanField(default=False) + results_accepted = BooleanField(default=False) \ No newline at end of file diff --git a/SAS/TMSS/src/tmss/workflowapp/serializers/CMakeLists.txt b/SAS/TMSS/src/tmss/workflowapp/serializers/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..93e5e84e9ee2e14a5b311ad8f204c7d62920dae0 --- /dev/null +++ b/SAS/TMSS/src/tmss/workflowapp/serializers/CMakeLists.txt @@ -0,0 +1,11 @@ + +include(PythonInstall) + +set(_py_files + __init__.py + schedulingunitflow.py + + ) + +python_install(${_py_files} + DESTINATION lofar/sas/tmss/tmss/workflowapp/serializers) diff --git a/SAS/TMSS/src/tmss/workflowapp/serializers/__init__.py b/SAS/TMSS/src/tmss/workflowapp/serializers/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..bfdfbc84e07beb363937412fd7fb6d5788c684d0 --- /dev/null +++ b/SAS/TMSS/src/tmss/workflowapp/serializers/__init__.py @@ -0,0 +1 @@ +from .schedulingunitflow import * \ No newline at end of file diff --git a/SAS/TMSS/src/tmss/workflowapp/serializers/schedulingunitflow.py b/SAS/TMSS/src/tmss/workflowapp/serializers/schedulingunitflow.py new file mode 100644 index 0000000000000000000000000000000000000000..e29cf3cb9796afcce95e94e63636fe300791f5b0 --- /dev/null +++ b/SAS/TMSS/src/tmss/workflowapp/serializers/schedulingunitflow.py @@ -0,0 +1,41 @@ +from rest_framework.serializers import ModelSerializer +from lofar.sas.tmss.tmss.workflowapp import models + +from django.views import generic +from django.forms.models import modelform_factory + + +from .. import forms + +#View to add a fake Scheduling Unit for the QA Workflow +class SchedulingUnitSerializer(ModelSerializer): + class Meta: + model = models.SchedulingUnit + fields = '__all__' + +#Viewsets and serializers to access intermediate steps of the QA Workflow +#through DRF +class QAReportingTOSerializer(ModelSerializer): + class Meta: + model = models.QAReportingTO + fields = '__all__' + +class QAReportingSOSSerializer(ModelSerializer): + class Meta: + model = models.QAReportingSOS + fields = '__all__' + +class PIVerificationSerializer(ModelSerializer): + class Meta: + model = models.PIVerification + fields = '__all__' + +class DecideAcceptanceSerializer(ModelSerializer): + class Meta: + model = models.DecideAcceptance + fields = '__all__' + +class SchedulingUnitProcessSerializer(ModelSerializer): + class Meta: + model = models.SchedulingUnitProcess + fields = '__all__' \ No newline at end of file diff --git a/SAS/TMSS/src/tmss/workflowapp/templates/CMakeLists.txt b/SAS/TMSS/src/tmss/workflowapp/templates/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..3047f7e1561039003dec0c8630b75de4ce5f3037 --- /dev/null +++ b/SAS/TMSS/src/tmss/workflowapp/templates/CMakeLists.txt @@ -0,0 +1,10 @@ + +include(PythonInstall) + +set(_py_files + __init__.py + qa_reporting.html + ) + +python_install(${_py_files} + DESTINATION lofar/sas/tmss/tmss/workflowapp/templates) diff --git a/SAS/TMSS/src/tmss/workflowapp/templates/__init__.py b/SAS/TMSS/src/tmss/workflowapp/templates/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/SAS/TMSS/src/tmss/workflowapp/templates/qa_reporting.html b/SAS/TMSS/src/tmss/workflowapp/templates/qa_reporting.html new file mode 100644 index 0000000000000000000000000000000000000000..822e7eb45e1677261b67fda229a2848d49963cfc --- /dev/null +++ b/SAS/TMSS/src/tmss/workflowapp/templates/qa_reporting.html @@ -0,0 +1 @@ +{% extends 'viewflow/flow/task.html' %} diff --git a/SAS/TMSS/src/tmss/workflowapp/viewsets/CMakeLists.txt b/SAS/TMSS/src/tmss/workflowapp/viewsets/CMakeLists.txt index 7adc12fcf7a85912784409d17f37177986c94298..eaf3c5ab4b9afa9063deda344de3644dcfbc388d 100644 --- a/SAS/TMSS/src/tmss/workflowapp/viewsets/CMakeLists.txt +++ b/SAS/TMSS/src/tmss/workflowapp/viewsets/CMakeLists.txt @@ -3,7 +3,7 @@ include(PythonInstall) set(_py_files __init__.py - schedulingunitdemoflow.py + schedulingunitflow.py ) python_install(${_py_files} diff --git a/SAS/TMSS/src/tmss/workflowapp/viewsets/__init__.py b/SAS/TMSS/src/tmss/workflowapp/viewsets/__init__.py index b77c70aeb959e9d4f63c395fd1079cfbbe3bc078..bfdfbc84e07beb363937412fd7fb6d5788c684d0 100644 --- a/SAS/TMSS/src/tmss/workflowapp/viewsets/__init__.py +++ b/SAS/TMSS/src/tmss/workflowapp/viewsets/__init__.py @@ -1 +1 @@ -from .schedulingunitdemoflow import * \ No newline at end of file +from .schedulingunitflow import * \ No newline at end of file diff --git a/SAS/TMSS/src/tmss/workflowapp/viewsets/schedulingunitdemoflow.py b/SAS/TMSS/src/tmss/workflowapp/viewsets/schedulingunitdemoflow.py deleted file mode 100644 index da3dc24e15ff6f3bd93da9037101a718f4ebed66..0000000000000000000000000000000000000000 --- a/SAS/TMSS/src/tmss/workflowapp/viewsets/schedulingunitdemoflow.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.shortcuts import render -from rest_framework import viewsets -from rest_framework.response import Response -from rest_framework.decorators import action -from rest_framework.serializers import ModelSerializer -from lofar.sas.tmss.tmss.workflowapp import models - -# Create your views here. - -class SchedulingUnitDemoSerializer(ModelSerializer): - class Meta: - model = models.SchedulingUnitDemo - fields = '__all__' - -class SchedulingUnitFlowViewSet(viewsets.ModelViewSet): - queryset = models.SchedulingUnitDemo.objects.all() - serializer_class = SchedulingUnitDemoSerializer - - @action(methods=['get'], detail=True) - def trigger(self, request, pk=None): - SchedulingUnitDemoFlow - return Response("ok") \ No newline at end of file diff --git a/SAS/TMSS/src/tmss/workflowapp/viewsets/schedulingunitflow.py b/SAS/TMSS/src/tmss/workflowapp/viewsets/schedulingunitflow.py new file mode 100644 index 0000000000000000000000000000000000000000..1c70e87e110fd31d5f2533712165f973d0701733 --- /dev/null +++ b/SAS/TMSS/src/tmss/workflowapp/viewsets/schedulingunitflow.py @@ -0,0 +1,117 @@ +from django.shortcuts import render, redirect +from rest_framework import viewsets +from rest_framework.response import Response +from rest_framework.decorators import action +from lofar.sas.tmss.tmss.workflowapp import models + +from django.views import generic +from viewflow.flow.views import StartFlowMixin, FlowMixin +from viewflow.decorators import flow_start_view, flow_view +from viewflow.flow.views.utils import get_next_task_url +from django.forms import CharField, CheckboxInput +from django.forms.models import modelform_factory + + +from .. import forms, models, serializers + +class SchedulingUnitFlowViewSet(viewsets.ModelViewSet): + queryset = models.SchedulingUnit.objects.all() + serializer_class = serializers.SchedulingUnitSerializer + + @action(methods=['get'], detail=True) + def trigger(self, request, pk=None): + SchedulingUnitFlow + return Response("ok") + +#Viewsets and serializers to access intermediate steps of the QA Workflow +#through DRF +class QAReportingTOViewSet(viewsets.ModelViewSet): + queryset = models.QAReportingTO.objects.all() + serializer_class = serializers.QAReportingTOSerializer + +class QAReportingSOSViewSet(viewsets.ModelViewSet): + queryset = models.QAReportingSOS.objects.all() + serializer_class = serializers.QAReportingSOSSerializer + +class PIVerificationViewSet(viewsets.ModelViewSet): + queryset = models.PIVerification.objects.all() + serializer_class = serializers.PIVerificationSerializer + +class DecideAcceptanceViewSet(viewsets.ModelViewSet): + queryset = models.DecideAcceptance.objects.all() + serializer_class = serializers.DecideAcceptanceSerializer + +class SchedulingUnitProcessViewSet(viewsets.ModelViewSet): + queryset = models.SchedulingUnitProcess.objects.all() + serializer_class = serializers.SchedulingUnitProcessSerializer + +class QAReportingTOView(FlowMixin, generic.CreateView): + template_name = 'qa_reporting.html' + model = models.QAReportingTO + fields = [ + 'operator_report', 'operator_accept' + ] + + def form_valid(self, form): + report_data = form.save(commit=False) + report_data.save() + + self.activation.process.qa_reporting_to = report_data + self.activation.process.save() + + self.activation_done() + return redirect(self.get_success_url()) + + +class QAReportingSOSView(FlowMixin, generic.CreateView): + template_name = 'qa_reporting.html' + model = models.QAReportingSOS + fields = [ + 'sos_report', 'quality_within_policy','sos_accept_show_pi' + ] + + def form_valid(self, form): + report_data = form.save(commit=False) + report_data.save() + + self.activation.process.qa_reporting_sos = report_data + self.activation.process.save() + + self.activation_done() + return redirect(self.get_success_url()) + + +class PIVerificationView(FlowMixin, generic.CreateView): + template_name = 'qa_reporting.html' + model = models.PIVerification + fields = [ + 'pi_report', 'pi_accept' + ] + + def form_valid(self, form): + report_data = form.save(commit=False) + report_data.save() + + self.activation.process.pi_verification = report_data + self.activation.process.save() + + self.activation_done() + return redirect(self.get_success_url()) + + +class DecideAcceptanceView(FlowMixin, generic.CreateView): + template_name = 'qa_reporting.html' + model = models.DecideAcceptance + fields = [ + 'sos_accept_after_pi' + ] + + def form_valid(self, form): + report_data = form.save(commit=False) + report_data.save() + + self.activation.process.decide_acceptance = report_data + self.activation.process.save() + + self.activation_done() + return redirect(self.get_success_url()) \ No newline at end of file