Select Git revision
-
Roy de Goei authoredRoy de Goei authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
urls.py 14.96 KiB
"""tmss URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.shortcuts import render
from django.contrib import admin
from django.contrib.auth.views import LogoutView
from django.urls import path, re_path
from django.conf.urls import url, include
from django.views.generic.base import TemplateView, RedirectView
from collections import OrderedDict
from rest_framework import routers, permissions
from rest_framework.authtoken.views import obtain_auth_token
from .tmssapp import viewsets, models, serializers, views
from rest_framework.documentation import include_docs_urls
from drf_yasg.views import get_schema_view
from drf_yasg import openapi
from datetime import datetime
import os
from material.frontend import urls as frontend_urls
#
# Django style patterns
#
# schema for Swagger API
swagger_schema_view = get_schema_view(
openapi.Info(
title="LOFAR Internal API",
default_version='v1',
description="ReST API for internal LOFAR services",
terms_of_service="",
contact=openapi.Contact(email="softwaresupport@astron.nl"),
license=openapi.License(name="GPL License v3"),
),
validators=['flex', 'ssv'],
public=False,
# public=True,
# permission_classes=(permissions.AllowAny,),
)
# use re_path(r'<...>/?') to make trailing slash optional (double entries confuse Swagger)
urlpatterns = [
path('admin/', admin.site.urls),
path('logout/', LogoutView.as_view(), name='logout'),
path('token-auth/', obtain_auth_token, name='obtain-token-auth'),
path('token-deauth/', views.revoke_token_deauth, name='revoke-token-deauth'),
path('docs/', include_docs_urls(title='TMSS API')),
re_path(r'^swagger(?P<format>\.json|\.yaml)$', swagger_schema_view.without_ui(cache_timeout=0), name='schema-json'),
path('swagger/', swagger_schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
path('redoc/', swagger_schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
#re_path('schemas/<str:template>/<str:name>/<str:version>', views.get_template_json_schema, name='get_template_json_schema'), # !! use of regex here breaks reverse url lookup
path('schemas/<str:template>/<str:name>/<str:version>', views.get_template_json_schema, name='get_template_json_schema'), # !! two urls for same view break Swagger, one url break json ref resolution !!
path('schemas/<str:template>/<str:name>/<str:version>/', views.get_template_json_schema, name='get_template_json_schema'), # !! two urls for same view break Swagger, one url break json ref resolution !!
#re_path('station_groups/<str:template_name>/<str:template_version>/<str:station_group>/?', views.get_stations_in_group, name='get_stations_in_group'), # !! use of regex here somehow breaks functionality (because parameters?) -> index page
path('station_groups/<str:template_name>/<str:template_version>/<str:station_group>', views.get_stations_in_group, name='get_stations_in_group'),
path('station_groups/<str:template_name>/<str:template_version>/<str:station_group>/', views.get_stations_in_group, name='get_stations_in_group'),
re_path('util/sun_rise_and_set/?', views.get_sun_rise_and_set, name='get_sun_rise_and_set'),
re_path('util/utc/?', views.utc, name="system-utc"),
re_path('util/lst/?', views.lst, name="conversion-lst"),
re_path('util/angular_separation_from_bodies/?', views.get_angular_separation_from_bodies, name='get_angular_separation_from_bodies'),
re_path('util/target_rise_and_set/?', views.get_target_rise_and_set, name='get_target_rise_and_set'),
]
if os.environ.get('SHOW_DJANGO_DEBUG_TOOLBAR', False):
import debug_toolbar
urlpatterns.append(path('__debug__/', include(debug_toolbar.urls)))
#
# REST Router
#
class TMSSAPIRootView(routers.APIRootView):
def get(self, request, *args, **kwargs):
'''return the normal list of urls, but then sorted by url so they are easier to find in a list for us humble humans'''
response = super().get(request, *args, **kwargs)
sorted_by_key_urls = OrderedDict()
for key in sorted(response.data.keys()):
sorted_by_key_urls[key] = response.data[key]
response.data = sorted_by_key_urls
return response
class OptionalSlashRouter(routers.DefaultRouter):
def __init__(self):
super(routers.DefaultRouter, self).__init__()
self.trailing_slash = '/?'
router = OptionalSlashRouter()
router.APIRootView = TMSSAPIRootView
# COMMON
router.register(r'tags', viewsets.TagsViewSet)
# SPECIFICATION
# choices
router.register(r'role', viewsets.RoleViewSet)
router.register(r'datatype', viewsets.DatatypeViewSet)
router.register(r'dataformat', viewsets.DataformatViewSet)
router.register(r'copy_reason', viewsets.CopyReasonViewSet)
router.register(r'flag', viewsets.FlagViewSet)
router.register(r'period_category', viewsets.PeriodCategoryViewSet)
router.register(r'project_category', viewsets.ProjectCategoryViewSet)
router.register(r'quantity', viewsets.QuantityViewSet)
router.register(r'task_type', viewsets.TaskTypeViewSet)
# templates
router.register(r'common_schema_template', viewsets.CommonSchemaTemplateViewSet)
router.register(r'generator_template', viewsets.GeneratorTemplateViewSet)
router.register(r'scheduling_unit_observing_strategy_template', viewsets.SchedulingUnitObservingStrategyTemplateViewSet)
router.register(r'scheduling_unit_template', viewsets.SchedulingUnitTemplateViewSet)
router.register(r'scheduling_constraints_template', viewsets.SchedulingConstraintsTemplateViewSet)
router.register(r'task_template', viewsets.TaskTemplateViewSet)
router.register(r'task_relation_selection_template', viewsets.TaskRelationSelectionTemplateViewSet)
router.register(r'reservation_template', viewsets.ReservationTemplateViewSet)
router.register(r'task_connector_type', viewsets.TaskConnectorTypeViewSet)
router.register(r'default_generator_template', viewsets.DefaultGeneratorTemplateViewSet)
router.register(r'default_scheduling_unit_template', viewsets.DefaultSchedulingUnitTemplateViewSet)
router.register(r'default_scheduling_constraints_template', viewsets.DefaultSchedulingConstraintsTemplateViewSet)
router.register(r'default_task_template', viewsets.DefaultTaskTemplateViewSet)
router.register(r'default_task_relation_selection_template', viewsets.DefaultTaskRelationSelectionTemplateViewSet)
router.register(r'default_reservation_template', viewsets.DefaultReservationTemplateViewSet)
router.register(r'reservation_strategy_template', viewsets.ReservationStrategyTemplateViewSet)
# instances
router.register(r'cycle', viewsets.CycleViewSet)
router.register(r'cycle_quota', viewsets.CycleQuotaViewSet)
router.register(r'project', viewsets.ProjectViewSet)
router.register(r'resource_type', viewsets.ResourceTypeViewSet)
router.register(r'project_quota', viewsets.ProjectQuotaViewSet)
router.register(r'project_quota_archive_location', viewsets.ProjectQuotaArchiveLocationViewSet)
router.register(r'setting', viewsets.SettingViewSet)
router.register(r'reservation', viewsets.ReservationViewSet)
router.register(r'scheduling_set', viewsets.SchedulingSetViewSet)
router.register(r'scheduling_unit_draft_extended', viewsets.SchedulingUnitDraftExtendedViewSet)
router.register(r'scheduling_unit_draft', viewsets.SchedulingUnitDraftViewSet) # ! The last registered view on a model is used for references to objects
router.register(r'scheduling_unit_blueprint_extended', viewsets.SchedulingUnitBlueprintExtendedViewSet)
router.register(r'scheduling_unit_blueprint', viewsets.SchedulingUnitBlueprintViewSet) # ! The last registered view on a model is used for references to objects
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)
router.register(r'scheduling_set/(?P<scheduling_set_id>\d+)/scheduling_unit_draft', viewsets.SchedulingUnitDraftNestedViewSet)
router.register(r'scheduling_set/(?P<scheduling_set_id>\d+)/scheduling_unit_observing_strategy_template', viewsets.SchedulingUnitObservingStrategyTemplateNestedViewSet)
router.register(r'scheduling_unit_draft/(?P<scheduling_unit_draft_id>\d+)/scheduling_unit_blueprint', viewsets.SchedulingUnitBlueprintNestedViewSet)
router.register(r'scheduling_unit_draft/(?P<scheduling_unit_draft_id>\d+)/task_draft', viewsets.TaskDraftNestedViewSet)
router.register(r'task_draft/(?P<task_draft_id>\d+)/task_blueprint', viewsets.TaskBlueprintNestedViewSet)
router.register(r'task_draft/(?P<task_draft_id>\d+)/task_relation_draft', viewsets.TaskRelationDraftNestedViewSet)
router.register(r'task_relation_draft/(?P<task_relation_draft_id>\d+)/task_relation_blueprint', viewsets.TaskRelationBlueprintNestedViewSet)
router.register(r'task_blueprint/(?P<task_blueprint_id>\d+)/task_relation_blueprint', viewsets.TaskRelationBlueprintNestedViewSet)
router.register(r'task_blueprint/(?P<task_blueprint_id>\d+)/subtask', viewsets.SubtaskNestedViewSet)
# copy
router.register(r'task_draft/(?P<task_draft_id>\d+)/copy', viewsets.TaskDraftCopyViewSet)
router.register(r'task_blueprint/(?P<task_blueprint_id>\d+)/copy_to_task_draft', viewsets.TaskBlueprintCopyToTaskDraftViewSet)
router.register(r'scheduling_set/(?P<scheduling_set_id>\d+)/copy_scheduling_unit_drafts', viewsets.SchedulingUnitDraftCopyFromSchedulingSetViewSet)
router.register(r'scheduling_unit_draft/(?P<scheduling_unit_draft_id>\d+)/copy', viewsets.SchedulingUnitDraftCopyViewSet)
router.register(r'scheduling_unit_blueprint/(?P<scheduling_unit_blueprint_id>\d+)/copy_to_scheduling_unit_draft', viewsets.SchedulingUnitBlueprintCopyToSchedulingUnitDraftViewSet)
# SCHEDULING
# choices
router.register(r'subtask_state', viewsets.SubtaskStateViewSet)
router.register(r'subtask_type', viewsets.SubtaskTypeViewSet)
router.register(r'station_type', viewsets.StationTypeViewSet)
router.register(r'algorithm', viewsets.AlgorithmViewSet)
router.register(r'scheduling_relation_placement', viewsets.SchedulingRelationPlacement)
# templates
router.register(r'subtask_template', viewsets.SubtaskTemplateViewSet)
router.register(r'dataproduct_specifications_template', viewsets.DataproductSpecificationsTemplateViewSet)
router.register(r'default_subtask_template', viewsets.DefaultSubtaskTemplateViewSet)
router.register(r'default_dataproduct_specifications_template', viewsets.DefaultDataproductSpecificationsTemplateViewSet)
router.register(r'dataproduct_feedback_template', viewsets.DataproductFeedbackTemplateViewSet)
router.register(r'sap_template', viewsets.SAPTemplateViewSet)
# instances
router.register(r'subtask', viewsets.SubtaskViewSet)
router.register(r'dataproduct', viewsets.DataproductViewSet)
router.register(r'subtask_input', viewsets.SubtaskInputViewSet)
router.register(r'subtask_output', viewsets.SubtaskOutputViewSet)
router.register(r'antenna_set', viewsets.AntennaSetViewSet)
router.register(r'dataproduct_transform', viewsets.DataproductTransformViewSet)
router.register(r'filesystem', viewsets.FilesystemViewSet)
router.register(r'cluster', viewsets.ClusterViewSet)
router.register(r'dataproduct_archive_info', viewsets.DataproductArchiveInfoViewSet)
router.register(r'dataproduct_hash', viewsets.DataproductHashViewSet)
router.register(r'subtask_state_log', viewsets.SubtaskStateLogViewSet)
router.register(r'user', viewsets.UserViewSet)
router.register(r'sap', viewsets.SAPViewSet)
router.register(r'sip_identifier', viewsets.SIPidentifierViewSet)
# PERMISSIONS
router.register(r'project_role', viewsets.ProjectRoleViewSet)
router.register(r'project_permission', viewsets.ProjectPermissionViewSet)
urlpatterns.extend(router.urls)
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/')),
url(r'^oidc/', include('mozilla_django_oidc.urls')),
url(r'', include(frontend_urls)),
url(r'^.*', include(frontend_urlpatterns)),
]
# QA Workflow steps
if os.environ.get('TMSS_ENABLE_VIEWFLOW', "False").lower() == "true":
from .workflowapp import viewsets as workflow_viewsets
viewflow_urlpatterns = []
viewflow_router = OptionalSlashRouter()
viewflow_router.APIRootView = TMSSAPIRootView
from .workflowapp import viewsets as workflow_viewsets
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_router.register('scheduling_unit_flow/qa_scheduling_unit_task', workflow_viewsets.SchedulingUnitTaskViewSet, basename='qa_scheduling_unit_task')
viewflow_router.register(r'scheduling_unit_flow/qa_scheduling_unit_task/(?P<qa_scheduling_unit_task_id>\d+)/assign', workflow_viewsets.SchedulingUnitTaskAssignViewSet)
viewflow_router.register(r'scheduling_unit_flow/qa_scheduling_unit_task/(?P<qa_scheduling_unit_task_id>\d+)/unassign', workflow_viewsets.SchedulingUnitTaskUnassignViewSet)
viewflow_router.register(r'scheduling_unit_flow/qa_scheduling_unit_process/(?P<qa_scheduling_unit_process_id>\d+)/current_task', workflow_viewsets.SchedulingUnitGetActiveTasksViewSet)
viewflow_router.register(r'scheduling_unit_flow/qa_scheduling_unit_process/(?P<qa_scheduling_unit_process_id>\d+)/perform', workflow_viewsets.SchedulingUnitTaskExecuteViewSet)
viewflow_urlpatterns.extend(viewflow_router.urls)
urlpatterns.insert(0,url(r'^workflow$', RedirectView.as_view(url='/workflow/', permanent=False)))
#Doesn't work if it is at the end of urlpatterns
urlpatterns.insert(0,url(r'^workflow_api/', include(viewflow_urlpatterns)))