summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSuchita Lad2025-02-28 17:55:59 +0530
committerSuchita Lad2025-02-28 17:55:59 +0530
commitc0ad7661aa81b5a330e4470f71b19481a1991fd7 (patch)
tree28de8d81cf52013dc4052c39b352a24a7ff00718
parent621a193ff773b1be38f880bd891a1ec1de0586b4 (diff)
downloadCommon-Interface-Project-c0ad7661aa81b5a330e4470f71b19481a1991fd7.tar.gz
Common-Interface-Project-c0ad7661aa81b5a330e4470f71b19481a1991fd7.tar.bz2
Common-Interface-Project-c0ad7661aa81b5a330e4470f71b19481a1991fd7.zip
Updated files for session
-rw-r--r--blocks/eda-frontend/src/App.js41
-rw-r--r--blocks/simulationAPI/helpers/ngspice_helper.py89
-rw-r--r--blocks/simulationAPI/models.py34
-rw-r--r--blocks/simulationAPI/serializers.py23
-rw-r--r--blocks/simulationAPI/tasks.py4
-rw-r--r--blocks/simulationAPI/views.py4
6 files changed, 121 insertions, 74 deletions
diff --git a/blocks/eda-frontend/src/App.js b/blocks/eda-frontend/src/App.js
index 9b38be4c..838c9c62 100644
--- a/blocks/eda-frontend/src/App.js
+++ b/blocks/eda-frontend/src/App.js
@@ -1,6 +1,7 @@
-import React, { useEffect } from 'react'
+import React, { useEffect, useState } from 'react'
import PropTypes from 'prop-types'
import { HashRouter, Switch, Route, Redirect } from 'react-router-dom'
+import { v4 as uuidv4 } from 'uuid'
import CircularProgress from '@material-ui/core/CircularProgress'
import Navbar from './components/Shared/Navbar'
@@ -75,10 +76,46 @@ PublicRoute.propTypes = {
restricted: PropTypes.bool
}
-function App () {
+
+const App = () => {
+ const [sessionId, setSessionId] = useState(null)
+
+ useEffect(() => {
+ const fetchSession = async () => {
+ // Check if session ID already exists
+ let existingSession = localStorage.getItem('session_id')
+
+ if (!existingSession) {
+ // Generate a new session ID
+ const response = api.get("init-session")
+ setSessionData(response.data);
+ localStorage.setItem("session_id", response.data.session_id)
+ // localStorage.setItem('session_id', newSession)
+ existingSession = response.data.session_id
+
+ }
+
+ setSessionId(existingSession)
+ }
+ fetchSession()
+ }, [])
+
+ // const get_sessionid = () => {
+ // return sessionId
+ // }
+
return (
// Handles Routing for an application
<HashRouter>
+ {/* <div>
+ <h1>React Session Management</h1>
+ {sessionId ? (
+ <p><strong>Session ID:</strong> {sessionId}<br />
+ <strong>Length:</strong> {sessionId.length}</p>
+ ) : (
+ <p>Generating session...</p>
+ )}
+ </div> */}
<Switch>
<PublicRoute exact path='/login' restricted nav={false} component={Login} />
<PublicRoute exact path='/signup' restricted nav={false} component={SignUp} />
diff --git a/blocks/simulationAPI/helpers/ngspice_helper.py b/blocks/simulationAPI/helpers/ngspice_helper.py
index 8e355f0b..59734a9a 100644
--- a/blocks/simulationAPI/helpers/ngspice_helper.py
+++ b/blocks/simulationAPI/helpers/ngspice_helper.py
@@ -9,33 +9,34 @@ from datetime import datetime
from pathlib import Path
from tempfile import mkstemp
from django.conf import settings
+from simulationAPI.helpers.scilab_manager import run_scilab, prestart_scilab
logger = get_task_logger(__name__)
XmlToXcos = join(settings.BASE_DIR, 'Xcos/XmlToXcos.sh')
-SCILAB_DIR = abspath(settings.SCILAB_DIR)
-SCILAB = join(SCILAB_DIR, 'bin', 'scilab-adv-cli')
+# SCILAB_DIR = abspath(settings.SCILAB_DIR)
+# SCILAB = join(SCILAB_DIR, 'bin', 'scilab-adv-cli')
# handle scilab startup
-SCILAB_START = (
- "try;funcprot(0);lines(0,120);"
- "clearfun('messagebox');"
- "function messagebox(msg,title,icon,buttons,modal),disp(msg),endfunction;"
- "funcprot(1);"
- "catch;[error_message,error_number,error_line,error_func]=lasterror();"
- "disp(error_message,error_number,error_line,error_func);exit(3);end;"
-)
-
-SCILAB_END = (
- "catch;[error_message,error_number,error_line,error_func]=lasterror();"
- "disp(error_message,error_number,error_line,error_func);exit(2);end;exit;"
-)
-SCILAB_CMD = [SCILAB,
- "-noatomsautoload",
- "-nogui",
- "-nouserstartup",
- "-nb",
- "-nw",
- "-e", SCILAB_START]
-LOGFILEFD = 123
+# SCILAB_START = (
+# "try;funcprot(0);lines(0,120);"
+# "clearfun('messagebox');"
+# "function messagebox(msg,title,icon,buttons,modal),disp(msg),endfunction;"
+# "funcprot(1);"
+# "catch;[error_message,error_number,error_line,error_func]=lasterror();"
+# "disp(error_message,error_number,error_line,error_func);exit(3);end;"
+# )
+
+# SCILAB_END = (
+# "catch;[error_message,error_number,error_line,error_func]=lasterror();"
+# "disp(error_message,error_number,error_line,error_func);exit(2);end;exit;"
+# )
+# SCILAB_CMD = [SCILAB,
+# "-noatomsautoload",
+# "-nogui",
+# "-nouserstartup",
+# "-nb",
+# "-nw",
+# "-e", SCILAB_START]
+# LOGFILEFD = 123
class CannotRunParser(Exception):
@@ -89,26 +90,29 @@ def ExecXml(task_id, file_obj):
file_path = file_obj.file.path
current_dir = settings.MEDIA_ROOT + '/' + str(task_id)
try:
+ # proc, log_name = prestart_scilab()
+ # if not proc:
+ # raise RuntimeError("Failed to start Scilab.")
xcosfile = CreateXml(file_path, file_obj.parameters, task_id)
- (logfilefd, log_name) = mkstemp(prefix=datetime.now().strftime(
- 'scilab-log-%Y%m%d-'), suffix='.txt', dir=current_dir)
+ # (logfilefd, log_name) = mkstemp(prefix=datetime.now().strftime(
+ # 'scilab-log-%Y%m%d-'), suffix='.txt', dir=current_dir)
- if logfilefd != LOGFILEFD:
- os.dup2(logfilefd, LOGFILEFD)
- os.close(logfilefd)
+ # if logfilefd != LOGFILEFD:
+ # os.dup2(logfilefd, LOGFILEFD)
+ # os.close(logfilefd)
file_obj.log_name = log_name
file_obj.save()
- logger.info('will run %s %s> %s', SCILAB_CMD[0], LOGFILEFD, log_name)
- logger.info('running command %s', SCILAB_CMD[-1])
- proc = subprocess.Popen(
- SCILAB_CMD,
- stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
- start_new_session=True, universal_newlines=True, cwd=current_dir,
- pass_fds=(LOGFILEFD, ))
+ # logger.info('will run %s %s> %s', SCILAB_CMD[0], LOGFILEFD, log_name)
+ # logger.info('running command %s', SCILAB_CMD[-1])
+ # proc = subprocess.Popen(
+ # SCILAB_CMD,
+ # stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+ # start_new_session=True, universal_newlines=True, cwd=current_dir,
+ # pass_fds=(LOGFILEFD, ))
- os.close(LOGFILEFD)
+ # os.close(LOGFILEFD)
current_task.update_state(
state='STREAMING',
@@ -119,15 +123,18 @@ def ExecXml(task_id, file_obj):
cmd += "loadXcosLibs();"
cmd += "importXcosDiagram('%s');" % xcosfile
cmd += "xcos_simulate(scs_m,4);"
- cmd += SCILAB_END
+ # cmd += SCILAB_END
+
+
logger.info('running command %s', cmd)
- proc.stdin.write(cmd)
+ # proc.stdin.write(cmd)
- (out, err) = proc.communicate()
+ # (out, err) = proc.communicate()
+ out, err, returncode = run_scilab(cmd, current_dir, createlogfile=False, timeout=70)
maxlines = 15
- logger.info('Ran %s', SCILAB_CMD[0])
+ # logger.info('Ran %s', SCILAB_CMD[0])
if out:
out = out.rstrip()
if out:
@@ -140,7 +147,7 @@ def ExecXml(task_id, file_obj):
err = '\n'.join(re.split(r'\n+', err, maxlines + 1)[:maxlines])
logger.info('err=%s', err)
- file_obj.returncode = proc.returncode
+ file_obj.returncode = returncode
file_obj.save()
return 'Streaming'
diff --git a/blocks/simulationAPI/models.py b/blocks/simulationAPI/models.py
index fb8f860e..516b84a7 100644
--- a/blocks/simulationAPI/models.py
+++ b/blocks/simulationAPI/models.py
@@ -4,32 +4,34 @@ from django.conf import settings
import uuid
-class Task(models.Model):
- task_id = models.UUIDField(
- primary_key=True, default=uuid.uuid4, editable=False)
- task_time = models.DateTimeField(auto_now=True)
-
- def save(self, *args, **kwargs):
- super(Task, self).save(*args, **kwargs)
+# session
+class Session(models.Model):
+ session_id = models.CharField(primary_key=True, max_length=100, null=False, editable=False)
+ app_name = models.CharField(max_length=100, blank=True, null=True)
+ created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
- """String for representing the Model object."""
- return self.task_id.hex
+ return self.session_id
-class TaskFile(models.Model):
- file_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
- file = models.FileField(storage=FileSystemStorage(location=settings.MEDIA_ROOT))
- app_name = models.CharField(max_length=100, blank=True, null=True)
+class Task(models.Model):
+ task_id = models.UUIDField(
+ primary_key=True, default=uuid.uuid4, editable=False)
+ file = models.FileField(storage=FileSystemStorage(location=settings.MEDIA_ROOT), default='default_file.txt')
+
parameters = models.TextField(blank=True, null=True)
upload_time = models.DateTimeField(auto_now=True)
log_name = models.CharField(max_length=500, blank=True, null=True)
returncode = models.IntegerField(blank=True, null=True)
- task = models.OneToOneField(Task, on_delete=models.CASCADE, related_name='file')
+
+ task_time = models.DateTimeField(auto_now=True)
+
+ session = models.ForeignKey(Session, on_delete=models.CASCADE, related_name='task_files', null=True, blank=True)
def save(self, *args, **kwargs):
- super(TaskFile, self).save(*args, **kwargs)
+ super(Task, self).save(*args, **kwargs)
def __str__(self):
"""String for representing the Model object."""
- return self.file_id.hex
+ return self.task_id.hex
+
diff --git a/blocks/simulationAPI/serializers.py b/blocks/simulationAPI/serializers.py
index b0765f56..a857c5d7 100644
--- a/blocks/simulationAPI/serializers.py
+++ b/blocks/simulationAPI/serializers.py
@@ -2,24 +2,24 @@ import json
from celery.utils.log import get_task_logger
from rest_framework import serializers
-from simulationAPI.models import TaskFile, Task
+from simulationAPI.models import Task, Session
logger = get_task_logger(__name__)
-class TaskFileSerializer(serializers.ModelSerializer):
+class SessionSerializer(serializers.ModelSerializer):
class Meta:
- model = TaskFile
- fields = ('file_id', 'file', 'app_name', 'parameters', 'upload_time',
- 'log_name', 'returncode', 'task')
+ model = Session
+ fields = ('session_id', 'app_name', 'created_at')
class TaskSerializer(serializers.HyperlinkedModelSerializer):
- file = TaskFileSerializer(read_only=True)
+ session = SessionSerializer(read_only=True)
class Meta:
model = Task
- fields = ('task_id', 'task_time', 'file')
+ fields = ('task_id', 'file', 'parameters', 'upload_time',
+ 'log_name', 'returncode', 'task_time', 'session')
def create(self, validated_data):
# Takes file from request and stores it along with a taskid
@@ -29,9 +29,10 @@ class TaskSerializer(serializers.HyperlinkedModelSerializer):
post = request.POST
postdata = post.dict()
app_name = postdata.pop('app_name')
+ session_id = postdata.pop('session_id')
parameters = json.dumps(postdata, separators=(',', ':'))
- task = Task.objects.create()
- taskfile = TaskFile.objects.create(
- task=task, file=file, app_name=app_name, parameters=parameters)
- logger.info('task: %s, taskfile: %s', task, taskfile)
+ session = Session.objects.create(session_id, app_name)
+ task = Task.objects.create(
+ session=session, file=file, parameters=parameters)
+ logger.info('session: %s, task: %s', session, task)
return task
diff --git a/blocks/simulationAPI/tasks.py b/blocks/simulationAPI/tasks.py
index 0e2e70a7..c2766947 100644
--- a/blocks/simulationAPI/tasks.py
+++ b/blocks/simulationAPI/tasks.py
@@ -4,7 +4,7 @@ from celery.exceptions import Ignore
from celery.utils.log import get_task_logger
from simulationAPI.helpers import ngspice_helper
-from simulationAPI.models import TaskFile
+from simulationAPI.models import Task
logger = get_task_logger(__name__)
@@ -13,7 +13,7 @@ logger = get_task_logger(__name__)
@shared_task
def process_task(task_id):
try:
- file_obj = TaskFile.objects.get(task_id=task_id)
+ file_obj = Task.objects.get(task_id=task_id)
logger.info("Processing %s %s %s",
task_id, file_obj.file.path, file_obj.app_name)
diff --git a/blocks/simulationAPI/views.py b/blocks/simulationAPI/views.py
index 5ee51d3f..e342f270 100644
--- a/blocks/simulationAPI/views.py
+++ b/blocks/simulationAPI/views.py
@@ -13,7 +13,7 @@ from rest_framework.response import Response
from rest_framework.views import APIView
from blocks.celery_tasks import app
-from simulationAPI.models import TaskFile
+from simulationAPI.models import Task
from simulationAPI.negotiation import IgnoreClientContentNegotiation
from simulationAPI.serializers import TaskSerializer
from simulationAPI.tasks import process_task
@@ -241,7 +241,7 @@ class StreamView(APIView):
def get_log_name(self, task_id):
while True:
- file_obj = TaskFile.objects.get(task_id=task_id)
+ file_obj = Task.objects.get(task_id=task_id)
log_name = file_obj.log_name
returncode = file_obj.returncode
if log_name is None: