Spaces:
Sleeping
Sleeping
File size: 4,476 Bytes
2f495f4 7a03600 2f495f4 7a03600 2f495f4 7a03600 2f495f4 7a03600 2f495f4 7a03600 2f495f4 7a03600 2f495f4 7a03600 2f495f4 7a03600 2f495f4 7a03600 2f495f4 7a03600 2f495f4 7a03600 2f495f4 7a03600 2f495f4 7a03600 2f495f4 7a03600 2f495f4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
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()
|