From 6e4f63bb521e2bf722c6b87719316379f878db12 Mon Sep 17 00:00:00 2001
From: Stefano Alberto Russo <stefano.russo@gmail.com>
Date: Fri, 1 May 2020 18:21:11 +0200
Subject: [PATCH] Added support for editing computing confs.

---
 .../templates/components/computing.html       |   6 +-
 .../base_app/templates/computings.html        |   4 +-
 .../templates/edit_computing_conf.html        |  70 ++++++++++
 .../webapp/code/rosetta/base_app/views.py     | 121 +++++++++++++++++-
 services/webapp/code/rosetta/urls.py          |   1 +
 5 files changed, 195 insertions(+), 7 deletions(-)
 create mode 100644 services/webapp/code/rosetta/base_app/templates/edit_computing_conf.html

diff --git a/services/webapp/code/rosetta/base_app/templates/components/computing.html b/services/webapp/code/rosetta/base_app/templates/components/computing.html
index e918725..c3f29ee 100644
--- a/services/webapp/code/rosetta/base_app/templates/components/computing.html
+++ b/services/webapp/code/rosetta/base_app/templates/components/computing.html
@@ -1,4 +1,4 @@
-      <table class="dashboard">
+      <table class="dashboard" style="max-width:500px">
 
        <tr>
         <td><b>ID</b></td>
@@ -22,12 +22,12 @@
 
        <tr>
         <td><b>Sys Conf</b></td>
-        <td>{{ computing.sys_conf_data }}</td>
+        <td>{{ computing.sys_conf_data }} {% if request.user.is_superuser %} &nbsp;[<a href="/edit_computing_conf?type=sys&computing_uuid={{ computing.uuid}}">Edit</a>] {% endif %}</td>
        </tr>
 
        <tr>
         <td><b>User Conf</b></td>
-        <td>{{ computing.user_conf_data }}</td>
+        <td>{{ computing.user_conf_data }} &nbsp;[<a href="/edit_computing_conf?type=user&computing_uuid={{ computing.uuid}}">Edit</a>]</td>
        </tr>
 
        
diff --git a/services/webapp/code/rosetta/base_app/templates/computings.html b/services/webapp/code/rosetta/base_app/templates/computings.html
index b6dbb3f..56271a1 100644
--- a/services/webapp/code/rosetta/base_app/templates/computings.html
+++ b/services/webapp/code/rosetta/base_app/templates/computings.html
@@ -27,8 +27,8 @@
       {% endfor %}
   
       
-      <br />
-      <a href="/add_computing">Add new...</a>
+      <!-- <br />
+      <a href="/add_computing">Add new...</a> -->
       
       {% endif %}
       <br />
diff --git a/services/webapp/code/rosetta/base_app/templates/edit_computing_conf.html b/services/webapp/code/rosetta/base_app/templates/edit_computing_conf.html
new file mode 100644
index 0000000..67032cb
--- /dev/null
+++ b/services/webapp/code/rosetta/base_app/templates/edit_computing_conf.html
@@ -0,0 +1,70 @@
+{% load static %} 
+{% include "header.html" %}
+{% include "navigation.html" with main_path='/main/' %}
+
+<br/>
+<br/>
+
+<div class="container">
+  <div class="dashboard">
+    <div class="span8 offset2">
+      <h1>Edit computing conf</h1> 
+      <hr>
+
+
+      <h4>Edit the configuration in JSON format for {{ data.computing }}</h4> 
+      
+      <br/>
+      
+      <form action="/edit_computing_conf/" method="POST">
+      {% csrf_token %}
+      <input type="hidden" name="type" value="{{ data.type }}">
+      <input type="hidden" name="computing_uuid" value="{{ data.computing.uuid }}">
+      <table class="dashboard" style="max-width:430px">
+
+       <tr>
+        <td>
+         <textarea name="new_conf" style="height:300px; width:500px">
+{{ data.computing_conf_data}}
+         </textarea>
+        </td>
+       </tr>
+
+      {% if data.saved %}
+       <tr>
+        <td colspan=2 align=center style="padding:0px">
+         <font color="green">Saved</font>
+        </td>
+       </tr>
+      {% endif %}
+
+       <tr>
+        <td colspan=2 align=center style="padding:20px">
+         <input type="submit" value="Save">
+        </td>
+       </tr>
+       
+      </table>
+      </form>
+
+      <br/>          
+      <br/>
+      <br/>
+      <br/>
+      <br/>
+      <br/>
+      <br/>
+      <br/>
+      <br/>
+      
+    </div>
+  </div>
+</div>
+
+{% include "footer.html" %}
+
+
+
+
+
+
diff --git a/services/webapp/code/rosetta/base_app/views.py b/services/webapp/code/rosetta/base_app/views.py
index af2fd9d..8ae2bce 100644
--- a/services/webapp/code/rosetta/base_app/views.py
+++ b/services/webapp/code/rosetta/base_app/views.py
@@ -1,4 +1,5 @@
 import uuid
+import json
 import subprocess
 from django.conf import settings
 from django.shortcuts import render
@@ -6,7 +7,7 @@ from django.contrib.auth import authenticate, login, logout
 from django.http import HttpResponse, HttpResponseRedirect
 from django.contrib.auth.models import User
 from django.shortcuts import redirect
-from .models import Profile, LoginToken, Task, TaskStatuses, Container, Computing, Keys
+from .models import Profile, LoginToken, Task, TaskStatuses, Container, Computing, Keys, ComputingSysConf, ComputingUserConf
 from .utils import send_email, format_exception, timezonize, os_shell, booleanize, debug_param
 from .decorators import public_view, private_view
 from .exceptions import ErrorMessage
@@ -715,7 +716,7 @@ def computings(request):
 
 
 #=========================
-#  Add Compute view
+#  Add Computing view
 #=========================
 
 @private_view
@@ -730,3 +731,119 @@ def add_computing(request):
 
 
     return render(request, 'add_computing.html', {'data': data})
+
+
+
+#=========================
+# Edit Computing conf view
+#=========================
+
+@private_view
+def edit_computing_conf(request):
+
+    # Init data
+    data={}
+    data['user']    = request.user
+    data['profile'] = Profile.objects.get(user=request.user)
+    data['title']   = 'Add computing'
+
+    # Get computing conf type
+    computing_conf_type = request.GET.get('type', request.POST.get('type', None))
+    if not computing_conf_type:
+        raise Exception('Missing type')
+    
+    # Get computing uuid
+    computing_uuid = request.GET.get('computing_uuid', request.POST.get('computing_uuid', None))
+    if not computing_uuid:
+        raise Exception('Missing computing_uuid')
+
+    new_conf = request.POST.get('new_conf', None)
+
+
+    if computing_conf_type == 'sys':
+        
+        data['type'] = 'sys'
+        
+        if not request.user.is_superuser:
+            raise Exception('Cannot edit sys conf as not superuser')
+    
+        # Get computing
+        try:
+            computing = Computing.objects.get(uuid=computing_uuid)
+            data['computing'] = computing
+        except ComputingSysConf.DoesNotExist:
+            raise Exception('Unknown computing "{}"'.format(computing_uuid))
+        
+        # Get computing conf
+        computingSysConf = ComputingSysConf.objects.get(computing=computing)   
+        
+        # Edit conf?
+        if new_conf:
+            new_conf_data = json.loads(new_conf)
+            logger.debug('Setting new conf data for sys conf "{}": "{}"'.format(computingSysConf.uuid, new_conf_data))
+            computingSysConf.data = new_conf_data
+            computingSysConf.save()
+            data['saved'] = True
+
+        # Dump conf data for the webpage            
+        data['computing_conf_data'] = json.dumps(computingSysConf.data)
+    
+    elif computing_conf_type == 'user':
+
+        data['type'] = 'user'
+        
+        # Get computing
+        try:
+            computing = Computing.objects.get(uuid=computing_uuid)
+            data['computing'] = computing
+        except ComputingUserConf.DoesNotExist:
+            raise Exception('Unknown computing "{}"'.format(computing_uuid))
+
+        # Get computing conf
+        computingUserConf = ComputingUserConf.objects.get(computing=computing)
+
+        # Edit conf?
+        if new_conf:
+            new_conf_data = json.loads(new_conf)
+            logger.debug('Setting new conf data for user conf "{}": "{}"'.format(computingUserConf.uuid, new_conf_data))
+            computingUserConf.data = new_conf_data
+            computingUserConf.save()
+            data['saved'] = True
+        
+        # Dump conf data for the webpage
+        data['computing_conf_data'] = json.dumps(computingUserConf.data) 
+
+           
+    else:
+        raise Exception('Unknown computing conf type "{}"'.format(computing_conf_type))
+    
+
+    return render(request, 'edit_computing_conf.html', {'data': data})
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/services/webapp/code/rosetta/urls.py b/services/webapp/code/rosetta/urls.py
index 25b14bf..26ca460 100644
--- a/services/webapp/code/rosetta/urls.py
+++ b/services/webapp/code/rosetta/urls.py
@@ -45,6 +45,7 @@ urlpatterns = [
     url(r'^task_log/$', base_app_views.task_log),
     url(r'^computings/$', base_app_views.computings),
     url(r'^add_computing/$', base_app_views.add_computing),
+    url(r'^edit_computing_conf/$', base_app_views.edit_computing_conf),
     url(r'^containers/$', base_app_views.containers),
     url(r'^add_container/$', base_app_views.add_container),
 
-- 
GitLab