Alert time zula (#523)
* Refactor datetime fields to string format with ISO 8601 representation in Case and Alert models * Remove unnecessary license retrieval in replace_license_in_db function
taylor_socfortress committed
Oct 18, 2025 at 11:02 UTC
a22bbabf289ab5b84f74a0dc3b4a04bdefa0ac68
2 files changed
+37
-7
backend/app/incidents/schema/db_operations.py
+35
-6
@@ -317,11 +317,16 @@ class CaseCreate(BaseModel):
317
class LinkedCaseCreate(BaseModel):
318
case_name: str
319
case_description: str
320
- case_creation_time: datetime
320
+ case_creation_time: str
321
case_status: str
322
assigned_to: Optional[str] = None
323
id: int
324
325
+ @validator('case_creation_time', pre=True)
326
+ def format_case_creation_time(cls, v):
327
+ if isinstance(v, datetime):
328
+ return v.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
329
+ return v
330
331
class CaseCreateFromAlert(BaseModel):
332
alert_id: int
@@ -378,7 +383,13 @@ class CommentBase(BaseModel):
383
alert_id: int
384
id: int
385
comment: str
381
- created_at: datetime
386
+ created_at: str
387
+
388
+ @validator('created_at', pre=True)
389
+ def format_created_at(cls, v):
390
+ if isinstance(v, datetime):
391
+ return v.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
392
+ return v
393
394
395
class CaseCommentBase(BaseModel):
@@ -386,7 +397,13 @@ class CaseCommentBase(BaseModel):
397
case_id: int
398
id: int
399
comment: str
389
- created_at: datetime
400
+ created_at: str
401
+
402
+ @validator('created_at', pre=True)
403
+ def format_created_at(cls, v):
404
+ if isinstance(v, datetime):
405
+ return v.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
406
+ return v
407
408
409
class AssetBase(BaseModel):
@@ -410,8 +427,8 @@ class IoCBase(BaseModel):
427
428
class AlertOut(BaseModel):
429
id: int
413
- alert_creation_time: datetime
414
- time_closed: Optional[datetime] = None
430
+ alert_creation_time: str
431
+ time_closed: Optional[str] = None
432
alert_name: str
433
alert_description: str
434
status: str
@@ -425,6 +442,12 @@ class AlertOut(BaseModel):
442
linked_cases: List[LinkedCaseCreate] = []
443
iocs: List[IoCBase] = []
444
445
+ @validator('alert_creation_time', 'time_closed', pre=True)
446
+ def format_datetime(cls, v):
447
+ if isinstance(v, datetime):
448
+ return v.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
449
+ return v
450
+
451
452
class AlertOutResponse(BaseModel):
453
alerts: List[AlertOut]
@@ -444,12 +467,18 @@ class CaseOut(BaseModel):
467
assigned_to: Optional[str] = None
468
alerts: Optional[List[AlertOut]] = []
469
case_status: Optional[str] = None
447
- case_creation_time: Optional[datetime] = None
470
+ case_creation_time: Optional[str] = None
471
customer_code: Optional[str] = None
472
notification_invoked_number: Optional[int] = 0
473
escalated: bool = False
474
comments: List[CaseCommentBase] = []
475
476
+ @validator('case_creation_time', pre=True)
477
+ def format_case_creation_time(cls, v):
478
+ if isinstance(v, datetime):
479
+ return v.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
480
+ return v
481
+
482
483
class CaseOutResponse(BaseModel):
484
cases: List[CaseOut]
backend/app/middleware/license.py
+2
-1
@@ -1048,7 +1048,8 @@ async def get_license_features(session: AsyncSession = Depends(get_db)) -> GetLi
1048
description="Replace a license",
1049
)
1050
async def replace_license_in_db(request: ReplaceLicenseRequest, session: AsyncSession = Depends(get_db)):
1051
- license = await get_license(session)
1051
+ # ! Remove get_license becasue we don't need to fetch old license
1052
+ #license = await get_license(session)
1053
1054
# Invalidate cache for old license
1055
await invalidate_license_cache(session, license.license_key)