Skip to content

Commit

Permalink
use CustomBaseModel on all endpoint models and make fields optional (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
CM000n authored Aug 27, 2024
1 parent 5310e09 commit ee72933
Show file tree
Hide file tree
Showing 13 changed files with 727 additions and 658 deletions.
77 changes: 40 additions & 37 deletions mytoyota/models/endpoints/account.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,56 +3,59 @@
from typing import List, Optional
from uuid import UUID

from pydantic import BaseModel, Field
from pydantic import Field

from mytoyota.models.endpoints.common import StatusModel
from mytoyota.utils.models import CustomBaseModel


class _TermsActivityModel(BaseModel):
time_stamp: datetime = Field(alias="timeStamp")
version: str
class _TermsActivityModel(CustomBaseModel):
time_stamp: Optional[datetime] = Field(alias="timeStamp")
version: Optional[str]


class _AdditionalAttributesModel(BaseModel):
is_terms_accepted: bool = Field(alias="isTermsAccepted")
terms_activity: List[_TermsActivityModel] = Field("termsActivity")
class _AdditionalAttributesModel(CustomBaseModel):
is_terms_accepted: Optional[bool] = Field(alias="isTermsAccepted")
terms_activity: Optional[List[_TermsActivityModel]] = Field("termsActivity")


class _EmailModel(BaseModel):
email_address: str = Field(alias="emailAddress")
email_type: str = Field(alias="emailType")
email_verified: bool = Field(alias="emailVerified")
verification_date: datetime = Field(alias="verificationDate")
class _EmailModel(CustomBaseModel):
email_address: Optional[str] = Field(alias="emailAddress")
email_type: Optional[str] = Field(alias="emailType")
email_verified: Optional[bool] = Field(alias="emailVerified")
verification_date: Optional[datetime] = Field(alias="verificationDate")


class _PhoneNumberModel(BaseModel):
country_code: int = Field(alias="countryCode")
phone_number: int = Field(alias="phoneNumber")
phone_verified: bool = Field(alias="phoneVerified")
verification_date: datetime = Field("verificationDate")
class _PhoneNumberModel(CustomBaseModel):
country_code: Optional[int] = Field(alias="countryCode")
phone_number: Optional[int] = Field(alias="phoneNumber")
phone_verified: Optional[bool] = Field(alias="phoneVerified")
verification_date: Optional[datetime] = Field("verificationDate")


class _CustomerModel(BaseModel):
account_status: str = Field(alias="accountStatus")
additional_attributes: _AdditionalAttributesModel = Field(alias="additionalAttributes")
create_date: datetime = Field(alias="createDate")
create_source: str = Field(alias="createSource")
customer_type: str = Field(alias="customerType")
emails: List[_EmailModel]
first_name: str = Field(alias="firstName")
forge_rock_id: UUID = Field(alias="forgerockId")
guid: UUID
is_cp_migrated: bool = Field(alias="isCpMigrated")
lastname: str = Field(alias="lastName")
last_update_date: datetime = Field("lastUpdateDate")
last_update_source: str = Field("lastUpdateSource")
phone_numbers: List[_PhoneNumberModel] = Field(alias="phoneNumbers")
preferred_language: str = Field(alias="preferredLanguage")
signup_type: str = Field(alias="signupType")
ui_language: str = Field(alias="uiLanguage")
class _CustomerModel(CustomBaseModel):
account_status: Optional[str] = Field(alias="accountStatus")
additional_attributes: Optional[_AdditionalAttributesModel] = Field(
alias="additionalAttributes"
)
create_date: Optional[datetime] = Field(alias="createDate")
create_source: Optional[str] = Field(alias="createSource")
customer_type: Optional[str] = Field(alias="customerType")
emails: Optional[List[_EmailModel]]
first_name: Optional[str] = Field(alias="firstName")
forge_rock_id: Optional[UUID] = Field(alias="forgerockId")
guid: Optional[UUID]
is_cp_migrated: Optional[bool] = Field(alias="isCpMigrated")
lastname: Optional[str] = Field(alias="lastName")
last_update_date: Optional[datetime] = Field("lastUpdateDate")
last_update_source: Optional[str] = Field("lastUpdateSource")
phone_numbers: Optional[List[_PhoneNumberModel]] = Field(alias="phoneNumbers")
preferred_language: Optional[str] = Field(alias="preferredLanguage")
signup_type: Optional[str] = Field(alias="signupType")
ui_language: Optional[str] = Field(alias="uiLanguage")


class AccountModel(BaseModel):
class AccountModel(CustomBaseModel):
"""Model representing an account.
Attributes
Expand All @@ -61,7 +64,7 @@ class AccountModel(BaseModel):
"""

customer: _CustomerModel
customer: Optional[_CustomerModel]


class AccountResponseModel(StatusModel):
Expand Down
22 changes: 12 additions & 10 deletions mytoyota/models/endpoints/common.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
"""Toyota Connected Services API - Common Endpoint Models."""
from typing import List, Optional, Union

from pydantic import BaseModel, Field
from pydantic import Field

from mytoyota.utils.models import CustomBaseModel

class UnitValueModel(BaseModel):

class UnitValueModel(CustomBaseModel):
"""Model representing a unit and a value.
Can be reused several times within other models.
Expand All @@ -20,17 +22,17 @@ class UnitValueModel(BaseModel):
value: Optional[float] = None


class _MessageModel(BaseModel):
description: str
class _MessageModel(CustomBaseModel):
description: Optional[str]
detailed_description: Optional[str] = Field(alias="detailedDescription", default=None)
response_code: str = Field(alias="responseCode")
response_code: Optional[str] = Field(alias="responseCode")


class _MessagesModel(BaseModel):
messages: List[_MessageModel]
class _MessagesModel(CustomBaseModel):
messages: Optional[List[_MessageModel]]


class StatusModel(BaseModel):
class StatusModel(CustomBaseModel):
"""Model representing the status of an endpoint.
Attributes
Expand All @@ -43,7 +45,7 @@ class StatusModel(BaseModel):
"""

status: Union[str, _MessagesModel]
status: Optional[Union[str, _MessagesModel]]
code: Optional[int] = None
errors: Optional[List] = []
errors: Optional[List] = None
message: Optional[str] = None
11 changes: 6 additions & 5 deletions mytoyota/models/endpoints/electric.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@
from datetime import datetime
from typing import Optional

from pydantic import BaseModel, Field
from pydantic import Field

from mytoyota.models.endpoints.common import StatusModel, UnitValueModel
from mytoyota.utils.models import CustomBaseModel


class ElectricStatusModel(BaseModel):
class ElectricStatusModel(CustomBaseModel):
r"""Model representing the status of an electric vehicle.
Attributes
Expand All @@ -25,16 +26,16 @@ class ElectricStatusModel(BaseModel):
"""

battery_level: int = Field(alias="batteryLevel")
battery_level: Optional[int] = Field(alias="batteryLevel")
can_set_next_charging_event: Optional[bool] = Field(
alias="canSetNextChargingEvent", default=None
)
charging_status: str = Field(alias="chargingStatus")
charging_status: Optional[str] = Field(alias="chargingStatus")
ev_range: Optional[UnitValueModel] = Field(alias="evRange")
ev_range_with_ac: Optional[UnitValueModel] = Field(alias="evRangeWithAc")
fuel_level: Optional[int] = Field(alias="fuelLevel", default=None)
fuel_range: Optional[UnitValueModel] = Field(alias="fuelRange", default=None)
last_update_timestamp: datetime = Field(alias="lastUpdateTimestamp")
last_update_timestamp: Optional[datetime] = Field(alias="lastUpdateTimestamp")
remaining_charge_time: Optional[int] = Field(
alias="remainingChargeTime",
default=None,
Expand Down
15 changes: 8 additions & 7 deletions mytoyota/models/endpoints/location.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,20 @@
from datetime import datetime
from typing import Optional

from pydantic import BaseModel, Field
from pydantic import Field

from mytoyota.models.endpoints.common import StatusModel
from mytoyota.utils.models import CustomBaseModel


class _VehicleLocationModel(BaseModel):
display_name: str = Field(alias="displayName")
latitude: float
location_acquisition_datetime: datetime = Field(alias="locationAcquisitionDatetime")
longitude: float
class _VehicleLocationModel(CustomBaseModel):
display_name: Optional[str] = Field(alias="displayName")
latitude: Optional[float]
location_acquisition_datetime: Optional[datetime] = Field(alias="locationAcquisitionDatetime")
longitude: Optional[float]


class LocationModel(BaseModel):
class LocationModel(CustomBaseModel):
r"""Model representing the location of a vehicle.
Attributes
Expand Down
44 changes: 23 additions & 21 deletions mytoyota/models/endpoints/notifications.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,16 @@
from typing import List, Optional, Union
from uuid import UUID

from pydantic import BaseModel, Field
from pydantic import Field

from mytoyota.utils.models import CustomBaseModel

class _HeadersModel(BaseModel):
content_type: str = Field(..., alias="Content-Type")

class _HeadersModel(CustomBaseModel):
content_type: Optional[str] = Field(..., alias="Content-Type")

class NotificationModel(BaseModel):

class NotificationModel(CustomBaseModel):
"""Model representing a notification.
Attributes
Expand All @@ -29,25 +31,25 @@ class NotificationModel(BaseModel):
"""

message_id: str = Field(alias="messageId")
vin: str
notification_date: datetime = Field(alias="notificationDate")
is_read: bool = Field(alias="isRead")
message_id: Optional[str] = Field(alias="messageId")
vin: Optional[str]
notification_date: Optional[datetime] = Field(alias="notificationDate")
is_read: Optional[bool] = Field(alias="isRead")
read_timestamp: Optional[datetime] = Field(alias="readTimestamp", default=None)
icon_url: str = Field(alias="iconUrl")
message: str
icon_url: Optional[str] = Field(alias="iconUrl")
message: Optional[str]
status: Optional[Union[int, str]] = None
type: str
category: str
display_category: str = Field(alias="displayCategory")
type: Optional[str]
category: Optional[str]
display_category: Optional[str] = Field(alias="displayCategory")


class _PayloadItemModel(BaseModel):
vin: str = None
notifications: List[NotificationModel]
class _PayloadItemModel(CustomBaseModel):
vin: Optional[str] = None
notifications: Optional[List[NotificationModel]]


class NotificationResponseModel(BaseModel):
class NotificationResponseModel(CustomBaseModel):
r"""Model representing a notification response.
Attributes
Expand All @@ -61,8 +63,8 @@ class NotificationResponseModel(BaseModel):
"""

guid: UUID = None
status_code: int = Field(alias="statusCode")
headers: _HeadersModel
body: str
guid: Optional[UUID] = None
status_code: Optional[int] = Field(alias="statusCode")
headers: Optional[_HeadersModel]
body: Optional[str]
payload: Optional[List[_PayloadItemModel]] = None
19 changes: 10 additions & 9 deletions mytoyota/models/endpoints/service_history.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@
from datetime import date
from typing import Any, List, Optional

from pydantic import BaseModel, Field
from pydantic import Field

from mytoyota.models.endpoints.common import StatusModel
from mytoyota.utils.models import CustomBaseModel


class ServiceHistoryModel(BaseModel):
class ServiceHistoryModel(CustomBaseModel):
"""Represents a service history record.
Attributes
Expand All @@ -27,20 +28,20 @@ class ServiceHistoryModel(BaseModel):
"""

customer_created_record: bool = Field(alias="customerCreatedRecord")
customer_created_record: Optional[bool] = Field(alias="customerCreatedRecord")
mileage: Optional[int] = None
notes: Any
operations_performed: Any = Field(alias="operationsPerformed")
ro_number: Any = Field(alias="roNumber")
service_category: str = Field(alias="serviceCategory")
service_date: date = Field(alias="serviceDate")
service_history_id: str = Field(alias="serviceHistoryId")
service_provider: str = Field(alias="serviceProvider")
service_category: Optional[str] = Field(alias="serviceCategory")
service_date: Optional[date] = Field(alias="serviceDate")
service_history_id: Optional[str] = Field(alias="serviceHistoryId")
service_provider: Optional[str] = Field(alias="serviceProvider")
servicing_dealer: Any = Field(alias="servicingDealer")
unit: Optional[str] = None


class ServiceHistoriesModel(BaseModel):
class ServiceHistoriesModel(CustomBaseModel):
r"""Model representing a list of service histories.
Attributes
Expand All @@ -50,7 +51,7 @@ class ServiceHistoriesModel(BaseModel):
"""

service_histories: List[Optional[ServiceHistoryModel]] = Field(
service_histories: Optional[List[Optional[ServiceHistoryModel]]] = Field(
alias="serviceHistories", default=[]
)

Expand Down
Loading

0 comments on commit ee72933

Please sign in to comment.