Spaces:
Sleeping
Sleeping
| 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() | |