Fix dependabot directories and admin weekend shift handling

Dependabot now scans per-function requirement directories instead
of the repo root. Admin override/open/clear commands accept an
optional day/night parameter for weekend day shift management.
This commit is contained in:
Adam Moussa 2026-05-12 17:01:41 -04:00
parent 69220afb9a
commit 745f8cd31e
2 changed files with 38 additions and 17 deletions

View file

@ -1,7 +1,12 @@
version: 2 version: 2
updates: updates:
- package-ecosystem: "pip" - package-ecosystem: "pip"
directory: "/" directories:
- "/src/slack-bot"
- "/src/weekly-post"
- "/src/roster-sync"
- "/src/ring-scheduler"
- "/src/shared"
schedule: schedule:
interval: "weekly" interval: "weekly"
assignees: assignees:

View file

@ -594,9 +594,9 @@ def create_app(
respond( respond(
text=( text=(
"*Admin Commands:*\n" "*Admin Commands:*\n"
"`admin override <date> <ext>` — Assign shift\n" "`admin override <date> <ext> [day|night]` — Assign shift\n"
"`admin open <date>` — Mark open\n" "`admin open <date> [day|night]` — Mark open\n"
"`admin clear <date>` — Remove override\n" "`admin clear <date> [day|night]` — Remove override\n"
"`admin roster add <ext> <name>` — Add employee\n" "`admin roster add <ext> <name>` — Add employee\n"
"`admin roster remove <ext>` — Remove employee\n" "`admin roster remove <ext>` — Remove employee\n"
"`admin roster rename <ext> <name>` — Rename" "`admin roster rename <ext> <name>` — Rename"
@ -608,59 +608,75 @@ def create_app(
if subcmd == "override": if subcmd == "override":
if len(parts) < 4: if len(parts) < 4:
respond(text="Usage: `/oncall admin override <date> <extension>`") respond(
text="Usage: `/oncall admin override <date> <extension> [day|night]`"
)
return return
date = parse_date(parts[2]) date = parse_date(parts[2])
if not date: if not date:
respond(text=f"Couldn't parse date: `{parts[2]}`") respond(text=f"Couldn't parse date: `{parts[2]}`")
return return
ext = parts[3] ext = parts[3]
shift_type = (
parts[4] if len(parts) > 4 and parts[4] in ("day", "night") else "night"
)
employee = schedule.get_employee_by_extension(ext) employee = schedule.get_employee_by_extension(ext)
if not employee: if not employee:
respond(text=f"Extension `{ext}` not found in the roster.") respond(text=f"Extension `{ext}` not found in the roster.")
return return
date_str = date.strftime("%Y-%m-%d") date_str = date.strftime("%Y-%m-%d")
schedule.set_override(date_str, employee["extension"], employee["name"]) schedule.set_override(
if is_today(date_str) and _is_active_shift_type("night"): date_str, employee["extension"], employee["name"], shift_type
)
if is_today(date_str) and _is_active_shift_type(shift_type):
_update_3cx_routing(employee["extension"]) _update_3cx_routing(employee["extension"])
label = "Day" if shift_type == "day" else "Night"
respond( respond(
text=f"Override set: *{date.strftime('%A, %b %-d')}* → {employee['name']} (Ext {ext})" text=f"Override set: *{date.strftime('%A, %b %-d')}* ({label}) → {employee['name']} (Ext {ext})"
) )
_refresh_schedule_post(client) _refresh_schedule_post(client)
elif subcmd == "open": elif subcmd == "open":
if len(parts) < 3: if len(parts) < 3:
respond(text="Usage: `/oncall admin open <date>`") respond(text="Usage: `/oncall admin open <date> [day|night]`")
return return
date = parse_date(parts[2]) date = parse_date(parts[2])
if not date: if not date:
respond(text=f"Couldn't parse date: `{parts[2]}`") respond(text=f"Couldn't parse date: `{parts[2]}`")
return return
shift_type = (
parts[3] if len(parts) > 3 and parts[3] in ("day", "night") else "night"
)
date_str = date.strftime("%Y-%m-%d") date_str = date.strftime("%Y-%m-%d")
schedule.mark_open(date_str) schedule.mark_open(date_str, shift_type)
if is_today(date_str) and _is_active_shift_type("night"): if is_today(date_str) and _is_active_shift_type(shift_type):
_update_3cx_routing(FALLBACK_EXTENSION) _update_3cx_routing(FALLBACK_EXTENSION)
respond(text=f"*{date.strftime('%A, %b %-d')}* marked as open.") label = "Day" if shift_type == "day" else "Night"
respond(text=f"*{date.strftime('%A, %b %-d')}* ({label}) marked as open.")
_refresh_schedule_post(client) _refresh_schedule_post(client)
elif subcmd == "clear": elif subcmd == "clear":
if len(parts) < 3: if len(parts) < 3:
respond(text="Usage: `/oncall admin clear <date>`") respond(text="Usage: `/oncall admin clear <date> [day|night]`")
return return
date = parse_date(parts[2]) date = parse_date(parts[2])
if not date: if not date:
respond(text=f"Couldn't parse date: `{parts[2]}`") respond(text=f"Couldn't parse date: `{parts[2]}`")
return return
shift_type = (
parts[3] if len(parts) > 3 and parts[3] in ("day", "night") else "night"
)
date_str = date.strftime("%Y-%m-%d") date_str = date.strftime("%Y-%m-%d")
schedule.remove_override(date_str) schedule.remove_override(date_str, shift_type)
if is_today(date_str) and _is_active_shift_type("night"): if is_today(date_str) and _is_active_shift_type(shift_type):
day_name = date.strftime("%A") day_name = date.strftime("%A")
ext, _name, _source = schedule.resolve_shift( ext, _name, _source = schedule.resolve_shift(
date_str, day_name, "night" date_str, day_name, shift_type
) )
_update_3cx_routing(ext) _update_3cx_routing(ext)
label = "Day" if shift_type == "day" else "Night"
respond( respond(
text=f"Override cleared for *{date.strftime('%A, %b %-d')}* — reverted to weekly schedule." text=f"Override cleared for *{date.strftime('%A, %b %-d')}* ({label}) — reverted to weekly schedule."
) )
_refresh_schedule_post(client) _refresh_schedule_post(client)