Skip to content
Snippets Groups Projects
Commit 450a3ae6 authored by Nico Vermaas's avatar Nico Vermaas
Browse files

Merge branch 'add_unique_aggregation_key_endpoint' into 'master'

Add unique aggregation key endpoint

See merge request !174
parents 663d98de d27df740
No related branches found
No related tags found
3 merge requests!176Master,!175Master,!174Add unique aggregation key endpoint
Pipeline #24288 passed
Django==3.1.4
djangorestframework==3.12.2
django-filter==2.3.0
psycopg2==2.8.6
psycopg2-binary==2.9.3
django-cors-headers==3.6.0
django-extensions==3.1.0
django-bootstrap-pagination==1.7.0
......
......@@ -554,3 +554,8 @@ def construct_dashboard_html(request, selection):
results_logs = construct_logs_per_workflow_html(request, log_records)
return results_tasks, results_logs
def unique_values_for_aggregation_key(queryset, aggregation_key):
return list(map(lambda x: x[aggregation_key], queryset.values(aggregation_key).distinct()))
\ No newline at end of file
......@@ -61,6 +61,9 @@ urlpatterns = [
path('tasks/get_size/', views.GetSizeView.as_view(), name='get-size-view'),
# /atdb/get_min_start_and_max_end_time?sas_id=65005
path('get_min_start_and_max_end_time/', views.GetMinMaxTimeView.as_view(), name='get-min-start-and-max-end-time-view'),
# /atdb/get_unique_values_for_key/<aggregation_key>
path('get_unique_values_for_key/<str:aggregation_key>', views.GetUniqueValuesForKey.as_view(),
name='get-unique-values-for-key-view'),
# --- controller resources ---
path('tasks/<int:pk>/setstatus/<new_status>/<page>', views.TaskSetStatus, name='task-setstatus-view'),
......
import logging
import json
......@@ -20,6 +19,7 @@ from django_tables2 import SingleTableView
from django.shortcuts import render, redirect
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from rest_framework.request import Request
from django.conf import settings
from .models import Task, Status, Workflow, LogEntry, Configuration, Job, PostProcessingRule, Monitor
......@@ -41,9 +41,9 @@ from .services import algorithms
logger = logging.getLogger(__name__)
# ---------- filters (in the REST API) ---------
class TaskFilter(filters.FilterSet):
class Meta:
model = Task
......@@ -63,6 +63,7 @@ class TaskFilter(filters.FilterSet):
'predecessor__status': ['exact', 'icontains', 'in', 'startswith'],
}
class TaskFilterQueryPage(filters.FilterSet):
resume = django_filters.BooleanFilter(lookup_expr='exact', label='resuming')
......@@ -83,7 +84,6 @@ class TaskFilterQueryPage(filters.FilterSet):
class WorkflowFilter(filters.FilterSet):
class Meta:
model = Workflow
......@@ -95,7 +95,6 @@ class WorkflowFilter(filters.FilterSet):
class LogEntryFilter(filters.FilterSet):
class Meta:
model = LogEntry
......@@ -105,8 +104,8 @@ class LogEntryFilter(filters.FilterSet):
'status': ['exact', 'in'],
}
class ConfigurationFilter(filters.FilterSet):
class ConfigurationFilter(filters.FilterSet):
class Meta:
model = Configuration
......@@ -116,8 +115,8 @@ class ConfigurationFilter(filters.FilterSet):
'value': ['exact', 'icontains'],
}
class JobFilter(filters.FilterSet):
class JobFilter(filters.FilterSet):
class Meta:
model = Job
......@@ -127,8 +126,8 @@ class JobFilter(filters.FilterSet):
'job_id': ['exact'],
}
class PostProcessingFilter(filters.FilterSet):
class PostProcessingFilter(filters.FilterSet):
class Meta:
model = PostProcessingRule
......@@ -139,6 +138,7 @@ class PostProcessingFilter(filters.FilterSet):
'workflow_to_apply__id': ['exact'],
}
# ---------- Tables2 Views (experimental) -----------
# implementation with tables2: http://localhost:8000/atdb/tables2
class QueryView(SingleTableMixin, FilterView):
......@@ -254,7 +254,6 @@ class TaskTables2View(SingleTableView):
def TaskDetails(request, id=0, page=0):
try:
task = Task.objects.get(id=id)
......@@ -280,8 +279,6 @@ def TaskDetails(request, id=0, page=0):
return render(request, "taskdatabase/tasks/task_details.html", {'task': task, 'logentries': logentries_html})
def ShowInputs(request, id):
task = Task.objects.get(id=id)
......@@ -336,6 +333,7 @@ class DiagramView(ListView):
model = Task
template_name = "taskdatabase/diagram.html"
# ---------- REST API views -----------
# example: /atdb/tasks/
......@@ -359,6 +357,7 @@ class TaskListViewAPI(generics.ListCreateAPIView):
else:
return TaskWriteSerializer
class PostProcessingTaskListViewAPI(generics.ListCreateAPIView):
"""
A pagination list of tasks, unsorted.
......@@ -377,6 +376,7 @@ class PostProcessingTaskListViewAPI(generics.ListCreateAPIView):
else:
return TaskWriteSerializer
# all tasks
class AllTaskListViewAPI(generics.ListCreateAPIView):
"""
......@@ -418,6 +418,7 @@ class TaskDetailsViewAPI(generics.RetrieveUpdateDestroyAPIView):
"""
model = Task
queryset = Task.objects.all()
# serializer_class = TaskSerializer
def get_serializer_class(self):
......@@ -445,6 +446,7 @@ class WorkflowListViewAPI(generics.ListCreateAPIView):
filter_backends = (filters.DjangoFilterBackend,)
filter_class = WorkflowFilter
# example: /atdb/workflows/5/
class WorkflowDetailsViewAPI(generics.RetrieveUpdateDestroyAPIView):
model = Workflow
......@@ -598,6 +600,7 @@ def TaskSetStatus(request,pk,new_status,page=0):
# redirect to tasks list
return redirect('/atdb/?page=' + page)
# set a filter value in the session, used later by the 'get_searched_tasks' mechanism
def TaskSetFilter(request, filter):
request.session['task_filter'] = filter
......@@ -608,12 +611,14 @@ def TaskSetFilter(request,filter):
return redirect('/atdb/?page=1')
# set the defined list of ACTIVE_STATUSSES on the session, used later by the 'get_searched_tasks' mechanism
def TaskSetActiveFilter(request):
request.session['task_filter'] = settings.ACTIVE_STATUSSES
request.session['task_onhold_filter'] = None
return redirect('/atdb/?page=1')
def TaskSetOnHoldFilter(request, onhold):
request.session['task_onhold_filter'] = onhold
return redirect('/atdb/?page=1')
......@@ -681,7 +686,6 @@ def TaskSetStatusTables2(request,pk,new_status,query_params):
return redirect('/atdb/query/?' + current_query_params)
@login_required
def TaskMultiStatus(request, new_status, query_params):
# get the list of id's from the session
......@@ -781,3 +785,29 @@ class GetMinMaxTimeView(generics.ListAPIView):
return Response({
'error': str(error)
})
from rest_framework.serializers import ListSerializer
# /atdb/get_unique_values_for_key/{key}
class GetUniqueValuesForKey(generics.ListAPIView):
queryset = Task.objects.all()
model = Task
filter_backends = (filters.DjangoFilterBackend,)
filter_class = TaskFilter
# override list and generate a custom response
def list(self, request: Request, *args, **kwargs):
try:
aggregation_key = kwargs['aggregation_key']
queryset = self.get_queryset()
queryset = self.filter_queryset(queryset)
return Response({'aggregation_key': aggregation_key,
'result': algorithms.unique_values_for_aggregation_key(
queryset,
aggregation_key)
})
except Exception as error:
return Response({
'error': str(error)
})
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment