Skip to content

Commit 34b630e

Browse files
committed
fix: date-room saving bug
fixed & refactored datetime/datetime_ keys mismatch resolution in on_date_room_save_rightaway handle
1 parent 4c1701f commit 34b630e

2 files changed

Lines changed: 26 additions & 9 deletions

File tree

src/bot/dialogs/change_meeting/handles.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -293,17 +293,10 @@ async def on_date_room_save_rightaway(query: CallbackQuery, _, manager: DialogMa
293293
manager = extend_dialog(manager)
294294
async with manager.state.sync_meeting() as meeting:
295295
meeting_update = await manager.state.get_value("meeting_update", {})
296-
for key in meeting_update:
297-
attr, value = (key, meeting_update[key])
298-
if attr in ["datetime", "datetime_"]:
299-
attr = "datetime_"
300-
value = datetime.fromisoformat(value) if value else None
301-
setattr(meeting, attr, value)
296+
meeting.update_from_dict(meeting_update)
302297
await meeting_repo.update(meeting, attrs=["datetime", "room"])
303298
if meeting.status >= MeetingStatus.ANNOUNCED:
304-
meeting_update["datetime"] = meeting_update.get("datetime_") or meeting_update.get("datetime")
305-
del meeting_update["datetime_"]
306-
meeting_update_obj = MeetingUpdate(id=meeting.id, **meeting_update)
299+
meeting_update_obj = MeetingUpdate.from_dict(meeting.id, meeting_update)
307300
await notification_manager.send_meeting_update_rightaway(meeting, meeting_update_obj)
308301
await manager.state.update_data({"meeting_update": None})
309302

src/domain/models.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from datetime import datetime
22
from enum import IntEnum, StrEnum
3+
from typing import Any
34

45
from pydantic import BaseModel, EmailStr, Field, computed_field
56

@@ -95,6 +96,18 @@ class Meeting(BaseModel):
9596
datetime_: datetime | None = Field(None, alias="datetime")
9697
tutor_id: int | None = None
9798

99+
def update_from_dict(self, meeting_update: dict[str, Any]):
100+
"""Update Meeting using meeting_update dictionary
101+
102+
Handle "datetime", "datetime_" key mismatch
103+
"""
104+
for orig_key, orig_value in meeting_update.items():
105+
key, value = (orig_key, orig_value)
106+
if key in ["datetime", "datetime_"]:
107+
key = "datetime_"
108+
value = datetime.fromisoformat(value) if value else None
109+
setattr(self, key, value)
110+
98111
def assign_tutor(self, tutor: "Tutor"):
99112
self.tutor_id = tutor.id
100113

@@ -183,3 +196,14 @@ class MeetingUpdate(BaseModel):
183196
id: int
184197
room: str | None = None
185198
datetime_: datetime | None = Field(None, alias="datetime")
199+
200+
@staticmethod
201+
def from_dict(meeting_id: int, meeting_update: dict[str, Any]) -> "MeetingUpdate":
202+
"""Construct MeetingUpdate object from meeting_id and meeting_update dict
203+
204+
Handle "datetime", "datetime_" key mismatch
205+
"""
206+
meeting_update["datetime"] = meeting_update.get("datetime_") or meeting_update.get("datetime")
207+
if "datetime_" in meeting_update:
208+
del meeting_update["datetime_"]
209+
return MeetingUpdate(id=meeting_id, **meeting_update)

0 commit comments

Comments
 (0)