From 73038a3f53c38abc4bef68c985038ce22a263360 Mon Sep 17 00:00:00 2001 From: Mo Kweon Date: Tue, 19 May 2026 08:52:29 -0700 Subject: [PATCH 1/2] fix(usedirect): update ReserveCalifornia booking URLs to modern routing ReserveCalifornia changed its website routing, moving away from the legacy format to a standard path-based structure. - Incorrect URL: https://www.reservecalifornia.com/Web/Default.aspx#!park/690/611 - Correct URL: https://www.reservecalifornia.com/park/690/611 This change introduces an overridable `get_booking_url()` method to the UseDirect base class, allowing ReserveCalifornia to safely define its modern URL structure without breaking older routing schemes still used by other states like Florida and Ohio. Test assertions have been updated accordingly. --- camply/providers/usedirect/usedirect.py | 16 +++++++++++++--- camply/providers/usedirect/variations.py | 6 ++++++ tests/debug_camply.py | 2 +- .../search_providers/test_reserve_california.py | 2 +- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/camply/providers/usedirect/usedirect.py b/camply/providers/usedirect/usedirect.py index f2b6ff2d..4b95af26 100644 --- a/camply/providers/usedirect/usedirect.py +++ b/camply/providers/usedirect/usedirect.py @@ -67,6 +67,15 @@ class UseDirectProvider(BaseProvider, ABC): booking_path_params: bool = True booking_path: str = "Web/Default.aspx" + def get_booking_url(self, recreation_area_id: int, facility_id: int) -> str: + """ + Generate the Booking URL for the Campsite + """ + booking_url = f"{self.campground_url}/{self.booking_path}" + if self.booking_path_params is True: + booking_url = f"{booking_url}#!park/{recreation_area_id}/{facility_id}" + return booking_url + @property @abstractmethod def base_url(self) -> str: @@ -447,9 +456,10 @@ def _get_available_campsite( facility_id = availability_response.Facility.FacilityId facility = self.usedirect_campgrounds[facility_id] recreation_area = self.usedirect_rec_areas[facility.recreation_area_id] - booking_url = f"{self.campground_url}/{self.booking_path}" - if self.booking_path_params is True: - booking_url = f"{booking_url}#!park/{recreation_area.recreation_area_id}/{facility_id}" + booking_url = self.get_booking_url( + recreation_area_id=recreation_area.recreation_area_id, + facility_id=facility_id + ) if unit.UnitCategoryId is None: unit.UnitCategoryId = -1 if unit.UnitTypeGroupId is None: diff --git a/camply/providers/usedirect/variations.py b/camply/providers/usedirect/variations.py index e03f3563..630897a7 100644 --- a/camply/providers/usedirect/variations.py +++ b/camply/providers/usedirect/variations.py @@ -32,6 +32,12 @@ class ReserveCalifornia(UseDirectProvider): state_code = "CA" rdr_path = "" + def get_booking_url(self, recreation_area_id: int, facility_id: int) -> str: + """ + Override the Booking URL for ReserveCalifornia's modern routing + """ + return f"{self.campground_url}/park/{recreation_area_id}/{facility_id}" + class FloridaStateParks(UseDirectProvider): """ diff --git a/tests/debug_camply.py b/tests/debug_camply.py index 625a18a3..2cb1d162 100644 --- a/tests/debug_camply.py +++ b/tests/debug_camply.py @@ -9,7 +9,7 @@ def test_debug_usedirect(cli_runner: CamplyRunner) -> None: """ Debug the Camply CLI - ReserveCalifornia - UseDirect - https://reservecalifornia.com/Web/#!park/726/737 + https://www.reservecalifornia.com/park/726/737 """ test_command = """ camply \ diff --git a/tests/search_providers/test_reserve_california.py b/tests/search_providers/test_reserve_california.py index 41260b5e..34b8e153 100644 --- a/tests/search_providers/test_reserve_california.py +++ b/tests/search_providers/test_reserve_california.py @@ -153,7 +153,7 @@ def test_rc_cli_campsites_nights( cli_status_checker(result=result, exit_code_zero=True) assert "Valley Oak Loop (sites 85-90)" in result.output assert "total sites found in month of June" in result.output - assert "https://www.reservecalifornia.com" in result.output + assert "https://www.reservecalifornia.com/park/678/1121" in result.output @vcr_cassette From d830bea525f22ebec5d84b2beb8b1f06cff697f8 Mon Sep 17 00:00:00 2001 From: Justin Flannery Date: Sat, 23 May 2026 22:31:10 -0600 Subject: [PATCH 2/2] fix style and update VCR cassette for new RC URLs --- camply/providers/usedirect/usedirect.py | 2 +- tests/cli/cassettes/test_search_once_pushover.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/camply/providers/usedirect/usedirect.py b/camply/providers/usedirect/usedirect.py index 4b95af26..65fec63d 100644 --- a/camply/providers/usedirect/usedirect.py +++ b/camply/providers/usedirect/usedirect.py @@ -458,7 +458,7 @@ def _get_available_campsite( recreation_area = self.usedirect_rec_areas[facility.recreation_area_id] booking_url = self.get_booking_url( recreation_area_id=recreation_area.recreation_area_id, - facility_id=facility_id + facility_id=facility_id, ) if unit.UnitCategoryId is None: unit.UnitCategoryId = -1 diff --git a/tests/cli/cassettes/test_search_once_pushover.yaml b/tests/cli/cassettes/test_search_once_pushover.yaml index 57e10884..529da435 100644 --- a/tests/cli/cassettes/test_search_once_pushover.yaml +++ b/tests/cli/cassettes/test_search_once_pushover.yaml @@ -3025,7 +3025,7 @@ interactions: User-Agent: - python-requests/2.28.2 method: POST - uri: https://api.pushover.net/1/messages.json?html=1&message=%3Cb%3ECampsite+Id%3A%3C%2Fb%3E+4501%0A%3Cb%3EBooking+Date%3A%3C%2Fb%3E+2023-07-13%0A%3Cb%3EBooking+End+Date%3A%3C%2Fb%3E+2023-07-14%0A%3Cb%3EBooking+Nights%3A%3C%2Fb%3E+1%0A%3Cb%3ECampsite+Site+Name%3A%3C%2Fb%3E+Tent+Hike+In+Primitive+Campsite+%23SUGA%0A%3Cb%3ECampsite+Loop+Name%3A%3C%2Fb%3E+None%0A%3Cb%3ECampsite+Type%3A%3C%2Fb%3E+Remote+Camping%0A%3Cb%3ECampsite+Occupancy%3A%3C%2Fb%3E+%280%2C+1%29%0A%3Cb%3ECampsite+Use+Type%3A%3C%2Fb%3E+Hike+In%0A%3Cb%3EAvailability+Status%3A%3C%2Fb%3E+Available%0A%3Cb%3ERecreation+Area%3A%3C%2Fb%3E+Calaveras+Big+Trees+SP%0A%3Cb%3ERecreation+Area+Id%3A%3C%2Fb%3E+5%0A%3Cb%3EFacility+Name%3A%3C%2Fb%3E+North+Grove+Environmental%0A%3Cb%3EFacility+Id%3A%3C%2Fb%3E+343%0A%3Cb%3EBooking+Link%3A%3C%2Fb%3E+%3Ca+href%3D%27https%3A%2F%2Fwww.reservecalifornia.com%2FWeb%2FDefault.aspx%23%21park%2F5%2F343%27%3Ehttps%3A%2F%2Fwww.reservecalifornia.com%2FWeb%2FDefault.aspx%23%21park%2F5%2F343%3C%2Fa%3E%0A%3Cb%3EPermitted+Equipment%3A%3C%2Fb%3E+%0A++-+&title=Calaveras+Big+Trees+SP+%7C+North+Grove+Environmental+%7C+2023-07-13&token=REDACTED&user=REDACTED + uri: https://api.pushover.net/1/messages.json?html=1&message=%3Cb%3ECampsite+Id%3A%3C%2Fb%3E+4501%0A%3Cb%3EBooking+Date%3A%3C%2Fb%3E+2023-07-13%0A%3Cb%3EBooking+End+Date%3A%3C%2Fb%3E+2023-07-14%0A%3Cb%3EBooking+Nights%3A%3C%2Fb%3E+1%0A%3Cb%3ECampsite+Site+Name%3A%3C%2Fb%3E+Tent+Hike+In+Primitive+Campsite+%23SUGA%0A%3Cb%3ECampsite+Loop+Name%3A%3C%2Fb%3E+None%0A%3Cb%3ECampsite+Type%3A%3C%2Fb%3E+Remote+Camping%0A%3Cb%3ECampsite+Occupancy%3A%3C%2Fb%3E+%280%2C+1%29%0A%3Cb%3ECampsite+Use+Type%3A%3C%2Fb%3E+Hike+In%0A%3Cb%3EAvailability+Status%3A%3C%2Fb%3E+Available%0A%3Cb%3ERecreation+Area%3A%3C%2Fb%3E+Calaveras+Big+Trees+SP%0A%3Cb%3ERecreation+Area+Id%3A%3C%2Fb%3E+5%0A%3Cb%3EFacility+Name%3A%3C%2Fb%3E+North+Grove+Environmental%0A%3Cb%3EFacility+Id%3A%3C%2Fb%3E+343%0A%3Cb%3EBooking+Link%3A%3C%2Fb%3E+%3Ca+href%3D%27https%3A%2F%2Fwww.reservecalifornia.com%2Fpark%2F5%2F343%27%3Ehttps%3A%2F%2Fwww.reservecalifornia.com%2Fpark%2F5%2F343%3C%2Fa%3E%0A%3Cb%3EPermitted+Equipment%3A%3C%2Fb%3E+%0A++-+&title=Calaveras+Big+Trees+SP+%7C+North+Grove+Environmental+%7C+2023-07-13&token=REDACTED&user=REDACTED response: body: string: '{"status":1,"request":"9481ec88-e597-4b8a-939a-ee0fe7860e7c"}'