from __future__ import annotations from typing import Any, Optional from pydantic import BaseModel, Field class SettingsUpdatePayload(BaseModel): gitlab_url: Optional[str] = None gitlab_token: Optional[str] = None gitlab_project_path: Optional[str] = None gitlab_board_id: Optional[int] = None gitlab_board_labels: Optional[str] = None gitlab_milestone_title: Optional[str] = None pts_url: Optional[str] = None pts_project_name: Optional[str] = None pts_default_task_name: Optional[str] = None pts_username: Optional[str] = None pts_password: Optional[str] = None auto_fill_enabled: Optional[bool] = None auto_fill_hour: Optional[int] = Field(default=None, ge=0, le=23) auto_fill_minute: Optional[int] = Field(default=None, ge=0, le=59) max_hours_per_day: Optional[float] = Field(default=None, gt=0, le=24) hour_step: Optional[float] = Field(default=None, gt=0, le=8) xai_api_key: Optional[str] = None xai_base_url: Optional[str] = None grok_model: Optional[str] = None use_llm: Optional[bool] = None use_description_variation: Optional[bool] = None teams_calendar_enabled: Optional[bool] = None teams_username: Optional[str] = None teams_password: Optional[str] = None teams_calendar_timezone: Optional[str] = None teams_meeting_task_name: Optional[str] = None teams_headless: Optional[bool] = None teams_meeting_exclude_keywords: Optional[str] = None azure_client_id: Optional[str] = None azure_tenant_id: Optional[str] = None compbase_list_url: Optional[str] = None compbase_fill_url: Optional[str] = None compbase_username: Optional[str] = None compbase_password: Optional[str] = None compbase_default_days: Optional[int] = Field(default=None, ge=1, le=62) compbase_out_time_mode: Optional[str] = None def to_update_dict(self) -> dict[str, Any]: return {k: v for k, v in self.model_dump().items() if v is not None} class DatesFilePayload(BaseModel): content: str = ""