Skip to content

Commit b8a38a6

Browse files
authored
Add more info to trackables (#19)
* Add more info to trackables
1 parent 190d5fe commit b8a38a6

3 files changed

Lines changed: 61 additions & 8 deletions

File tree

geocachingapi/geocachingapi.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
GeocachingStatus,
2525
GeocachingSettings,
2626
GeocachingApiEnvironment,
27-
GeocachingApiEnvironmentSettings
27+
GeocachingApiEnvironmentSettings,
28+
GeocachingTrackableJourney
2829
)
2930

3031
_LOGGER = logging.getLogger(__name__)
@@ -168,13 +169,24 @@ async def _update_trackables(self, data: Dict[str, Any] = None) -> None:
168169
"holder",
169170
"trackingNumber",
170171
"kilometersTraveled",
172+
"milesTraveled",
171173
"currentGeocacheCode",
172-
"currentGeocacheName"
174+
"currentGeocacheName",
175+
"isMissing"
173176
])
174177
data = await self._request("GET", f"/trackables?fields={fields}&type=3")
175178
self._status.update_trackables_from_dict(data)
179+
if len(self._status.trackables) > 0:
180+
for trackable in self._status.trackables.values():
181+
latest_journey_data = await self._request("GET",f"/trackables/{trackable.reference_code}/journeys?sort=loggedDate-&take=1")
182+
if len(latest_journey_data) == 1:
183+
trackable.latest_journey = GeocachingTrackableJourney(data=latest_journey_data[0])
184+
else:
185+
trackable.latest_journey = None
186+
176187
_LOGGER.debug(f'Trackables updated.')
177188

189+
178190
async def close(self) -> None:
179191
"""Close open client session."""
180192
if self._session and self._close_session:

geocachingapi/models.py

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,19 +48,47 @@ def update_from_dict(self, data: Dict[str, Any]) -> None:
4848
self.souvenir_count = try_get_from_dict(data, "souvenirCount", self.souvenir_count)
4949
self.awarded_favorite_points = try_get_from_dict(data, "awardedFavoritePoints", self.awarded_favorite_points)
5050

51+
@dataclass
52+
class GeocachingCoordinate:
53+
"""Class to hold a Geocaching coordinate"""
54+
latitude: Optional[str] = None
55+
longitude: Optional[str] = None
56+
57+
def __init__(self, *, data: Dict[str, Any]) -> GeocachingCoordinate:
58+
"""Constructor for Geocaching coordinates"""
59+
self.latitude = try_get_from_dict(data, "latitude", None)
60+
self.longitude = try_get_from_dict(data, "longitude", None)
61+
62+
@dataclass
63+
class GeocachingTrackableJourney:
64+
"""Class to hold Geocaching trackable journey information"""
65+
coordinates: GeocachingCoordinate = None
66+
logged_date: Optional[datetime] = None
67+
68+
def __init__(self, *, data: Dict[str, Any]) -> GeocachingTrackableJourney:
69+
"""Constructor for Geocaching trackable journey"""
70+
if "coordinates" in data:
71+
self.coordinates = GeocachingCoordinate(data=data["coordinates"])
72+
else:
73+
self.coordinates = None
74+
self.logged_date = try_get_from_dict(data, "loggedDate", self.logged_date)
75+
5176
@dataclass
5277
class GeocachingTrackable:
5378
"""Class to hold the Geocaching trackable information"""
5479
reference_code: Optional[str] = None
5580
name: Optional[str] = None
5681
holder: GeocachingUser = None
5782
tracking_number: Optional[str] = None
58-
kilometers_traveled: Optional[datetime] = None
83+
kilometers_traveled: Optional[str] = None
84+
miles_traveled: Optional[str] = None
5985
current_geocache_code: Optional[str] = None
6086
current_geocache_name: Optional[str] = None
61-
87+
latest_journey: GeocachingTrackableJourney = None
88+
is_missing: bool = False
89+
6290
def update_from_dict(self, data: Dict[str, Any]) -> None:
63-
"""Update trackble from the API"""
91+
"""Update trackable from the API"""
6492
self.reference_code = try_get_from_dict(data, "referenceCode", self.reference_code)
6593
self.name = try_get_from_dict(data, "name", self.name)
6694
if data["holder"] is not None:
@@ -72,8 +100,10 @@ def update_from_dict(self, data: Dict[str, Any]) -> None:
72100

73101
self.tracking_number = try_get_from_dict(data, "trackingNumber", self.tracking_number)
74102
self.kilometers_traveled = try_get_from_dict(data, "kilometersTraveled", self.kilometers_traveled)
103+
self.miles_traveled = try_get_from_dict(data, "milesTraveled", self.miles_traveled)
75104
self.current_geocache_code = try_get_from_dict(data, "currectGeocacheCode", self.current_geocache_code)
76105
self.current_geocache_name = try_get_from_dict(data, "currentGeocacheName", self.current_geocache_name)
106+
self.is_missing = try_get_from_dict(data, "isMissing", self.is_missing)
77107

78108
class GeocachingStatus:
79109
"""Class to hold all account status information"""

tests/test.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,28 @@
22
import asyncio
33
import logging
44
from geocachingapi import GeocachingApi, GeocachingStatus
5-
from geocachingapi.models import GeocachingApiEnvironment, GeocachingSettings
5+
from geocachingapi.models import GeocachingApiEnvironment, GeocachingSettings, GeocachingTrackable
66
from my_token import TOKEN
7-
logging.basicConfig(level=logging.DEBUG)
7+
logging.basicConfig(level=logging.INFO)
88
mylogger = logging.getLogger()
99

1010
async def test():
11-
"""Function to test GeocachingAPI integration"""
11+
"""Function to test GeocachingAPI integration"""
1212
status:GeocachingStatus = None
1313
api = GeocachingApi(token=TOKEN, environment=GeocachingApiEnvironment.Staging, settings = GeocachingSettings(fetch_trackables=True))
1414
status = await api.update()
1515
print(status.user.reference_code)
16+
for trackable in status.trackables.values():
17+
print('----------------------')
18+
print(f'Trackable code: {trackable.reference_code}')
19+
print(f'Trackable name: {trackable.name}')
20+
print(f'Kilometers traveled: {trackable.kilometers_traveled}km')
21+
print(f'Miles traveled: {trackable.miles_traveled}mi')
22+
print(f'Missing?: {trackable.is_missing}')
23+
if trackable.latest_journey:
24+
print(f'last log: {trackable.latest_journey.logged_date}')
25+
print(f'latitude: {trackable.latest_journey.coordinates.latitude}')
26+
print(f'longitude: {trackable.latest_journey.coordinates.longitude}')
1627
await api.close()
1728
loop = asyncio.get_event_loop()
1829
loop.run_until_complete(test())

0 commit comments

Comments
 (0)