queue_test / app.py
aartstudio's picture
Upload 2 files
7a03600 verified
import time
import gradio as gr
MAX_QUEUE_SIZE = 3
def get_sorted_queue(queue_state):
if queue_state is None:
return []
# Sort by age descending; if ages equal, keep original order by queue number
return sorted(queue_state, key=lambda p: (-p["Age"], p["Queue No."]))
def add_to_queue(name, age, queue_state):
if queue_state is None:
queue_state = []
if not name:
return (
"Please enter your name.",
queue_state,
get_sorted_queue(queue_state),
-1,
"Waiting for people to join the queue."
)
try:
age = int(age)
if age <= 0:
raise ValueError
except Exception:
return (
"Please enter a valid positive age.",
queue_state,
get_sorted_queue(queue_state),
-1,
"Waiting for people to join the queue."
)
if len(queue_state) >= MAX_QUEUE_SIZE:
return (
"Queue is full. Only 3 people are allowed.",
queue_state,
get_sorted_queue(queue_state),
-1,
"Queue is full. No more people can join."
)
queue_number = len(queue_state) + 1
person = {
"Queue No.": queue_number,
"Name": name,
"Age": age
}
queue_state.append(person)
message = f"Welcome, {name}! Your queue number is {queue_number}."
display_queue = get_sorted_queue(queue_state)
return (
message,
queue_state,
display_queue,
-1,
"Queue updated. Press 'Start / Next' to call the next person."
)
def reset_queue():
return (
"Queue has been reset.",
[],
[],
-1,
"Waiting for people to join the queue."
)
def serve_next(queue_state, service_index):
if not queue_state:
return (
"No one in the queue yet.",
-1,
[],
"Waiting for people to join the queue."
)
display_queue = get_sorted_queue(queue_state)
if service_index is None or service_index < 0:
idx = 0
else:
idx = service_index + 1
if idx >= len(display_queue):
return (
"All people have been served.",
service_index,
display_queue,
"Queue completed."
)
person = display_queue[idx]
# Simulate a 10-second service time
time.sleep(10)
now_serving_msg = (
f"Now serving: Queue No. {person['Queue No.']} - "
f"{person['Name']} (Age {person['Age']})"
)
status_msg = "Next person has been called."
return (
now_serving_msg,
idx,
display_queue,
status_msg
)
with gr.Blocks() as demo:
gr.Markdown("# Smart Queue System (Older First)")
gr.Markdown(
"Enter your name and age. Up to 3 people can join the queue. "
"Older people are served first. Each turn takes about 10 seconds."
)
queue_state = gr.State([])
service_index = gr.State(-1)
with gr.Row():
name_input = gr.Textbox(label="Name")
age_input = gr.Number(label="Age", precision=0)
with gr.Row():
submit_btn = gr.Button("Join Queue")
reset_btn = gr.Button("Reset Queue")
next_btn = gr.Button("Start / Next")
status_output = gr.Textbox(label="Status", interactive=False)
now_serving_output = gr.Textbox(label="Now Serving", interactive=False)
queue_table = gr.Dataframe(
headers=["Queue No.", "Name", "Age"],
label="Current Queue (sorted, older first)",
datatype=["number", "str", "number"],
wrap=True
)
submit_btn.click(
fn=add_to_queue,
inputs=[name_input, age_input, queue_state],
outputs=[
status_output,
queue_state,
queue_table,
service_index,
now_serving_output
]
)
reset_btn.click(
fn=reset_queue,
inputs=None,
outputs=[
status_output,
queue_state,
queue_table,
service_index,
now_serving_output
]
)
next_btn.click(
fn=serve_next,
inputs=[queue_state, service_index],
outputs=[
now_serving_output,
service_index,
queue_table,
status_output
]
)
if __name__ == "__main__":
demo.launch()