diff --git a/atdb/atdb/static/taskdatabase/style.css b/atdb/atdb/static/taskdatabase/style.css index cfb0a4f8d97a15f54c8c66aa8176e797b078cc95..e293d1a7a87d08cd1c5b338cfdf5a15f5ed77b68 100644 --- a/atdb/atdb/static/taskdatabase/style.css +++ b/atdb/atdb/static/taskdatabase/style.css @@ -50,3 +50,7 @@ p.title { left: auto !important; right: 0px; } + +.bigger { + font-size: 13pt; +} \ No newline at end of file diff --git a/atdb/taskdatabase/static/taskdatabase/style.css b/atdb/taskdatabase/static/taskdatabase/style.css index 4a4dc5ac3251398045e74f2f578be4b5fd2c48ce..ed0e63894f1c3c537c3d516d7c94c69ff4b0beec 100644 --- a/atdb/taskdatabase/static/taskdatabase/style.css +++ b/atdb/taskdatabase/static/taskdatabase/style.css @@ -51,3 +51,7 @@ p.title { left: auto !important; right: 0px; } + +.bigger { + font-size: 13pt; +} \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/base.html b/atdb/taskdatabase/templates/taskdatabase/base.html index 07146b37cd1bb72115c72a0f8034358557ef3eb8..5cf77c36929a920a7778dc5a22d2ed6ac0417fb6 100644 --- a/atdb/taskdatabase/templates/taskdatabase/base.html +++ b/atdb/taskdatabase/templates/taskdatabase/base.html @@ -36,18 +36,19 @@ <!-- Header --> <li><a class="navbar-brand" href="{% url 'index' %}"> <img src="{% static 'taskdatabase/ldvlogo_small.png' %}" height="30" alt=""> - ATDB-LDV</a> + ATDB-LDV Dashboard</a> </li> <li><a class="nav-link" href="{% url 'index' %}">Tasks</a></li> <li><a class="nav-link" href="{% url 'tables2' %}">Query</a></li> <li><a class="nav-link" href="{% url 'diagram' %}">State Diagram</a></li> - <li><a class="nav-link" href="{% url 'admin:index' %}">Admin</a></li> - + {% if user.is_staff %} + <li><a class="nav-link" href="{% url 'admin:index' %}" target="_blank">Admin Page</a></li> + {% endif %} </ul> - + User: {{ user.get_username }} </div> - User: {{ user.get_username }} + {% include 'taskdatabase/filter/search.html' %} </nav> diff --git a/atdb/taskdatabase/templates/taskdatabase/details/inputs.html b/atdb/taskdatabase/templates/taskdatabase/details/inputs.html new file mode 100644 index 0000000000000000000000000000000000000000..fdf5dd5e02bc8bdf9a619c00c3619124c5331246 --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/details/inputs.html @@ -0,0 +1,17 @@ + +{% load static %} +{% block myBlock %} + + +<div class="card"> + <div class="card-body"> + <h3>Inputs </h3> + <table class="table table-striped"> + <tbody> + {{ results | safe }} + </tbody> + </table> + </div> +</div> + +{% endblock %} \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/details/metrics.html b/atdb/taskdatabase/templates/taskdatabase/details/metrics.html new file mode 100644 index 0000000000000000000000000000000000000000..c58ec80adff374be755eebd8fac8494e9e91016e --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/details/metrics.html @@ -0,0 +1,17 @@ + +{% load static %} +{% block myBlock %} + + +<div class="card"> + <div class="card-body"> + <h3>Metrics </h3> + <table class="table table-striped"> + <tbody> + {{ results | safe }} + </tbody> + </table> + </div> +</div> + +{% endblock %} \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/details/outputs.html b/atdb/taskdatabase/templates/taskdatabase/details/outputs.html new file mode 100644 index 0000000000000000000000000000000000000000..05e04ed4d47dd611a0b8dea16ceaeabe707b77a1 --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/details/outputs.html @@ -0,0 +1,17 @@ + +{% load static %} +{% block myBlock %} + + +<div class="card"> + <div class="card-body"> + <h3>Outputs </h3> + <table class="table table-striped"> + <tbody> + {{ results | safe }} + </tbody> + </table> + </div> +</div> + +{% endblock %} \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/index.html b/atdb/taskdatabase/templates/taskdatabase/index.html index c0f6332515468e8e777aa0ee7672133c5fb1442b..a06f04b9687d18362e048d1fde1b37e5317c89ae 100644 --- a/atdb/taskdatabase/templates/taskdatabase/index.html +++ b/atdb/taskdatabase/templates/taskdatabase/index.html @@ -21,15 +21,15 @@ <thead> <tr> <th width="5%">ID</th> - <th width="9%">Priority</th> - <th>Hold</th> + <th>Priority</th> <th>Status</th> <th>Project</th> <th>SAS_ID</th> - <th>Workflow</th> <th>Created</th> <th>size-to-process</th> + <th>Details</th> + <th>Hold</th> <th>Set Status</th> </tr> </thead> @@ -46,7 +46,7 @@ {% include 'taskdatabase/pagination.html' %} </div> </div> - <p class="footer"> Version 1.0.0 (3 mar 2021 - 08:00) + <p class="footer"> Version 1.0.0 (4 mar 2021 - 15:00) </div> @@ -66,9 +66,10 @@ $(document).on('keypress click', function() { intvrefresh() }); intvrefresh(); - }(10)); + }(30)); </script> + <script type="text/javascript"> function readFromLocalStorage(id) { var s = localStorage.getItem(id); @@ -85,8 +86,6 @@ function writeToLocalStorage(id) { } </script> -{% include "taskdatabase/workflow/workflow_modal_script.html" %} -{% include "taskdatabase/workflow/workflow_modal.html" %} {% endblock %} diff --git a/atdb/taskdatabase/templates/taskdatabase/workflow/workflow_modal.html b/atdb/taskdatabase/templates/taskdatabase/modal/modal.html similarity index 100% rename from atdb/taskdatabase/templates/taskdatabase/workflow/workflow_modal.html rename to atdb/taskdatabase/templates/taskdatabase/modal/modal.html diff --git a/atdb/taskdatabase/templates/taskdatabase/workflow/workflow_modal_script.html b/atdb/taskdatabase/templates/taskdatabase/modal/modal_script.html similarity index 81% rename from atdb/taskdatabase/templates/taskdatabase/workflow/workflow_modal_script.html rename to atdb/taskdatabase/templates/taskdatabase/modal/modal_script.html index 60e4bb89c0f07fa0800619b36b2b00a5a7438541..1c0d5006e22de81d0a943b69510fbf8ba88c4a63 100644 --- a/atdb/taskdatabase/templates/taskdatabase/workflow/workflow_modal_script.html +++ b/atdb/taskdatabase/templates/taskdatabase/modal/modal_script.html @@ -1,6 +1,6 @@ <!-- To place above the workflow-modal html --> <script> - $(document).on("click", ".open-workflow", function (e) { + $(document).on("click", ".open-modal", function (e) { e.preventDefault(); var $popup = $("#popup"); var popup_url = $(this).data("popup-url"); diff --git a/atdb/taskdatabase/templates/taskdatabase/tasks.html b/atdb/taskdatabase/templates/taskdatabase/tasks.html index a70752193c98139d1be97b1adc1de369e9519a21..041338aa7e861c7b2ef10b463377d6da26a95337 100644 --- a/atdb/taskdatabase/templates/taskdatabase/tasks.html +++ b/atdb/taskdatabase/templates/taskdatabase/tasks.html @@ -8,57 +8,90 @@ <a href="{{ task.get_absolute_url }}" target="_blank">{{ task.id }} </a> </td> <td> - <a href="{% url 'task-change-priority' task.pk '-10' my_tasks.number %}" class="btn btn-primary btn-sm" role="button">-10</a> + {% if user.is_authenticated %} + <a href="{% url 'task-change-priority' task.pk '-10' my_tasks.number %}" class="btn btn-warning btn-sm" role="button">-10</a> + {% endif %} {{ task.priority }} - <a href="{% url 'task-change-priority' task.pk '10' my_tasks.number %}" class="btn btn-primary btn-sm" role="button">+10</a> + {% if user.is_authenticated %} + <a href="{% url 'task-change-priority' task.pk '10' my_tasks.number %}" class="btn btn-warning btn-sm" role="button">+10</a> + {% endif %} </td> {% if task.resume %} - <td> - <a href="{% url 'task-hold-resume' task.pk 'hold' my_tasks.number %}" class="btn btn-warning btn-sm" role="button"><i class="fas fa-pause"></i> hold</a> - </td> + <td class="bigger">{{ task.status }}</td> {% endif %} - {% if not task.resume %} - <td> - <a href="{% url 'task-hold-resume' task.pk 'resume' my_tasks.number %}" class="btn btn-success btn-sm" role="button"><i class="fas fa-play"></i> start</a> - </td> + <td class="bigger">{{ task.status }} (holding)</td> {% endif %} - <td class="bigger">{{ task.status }}</td> - <td>{{ task.project }}</td> <td>{{ task.sas_id }}</td> - <td><a class="open-workflow btn btn-secondary btn-sm" + <td>{{ task.creationTime|date:"Y-m-d H:i:s" }} </td> + <td>{{ task.size_to_process|filesizeformat }} </td> + + <td> + <a class="open-modal btn btn-primary btn-sm" href="{% url 'workflow-details' task.workflow %}" data-popup-url="{% url 'workflow-details' task.workflow %}" - target="_blank"> {{ task.workflow }} + target="_blank"> w({{ task.workflow }}) </a> - <td>{{ task.creationTime|date:"Y-m-d H:i:s" }} </td> - <td>{{ task.size_to_process|filesizeformat }} </td> + <a class="open-modal btn btn-primary btn-sm" + href="{% url 'show-inputs' task.id %}" + data-popup-url="{% url 'show-inputs' task.id %}" + target="_blank"><i class="fas fa-angle-double-down"></i> + </a> + + <a class="open-modal btn btn-primary btn-sm" + href="{% url 'show-outputs' task.id %}" + data-popup-url="{% url 'show-outputs' task.id %}" + target="_blank"><i class="fas fa-angle-double-up"></i> + </a> + + <a class="open-modal btn btn-primary btn-sm" + href="{% url 'show-metrics' task.id %}" + data-popup-url="{% url 'show-metrics' task.id %}" + target="_blank"><i class="fas fa-clock"></i> + </a> </td> - <td> + {% if user.is_authenticated %} - {% if task.status == "defining" %} - <a href="{% url 'task-setstatus-view' task.pk 'defined' my_tasks.number %}" class="btn btn-success btn-sm" role="button">Stage</a> + + {% if task.resume %} + <td> + <a href="{% url 'task-hold-resume' task.pk 'hold' my_tasks.number %}" class="btn btn-warning btn-sm" role="button"><i class="fas fa-pause"></i> hold</a> + </td> + {% endif %} + + {% if not task.resume %} + <td> + <a href="{% url 'task-hold-resume' task.pk 'resume' my_tasks.number %}" class="btn btn-success btn-sm" role="button"><i class="fas fa-play"></i> start</a> + </td> {% endif %} - {% if task.status != "defining" %} - <a href="{% url 'task-setstatus-view' task.pk 'defining' my_tasks.number %}" class="btn btn-warning btn-sm" role="button"><i class="fas fa-undo"></i> Reset</a> + <td> + {% if user.is_staff %} + + {% if task.status != "defining" %} + <a href="{% url 'task-setstatus-view' task.pk 'defining' my_tasks.number %}" class="btn btn-warning btn-sm" role="button"><i class="fas fa-undo"></i> Reset</a> + {% endif %} + {% if task.status == "defining" %} + <a href="{% url 'task-setstatus-view' task.pk 'defined' my_tasks.number %}" class="btn btn-success btn-sm" role="button">Stage</a> + {% endif %} + <a href="{% url 'task-setstatus-view' task.pk 'staged' my_tasks.number %}" class="btn btn-secondary btn-sm" role="button"></i> staged</a> + <a href="{% url 'task-setstatus-view' task.pk 'processed' my_tasks.number %}" class="btn btn-secondary btn-sm" role="button">processed</a> + <a href="{% url 'task-setstatus-view' task.pk 'validated' my_tasks.number %}" class="btn btn-secondary btn-sm" role="button">validated</a> + <a href="{% url 'task-setstatus-view' task.pk 'scrubbed' my_tasks.number %}" class="btn btn-secondary btn-sm" role="button">scrubbed</a> + <a href="{% url 'task-setstatus-view' task.pk 'archived' my_tasks.number %}" class="btn btn-secondary btn-sm" role="button">archived</a> + <a href="{% url 'task-setstatus-view' task.pk 'finished' my_tasks.number %}" class="btn btn-secondary btn-sm" role="button">finished</a> {% endif %} - <a href="{% url 'task-setstatus-view' task.pk 'staged' my_tasks.number %}" class="btn btn-secondary btn-sm" role="button"></i> staged</a> - <a href="{% url 'task-setstatus-view' task.pk 'processed' my_tasks.number %}" class="btn btn-secondary btn-sm" role="button">processed</a> - <a href="{% url 'task-setstatus-view' task.pk 'validated' my_tasks.number %}" class="btn btn-secondary btn-sm" role="button">validated</a> - <a href="{% url 'task-setstatus-view' task.pk 'scrubbed' my_tasks.number %}" class="btn btn-secondary btn-sm" role="button">scrubbed</a> - <a href="{% url 'task-setstatus-view' task.pk 'archived' my_tasks.number %}" class="btn btn-secondary btn-sm" role="button">archived</a> - <a href="{% url 'task-setstatus-view' task.pk 'finished' my_tasks.number %}" class="btn btn-secondary btn-sm" role="button">finished</a> + {% if task.status == "processed" %} + <a href="{% url 'task-setstatus-view' task.pk 'validated' my_tasks.number %}" class="btn btn-success btn-sm" role="button"><i class="fas fa-check"></i> Validate</a> {% endif %} - {% if task.status == "processed" %} - <a href="{% url 'task-setstatus-view' task.pk 'validated' my_tasks.number %}" class="btn btn-success btn-sm" role="button"><i class="fas fa-check"></i> Validate</a> + </td> {% endif %} </td> @@ -67,5 +100,5 @@ {% endif %} {% endfor %} -{% include "taskdatabase/workflow/workflow_modal_script.html" %} -{% include "taskdatabase/workflow/workflow_modal.html" %} \ No newline at end of file +{% include "taskdatabase/modal/modal_script.html" %} +{% include "taskdatabase/modal/modal.html" %} \ No newline at end of file diff --git a/atdb/taskdatabase/urls.py b/atdb/taskdatabase/urls.py index ae20f25c411395e540073e7395ab56257e51fce0..b5721ebbf2fd95572e46f157368dc6efce2ed545 100644 --- a/atdb/taskdatabase/urls.py +++ b/atdb/taskdatabase/urls.py @@ -18,10 +18,13 @@ urlpatterns = [ # --- REST API --- path('tasks/', views.TaskListViewAPI.as_view()), path('tasks/<int:pk>/', views.TaskDetailsViewAPI.as_view(), name='task-detail-view-api'), + path('show-inputs/<int:id>/', views.ShowInputs, name='show-inputs'), + path('show-outputs/<int:id>/', views.ShowOutputs, name='show-outputs'), + path('show-metrics/<int:id>/', views.ShowMetrics, name='show-metrics'), path('workflows/', views.WorkflowListViewAPI.as_view(), name='workflows'), path('workflows/<int:pk>/', views.WorkflowDetailsViewAPI.as_view(), name='workflow-detail-view-api'), - path('workflow_details/<uri>/', views.WorkflowDetails, name='workflow-details'), + path('workflow_details/<int:id>/', views.WorkflowDetails, name='workflow-details'), path('logentries/', views.LogEntryListViewAPI.as_view()), path('logentries/<int:pk>/', views.LogEntryDetailsViewAPI.as_view(), name='logentry-detail-view-api'), diff --git a/atdb/taskdatabase/views.py b/atdb/taskdatabase/views.py index e6ca203fb938e3d90eb81660c8c727792942a17c..772a8fcaad80ac794e66282f65bd833e64cad434 100644 --- a/atdb/taskdatabase/views.py +++ b/atdb/taskdatabase/views.py @@ -217,6 +217,51 @@ class TaskDetailsViewAPI(generics.RetrieveUpdateDestroyAPIView): else: return TaskWriteSerializer + +def convert_list_of_dicts_to_html(my_list): + results = "" + try: + for my_dict in my_list: + # iterate through the dict of key/values + for key,value in my_dict.items(): + try: + if "://" in value: + link = "<a href=" + '"' + value + '">' + key +"</a>" + value = link + except: + pass + line = "<tr><td><b>" + str(key) + "</b></td><td>" + str(value) + "</td></tr>" + results = results + line + except: + results = "<tr><td>no data</td></tr>" + + return results + + +def ShowInputs(request, id): + task = Task.objects.get(id=id) + + # convert the json to a presentable piece of html for the output template + results = convert_list_of_dicts_to_html(task.inputs) + return render(request, "taskdatabase/details/inputs.html", {'results': results}) + + +def ShowOutputs(request, id): + task = Task.objects.get(id=id) + + # convert the json to a presentable piece of html for the output template + results = convert_list_of_dicts_to_html(task.outputs) + return render(request, "taskdatabase/details/outputs.html", {'results': results}) + + +def ShowMetrics(request, id): + task = Task.objects.get(id=id) + + # convert the json to a presentable piece of html for the output template + results = convert_list_of_dicts_to_html(task.metrics) + return render(request, "taskdatabase/details/metrics.html", {'results': results}) + + # example: /atdb/workflows/ class WorkflowListViewAPI(generics.ListCreateAPIView): model = Workflow @@ -226,7 +271,6 @@ class WorkflowListViewAPI(generics.ListCreateAPIView): filter_backends = (filters.DjangoFilterBackend,) filter_class = WorkflowFilter - # example: /atdb/workflows/5/ class WorkflowDetailsViewAPI(generics.RetrieveUpdateDestroyAPIView): model = Workflow @@ -234,8 +278,8 @@ class WorkflowDetailsViewAPI(generics.RetrieveUpdateDestroyAPIView): serializer_class = WorkflowSerializer -def WorkflowDetails(request, uri): - workflow = Workflow.objects.get(id=uri) +def WorkflowDetails(request, id): + workflow = Workflow.objects.get(id=id) return render(request, "taskdatabase/workflow/workflow_details.html", {'workflow': workflow})