aartstudio commited on
Commit
7a03600
·
verified ·
1 Parent(s): 2f495f4

Upload 2 files

Browse files
Files changed (1) hide show
  1. app.py +124 -12
app.py CHANGED
@@ -1,24 +1,49 @@
1
 
 
2
  import gradio as gr
3
 
4
  MAX_QUEUE_SIZE = 3
5
 
 
 
 
 
 
 
6
  def add_to_queue(name, age, queue_state):
7
  if queue_state is None:
8
  queue_state = []
9
 
10
  if not name:
11
- return ("Please enter your name.", queue_state, queue_state)
 
 
 
 
 
 
12
 
13
  try:
14
  age = int(age)
15
  if age <= 0:
16
  raise ValueError
17
  except Exception:
18
- return ("Please enter a valid positive age.", queue_state, queue_state)
 
 
 
 
 
 
19
 
20
  if len(queue_state) >= MAX_QUEUE_SIZE:
21
- return ("Queue is full. Only 3 people are allowed.", queue_state, queue_state)
 
 
 
 
 
 
22
 
23
  queue_number = len(queue_state) + 1
24
  person = {
@@ -29,28 +54,92 @@ def add_to_queue(name, age, queue_state):
29
  queue_state.append(person)
30
 
31
  message = f"Welcome, {name}! Your queue number is {queue_number}."
32
- return message, queue_state, queue_state
 
 
 
 
 
 
 
 
33
 
34
  def reset_queue():
35
- return "Queue has been reset.", [], []
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
 
37
  with gr.Blocks() as demo:
38
- gr.Markdown("# Simple Queue System (First Come, First Served)")
39
- gr.Markdown("Enter your name and age. Only 3 people can join the queue.")
 
 
 
40
 
41
  queue_state = gr.State([])
 
42
 
43
  with gr.Row():
44
  name_input = gr.Textbox(label="Name")
45
  age_input = gr.Number(label="Age", precision=0)
46
 
47
- submit_btn = gr.Button("Join Queue")
48
- reset_btn = gr.Button("Reset Queue")
 
 
49
 
50
  status_output = gr.Textbox(label="Status", interactive=False)
 
 
51
  queue_table = gr.Dataframe(
52
  headers=["Queue No.", "Name", "Age"],
53
- label="Current Queue",
54
  datatype=["number", "str", "number"],
55
  wrap=True
56
  )
@@ -58,13 +147,36 @@ with gr.Blocks() as demo:
58
  submit_btn.click(
59
  fn=add_to_queue,
60
  inputs=[name_input, age_input, queue_state],
61
- outputs=[status_output, queue_state, queue_table]
 
 
 
 
 
 
62
  )
63
 
64
  reset_btn.click(
65
  fn=reset_queue,
66
  inputs=None,
67
- outputs=[status_output, queue_state, queue_table]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
  )
69
 
70
  if __name__ == "__main__":
 
1
 
2
+ import time
3
  import gradio as gr
4
 
5
  MAX_QUEUE_SIZE = 3
6
 
7
+ def get_sorted_queue(queue_state):
8
+ if queue_state is None:
9
+ return []
10
+ # Sort by age descending; if ages equal, keep original order by queue number
11
+ return sorted(queue_state, key=lambda p: (-p["Age"], p["Queue No."]))
12
+
13
  def add_to_queue(name, age, queue_state):
14
  if queue_state is None:
15
  queue_state = []
16
 
17
  if not name:
18
+ return (
19
+ "Please enter your name.",
20
+ queue_state,
21
+ get_sorted_queue(queue_state),
22
+ -1,
23
+ "Waiting for people to join the queue."
24
+ )
25
 
26
  try:
27
  age = int(age)
28
  if age <= 0:
29
  raise ValueError
30
  except Exception:
31
+ return (
32
+ "Please enter a valid positive age.",
33
+ queue_state,
34
+ get_sorted_queue(queue_state),
35
+ -1,
36
+ "Waiting for people to join the queue."
37
+ )
38
 
39
  if len(queue_state) >= MAX_QUEUE_SIZE:
40
+ return (
41
+ "Queue is full. Only 3 people are allowed.",
42
+ queue_state,
43
+ get_sorted_queue(queue_state),
44
+ -1,
45
+ "Queue is full. No more people can join."
46
+ )
47
 
48
  queue_number = len(queue_state) + 1
49
  person = {
 
54
  queue_state.append(person)
55
 
56
  message = f"Welcome, {name}! Your queue number is {queue_number}."
57
+ display_queue = get_sorted_queue(queue_state)
58
+
59
+ return (
60
+ message,
61
+ queue_state,
62
+ display_queue,
63
+ -1,
64
+ "Queue updated. Press 'Start / Next' to call the next person."
65
+ )
66
 
67
  def reset_queue():
68
+ return (
69
+ "Queue has been reset.",
70
+ [],
71
+ [],
72
+ -1,
73
+ "Waiting for people to join the queue."
74
+ )
75
+
76
+ def serve_next(queue_state, service_index):
77
+ if not queue_state:
78
+ return (
79
+ "No one in the queue yet.",
80
+ -1,
81
+ [],
82
+ "Waiting for people to join the queue."
83
+ )
84
+
85
+ display_queue = get_sorted_queue(queue_state)
86
+
87
+ if service_index is None or service_index < 0:
88
+ idx = 0
89
+ else:
90
+ idx = service_index + 1
91
+
92
+ if idx >= len(display_queue):
93
+ return (
94
+ "All people have been served.",
95
+ service_index,
96
+ display_queue,
97
+ "Queue completed."
98
+ )
99
+
100
+ person = display_queue[idx]
101
+
102
+ # Simulate a 10-second service time
103
+ time.sleep(10)
104
+
105
+ now_serving_msg = (
106
+ f"Now serving: Queue No. {person['Queue No.']} - "
107
+ f"{person['Name']} (Age {person['Age']})"
108
+ )
109
+ status_msg = "Next person has been called."
110
+
111
+ return (
112
+ now_serving_msg,
113
+ idx,
114
+ display_queue,
115
+ status_msg
116
+ )
117
 
118
  with gr.Blocks() as demo:
119
+ gr.Markdown("# Smart Queue System (Older First)")
120
+ gr.Markdown(
121
+ "Enter your name and age. Up to 3 people can join the queue. "
122
+ "Older people are served first. Each turn takes about 10 seconds."
123
+ )
124
 
125
  queue_state = gr.State([])
126
+ service_index = gr.State(-1)
127
 
128
  with gr.Row():
129
  name_input = gr.Textbox(label="Name")
130
  age_input = gr.Number(label="Age", precision=0)
131
 
132
+ with gr.Row():
133
+ submit_btn = gr.Button("Join Queue")
134
+ reset_btn = gr.Button("Reset Queue")
135
+ next_btn = gr.Button("Start / Next")
136
 
137
  status_output = gr.Textbox(label="Status", interactive=False)
138
+ now_serving_output = gr.Textbox(label="Now Serving", interactive=False)
139
+
140
  queue_table = gr.Dataframe(
141
  headers=["Queue No.", "Name", "Age"],
142
+ label="Current Queue (sorted, older first)",
143
  datatype=["number", "str", "number"],
144
  wrap=True
145
  )
 
147
  submit_btn.click(
148
  fn=add_to_queue,
149
  inputs=[name_input, age_input, queue_state],
150
+ outputs=[
151
+ status_output,
152
+ queue_state,
153
+ queue_table,
154
+ service_index,
155
+ now_serving_output
156
+ ]
157
  )
158
 
159
  reset_btn.click(
160
  fn=reset_queue,
161
  inputs=None,
162
+ outputs=[
163
+ status_output,
164
+ queue_state,
165
+ queue_table,
166
+ service_index,
167
+ now_serving_output
168
+ ]
169
+ )
170
+
171
+ next_btn.click(
172
+ fn=serve_next,
173
+ inputs=[queue_state, service_index],
174
+ outputs=[
175
+ now_serving_output,
176
+ service_index,
177
+ queue_table,
178
+ status_output
179
+ ]
180
  )
181
 
182
  if __name__ == "__main__":