Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion backend/backend/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,11 @@
origin.replace(':4000', ':4002')
])

# if DEBUG:
# CORS_ALLOWED_ORIGINS = [
# env.str('VISUAL_CIRCUIT_FRONTEND_HOST'),
# f"{env.str('VISUAL_CIRCUIT_FRONTEND_HOST')}:{DESIRED_PORT}",
# ]

# Allow frontend to read the Content-Disposition header to get the correct .zip filename
CORS_EXPOSE_HEADERS = ['Content-Disposition']

38 changes: 2 additions & 36 deletions backend/staticfiles/synthesis/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,40 +50,6 @@ def clean_shared_memory(signum, frame, names, processes):
sys.exit(0)


def process_wrapper(method, inputs, outputs, parameters, sync):
"""
Wrapper that restores sys.stdin before running a block's main().

On macOS / Windows, multiprocessing uses 'spawn' which starts a fresh
Python interpreter where sys.stdin is None. Calling input() in that
state raises EOFError immediately (Issue #359).

Strategy:
1. If fd 0 is a real TTY, open /dev/tty so the block gets a proper
interactive terminal (works even inside Docker with -it).
2. Otherwise fall back to os.fdopen(0) for piped / non-TTY contexts.
3. If both fail, leave sys.stdin unchanged and let the block handle it.
"""
import sys
import os

if os.isatty(0):
# fd 0 is connected to a real terminal — give the block full TTY access
try:
sys.stdin = open('/dev/tty', 'r')
except OSError:
# /dev/tty not available (rare); fall back to wrapping fd 0 directly
try:
sys.stdin = os.fdopen(0)
except OSError:
pass # leave sys.stdin as-is; block may not need input()
# If fd 0 is NOT a tty (pipe / redirect / Docker without -it),
# we do NOT restore stdin — input() will raise EOFError, which is the
# correct, expected behaviour in a non-interactive environment.

method(inputs, outputs, parameters, sync)


def main():
"""
Main function
Expand Down Expand Up @@ -165,8 +131,8 @@ def main():
freq = block_data[block_id].get("frequency", 30)
processes.append(
multiprocessing.Process(
target=process_wrapper,
args=(method, inputs, outputs, parameters, Synchronise(1 / (freq if freq != 0 else 30)))
target=method,
args=(inputs, outputs, parameters, Synchronise(1 / (freq if freq != 0 else 30)))
)
)

Expand Down
4 changes: 1 addition & 3 deletions frontend/.env.development
Original file line number Diff line number Diff line change
@@ -1,3 +1 @@
REACT_APP_BACKEND_HOST=http://localhost:8080/api/
HOST=localhost
DANGEROUSLY_DISABLE_HOST_CHECK=true
REACT_APP_BACKEND_HOST=http://localhost:8080/api/
22 changes: 1 addition & 21 deletions frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 3 additions & 17 deletions frontend/src/components/dialogs/project-info-dialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,6 @@ const ProjectInfoDialog = ({ isOpen, onResolve, onReject,
// Tags of the package (comma separated)
const [tagsInput, setTags] = useState(tags ? tags.join(', ') : '');

const ALLOWED_CATEGORIES = [
"Computer Vision",
"Control Systems",
"Locomotion",
"Machine Learning",
"Utilities",
"ROS2"
];

const fileReader = new FileReader();
fileReader.onload = (event) => {
if (event.target?.result) {
Expand Down Expand Up @@ -145,19 +136,14 @@ const ProjectInfoDialog = ({ isOpen, onResolve, onReject,
Category
</DialogContentText>
<TextField
select
autoFocus
margin="dense"
type="text"
variant='outlined'
value={categoryInput}
onChange={(event) => setCategory(event.target.value)}
fullWidth
>
{ALLOWED_CATEGORIES.map((cat) => (
<MenuItem key={cat} value={cat}>
{cat}
</MenuItem>
))}
</TextField>
/>

<DialogContentText>
Tags (comma separated)
Expand Down
Loading