diff --git a/cwms-data-api/src/test/java/cwms/cda/api/CatalogControllerTestIT.java b/cwms-data-api/src/test/java/cwms/cda/api/CatalogControllerTestIT.java index cc10e68b5..df8a1c5a2 100644 --- a/cwms-data-api/src/test/java/cwms/cda/api/CatalogControllerTestIT.java +++ b/cwms-data-api/src/test/java/cwms/cda/api/CatalogControllerTestIT.java @@ -13,6 +13,8 @@ import cwms.cda.formatters.ContentType; import cwms.cda.formatters.json.JsonV2; import fixtures.TestAccounts; + +import java.util.HashMap; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -43,6 +45,7 @@ import io.restassured.filter.log.LogDetail; import io.restassured.response.Response; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.ValueSource; import static org.hamcrest.Matchers.*; @@ -50,7 +53,9 @@ @Tag("integration") public class CatalogControllerTestIT extends DataApiTestIT { - public static final String OFFICE = "SPK"; + public static final String OFFICE1 = "SPK"; + public static final String OFFICE2 = "MVP"; + public static final String OFFICE3 = "LRL"; //// These have to match the groups in ts_catalog_setup.sql public static final String A_TO_M = "A to M"; @@ -62,24 +67,34 @@ public class CatalogControllerTestIT extends DataApiTestIT { @BeforeAll static void setup_data() throws Exception { // Create some locations and create some ts. - createLocation("Alder Springs",true, OFFICE); - createLocation("Wet Meadows",true, OFFICE); - createLocation("Pine Flat-Outflow",true, OFFICE); - createLocation("Flat Lake",true, OFFICE); - - createProject("Flat Project", OFFICE); - createTimeseries(OFFICE,"Alder Springs.Precip-Cumulative.Inst.15Minutes.0.raw-cda"); - createTimeseries(OFFICE,"Alder Springs.Precip-INC.Total.15Minutes.15Minutes.calc-cda"); - createTimeseries(OFFICE,"Pine Flat-Outflow.Stage.Inst.15Minutes.0.raw-cda"); - createTimeseries(OFFICE,"Pine Flat-Outflow.Stage.Inst.15Minutes.0.one"); - createTimeseries(OFFICE,"Pine Flat-Outflow.Stage.Inst.15Minutes.0.two"); - createTimeseries(OFFICE,"Pine Flat-Outflow.Stage.Inst.15Minutes.0.three"); - createTimeseries(OFFICE,"Pine Flat-Outflow.Stage.Inst.15Minutes.0.four"); - createTimeseries(OFFICE,"Wet Meadows.Depth-SWE.Inst.15Minutes.0.raw-cda"); - createTimeseries(OFFICE,"Wet Meadows.Depth-SWE.Inst.15Minutes.0.one"); - createTimeseries(OFFICE,"Wet Meadows.Depth-SWE.Inst.15Minutes.0.two"); - createTimeseries(OFFICE,"Wet Meadows.Depth-SWE.Inst.15Minutes.0.three"); - createTimeseries(OFFICE,"Wet Meadows.Depth-SWE.Inst.15Minutes.0.four"); + createLocation("Alder Springs",true, OFFICE1); + createLocation("Wet Meadows",true, OFFICE1); + createLocation("Pine Flat-Outflow",true, OFFICE1); + createLocation("Flat Lake",true, OFFICE1); + + createLocation("LockDam_10", true, OFFICE2); + createLocation("LockDam_01", true, OFFICE2); + for (int i=0; i < 30; i++) { + createLocation(String.format("LOckDam_%03d", i*10), true, OFFICE2); + } + + createLocation("Barkley", true, OFFICE2); + createLocation("Franklin", true, OFFICE2); + createLocation("HorseBranch", true, OFFICE2); + + createProject("Flat Project", OFFICE1); + createTimeseries(OFFICE1,"Alder Springs.Precip-Cumulative.Inst.15Minutes.0.raw-cda"); + createTimeseries(OFFICE1,"Alder Springs.Precip-INC.Total.15Minutes.15Minutes.calc-cda"); + createTimeseries(OFFICE1,"Pine Flat-Outflow.Stage.Inst.15Minutes.0.raw-cda"); + createTimeseries(OFFICE1,"Pine Flat-Outflow.Stage.Inst.15Minutes.0.one"); + createTimeseries(OFFICE1,"Pine Flat-Outflow.Stage.Inst.15Minutes.0.two"); + createTimeseries(OFFICE1,"Pine Flat-Outflow.Stage.Inst.15Minutes.0.three"); + createTimeseries(OFFICE1,"Pine Flat-Outflow.Stage.Inst.15Minutes.0.four"); + createTimeseries(OFFICE1,"Wet Meadows.Depth-SWE.Inst.15Minutes.0.raw-cda"); + createTimeseries(OFFICE1,"Wet Meadows.Depth-SWE.Inst.15Minutes.0.one"); + createTimeseries(OFFICE1,"Wet Meadows.Depth-SWE.Inst.15Minutes.0.two"); + createTimeseries(OFFICE1,"Wet Meadows.Depth-SWE.Inst.15Minutes.0.three"); + createTimeseries(OFFICE1,"Wet Meadows.Depth-SWE.Inst.15Minutes.0.four"); // Complicated loadSqlDataFromResource("cwms/cda/data/sql/ts_catalog_setup.sql"); @@ -89,7 +104,7 @@ static void setup_data() throws Exception { private static void createProject(String id, String office) throws SQLException { CwmsDataApiSetupCallback.getDatabaseLink().connection(c -> { - DSLContext dsl = dslContext(c, OFFICE); + DSLContext dsl = dslContext(c, OFFICE1); ProjectDao projectDao = new ProjectDao(dsl); Project project = new Project.Builder() .withLocation(new Location.Builder(id, @@ -107,7 +122,7 @@ private static void createProject(String id, String office) throws SQLException private static void deleteProject(String id, String office) throws SQLException { CwmsDataApiSetupCallback.getDatabaseLink().connection(c -> { - DSLContext dsl = dslContext(c, OFFICE); + DSLContext dsl = dslContext(c, OFFICE1); ProjectDao projectDao = new ProjectDao(dsl); projectDao.delete(office, id, DeleteRule.DELETE_KEY); @@ -117,7 +132,7 @@ private static void deleteProject(String id, String office) throws SQLException @AfterAll static void deload_data() throws Exception { loadSqlDataFromResource("cwms/cda/data/sql/ts_catalog_cleanup.sql"); - deleteProject("Flat Project", OFFICE); + deleteProject("Flat Project", OFFICE1); cleanupBasins(); cleanupStreams(); } @@ -128,7 +143,7 @@ void test_no_aliased_results_returned(String format) { given() .accept(format) .log().ifValidationFails(LogDetail.ALL, true) - .queryParam(Controllers.OFFICE, OFFICE) + .queryParam(Controllers.OFFICE, OFFICE1) .queryParam(EXCLUDE_EMPTY,false) .queryParam(LIKE,".*-cda$") .when() @@ -148,7 +163,7 @@ void test_no_aliases_returned(String format) { Integer numAliases = given() .accept(format) .log().ifValidationFails(LogDetail.ALL, true) - .queryParam(Controllers.OFFICE, OFFICE) + .queryParam(Controllers.OFFICE, OFFICE1) .queryParam(EXCLUDE_EMPTY, false) .when() .get("/catalog/TIMESERIES") @@ -167,7 +182,7 @@ void test_no_aliases_returned(String format) { void test_aliases_returned(String format) { Integer numAliases = given().accept(format) .log().ifValidationFails(LogDetail.ALL, true) - .queryParam(Controllers.OFFICE, OFFICE) + .queryParam(Controllers.OFFICE, OFFICE1) .queryParam(EXCLUDE_EMPTY,false) .queryParam(INCLUDE_ALIASES,true) .when() @@ -187,7 +202,7 @@ void test_aliases_returned(String format) { void test_alias_is_correct(String format) throws JsonProcessingException { Response response = given().accept(format) .log().ifValidationFails(LogDetail.ALL, true) - .queryParam(Controllers.OFFICE, OFFICE) + .queryParam(Controllers.OFFICE, OFFICE1) .queryParam(EXCLUDE_EMPTY, false) .queryParam(INCLUDE_ALIASES, true) .when() @@ -225,7 +240,7 @@ void test_alias_is_correct(String format) throws JsonProcessingException { void test_queries_are_case_insensitive() { given() .accept("application/json;version=2") - .queryParam(Controllers.OFFICE, OFFICE) + .queryParam(Controllers.OFFICE, OFFICE1) .queryParam(EXCLUDE_EMPTY,false) .queryParam(LIKE,"alder spRINgs.*-CDA$") .when() @@ -240,18 +255,27 @@ void test_queries_are_case_insensitive() { } @ParameterizedTest - @ValueSource(strings = {Formats.JSONV2, Formats.DEFAULT}) - void test_all_office_pagination_works(String format) { + @CsvSource({ + // Formats.JSONV2 + ",TIMESERIES", + //Formats.DEFAULT + ",TIMESERIES", + Formats.JSONV2 + ",LOCATIONS" //, + // Formats.DEFAULT + ",LOCATIONS" + }) + void test_all_office_pagination_works(String format, String endpoint) { assertTimeout(Duration.ofMinutes(5), () -> { - final int pageSize = 50; + final int pageSize = 10; // artificially low size to force pagination + final HashMap queryParams = new HashMap<>(); + queryParams.put("page-size", pageSize); + if (endpoint.equals("TIMESERIES")) { + queryParams.put(EXCLUDE_EMPTY,false); + } Response initialResponse = given() .log().ifValidationFails(LogDetail.ALL, true) .accept(format) - .queryParam("page-size",pageSize) - .queryParam(EXCLUDE_EMPTY,false) + .queryParams(queryParams) .when() - .get("/catalog/TIMESERIES") + .get("/catalog/{data}", endpoint) .then() .log().ifValidationFails(LogDetail.ALL, true) .assertThat() @@ -268,7 +292,7 @@ void test_all_office_pagination_works(String format) { int totalRetrieved = initialResponse.path("entries.size()"); String lastRowPreviousPage = initialResponse.path("entries.last().name"); - + queryParams.remove("page-size"); do { Response pageN = given() @@ -277,7 +301,7 @@ void test_all_office_pagination_works(String format) { .queryParam("page",nextPage) .queryParam(EXCLUDE_EMPTY,false) .when() - .get("/catalog/TIMESERIES") + .get("/catalog/{data}", endpoint) .then() .log().ifValidationFails(LogDetail.ALL, true) .assertThat() @@ -309,7 +333,7 @@ void test_loc_group_with_ts_group() { // filter by loc group and ts group should find the intersection given() .accept("application/json;version=2") - .queryParam(Controllers.OFFICE, OFFICE) + .queryParam(Controllers.OFFICE, OFFICE1) .queryParam(LOCATION_CATEGORY_LIKE, TEST_CATEGORY) .queryParam(LOCATION_GROUP_LIKE, N_TO_Z) .queryParam(TIMESERIES_CATEGORY_LIKE, TEST_CATEGORY) @@ -339,7 +363,7 @@ void test_loc_group() { // filter by just loc group given() .accept("application/json;version=2") - .queryParam(Controllers.OFFICE, OFFICE) + .queryParam(Controllers.OFFICE, OFFICE1) .queryParam(LOCATION_CATEGORY_LIKE, TEST_CATEGORY) .queryParam(LOCATION_GROUP_LIKE, A_TO_M) .queryParam(EXCLUDE_EMPTY,false) @@ -362,7 +386,7 @@ void test_loc_group() { // filter by just loc group given() .accept("application/json;version=2") - .queryParam(Controllers.OFFICE, OFFICE) + .queryParam(Controllers.OFFICE, OFFICE1) .queryParam(LOCATION_CATEGORY_LIKE, TEST_CATEGORY) .queryParam(LOCATION_GROUP_LIKE, N_TO_Z) .queryParam(EXCLUDE_EMPTY,false) @@ -397,7 +421,7 @@ void test_ts_with_bounding() { // we create Wet Meadows with a bounding office of SPK given() .accept("application/json;version=2") - .queryParam(BOUNDING_OFFICE_LIKE, OFFICE) + .queryParam(BOUNDING_OFFICE_LIKE, OFFICE1) .queryParam(LIKE, "^Wet Meadows.*") .queryParam(EXCLUDE_EMPTY,false) .when() @@ -422,7 +446,7 @@ void test_loc_kind() { // First with just the regex. This should match Flat Lake and Flat Project given() .accept("application/json;version=2") - .queryParam(Controllers.OFFICE, OFFICE) + .queryParam(Controllers.OFFICE, OFFICE1) .queryParam(LIKE, pattern) .when() .get("/catalog/LOCATIONS") @@ -439,7 +463,7 @@ void test_loc_kind() { // Now add the LOCATION_KIND filter given() .accept("application/json;version=2") - .queryParam(Controllers.OFFICE, OFFICE) + .queryParam(Controllers.OFFICE, OFFICE1) .queryParam(LIKE, pattern) .queryParam(LOCATION_KIND_LIKE, "PROJECT") // just Flat Project .when() @@ -464,7 +488,7 @@ void test_loc_aliases() { // Retrieve without aliases given() .accept("application/json;version=2") - .queryParam(Controllers.OFFICE, OFFICE) + .queryParam(Controllers.OFFICE, OFFICE1) .queryParam(LIKE, pattern) .queryParam(INCLUDE_ALIASES, false) .when() @@ -483,7 +507,7 @@ void test_loc_aliases() { // retrieve with aliases given() .accept("application/json;version=2") - .queryParam(Controllers.OFFICE, OFFICE) + .queryParam(Controllers.OFFICE, OFFICE1) .queryParam(LIKE, pattern) .queryParam(INCLUDE_ALIASES, true) .when() @@ -550,7 +574,7 @@ void testFilterLocations() throws Exception{ given() .log().ifValidationFails(LogDetail.ALL,true) .accept(Formats.JSON) - .queryParam(OFFICE, officeId) + .queryParam(OFFICE1, officeId) .queryParam(LIKE, String.format("%s*", baseLocationName)) .queryParam(UNIT_SYSTEM, UnitSystem.SI.getValue()) .when() @@ -571,7 +595,7 @@ void testFilterLocations() throws Exception{ given() .log().ifValidationFails(LogDetail.ALL,true) .accept(Formats.JSON) - .queryParam(OFFICE, officeId) + .queryParam(OFFICE1, officeId) .queryParam(LIKE, stringToMatch) .queryParam(UNIT_SYSTEM, UnitSystem.SI.getValue()) .when() @@ -591,7 +615,7 @@ void testFilterLocations() throws Exception{ given() .log().ifValidationFails(LogDetail.ALL,true) .accept(Formats.JSON) - .queryParam(OFFICE, officeId) + .queryParam(OFFICE1, officeId) .queryParam(LIKE, stringToMatch) .queryParam(LOCATION_KIND_LIKE, "^(BASIN)$") .queryParam(NEGATE_LOCATION_KIND_LIKE, true) @@ -612,7 +636,7 @@ void testFilterLocations() throws Exception{ given() .log().ifValidationFails(LogDetail.ALL,true) .accept(Formats.JSON) - .queryParam(OFFICE, officeId) + .queryParam(OFFICE1, officeId) .queryParam(LIKE, stringToMatch) .queryParam(LOCATION_KIND_LIKE, "^(STREAM)*$") .queryParam(NEGATE_LOCATION_KIND_LIKE, true) @@ -632,7 +656,7 @@ void testFilterLocations() throws Exception{ given() .log().ifValidationFails(LogDetail.ALL,true) .accept(Formats.JSON) - .queryParam(OFFICE, officeId) + .queryParam(OFFICE1, officeId) .queryParam(LIKE, stringToMatch) .queryParam(LOCATION_KIND_LIKE, "NOT:^(STREAM)*$") .queryParam(UNIT_SYSTEM, UnitSystem.SI.getValue()) @@ -651,7 +675,7 @@ void testFilterLocations() throws Exception{ given() .log().ifValidationFails(LogDetail.ALL,true) .accept(Formats.JSON) - .queryParam(OFFICE, officeId) + .queryParam(OFFICE1, officeId) .queryParam(LIKE, stringToMatch) .queryParam(LOCATION_KIND_LIKE, "NOT:^(STREAM)*$") .queryParam(UNIT_SYSTEM, UnitSystem.SI.getValue()) @@ -671,7 +695,7 @@ void testFilterLocations() throws Exception{ given() .log().ifValidationFails(LogDetail.ALL,true) .accept(Formats.JSON) - .queryParam(OFFICE, officeId) + .queryParam(OFFICE1, officeId) .queryParam(LIKE, stringToMatch) .queryParam(UNIT_SYSTEM, UnitSystem.SI.getValue()) .queryParam(LOCATION_KIND_LIKE, "^(BASIN|STREAM)*$") @@ -695,7 +719,7 @@ void test_locations_unsupported_param_single() { given() .log().ifValidationFails(LogDetail.ALL, true) .accept(Formats.JSON) - .queryParam(OFFICE, OFFICE) + .queryParam(OFFICE1, OFFICE1) .queryParam(INCLUDE_EXTENTS, true) .when() .get("/catalog/LOCATIONS") @@ -720,7 +744,7 @@ void test_locations_unsupported_params_multiple() { given() .log().ifValidationFails(LogDetail.ALL, true) .accept(Formats.JSON) - .queryParam(OFFICE, OFFICE) + .queryParam(OFFICE1, OFFICE1) .queryParam(INCLUDE_EXTENTS, true) .queryParam(EXCLUDE_EMPTY, true) .when() diff --git a/load_data/dev_data_load.ipynb b/load_data/dev_data_load.ipynb index 7837dcb36..92bc7977c 100644 --- a/load_data/dev_data_load.ipynb +++ b/load_data/dev_data_load.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "fc24b3e1-2a70-436a-a8e3-0bf0e8a9195f", "metadata": { "tags": [] @@ -27,7 +27,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "bb32f1d3-62a1-447a-b7fe-d0b48f3ccf01", "metadata": { "tags": [] @@ -92,7 +92,7 @@ " }\n", " clean_dict = {k: loc_json[k] for k in loc_json if not pd.isna(loc_json[k])}\n", " #try:\n", - " cwms.store_location(data = clean_dict)\n", + " cwms.store_location(data = clean_dict, fail_if_exists=False)\n", " #except:\n", " # print(clean_dict)\n", " # print('save failed')" @@ -100,12 +100,35 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "d6c56107-9c10-4c52-b8b3-2bf91e1d01ea", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ERROR:root:CDA Error: response=\n" + ] + }, + { + "ename": "ApiError", + "evalue": "CWMS API Error (http://localhost:8081/cwms-data/locations?fail-if-exists=True) Conflict. {\"message\":\"Already exists\",\"incidentIdentifier\":\"8af100ce-92f4-4a02-ab95-6839e593f6c2\",\"source\":\"Database\",\"details\":{\"message\":\"The location with name: Taylorsville-Lake already exists in office: LRL\"}}", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mApiError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[9]\u001b[39m\u001b[32m, line 3\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m office_id \u001b[38;5;129;01min\u001b[39;00m office_ids:\n\u001b[32m 2\u001b[39m locations = pd.read_csv(\u001b[33mf\u001b[39m\u001b[33m'\u001b[39m\u001b[33mdata/\u001b[39m\u001b[38;5;132;01m{\u001b[39;00moffice_id\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m_locations_data.csv\u001b[39m\u001b[33m'\u001b[39m)\n\u001b[32m----> \u001b[39m\u001b[32m3\u001b[39m \u001b[43mstore_multi_location_df\u001b[49m\u001b[43m(\u001b[49m\u001b[43mlocations\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[8]\u001b[39m\u001b[32m, line 36\u001b[39m, in \u001b[36mstore_multi_location_df\u001b[39m\u001b[34m(locations)\u001b[39m\n\u001b[32m 34\u001b[39m clean_dict = {k: loc_json[k] \u001b[38;5;28;01mfor\u001b[39;00m k \u001b[38;5;129;01min\u001b[39;00m loc_json \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m pd.isna(loc_json[k])}\n\u001b[32m 35\u001b[39m \u001b[38;5;66;03m#try:\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m36\u001b[39m \u001b[43mcwms\u001b[49m\u001b[43m.\u001b[49m\u001b[43mstore_location\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdata\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mclean_dict\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/projects/cwms-data-api/.venv/lib/python3.11/site-packages/cwms/locations/physical_locations.py:156\u001b[39m, in \u001b[36mstore_location\u001b[39m\u001b[34m(data, fail_if_exists)\u001b[39m\n\u001b[32m 154\u001b[39m endpoint = \u001b[33m\"\u001b[39m\u001b[33mlocations\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 155\u001b[39m params = {\u001b[33m\"\u001b[39m\u001b[33mfail-if-exists\u001b[39m\u001b[33m\"\u001b[39m: fail_if_exists}\n\u001b[32m--> \u001b[39m\u001b[32m156\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mapi\u001b[49m\u001b[43m.\u001b[49m\u001b[43mpost\u001b[49m\u001b[43m(\u001b[49m\u001b[43mendpoint\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[43m=\u001b[49m\u001b[43mparams\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/projects/cwms-data-api/.venv/lib/python3.11/site-packages/cwms/api.py:374\u001b[39m, in \u001b[36mpost\u001b[39m\u001b[34m(endpoint, data, params, api_version)\u001b[39m\n\u001b[32m 350\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mpost\u001b[39m(\n\u001b[32m 351\u001b[39m endpoint: \u001b[38;5;28mstr\u001b[39m,\n\u001b[32m 352\u001b[39m data: Any,\n\u001b[32m (...)\u001b[39m\u001b[32m 355\u001b[39m api_version: \u001b[38;5;28mint\u001b[39m = API_VERSION,\n\u001b[32m 356\u001b[39m ) -> \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 357\u001b[39m \u001b[38;5;250m \u001b[39m\u001b[33;03m\"\"\"Make a POST request to the CWMS Data API.\u001b[39;00m\n\u001b[32m 358\u001b[39m \n\u001b[32m 359\u001b[39m \u001b[33;03m Args:\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 372\u001b[39m \u001b[33;03m ApiError: If an error response is return by the API.\u001b[39;00m\n\u001b[32m 373\u001b[39m \u001b[33;03m \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m374\u001b[39m \u001b[43m_post_function\u001b[49m\u001b[43m(\u001b[49m\u001b[43mendpoint\u001b[49m\u001b[43m=\u001b[49m\u001b[43mendpoint\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata\u001b[49m\u001b[43m=\u001b[49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[43m=\u001b[49m\u001b[43mparams\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mapi_version\u001b[49m\u001b[43m=\u001b[49m\u001b[43mapi_version\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/projects/cwms-data-api/.venv/lib/python3.11/site-packages/cwms/api.py:346\u001b[39m, in \u001b[36m_post_function\u001b[39m\u001b[34m(endpoint, data, params, api_version)\u001b[39m\n\u001b[32m 344\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m response.ok:\n\u001b[32m 345\u001b[39m logging.error(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mCDA Error: response=\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mresponse\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m\"\u001b[39m)\n\u001b[32m--> \u001b[39m\u001b[32m346\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m ApiError(response)\n\u001b[32m 347\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m response\n", + "\u001b[31mApiError\u001b[39m: CWMS API Error (http://localhost:8081/cwms-data/locations?fail-if-exists=True) Conflict. {\"message\":\"Already exists\",\"incidentIdentifier\":\"8af100ce-92f4-4a02-ab95-6839e593f6c2\",\"source\":\"Database\",\"details\":{\"message\":\"The location with name: Taylorsville-Lake already exists in office: LRL\"}}" + ] + } + ], "source": [ "for office_id in office_ids:\n", " locations = pd.read_csv(f'data/{office_id}_locations_data.csv')\n", @@ -257,7 +280,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": ".venv", "language": "python", "name": "python3" }, @@ -271,7 +294,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.4" + "version": "3.11.2" } }, "nbformat": 4,