diff --git a/src/metabase/api/common/internal.clj b/src/metabase/api/common/internal.clj index 04bc2761784618c56bf616503a4a1ac091934a03..a5f5b874521980650b1f96a088f98464427f99f0 100644 --- a/src/metabase/api/common/internal.clj +++ b/src/metabase/api/common/internal.clj @@ -1,9 +1,11 @@ (ns metabase.api.common.internal "Internal functions used by `metabase.api.common`." - (:require [clojure.tools.logging :as log] + (:require [clojure.java.jdbc :as jdbc] + [clojure.string :as s] [medley.core :as m] [swiss.arrows :refer :all] - [metabase.util :as u])) + [metabase.util :as u]) + (:import java.sql.SQLException)) ;;; # DEFENDPOINT HELPER FUNCTIONS + MACROS @@ -232,10 +234,12 @@ status-code message ;; Otherwise it's a 500. Return a body that includes exception & filtered stacktrace for debugging purposes :else (let [stacktrace (u/filtered-stacktrace e)] - (log/debug message "\n" (u/pprint-to-str stacktrace)) - (assoc other-info - :message message - :stacktrace stacktrace)))})))) + (merge (assoc other-info + :message message + :stacktrace stacktrace) + (when (instance? SQLException e) + {:sql-exception-chain (s/split (with-out-str (jdbc/print-sql-exception-chain e)) + #"\s*\n\s*")}))))})))) (defmacro catch-api-exceptions "Execute BODY, and if an exception is thrown, return the appropriate HTTP response." diff --git a/src/metabase/models/segment.clj b/src/metabase/models/segment.clj index efe64501bc89a376704c6efdb08189bd50f123c7..88a41b0381a3f80793b58121805888ee09e52735 100644 --- a/src/metabase/models/segment.clj +++ b/src/metabase/models/segment.clj @@ -113,12 +113,15 @@ (string? revision_message)]} ;; update the segment itself (db/update! Segment id - :name name - :description description - :caveats caveats - :points_of_interest points_of_interest - :show_in_getting_started show_in_getting_started - :definition definition) + (merge + {:name name + :description description + :caveats caveats + :definition definition} + (when (seq points_of_interest) + {:points_of_interest points_of_interest}) + (when (not (nil? show_in_getting_started)) + {:show_in_getting_started show_in_getting_started}))) (u/prog1 (retrieve-segment id) (events/publish-event :segment-update (assoc <> :actor_id user-id, :revision_message revision_message)))) diff --git a/src/metabase/util.clj b/src/metabase/util.clj index 8bef222d58ef376c93c96638457418b80dfcf24e..4b2a0621420acea6d8c7241cd6cc05ce703a4d98 100644 --- a/src/metabase/util.clj +++ b/src/metabase/util.clj @@ -16,7 +16,7 @@ (java.net Socket InetSocketAddress InetAddress) - java.sql.Timestamp + (java.sql SQLException Timestamp) (java.util Calendar TimeZone) javax.xml.bind.DatatypeConverter org.joda.time.format.DateTimeFormatter)) @@ -560,7 +560,7 @@ (fn [& args] (try (apply f args) - (catch java.sql.SQLException e + (catch SQLException e (log/error (format-color 'red "%s\n%s\n%s" exception-message (with-out-str (jdbc/print-sql-exception-chain e)) diff --git a/test/metabase/api/segment_test.clj b/test/metabase/api/segment_test.clj index 767bbfac2008a666cb9962a87c36e150f8ee1c44..8206a5753c942ff2bb79cb6f1ffeb0e8b33320b8 100644 --- a/test/metabase/api/segment_test.clj +++ b/test/metabase/api/segment_test.clj @@ -10,7 +10,8 @@ [table :refer [Table]]) [metabase.test.data.users :refer :all] [metabase.test.data :refer :all] - [metabase.test.util :as tu])) + [metabase.test.util :as tu] + [metabase.util :as u])) ;; ## Helper Fns @@ -358,10 +359,19 @@ ;;; GET /api/segement/ - (tu/expect-with-temp [Segment [segment-1] Segment [segment-2] Segment [_ {:is_active false}]] ; inactive segments shouldn't show up (tu/mappify (hydrate [segment-1 segment-2] :creator)) ((user->client :rasta) :get 200 "segment/")) + + +;;; PUT /api/segment/id. Can I update a segment's name without specifying `:points_of_interest` and `:show_in_getting_started`? +(tu/expect-with-temp [Segment [segment]] + :ok + (do ((user->client :crowberto) :put 200 (str "segment/" (u/get-id segment)) + {:name "Cool name" + :revision_message "WOW HOW COOL" + :definition {}}) + :ok))