diff --git a/resources/migrations/000_migrations.yaml b/resources/migrations/000_migrations.yaml index b9ae4ab849e2afba964c14b82249f781ea488ddd..2b66f45e910cc38f035e139cebb17177a06fa112 100644 --- a/resources/migrations/000_migrations.yaml +++ b/resources/migrations/000_migrations.yaml @@ -11864,6 +11864,21 @@ databaseChangeLog: columnName: last_name columnDataType: varchar(254) + - changeSet: + id: v44.00-038 + author: metamben + comment: Added 0.44.0 - Add collection_preview to report_card + changes: + - addColumn: + tableName: report_card + columns: + - column: + name: collection_preview + type: boolean + remarks: Indicating whether the card should be visualized in the collection preview + defaultValueBoolean: true + constraints: + nullable: false # >>>>>>>>>> DO NOT ADD NEW MIGRATIONS BELOW THIS LINE! ADD THEM ABOVE <<<<<<<<<< diff --git a/src/metabase/api/card.clj b/src/metabase/api/card.clj index 77b9f3e5862fc943805e9dd4f630bf6e923f5a7c..e90bed932ec9d0b11ad947143cbd7489f04a37bd 100644 --- a/src/metabase/api/card.clj +++ b/src/metabase/api/card.clj @@ -509,7 +509,7 @@ (u/select-keys-when card-updates :present #{:collection_id :collection_position :description :cache_ttl :dataset} :non-nil #{:dataset_query :display :name :visualization_settings :archived :enable_embedding - :parameters :parameter_mappings :embedding_params :result_metadata}))) + :parameters :parameter_mappings :embedding_params :result_metadata :collection_preview}))) ;; Fetch the updated Card from the DB (let [card (Card id)] (delete-alerts-if-needed! card-before-update card) @@ -530,7 +530,7 @@ "Update a `Card`." [id :as {{:keys [dataset_query description display name visualization_settings archived collection_id collection_position enable_embedding embedding_params result_metadata parameters - cache_ttl dataset] + cache_ttl dataset collection_preview] :as card-updates} :body}] {name (s/maybe su/NonBlankString) parameters (s/maybe [su/Parameter]) @@ -545,7 +545,8 @@ collection_id (s/maybe su/IntGreaterThanZero) collection_position (s/maybe su/IntGreaterThanZero) result_metadata (s/maybe qr/ResultsMetadata) - cache_ttl (s/maybe su/IntGreaterThanZero)} + cache_ttl (s/maybe su/IntGreaterThanZero) + collection_preview (s/maybe s/Bool)} (let [card-before-update (hydrate (api/write-check Card id) [:moderation_reviews :moderator_details])] ;; Do various permissions checks diff --git a/src/metabase/api/collection.clj b/src/metabase/api/collection.clj index 2c5da860a46d3e4cb10fdd3493cbd0e702b72f77..554d3bd125fa76fa4f084ca56f0511cb36be548f 100644 --- a/src/metabase/api/collection.clj +++ b/src/metabase/api/collection.clj @@ -203,7 +203,9 @@ (defmethod post-process-collection-children :pulse [_ rows] (for [row rows] - (dissoc row :description :display :authority_level :moderated_status :icon :personal_owner_id))) + (dissoc row + :description :display :authority_level :moderated_status :icon :personal_owner_id + :collection_preview))) (defmethod collection-children-query :snippet [_ collection {:keys [archived?]}] @@ -225,17 +227,19 @@ (defmethod post-process-collection-children :timeline [_ rows] (for [row rows] - (dissoc row :description :display :collection_position :authority_level :moderated_status))) + (dissoc row + :description :display :collection_position :authority_level :moderated_status + :collection_preview))) (defmethod post-process-collection-children :snippet [_ rows] (for [row rows] (dissoc row :description :collection_position :display :authority_level - :moderated_status :icon :personal_owner_id))) + :moderated_status :icon :personal_owner_id :collection_preview))) (defn- card-query [dataset? collection {:keys [archived? pinned-state]}] - (-> {:select [:c.id :c.name :c.description :c.entity_id :c.collection_position :c.display + (-> {:select [:c.id :c.name :c.description :c.entity_id :c.collection_position :c.display :c.collection_preview [(hx/literal (if dataset? "dataset" "card")) :model] [:u.id :last_edit_user] [:u.email :last_edit_email] [:u.first_name :last_edit_first_name] [:u.last_name :last_edit_last_name] @@ -282,9 +286,21 @@ [_ collection options] (card-query false collection options)) +(defn- bit->boolean + "Coerce a bit returned by some MySQL/MariaDB versions in some situations to Boolean." + [v] + (if (number? v) + (not (zero? v)) + v)) + +(defn- post-process-card-row [row] + (-> row + (dissoc :authority_level :icon :personal_owner_id) + (update :collection_preview bit->boolean))) + (defmethod post-process-collection-children :card [_ rows] - (map #(dissoc % :authority_level :icon :personal_owner_id) rows)) + (map post-process-card-row rows)) (defmethod collection-children-query :dashboard [_ collection {:keys [archived? pinned-state]}] @@ -311,7 +327,8 @@ (defmethod post-process-collection-children :dashboard [_ rows] - (map #(dissoc % :display :authority_level :moderated_status :icon :personal_owner_id) rows)) + (map #(dissoc % :display :authority_level :moderated_status :icon :personal_owner_id :collection_preview) + rows)) (defmethod collection-children-query :collection [_ collection {:keys [archived? collection-namespace pinned-state]}] @@ -342,7 +359,8 @@ ;; when fetching root collection, we might have personal collection (:personal_owner_id row) (assoc :name (collection/user->personal-collection-name (:personal_owner_id row) :user)) true (assoc :can_write (mi/can-write? Collection (:id row))) - true (dissoc :collection_position :display :moderated_status :icon :personal_owner_id)))) + true (dissoc :collection_position :display :moderated_status :icon :personal_owner_id + :collection_preview)))) (s/defn ^:private coalesce-edit-info :- last-edit/MaybeAnnotated "Hoist all of the last edit information into a map under the key :last-edit-info. Considers this information present @@ -400,7 +418,8 @@ "All columns that need to be present for the union-all. Generated with the comment form below. Non-text columns that are optional (not id, but last_edit_user for example) must have a type so that the union-all can unify the nil with the correct column type." - [:id :name :description :entity_id :display :model :collection_position :authority_level [:personal_owner_id :integer] + [:id :name :description :entity_id :display [:collection_preview :boolean] + :model :collection_position :authority_level [:personal_owner_id :integer] :last_edit_email :last_edit_first_name :last_edit_last_name :moderated_status :icon [:last_edit_user :integer] [:last_edit_timestamp :timestamp]]) diff --git a/test/metabase/api/card_test.clj b/test/metabase/api/card_test.clj index 9da4141ddbcddc4e885714e45140f2cad42bb736..07c373c05345c2fe8ed20995b863f054e98d1aef 100644 --- a/test/metabase/api/card_test.clj +++ b/test/metabase/api/card_test.clj @@ -48,6 +48,7 @@ {:archived false :collection_id nil :collection_position nil + :collection_preview true :dataset_query {} :dataset false :description nil @@ -850,6 +851,14 @@ (is (= 1 (db/select-one-field :collection_position Card :id (u/the-id card))))))) +(deftest can-we-change-the-collection-preview-flag-of-a-card- + (mt/with-temp Card [card] + (with-cards-in-writeable-collection card + (mt/user-http-request :rasta :put 202 (str "card/" (u/the-id card)) + {:collection_preview false}) + (is (= false + (db/select-one-field :collection_preview Card :id (u/the-id card))))))) + (deftest ---and-unset--unpin--it-as-well- (mt/with-temp Card [card {:collection_position 1}] (with-cards-in-writeable-collection card diff --git a/test/metabase/api/collection_test.clj b/test/metabase/api/collection_test.clj index 9e5ce989b37f8193eb057955a74bbe37a57d6d1f..161ad4a9905ceed85eab38c510e58d0f45352ca3 100644 --- a/test/metabase/api/collection_test.clj +++ b/test/metabase/api/collection_test.clj @@ -337,8 +337,9 @@ (let [collection-id-or-nil (when collection-or-id-or-nil (u/the-id collection-or-id-or-nil))] (mt/with-temp* [Card [{card-id :id} - {:name "Birthday Card" - :collection_id collection-id-or-nil}] + {:name "Birthday Card" + :collection_preview false + :collection_id collection-id-or-nil}] Dashboard [{dashboard-id :id} {:name "Dine & Dashboard" :collection_id collection-id-or-nil}] @@ -420,6 +421,7 @@ [{:id card-id :name (:name card) :collection_position nil + :collection_preview true :display "table" :description nil :entity_id (:entity_id card) @@ -465,7 +467,8 @@ (perms/grant-collection-read-permissions! (perms-group/all-users) collection) (with-some-children-of-collection collection (is (= (map default-item [{:name "Acme Products", :model "pulse", :entity_id true} - {:name "Birthday Card", :description nil, :model "card", :display "table", :entity_id true} + {:name "Birthday Card", :description nil, :model "card", + :collection_preview false, :display "table", :entity_id true} {:name "Dine & Dashboard", :description nil, :model "dashboard", :entity_id true} {:name "Electro-Magnetic Pulse", :model "pulse", :entity_id true}]) (mt/boolean-ids-and-timestamps @@ -481,7 +484,8 @@ (is (= [(default-item {:name "Dine & Dashboard", :description nil, :model "dashboard", :entity_id true})] (mt/boolean-ids-and-timestamps (:data (mt/user-http-request :rasta :get 200 (str "collection/" (u/the-id collection) "/items?models=dashboard")))))) - (is (= [(default-item {:name "Birthday Card", :description nil, :model "card", :display "table", :entity_id true}) + (is (= [(default-item {:name "Birthday Card", :description nil, :model "card", + :collection_preview false, :display "table", :entity_id true}) (default-item {:name "Dine & Dashboard", :description nil, :model "dashboard", :entity_id true})] (mt/boolean-ids-and-timestamps (:data (mt/user-http-request :rasta :get 200 (str "collection/" (u/the-id collection) "/items?models=dashboard&models=card")))))))))) @@ -930,7 +934,8 @@ (deftest fetch-root-items-collection-test (testing "GET /api/collection/root/items" (testing "Make sure you can see everything for Users that can see everything" - (is (= [(default-item {:name "Birthday Card", :description nil, :model "card", :display "table"}) + (is (= [(default-item {:name "Birthday Card", :description nil, :model "card", + :collection_preview false, :display "table"}) (collection-item "Crowberto Corv's Personal Collection") (default-item {:name "Dine & Dashboard", :description nil, :model "dashboard"}) (default-item {:name "Electro-Magnetic Pulse", :model "pulse"})] @@ -973,7 +978,8 @@ (mt/with-temp* [PermissionsGroup [group] PermissionsGroupMembership [_ {:user_id (mt/user->id :rasta), :group_id (u/the-id group)}]] (perms/grant-permissions! group (perms/collection-read-path {:metabase.models.collection.root/is-root? true})) - (is (= [(default-item {:name "Birthday Card", :description nil, :model "card", :display "table"}) + (is (= [(default-item {:name "Birthday Card", :description nil, :model "card", + :collection_preview false, :display "table"}) (default-item {:name "Dine & Dashboard", :description nil, :model "dashboard"}) (default-item {:name "Electro-Magnetic Pulse", :model "pulse"}) (collection-item "Rasta Toucan's Personal Collection")] @@ -1037,6 +1043,7 @@ (is (= [{:name "Business Card" :description nil :collection_position nil + :collection_preview true :display "table" :moderated_status nil :entity_id (:entity_id card) diff --git a/test/metabase/events/revision_test.clj b/test/metabase/events/revision_test.clj index 40085e50e2b213c3254c1020d0e2f2eb3252ec74..36f3bf600a18abc071917710b7ff4ed9e2cdea0d 100644 --- a/test/metabase/events/revision_test.clj +++ b/test/metabase/events/revision_test.clj @@ -20,6 +20,7 @@ {:archived false :collection_id nil :collection_position nil + :collection_preview true :creator_id (:creator_id card) :database_id (mt/id) :dataset_query (:dataset_query card)