1 """Services for the seventeentrack integration."""
3 from typing
import Any, Final
5 from pyseventeentrack.package
import PACKAGE_STATUS_MAP, Package
6 import voluptuous
as vol
20 from .
import SeventeenTrackCoordinator
23 ATTR_DESTINATION_COUNTRY,
27 ATTR_PACKAGE_TRACKING_NUMBER,
31 ATTR_TRACKING_INFO_LANGUAGE,
34 SERVICE_ARCHIVE_PACKAGE,
38 SERVICE_ADD_PACKAGES_SCHEMA: Final = vol.Schema(
40 vol.Required(ATTR_CONFIG_ENTRY_ID): cv.string,
41 vol.Optional(ATTR_PACKAGE_STATE): selector.SelectSelector(
42 selector.SelectSelectorConfig(
45 value.lower().replace(
" ",
"_")
46 for value
in PACKAGE_STATUS_MAP.values()
48 mode=selector.SelectSelectorMode.DROPDOWN,
49 translation_key=ATTR_PACKAGE_STATE,
55 SERVICE_ARCHIVE_PACKAGE_SCHEMA: Final = vol.Schema(
57 vol.Required(ATTR_CONFIG_ENTRY_ID): cv.string,
58 vol.Required(ATTR_PACKAGE_TRACKING_NUMBER): cv.string,
64 """Set up the services for the seventeentrack integration."""
66 async
def get_packages(call: ServiceCall) -> ServiceResponse:
67 """Get packages from 17Track."""
68 config_entry_id = call.data[ATTR_CONFIG_ENTRY_ID]
69 package_states = call.data.get(ATTR_PACKAGE_STATE, [])
71 await _validate_service(config_entry_id)
73 seventeen_coordinator: SeventeenTrackCoordinator = hass.data[DOMAIN][
76 live_packages = sorted(
77 await seventeen_coordinator.client.profile.packages(
78 show_archived=seventeen_coordinator.show_archived
84 package_to_dict(package)
85 for package
in live_packages
86 if slugify(package.status)
in package_states
or package_states == []
90 async
def archive_package(call: ServiceCall) ->
None:
91 config_entry_id = call.data[ATTR_CONFIG_ENTRY_ID]
92 tracking_number = call.data[ATTR_PACKAGE_TRACKING_NUMBER]
94 await _validate_service(config_entry_id)
96 seventeen_coordinator: SeventeenTrackCoordinator = hass.data[DOMAIN][
100 await seventeen_coordinator.client.profile.archive_package(tracking_number)
102 def package_to_dict(package: Package) -> dict[str, Any]:
104 ATTR_DESTINATION_COUNTRY: package.destination_country,
105 ATTR_ORIGIN_COUNTRY: package.origin_country,
106 ATTR_PACKAGE_TYPE: package.package_type,
107 ATTR_TRACKING_INFO_LANGUAGE: package.tracking_info_language,
108 ATTR_TRACKING_NUMBER: package.tracking_number,
109 ATTR_LOCATION: package.location,
110 ATTR_STATUS: package.status,
111 ATTR_INFO_TEXT: package.info_text,
112 ATTR_FRIENDLY_NAME: package.friendly_name,
114 if timestamp := package.timestamp:
115 result[ATTR_TIMESTAMP] = timestamp.isoformat()
118 async
def _validate_service(config_entry_id):
119 entry: ConfigEntry |
None = hass.config_entries.async_get_entry(config_entry_id)
122 translation_domain=DOMAIN,
123 translation_key=
"invalid_config_entry",
124 translation_placeholders={
125 "config_entry_id": config_entry_id,
128 if entry.state != ConfigEntryState.LOADED:
130 translation_domain=DOMAIN,
131 translation_key=
"unloaded_config_entry",
132 translation_placeholders={
133 "config_entry_id": entry.title,
137 hass.services.async_register(
139 SERVICE_GET_PACKAGES,
141 schema=SERVICE_ADD_PACKAGES_SCHEMA,
142 supports_response=SupportsResponse.ONLY,
145 hass.services.async_register(
147 SERVICE_ARCHIVE_PACKAGE,
149 schema=SERVICE_ARCHIVE_PACKAGE_SCHEMA,
None setup_services(HomeAssistant hass)