mirror of
https://github.com/Sea-Haven-Industries/ring-scheduler-3cx.git
synced 2026-05-18 20:20:12 +00:00
Merge pull request #1 from Sea-Haven-Industries/feature/dynamodb-shift-integration
Add DynamoDB integration for Slack shift manager
This commit is contained in:
commit
9143c93386
2 changed files with 66 additions and 4 deletions
|
|
@ -41,21 +41,73 @@ def get_3cx_credentials() -> dict:
|
|||
return creds
|
||||
|
||||
|
||||
def check_dynamodb_override(date_str: str, day_name: str) -> str | None:
|
||||
"""Check the afterhours-shifts DynamoDB table for a Slack-driven override.
|
||||
|
||||
Returns the extension if an override exists, None otherwise.
|
||||
Only active when SHIFT_TABLE env var is set.
|
||||
"""
|
||||
table_name = os.environ.get("SHIFT_TABLE")
|
||||
if not table_name:
|
||||
return None
|
||||
|
||||
dynamodb = boto3.resource("dynamodb")
|
||||
table = dynamodb.Table(table_name)
|
||||
|
||||
# Check date-specific override first
|
||||
resp = table.get_item(Key={"PK": "OVERRIDE", "SK": date_str})
|
||||
item = resp.get("Item")
|
||||
if item:
|
||||
ext = item["extension"]
|
||||
if ext == "OPEN":
|
||||
# Open shift with no pickup — use fallback from DynamoDB config or default 100
|
||||
config_resp = table.get_item(Key={"PK": "CONFIG", "SK": "CONFIG"})
|
||||
fallback = config_resp.get("Item", {}).get("fallback_extension", "100")
|
||||
logger.info("DynamoDB override for %s: OPEN — using fallback Ext %s", date_str, fallback)
|
||||
return fallback
|
||||
logger.info("DynamoDB override for %s: Ext %s", date_str, ext)
|
||||
return ext
|
||||
|
||||
# Check DynamoDB weekly schedule (takes precedence over YAML when SHIFT_TABLE is set)
|
||||
resp = table.get_item(Key={"PK": "WEEKLY", "SK": day_name})
|
||||
item = resp.get("Item")
|
||||
if item:
|
||||
ext = item["extension"]
|
||||
logger.info("DynamoDB weekly schedule for %s (%s): Ext %s", date_str, day_name, ext)
|
||||
return ext
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def resolve_extension(schedule: dict, now: datetime) -> str:
|
||||
"""Determine which extension should handle after-hours calls today."""
|
||||
"""Determine which extension should handle after-hours calls today.
|
||||
|
||||
Resolution order:
|
||||
1. DynamoDB date override (Slack-driven pickup/drop)
|
||||
2. DynamoDB weekly schedule (if SHIFT_TABLE is set)
|
||||
3. YAML exception overrides
|
||||
4. YAML weekly schedule
|
||||
"""
|
||||
date_str = now.strftime("%Y-%m-%d")
|
||||
day_name = now.strftime("%A")
|
||||
|
||||
# Check DynamoDB first (Slack shift manager)
|
||||
dynamo_ext = check_dynamodb_override(date_str, day_name)
|
||||
if dynamo_ext is not None:
|
||||
return dynamo_ext
|
||||
|
||||
# Fall back to YAML config
|
||||
exceptions = schedule.get("exceptions") or {}
|
||||
if date_str in exceptions:
|
||||
ext = str(exceptions[date_str])
|
||||
logger.info("Using exception override for %s: Ext %s", date_str, ext)
|
||||
logger.info("Using YAML exception override for %s: Ext %s", date_str, ext)
|
||||
return ext
|
||||
|
||||
day_name = now.strftime("%A")
|
||||
weekly = schedule["weekly_schedule"]
|
||||
if day_name not in weekly:
|
||||
raise ValueError(f"No schedule entry for {day_name}")
|
||||
ext = str(weekly[day_name])
|
||||
logger.info("Using weekly schedule for %s (%s): Ext %s", date_str, day_name, ext)
|
||||
logger.info("Using YAML weekly schedule for %s (%s): Ext %s", date_str, day_name, ext)
|
||||
return ext
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,10 @@ Parameters:
|
|||
Timezone:
|
||||
Type: String
|
||||
Default: "America/New_York"
|
||||
ShiftTableName:
|
||||
Type: String
|
||||
Default: "afterhours-shifts"
|
||||
Description: DynamoDB table for Slack shift manager overrides
|
||||
|
||||
Globals:
|
||||
Function:
|
||||
|
|
@ -24,6 +28,7 @@ Resources:
|
|||
Variables:
|
||||
SSM_PREFIX: /3cx-scheduler
|
||||
TZ: !Ref Timezone
|
||||
SHIFT_TABLE: !Ref ShiftTableName
|
||||
Policies:
|
||||
- Statement:
|
||||
- Effect: Allow
|
||||
|
|
@ -41,6 +46,11 @@ Resources:
|
|||
Condition:
|
||||
StringEquals:
|
||||
"kms:ViaService": !Sub "ssm.${AWS::Region}.amazonaws.com"
|
||||
- Effect: Allow
|
||||
Action:
|
||||
- dynamodb:GetItem
|
||||
Resource:
|
||||
- !Sub "arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${ShiftTableName}"
|
||||
Events:
|
||||
# EST: 8am ET = 13:00 UTC (Nov-Mar)
|
||||
DailyScheduleEST:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue