Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use CustomBaseModel on all endpoint models and make fields Optional #365

Merged
merged 1 commit into from
Aug 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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