chewsuming/Queuesystem
0
1import gradio as gr2 3MAX_QUEUE = 104 5def _normalize_name(name: str) -> str:6 return (name or "").strip()7 8def _parse_age(age_text: str):9 age_text = (age_text or "").strip()10 if not age_text:11 return None, "Please enter an age."12 try:13 age = int(age_text)14 except ValueError:15 return None, "Age must be a whole number."16 if age < 0 or age > 130:17 return None, "Please enter a realistic age (0–130)."18 return age, None19 20def _sorted_queue(queue):21 # Oldest first; ties broken by entry order (seq)22 return sorted(queue, key=lambda x: (-x["age"], x["seq"]))23 24def _render(queue):25 if not queue:26 return "Queue is empty."27 q_sorted = _sorted_queue(queue)28 29 lines = ["### Smart Queue (Oldest First)"]30 for idx, item in enumerate(q_sorted, start=1):31 lines.append(f"**#{idx}** — {item['name']} (Age {item['age']})")32 lines.append("")33 lines.append(f"Slots used: **{len(queue)}/{MAX_QUEUE}**")34 lines.append("Rule: **Oldest first**; if ages tie, **earlier signup first**.")35 return "\n\n".join(lines)36 37def add_to_queue(name, age_text, queue_state, seq_state):38 queue_state = queue_state or []39 seq_state = int(seq_state or 1)40 41 if len(queue_state) >= MAX_QUEUE:42 return queue_state, seq_state, _render(queue_state), f"❌ Queue is full (max {MAX_QUEUE}). Please reset or serve next.", gr.update(), gr.update()43 44 name = _normalize_name(name)45 if not name:46 return queue_state, seq_state, _render(queue_state), "❌ Please enter a name.", gr.update(), gr.update()47 48 age, err = _parse_age(age_text)49 if err:50 return queue_state, seq_state, _render(queue_state), f"❌ {err}", gr.update(), gr.update()51 52 queue_state.append({"name": name, "age": age, "seq": seq_state})53 seq_state += 154 55 # After adding, show their *current* position in the sorted queue56 q_sorted = _sorted_queue(queue_state)57 position = next(i for i, p in enumerate(q_sorted, start=1) if p["name"] == name and p["age"] == age and p["seq"] == seq_state - 1)58 59 msg = f"✅ Added **{name}** (Age {age}). Current queue position: **#{position}** (oldest-first ordering)."60 return queue_state, seq_state, _render(queue_state), msg, gr.update(value=""), gr.update(value="")61 62def serve_next(queue_state):63 queue_state = queue_state or []64 if not queue_state:65 return queue_state, _render(queue_state), "Queue is empty. Nothing to serve."66 67 q_sorted = _sorted_queue(queue_state)68 next_person = q_sorted[0]69 70 # Remove by unique seq71 queue_state = [p for p in queue_state if p["seq"] != next_person["seq"]]72 msg = f"➡️ Served: **{next_person['name']}** (Age {next_person['age']})."73 return queue_state, _render(queue_state), msg74 75def reset_queue():76 queue_state = []77 seq_state = 178 return queue_state, seq_state, _render(queue_state), "🔄 Queue reset. You can add up to 10 people.", gr.update(value=""), gr.update(value="")79 80with gr.Blocks(title="Smart Queue (Oldest First)") as demo:81 gr.Markdown(82 "# 👥 Smart Queue (Oldest First)\n"83 "Enter **name** and **age**. The queue is ordered by **oldest first**.\n"84 "If ages are the same, the earlier signup comes first.\n"85 "**Maximum 10 people**."86 )87 88 queue_state = gr.State([])89 seq_state = gr.State(1) # internal counter to preserve signup order90 91 with gr.Row():92 name_in = gr.Textbox(label="Name", placeholder="e.g., Anna")93 age_in = gr.Textbox(label="Age", placeholder="e.g., 29")94 95 with gr.Row():96 add_btn = gr.Button("Join Queue", variant="primary")97 serve_btn = gr.Button("Serve Next")98 reset_btn = gr.Button("Reset Queue")99 100 status = gr.Markdown("Ready.")101 queue_view = gr.Markdown(_render([]))102 103 add_btn.click(104 add_to_queue,105 inputs=[name_in, age_in, queue_state, seq_state],106 outputs=[queue_state, seq_state, queue_view, status, name_in, age_in],107 )108 109 # Enter key on either field submits110 name_in.submit(111 add_to_queue,112 inputs=[name_in, age_in, queue_state, seq_state],113 outputs=[queue_state, seq_state, queue_view, status, name_in, age_in],114 )115 age_in.submit(116 add_to_queue,117 inputs=[name_in, age_in, queue_state, seq_state],118 outputs=[queue_state, seq_state, queue_view, status, name_in, age_in],119 )120 121 serve_btn.click(122 serve_next,123 inputs=[queue_state],124 outputs=[queue_state, queue_view, status],125 )126 127 reset_btn.click(128 reset_queue,129 inputs=[],130 outputs=[queue_state, seq_state, queue_view, status, name_in, age_in],131 )132 133if __name__ == "__main__":134 demo.launch()135 