CLAUDE: Fix draft channel configuration not persisting
Root cause: Field naming mismatch between bot model and database schema. The database stores channel IDs in columns named 'result_channel' and 'ping_channel', but the bot's DraftData model incorrectly used 'result_channel_id' and 'ping_channel_id'. Additionally, the draft data PATCH endpoint requires query parameters instead of JSON body (like player, game, transaction, and injury endpoints). Changes: - models/draft_data.py: Renamed fields to match database schema - result_channel_id → result_channel - ping_channel_id → ping_channel - services/draft_service.py: Added use_query_params=True to PATCH calls - views/draft_views.py: Updated embed to use correct field names - tasks/draft_monitor.py: Updated channel lookups to use correct field names - tests/test_models.py: Updated test assertions to match new field names This fixes: - Channel configuration now saves correctly via /draft-admin channels - Ping channel settings persist across bot restarts - Result channel settings persist across bot restarts - All draft data updates work properly 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
005c031062
commit
7370fa7006
@ -16,14 +16,14 @@ class DraftData(SBABaseModel):
|
||||
currentpick: int = Field(0, description="Current pick number in progress")
|
||||
timer: bool = Field(False, description="Whether draft timer is active")
|
||||
pick_deadline: Optional[datetime] = Field(None, description="Deadline for current pick")
|
||||
result_channel_id: Optional[int] = Field(None, description="Discord channel ID for draft results")
|
||||
ping_channel_id: Optional[int] = Field(None, description="Discord channel ID for draft pings")
|
||||
result_channel: Optional[int] = Field(None, description="Discord channel ID for draft results")
|
||||
ping_channel: Optional[int] = Field(None, description="Discord channel ID for draft pings")
|
||||
pick_minutes: int = Field(1, description="Minutes allowed per pick")
|
||||
|
||||
@field_validator("result_channel_id", "ping_channel_id", mode="before")
|
||||
|
||||
@field_validator("result_channel", "ping_channel", mode="before")
|
||||
@classmethod
|
||||
def cast_channel_ids_to_int(cls, v):
|
||||
"""Ensure channel IDs are integers."""
|
||||
"""Ensure channel IDs are integers (database stores as string)."""
|
||||
if v is None:
|
||||
return None
|
||||
if isinstance(v, str):
|
||||
|
||||
@ -78,7 +78,8 @@ class DraftService(BaseService[DraftData]):
|
||||
Updated DraftData instance or None if update failed
|
||||
"""
|
||||
try:
|
||||
updated = await self.patch(draft_id, updates)
|
||||
# Draft data API expects query parameters for PATCH requests
|
||||
updated = await self.patch(draft_id, updates, use_query_params=True)
|
||||
|
||||
if updated:
|
||||
logger.info(f"Updated draft data: {updates}")
|
||||
@ -277,9 +278,9 @@ class DraftService(BaseService[DraftData]):
|
||||
try:
|
||||
updates = {}
|
||||
if ping_channel_id is not None:
|
||||
updates['ping_channel_id'] = ping_channel_id
|
||||
updates['ping_channel'] = ping_channel_id
|
||||
if result_channel_id is not None:
|
||||
updates['result_channel_id'] = result_channel_id
|
||||
updates['result_channel'] = result_channel_id
|
||||
|
||||
if not updates:
|
||||
logger.warning("No channel updates provided")
|
||||
|
||||
@ -162,9 +162,9 @@ class DraftMonitorTask:
|
||||
config = get_config()
|
||||
|
||||
# Get ping channel
|
||||
ping_channel = guild.get_channel(draft_data.ping_channel_id)
|
||||
ping_channel = guild.get_channel(draft_data.ping_channel)
|
||||
if not ping_channel:
|
||||
self.logger.error(f"Could not find ping channel {draft_data.ping_channel_id}")
|
||||
self.logger.error(f"Could not find ping channel {draft_data.ping_channel}")
|
||||
return
|
||||
|
||||
# Get team's draft list
|
||||
@ -309,7 +309,7 @@ class DraftMonitorTask:
|
||||
if not guild:
|
||||
return
|
||||
|
||||
ping_channel = guild.get_channel(draft_data.ping_channel_id)
|
||||
ping_channel = guild.get_channel(draft_data.ping_channel)
|
||||
if not ping_channel:
|
||||
return
|
||||
|
||||
|
||||
@ -373,33 +373,33 @@ class TestDraftDataModel:
|
||||
def test_draft_data_creation(self):
|
||||
"""Test draft data creation."""
|
||||
draft_data = DraftData(
|
||||
result_channel_id=123456789,
|
||||
ping_channel_id=987654321,
|
||||
result_channel=123456789,
|
||||
ping_channel=987654321,
|
||||
pick_minutes=10
|
||||
)
|
||||
|
||||
assert draft_data.result_channel_id == 123456789
|
||||
assert draft_data.ping_channel_id == 987654321
|
||||
|
||||
assert draft_data.result_channel == 123456789
|
||||
assert draft_data.ping_channel == 987654321
|
||||
assert draft_data.pick_minutes == 10
|
||||
|
||||
|
||||
def test_draft_data_properties(self):
|
||||
"""Test draft data properties."""
|
||||
# Inactive draft
|
||||
draft_data = DraftData(
|
||||
result_channel_id=123,
|
||||
ping_channel_id=456,
|
||||
result_channel=123,
|
||||
ping_channel=456,
|
||||
timer=False
|
||||
)
|
||||
|
||||
|
||||
assert draft_data.is_draft_active is False
|
||||
|
||||
|
||||
# Active draft
|
||||
active_draft = DraftData(
|
||||
result_channel_id=123,
|
||||
ping_channel_id=456,
|
||||
result_channel=123,
|
||||
ping_channel=456,
|
||||
timer=True
|
||||
)
|
||||
|
||||
|
||||
assert active_draft.is_draft_active is True
|
||||
|
||||
|
||||
|
||||
@ -429,14 +429,14 @@ async def create_admin_draft_info_embed(
|
||||
)
|
||||
|
||||
# Channels
|
||||
ping_channel_value = f"<#{draft_data.ping_channel_id}>" if draft_data.ping_channel_id else "Not configured"
|
||||
ping_channel_value = f"<#{draft_data.ping_channel}>" if draft_data.ping_channel else "Not configured"
|
||||
embed.add_field(
|
||||
name="Ping Channel",
|
||||
value=ping_channel_value,
|
||||
inline=True
|
||||
)
|
||||
|
||||
result_channel_value = f"<#{draft_data.result_channel_id}>" if draft_data.result_channel_id else "Not configured"
|
||||
result_channel_value = f"<#{draft_data.result_channel}>" if draft_data.result_channel else "Not configured"
|
||||
embed.add_field(
|
||||
name="Result Channel",
|
||||
value=result_channel_value,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user