diff options
author | Suchita Lad | 2025-02-28 17:55:59 +0530 |
---|---|---|
committer | Suchita Lad | 2025-02-28 17:55:59 +0530 |
commit | c0ad7661aa81b5a330e4470f71b19481a1991fd7 (patch) | |
tree | 28de8d81cf52013dc4052c39b352a24a7ff00718 | |
parent | 621a193ff773b1be38f880bd891a1ec1de0586b4 (diff) | |
download | Common-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.js | 41 | ||||
-rw-r--r-- | blocks/simulationAPI/helpers/ngspice_helper.py | 89 | ||||
-rw-r--r-- | blocks/simulationAPI/models.py | 34 | ||||
-rw-r--r-- | blocks/simulationAPI/serializers.py | 23 | ||||
-rw-r--r-- | blocks/simulationAPI/tasks.py | 4 | ||||
-rw-r--r-- | blocks/simulationAPI/views.py | 4 |
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: |