Skip to content
Open
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
2 changes: 1 addition & 1 deletion camply/containers/usedirect.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ class UseDirectAvailabilitySlice(CamplyModel):
IsBlocked: Optional[bool]
IsWalkin: Optional[bool]
ReservationId: Optional[int]
Lock: Any
Lock: Optional[datetime.datetime]
MinStay: Optional[int]
IsReservationDraw: Optional[bool]

Expand Down
44 changes: 41 additions & 3 deletions camply/providers/usedirect/usedirect.py
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,7 @@ def get_campsites(
campsites: List[AvailableCampsite] = []
if availability_response.Facility.Units is None:
return campsites
locked_count = 0
for _campground_unit_id, unit in availability_response.Facility.Units.items():
for _slice_date, availability_slice in unit.Slices.items():
campsite = self._get_available_campsite(
Expand All @@ -422,6 +423,17 @@ def get_campsites(
or campsite.campsite_id in self.campsite_ids
):
campsites.append(campsite)
elif (
availability_slice.Lock is not None
and availability_slice.Lock > datetime.now()
):
locked_count += 1
if locked_count > 0:
logger.info(
"%s locked site(s) found that will become available "
"for booking at their scheduled unlock time (typically 8 AM).",
locked_count,
)
return campsites

def _get_available_campsite(
Expand Down Expand Up @@ -464,9 +476,7 @@ def _get_available_campsite(
booking_end_date=start_date + timedelta(days=1),
booking_nights=1,
campsite_site_name=unit.Name,
availability_status=(
"Available" if availability_slice.IsFree is True else "Unavailable"
),
availability_status=self._get_availability_status(availability_slice),
recreation_area=recreation_area.recreation_area,
recreation_area_id=facility.recreation_area_id,
facility_name=facility.facility_name,
Expand All @@ -482,6 +492,34 @@ def _get_available_campsite(
)
return campsite

@staticmethod
def _get_availability_status(
availability_slice: UseDirectAvailabilitySlice,
) -> str:
"""
Determine availability status from an availability slice.

Sites that are not free but have a future Lock timestamp are
cancelled reservations that will become bookable at the lock
time (typically 8 AM the next day).

Parameters
----------
availability_slice: UseDirectAvailabilitySlice

Returns
-------
str
"""
if availability_slice.IsFree is True:
return "Available"
if (
availability_slice.Lock is not None
and availability_slice.Lock > datetime.now()
):
return "Available"
return "Unavailable"

def _fetch_metadata_from_disk(
self, file_path: pathlib.Path
) -> Optional[Union[Dict[Any, Any], List[Dict[Any, Any]]]]:
Expand Down