Vaishvik1618 commited on
Commit
929836c
·
verified ·
1 Parent(s): e08d1d9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +66 -41
app.py CHANGED
@@ -1,5 +1,7 @@
1
  import gradio as gr
2
  import random
 
 
3
 
4
  DAYS = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Saturday', 'Sunday']
5
  DEFAULT_DISHES = [
@@ -29,47 +31,69 @@ class SevakManager:
29
  self.dishes = [dish.strip() for dish in dish_list.split(',') if dish.strip()]
30
  return f"Dishes updated. Total dishes: {len(self.dishes)}"
31
 
32
- def generate_schedule(self):
33
- cooking_schedule = {}
34
- cleaning_schedule = {}
35
-
36
  cooks = [s for s in self.sevaks if s['duty'] in ['Cooking', 'Both']]
37
  cleaners = [s for s in self.sevaks if s['duty'] in ['Cleaning', 'Both']]
38
 
39
- for day in DAYS:
40
- required_cooks = self.required_per_day[day]['Cooking']
41
- required_cleaners = self.required_per_day[day]['Cleaning']
42
-
43
- available_cooks = [s for s in cooks if day in s['availability']]
44
- available_cleaners = [s for s in cleaners if day in s['availability']]
45
-
46
- cooking_assigned = random.sample(available_cooks, min(required_cooks, len(available_cooks)))
47
- cleaning_assigned = random.sample(available_cleaners, min(required_cleaners, len(available_cleaners)))
48
-
49
- cooking_schedule[day] = [
50
- f"{s['name']} ({random.choice(self.dishes)})" for s in cooking_assigned
51
- ] if cooking_assigned else ["No cooks available"]
52
-
53
- cleaning_schedule[day] = [
54
- s['name'] for s in cleaning_assigned
55
- ] if cleaning_assigned else ["No cleaners available"]
56
-
57
- html = """
58
- <h2>Weekly Chores Schedule</h2>
59
- <table border='1' style='width: 100%; border-collapse: collapse;'>
60
- <thead>
61
- <tr>
62
- <th>Day</th>
63
- <th>Cooking</th>
64
- <th>Cleaning</th>
65
- </tr>
66
- </thead>
67
- <tbody>
68
- """
69
- for day in DAYS:
70
- html += f"<tr><td>{day}</td><td>{'<br>'.join(cooking_schedule[day])}</td><td>{'<br>'.join(cleaning_schedule[day])}</td></tr>"
71
- html += "</tbody></table><p><i>Note: Friday is excluded.</i></p>"
72
- return html
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
 
74
  manager = SevakManager()
75
 
@@ -89,8 +113,8 @@ def update_required_per_day(*sliders):
89
  manager.set_total_required(update_dict)
90
  return "Per-day assignment numbers updated."
91
 
92
- def generate_schedule_ui():
93
- return manager.generate_schedule()
94
 
95
  def get_current_sevaks():
96
  if not manager.sevaks:
@@ -121,6 +145,7 @@ with gr.Blocks() as app:
121
  update_day_req_btn = gr.Button("Update Daily Requirements")
122
  daily_req_status = gr.Markdown()
123
 
 
124
  schedule_btn = gr.Button("Generate Schedule")
125
  schedule_html = gr.HTML()
126
 
@@ -128,7 +153,7 @@ with gr.Blocks() as app:
128
  add_btn.click(get_current_sevaks, outputs=sevak_list_html)
129
  update_dishes_btn.click(update_dishes_ui, inputs=dish_input, outputs=dish_status)
130
  update_day_req_btn.click(update_required_per_day, inputs=cooking_counts + cleaning_counts, outputs=daily_req_status)
131
- schedule_btn.click(generate_schedule_ui, outputs=schedule_html)
132
 
133
  if __name__ == "__main__":
134
  app.launch()
 
1
  import gradio as gr
2
  import random
3
+ import numpy as np
4
+ from datetime import datetime, timedelta
5
 
6
  DAYS = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Saturday', 'Sunday']
7
  DEFAULT_DISHES = [
 
31
  self.dishes = [dish.strip() for dish in dish_list.split(',') if dish.strip()]
32
  return f"Dishes updated. Total dishes: {len(self.dishes)}"
33
 
34
+ def generate_schedule(self, weeks=1):
 
 
 
35
  cooks = [s for s in self.sevaks if s['duty'] in ['Cooking', 'Both']]
36
  cleaners = [s for s in self.sevaks if s['duty'] in ['Cleaning', 'Both']]
37
 
38
+ cook_counts = {s['name']: 0 for s in cooks}
39
+ clean_counts = {s['name']: 0 for s in cleaners}
40
+
41
+ all_weeks_html = ""
42
+ today = datetime.today()
43
+
44
+ for week in range(weeks):
45
+ cooking_schedule = {}
46
+ cleaning_schedule = {}
47
+
48
+ week_start = today + timedelta(days=(week * 7))
49
+ week_days = [(week_start + timedelta(days=i)) for i in range(7) if (week_start + timedelta(days=i)).strftime('%A') != 'Friday']
50
+
51
+ for day_date in week_days:
52
+ day = day_date.strftime('%A')
53
+ day_str = day_date.strftime('%b %d, %Y')
54
+ required_cooks = self.required_per_day[day]['Cooking']
55
+ required_cleaners = self.required_per_day[day]['Cleaning']
56
+
57
+ available_cooks = [s for s in cooks if day in s['availability']]
58
+ available_cleaners = [s for s in cleaners if day in s['availability']]
59
+
60
+ if available_cooks:
61
+ sorted_cooks = sorted(available_cooks, key=lambda s: cook_counts[s['name']])
62
+ selected = sorted_cooks[:required_cooks]
63
+ for s in selected:
64
+ cook_counts[s['name']] += 1
65
+ cooking_schedule[day_str] = [f"{s['name']} ({random.choice(self.dishes)})" for s in selected]
66
+ else:
67
+ cooking_schedule[day_str] = ["No cooks available"]
68
+
69
+ if available_cleaners:
70
+ sorted_cleaners = sorted(available_cleaners, key=lambda s: clean_counts[s['name']])
71
+ selected = sorted_cleaners[:required_cleaners]
72
+ for s in selected:
73
+ clean_counts[s['name']] += 1
74
+ cleaning_schedule[day_str] = [s['name'] for s in selected]
75
+ else:
76
+ cleaning_schedule[day_str] = ["No cleaners available"]
77
+
78
+ html = f"""
79
+ <h2>Week {week + 1} ({week_days[0].strftime('%b %d')} - {week_days[-1].strftime('%b %d')})</h2>
80
+ <table border='1' style='width: 100%; border-collapse: collapse;'>
81
+ <thead>
82
+ <tr>
83
+ <th>Date</th>
84
+ <th>Cooking</th>
85
+ <th>Cleaning</th>
86
+ </tr>
87
+ </thead>
88
+ <tbody>
89
+ """
90
+ for date_str in cooking_schedule:
91
+ html += f"<tr><td>{date_str}</td><td>{'<br>'.join(cooking_schedule[date_str])}</td><td>{'<br>'.join(cleaning_schedule[date_str])}</td></tr>"
92
+ html += "</tbody></table><br>"
93
+ all_weeks_html += html
94
+
95
+ all_weeks_html += "<p><i>Note: Friday is excluded.</i></p>"
96
+ return all_weeks_html
97
 
98
  manager = SevakManager()
99
 
 
113
  manager.set_total_required(update_dict)
114
  return "Per-day assignment numbers updated."
115
 
116
+ def generate_schedule_ui(week_count):
117
+ return manager.generate_schedule(week_count)
118
 
119
  def get_current_sevaks():
120
  if not manager.sevaks:
 
145
  update_day_req_btn = gr.Button("Update Daily Requirements")
146
  daily_req_status = gr.Markdown()
147
 
148
+ week_slider = gr.Slider(1, 6, step=1, value=1, label="Number of Weeks")
149
  schedule_btn = gr.Button("Generate Schedule")
150
  schedule_html = gr.HTML()
151
 
 
153
  add_btn.click(get_current_sevaks, outputs=sevak_list_html)
154
  update_dishes_btn.click(update_dishes_ui, inputs=dish_input, outputs=dish_status)
155
  update_day_req_btn.click(update_required_per_day, inputs=cooking_counts + cleaning_counts, outputs=daily_req_status)
156
+ schedule_btn.click(generate_schedule_ui, inputs=week_slider, outputs=schedule_html)
157
 
158
  if __name__ == "__main__":
159
  app.launch()