diff options
author | Suchita Lad | 2025-03-21 17:43:12 +0530 |
---|---|---|
committer | Suchita Lad | 2025-03-25 11:13:14 +0530 |
commit | a7dcdd02a237dc59c2f65ad1a1594acd2091d301 (patch) | |
tree | 68f81cdff18b1291b512a137c6906ce9c8c100ce | |
parent | b9b2f6181a300ed8c5eb7667c507616bbb3bd558 (diff) | |
download | Common-Interface-Project-a7dcdd02a237dc59c2f65ad1a1594acd2091d301.tar.gz Common-Interface-Project-a7dcdd02a237dc59c2f65ad1a1594acd2091d301.tar.bz2 Common-Interface-Project-a7dcdd02a237dc59c2f65ad1a1594acd2091d301.zip |
Added Script file name and type in Task model
6 files changed, 80 insertions, 5 deletions
diff --git a/blocks/eda-frontend/src/components/SchematicEditor/ToolbarExtension.js b/blocks/eda-frontend/src/components/SchematicEditor/ToolbarExtension.js index c503c0d0..e1250c36 100644 --- a/blocks/eda-frontend/src/components/SchematicEditor/ToolbarExtension.js +++ b/blocks/eda-frontend/src/components/SchematicEditor/ToolbarExtension.js @@ -36,9 +36,10 @@ import { import { makeStyles } from '@material-ui/core/styles' import CloseIcon from '@material-ui/icons/Close' import { useSelector, useDispatch } from 'react-redux' -import { fetchSchematics, fetchSchematic, fetchDiagram, fetchGallery, setSchScriptDump } from '../../redux/actions/index' +import { fetchSchematics, fetchSchematic, fetchDiagram, fetchGallery, setSchScriptDump, setScriptTaskId } from '../../redux/actions/index' import { blue } from '@material-ui/core/colors' import { getDateTime as getDate, getUppercaseInitial, saveToFile } from '../../utils/GalleryUtils' +import api from '../../utils/Api' const Transition = forwardRef(function Transition (props, ref) { return <Slide direction='up' ref={ref} {...props} /> @@ -336,6 +337,7 @@ HelpScreen.propTypes = { export function ScriptScreen ({ isOpen, onClose }) { const scriptDump = useSelector(state => state.saveSchematicReducer.scriptDump) + const title = useSelector(state => state.netlistReducer.title) const dispatch = useDispatch() const scriptHandler = (e) => { dispatch(setSchScriptDump(e.target.value)) @@ -343,8 +345,47 @@ export function ScriptScreen ({ isOpen, onClose }) { const [result, setResult] = useState('') - const executeCode = () => { - setResult('Executing Scilab code...') + const prepareScriptNetlist = (scriptDump) => { + const titleA = title.split(' ')[1] + const myblob = new Blob([scriptDump], { + type: 'text/plain' + }) + const file = new File([myblob], `${titleA}.sce`, { type: 'text/sce', lastModified: Date.now() }) + const type = 'SCRIPT' + sendSriptNetlist(file, type) + } + + function sendSriptNetlist (file, type) { + netlistConfig(file, type) + .then((response) => { + const res = response.data + const taskId = res.details.task_id + dispatch(setScriptTaskId(taskId)) + }) + .catch(function (error) { + console.error(error) + }) + } + + function netlistConfig (file, type) { + const formData = new FormData() + + formData.append('app_name', process.env.REACT_APP_NAME) + formData.append('file', file) + formData.append('type', type) + + const config = { + headers: { + 'content-type': 'multipart/form-data' + } + } + return api.post('simulation/upload', formData, config) + } + + const executeScript = () => { + dispatch(setScriptTaskId('')) + prepareScriptNetlist(scriptDump) + } const resetCode = () => { @@ -414,7 +455,7 @@ export function ScriptScreen ({ isOpen, onClose }) { {/* Action Buttons */} <Box sx={{ mt: 4, display: 'flex', gap: 2 }}> - <Button onClick={executeCode} color='primary' variant='contained'> + <Button onClick={executeScript} color='primary' variant='contained'> Execute </Button> <Button onClick={resetCode} color='secondary' variant='contained'> diff --git a/blocks/eda-frontend/src/redux/actions/actions.js b/blocks/eda-frontend/src/redux/actions/actions.js index 9ec5a49b..dd25c855 100644 --- a/blocks/eda-frontend/src/redux/actions/actions.js +++ b/blocks/eda-frontend/src/redux/actions/actions.js @@ -46,6 +46,7 @@ export const SET_SCH_SHARED = 'SET_SCH_SHARED' export const CLEAR_DETAILS = 'CLEAR_DETAILS' export const LOAD_GALLERY = 'LOAD_GALLERY' export const SET_SCH_SCRIPT_DUMP = 'SET_SCH_SCRIPT_DUMP' +export const SET_SCRIPT_TASK_ID = 'SET_SCRIPT_TASK_ID' // Action for fetching on-cloud saved schematics for authenticated user to display in dashboard export const FETCH_SCHEMATICS = 'FETCH_SCHEMATICS' diff --git a/blocks/eda-frontend/src/redux/actions/simulationActions.js b/blocks/eda-frontend/src/redux/actions/simulationActions.js index f2d249a5..06a603b8 100644 --- a/blocks/eda-frontend/src/redux/actions/simulationActions.js +++ b/blocks/eda-frontend/src/redux/actions/simulationActions.js @@ -39,3 +39,12 @@ export const setResultTaskId = (taskId) => (dispatch) => { } }) } + +export const setScriptTaskId = (scriptTaskId) => (dispatch) => { + dispatch({ + type: actions.SET_SCRIPT_TASK_ID, + payload: { + scriptTaskId + } + }) +} diff --git a/blocks/eda-frontend/src/redux/reducers/simulationReducer.js b/blocks/eda-frontend/src/redux/reducers/simulationReducer.js index aee38f33..08b3c2d2 100644 --- a/blocks/eda-frontend/src/redux/reducers/simulationReducer.js +++ b/blocks/eda-frontend/src/redux/reducers/simulationReducer.js @@ -42,6 +42,13 @@ export default function (state = initialState, action) { } } + case actions.SET_SCRIPT_TASK_ID: { + return { + ...state, + scriptTaskId: action.payload.taskId + } + } + default: return state } diff --git a/blocks/simulationAPI/serializers.py b/blocks/simulationAPI/serializers.py index 9a815b41..605c0dfb 100644 --- a/blocks/simulationAPI/serializers.py +++ b/blocks/simulationAPI/serializers.py @@ -28,13 +28,18 @@ class TaskSerializer(serializers.HyperlinkedModelSerializer): file = request.FILES.get('file') logger.info('File Upload: %s', file) + file_extension = file.name.split('.')[-1].lower() + if file_extension not in ['xml', 'sce']: + raise serializers.ValidationError({"file": "Invalid file type. Only .xml and .sce files are allowed."}) + session_id = request.headers.get("Session-ID") post = request.POST postdata = post.dict() app_name = postdata.pop('app_name') + type = postdata.pop('type', 'XCOS') parameters = json.dumps(postdata, separators=(',', ':')) session, created = Session.objects.get_or_create(session_id=session_id, app_name=app_name) - task = Task.objects.create(session=session, file=file, parameters=parameters) + task = Task.objects.create(session=session, file=file, type=type, parameters=parameters) logger.info("Session: %s (created: %s), Task: %s", session, created, task) return task diff --git a/blocks/simulationAPI/views.py b/blocks/simulationAPI/views.py index 5d397e5c..c2b207b8 100644 --- a/blocks/simulationAPI/views.py +++ b/blocks/simulationAPI/views.py @@ -49,6 +49,18 @@ class XmlUploader(APIView): def post(self, request, *args, **kwargs): logger.info('Got POST for Xml upload: data=%s', request.data) + + uploaded_file = request.FILES.get('file') + if not uploaded_file: + return Response({"error": "No file provided"}, status=status.HTTP_400_BAD_REQUEST) + + file_extension = uploaded_file.name.split('.')[-1].lower() + + # Validate file type + if file_extension not in ['xml', 'sce']: + return Response({"error": "Invalid file type. Only .xml and .sce files are allowed."}, + status=status.HTTP_400_BAD_REQUEST) + serializer = TaskSerializer(data=request.data, context={'request': request}) if serializer.is_valid(): serializer.save() |