Skip to content
Snippets Groups Projects
Unverified Commit 2d22d3af authored by Cam Saul's avatar Cam Saul Committed by GitHub
Browse files

[Toucan 2 Prep] Add helper for extending `IModel`; namespace Toucan properties (#27474)

* [Toucan 2 Prep] Add helper for extending `IModel`; namespace Toucan properties

* Clean namespaces

* Test fixes :wrench:
parent ae59ec81
No related branches found
No related tags found
No related merge requests found
Showing
with 117 additions and 138 deletions
......@@ -2,7 +2,6 @@
"Intersection table for `Metric` and `Field`; this is used to keep track of the top 0-3 important fields for a metric as shown in the Getting Started guide."
(:require
[metabase.models.interface :as mi]
[metabase.util :as u]
[toucan.models :as models]))
(models/defmodel MetricImportantField :metric_important_field)
......@@ -11,7 +10,6 @@
(derive ::mi/read-policy.always-allow)
(derive ::mi/write-policy.superuser))
(u/strict-extend #_{:clj-kondo/ignore [:metabase/disallow-class-or-type-on-model]} (class MetricImportantField)
models/IModel
(merge models/IModelDefaults
{:types (constantly {:definition :json})}))
(mi/define-methods
MetricImportantField
{:types (constantly {:definition :json})})
......@@ -2,9 +2,9 @@
"TODO -- this should be moved to `metabase-enterprise.content-management.models.moderation-review` since it's a
premium-only model."
(:require
[metabase.models.interface :as mi]
[metabase.models.permissions :as perms]
[metabase.moderation :as moderation]
[metabase.util :as u]
[metabase.util.schema :as su]
[schema.core :as s]
[toucan.db :as db]
......@@ -33,11 +33,10 @@
;;; TODO: this is wrong, but what should it be?
(derive ModerationReview ::perms/use-parent-collection-perms)
(u/strict-extend #_{:clj-kondo/ignore [:metabase/disallow-class-or-type-on-model]} (class ModerationReview)
models/IModel
(merge models/IModelDefaults
{:properties (constantly {:timestamped? true})
:types (constantly {:moderated_item_type :keyword})}))
(mi/define-methods
ModerationReview
{:properties (constantly {::mi/timestamped? true})
:types (constantly {:moderated_item_type :keyword})})
(def max-moderation-reviews
"The amount of moderation reviews we will keep on hand."
......
......@@ -33,14 +33,12 @@
(throw (UnsupportedOperationException. (tru "You cannot update the creator_id of a NativeQuerySnippet.")))))
(collection/check-collection-namespace NativeQuerySnippet (:collection_id updates))))
(u/strict-extend #_{:clj-kondo/ignore [:metabase/disallow-class-or-type-on-model]} (class NativeQuerySnippet)
models/IModel
(merge
models/IModelDefaults
{:properties (constantly {:timestamped? true
:entity_id true})
:pre-insert pre-insert
:pre-update pre-update}))
(mi/define-methods
NativeQuerySnippet
{:properties (constantly {::mi/timestamped? true
::mi/entity-id true})
:pre-insert pre-insert
:pre-update pre-update})
(defmethod serdes.hash/identity-hash-fields NativeQuerySnippet
[_snippet]
......
(ns metabase.models.parameter-card
(:require
[metabase.models.interface :as mi]
[metabase.util :as u]
[metabase.util.i18n :refer [tru]]
[toucan.db :as db]
......@@ -28,13 +29,12 @@
(u/prog1 pc
(validate-parameterized-object-type pc)))
(u/strict-extend #_{:clj-kondo/ignore [:metabase/disallow-class-or-type-on-model]} (class ParameterCard)
models/IModel
(merge models/IModelDefaults
{:properties (constantly {:timestamped? true})
:types (constantly {:parameterized_object_type :keyword})
:pre-insert pre-insert
:pre-update pre-update}))
(mi/define-methods
ParameterCard
{:properties (constantly {::mi/timestamped? true})
:types (constantly {:parameterized_object_type :keyword})
:pre-insert pre-insert
:pre-update pre-update})
(defn delete-all-for-parameterized-object!
"Delete all ParameterCard for a give Parameterized Object and NOT listed in the optional
......
......@@ -610,11 +610,11 @@
(:object permissions))))
(assert-not-admin-group permissions))
(u/strict-extend #_{:clj-kondo/ignore [:metabase/disallow-class-or-type-on-model]} (class Permissions)
models/IModel (merge models/IModelDefaults
{:pre-insert pre-insert
:pre-update pre-update
:pre-delete pre-delete}))
(mi/define-methods
Permissions
{:pre-insert pre-insert
:pre-update pre-update
:pre-delete pre-delete})
;;; +----------------------------------------------------------------------------------------------------------------+
......
......@@ -11,6 +11,7 @@
[clojure.string :as str]
[honeysql.helpers :as hh]
[metabase.db.connection :as mdb.connection]
[metabase.models.interface :as mi]
[metabase.models.setting :as setting]
[metabase.plugins.classloader :as classloader]
[metabase.public-settings.premium-features :as premium-features]
......@@ -100,11 +101,11 @@
(when group-name
(check-name-not-already-taken group-name))))
(u/strict-extend #_{:clj-kondo/ignore [:metabase/disallow-class-or-type-on-model]} (class PermissionsGroup)
models/IModel (merge models/IModelDefaults
{:pre-delete pre-delete
:pre-insert pre-insert
:pre-update pre-update}))
(mi/define-methods
PermissionsGroup
{:pre-delete pre-delete
:pre-insert pre-insert
:pre-update pre-update})
;;; ---------------------------------------------------- Util Fns ----------------------------------------------------
......
(ns metabase.models.permissions-group-membership
(:require
[metabase.models.interface :as mi]
[metabase.models.permissions-group :as perms-group]
[metabase.util :as u]
[metabase.util.i18n :refer [deferred-tru tru]]
......@@ -54,9 +55,8 @@
(db/update! 'User user_id
:is_superuser true))))
(u/strict-extend #_{:clj-kondo/ignore [:metabase/disallow-class-or-type-on-model]} (class PermissionsGroupMembership)
models/IModel
(merge models/IModelDefaults
{:pre-delete pre-delete
:pre-insert pre-insert
:post-insert post-insert}))
(mi/define-methods
PermissionsGroupMembership
{:pre-delete pre-delete
:pre-insert pre-insert
:post-insert post-insert})
(ns metabase.models.permissions-revision
(:require
[metabase.util :as u]
[metabase.models.interface :as mi]
[metabase.util.i18n :refer [tru]]
[toucan.db :as db]
[toucan.models :as models]))
(models/defmodel PermissionsRevision :permissions_revision)
(u/strict-extend #_{:clj-kondo/ignore [:metabase/disallow-class-or-type-on-model]} (class PermissionsRevision)
models/IModel
(merge models/IModelDefaults
{:types (constantly {:before :json
:after :json})
:properties (constantly {:created-at-timestamped? true})
:pre-update (fn [& _] (throw (Exception. (tru "You cannot update a PermissionsRevision!"))))}))
(mi/define-methods
PermissionsRevision
{:types (constantly {:before :json
:after :json})
:properties (constantly {::mi/created-at-timestamped? true})
:pre-update (fn [& _] (throw (Exception. (tru "You cannot update a PermissionsRevision!"))))})
(defn latest-id
"Return the ID of the newest `PermissionsRevision`, or zero if none have been made yet.
......
......@@ -65,10 +65,9 @@
(models/defmodel PersistedInfo :persisted_info)
(u/strict-extend #_{:clj-kondo/ignore [:metabase/disallow-class-or-type-on-model]} (class PersistedInfo)
models/IModel
(merge models/IModelDefaults
{:types (constantly {:definition ::definition})}))
(mi/define-methods
PersistedInfo
{:types (constantly {:definition ::definition})})
(defn persisted?
"Hydrate a card :is_persisted for the frontend."
......
......@@ -127,16 +127,14 @@
(= api/*current-user-id* (:creator_id notification))
(mi/current-user-has-full-permissions? :write notification)))
(u/strict-extend #_{:clj-kondo/ignore [:metabase/disallow-class-or-type-on-model]} (class Pulse)
models/IModel
(merge
models/IModelDefaults
{:hydration-keys (constantly [:pulse])
:properties (constantly {:timestamped? true
:entity_id true})
:pre-insert pre-insert
:pre-update pre-update
:types (constantly {:parameters :json})}))
(mi/define-methods
Pulse
{:hydration-keys (constantly [:pulse])
:properties (constantly {::mi/timestamped? true
::mi/entity-id true})
:pre-insert pre-insert
:pre-update pre-update
:types (constantly {:parameters :json})})
(defmethod serdes.hash/identity-hash-fields Pulse
[_pulse]
......
(ns metabase.models.pulse-card
(:require
[metabase.models.interface :as mi]
[metabase.models.serialization.base :as serdes.base]
[metabase.models.serialization.hash :as serdes.hash]
[metabase.models.serialization.util :as serdes.util]
......@@ -11,10 +12,9 @@
(models/defmodel PulseCard :pulse_card)
(u/strict-extend #_{:clj-kondo/ignore [:metabase/disallow-class-or-type-on-model]} (class PulseCard)
models/IModel
(merge models/IModelDefaults
{:properties (constantly {:entity_id true})}))
(mi/define-methods
PulseCard
{:properties (constantly {::mi/entity-id true})})
(defmethod serdes.hash/identity-hash-fields PulseCard
[_pulse-card]
......
......@@ -185,17 +185,18 @@
(throw (ex-info (tru "Wrong email address for User {0}." id)
{:status-code 403})))))))))
(u/strict-extend #_{:clj-kondo/ignore [:metabase/disallow-class-or-type-on-model]} (class PulseChannel)
models/IModel
(merge
models/IModelDefaults
{:hydration-keys (constantly [:pulse_channel])
:types (constantly {:details :json, :channel_type :keyword, :schedule_type :keyword, :schedule_frame :keyword})
:properties (constantly {:timestamped? true
:entity_id true})
:pre-delete pre-delete
:pre-insert validate-email-domains
:pre-update validate-email-domains}))
(mi/define-methods
PulseChannel
{:hydration-keys (constantly [:pulse_channel])
:types (constantly {:details :json
:channel_type :keyword
:schedule_type :keyword
:schedule_frame :keyword})
:properties (constantly {::mi/timestamped? true
::mi/entity-id true})
:pre-delete pre-delete
:pre-insert validate-email-domains
:pre-update validate-email-domains})
(defmethod serdes.hash/identity-hash-fields PulseChannel
[_pulse-channel]
......
(ns metabase.models.pulse-channel-recipient
(:require
[metabase.models.interface :as mi]
[metabase.plugins.classloader :as classloader]
[metabase.util :as u]
[toucan.models :as models]))
(models/defmodel PulseChannelRecipient :pulse_channel_recipient)
......@@ -12,8 +12,6 @@
(classloader/require 'metabase.models.pulse-channel)
((resolve 'metabase.models.pulse-channel/will-delete-recipient) pcr))
(u/strict-extend #_{:clj-kondo/ignore [:metabase/disallow-class-or-type-on-model]} (class PulseChannelRecipient)
models/IModel
(merge
models/IModelDefaults
{:pre-delete pre-delete}))
(mi/define-methods
PulseChannelRecipient
{:pre-delete pre-delete})
......@@ -6,19 +6,16 @@
[metabase.db :as mdb]
[metabase.mbql.normalize :as mbql.normalize]
[metabase.models.interface :as mi]
[metabase.util :as u]
[metabase.util.honeysql-extensions :as hx]
[toucan.db :as db]
[toucan.models :as models]))
(models/defmodel Query :query)
(u/strict-extend #_{:clj-kondo/ignore [:metabase/disallow-class-or-type-on-model]} (class Query)
models/IModel
(merge models/IModelDefaults
{:types (constantly {:query :json})
:primary-key (constantly :query_hash)}))
(mi/define-methods
Query
{:types (constantly {:query :json})
:primary-key (constantly :query_hash)})
;;; Helper Fns
......
(ns metabase.models.query-cache
"A model used to cache query results in the database."
(:require
[metabase.util :as u]
[metabase.models.interface :as mi]
[toucan.models :as models]))
(models/defmodel QueryCache :query_cache)
(u/strict-extend #_{:clj-kondo/ignore [:metabase/disallow-class-or-type-on-model]} (class QueryCache)
models/IModel
(merge models/IModelDefaults
{:properties (constantly {:updated-at-timestamped? true})}))
(mi/define-methods
QueryCache
{:properties (constantly {::mi/updated-at-timestamped? true})})
......@@ -3,6 +3,7 @@
time, context it was executed in, etc."
(:require
[metabase.mbql.schema :as mbql.s]
[metabase.models.interface :as mi]
[metabase.util :as u]
[metabase.util.i18n :refer [tru]]
[schema.core :as s]
......@@ -21,10 +22,9 @@
;; sadly we have 2 ways to reference the row count :(
(assoc query-execution :row_count (or result_rows 0)))
(u/strict-extend #_{:clj-kondo/ignore [:metabase/disallow-class-or-type-on-model]} (class QueryExecution)
models/IModel
(merge models/IModelDefaults
{:types (constantly {:json_query :json, :status :keyword, :context :keyword})
:pre-insert pre-insert
:pre-update (fn [& _] (throw (Exception. (tru "You cannot update a QueryExecution!"))))
:post-select post-select}))
(mi/define-methods
QueryExecution
{:types (constantly {:json_query :json, :status :keyword, :context :keyword})
:pre-insert pre-insert
:pre-update (fn [& _] (throw (Exception. (tru "You cannot update a QueryExecution!"))))
:post-select post-select})
......@@ -71,13 +71,12 @@
(cond-> revision
model (update :object (partial models/do-post-select model)))))
(u/strict-extend #_{:clj-kondo/ignore [:metabase/disallow-class-or-type-on-model]} (class Revision)
models/IModel
(merge models/IModelDefaults
{:types (constantly {:object :json})
:pre-insert pre-insert
:pre-update (fn [& _] (throw (Exception. (tru "You cannot update a Revision!"))))
:post-select do-post-select-for-object}))
(mi/define-methods
Revision
{:types (constantly {:object :json})
:pre-insert pre-insert
:pre-update (fn [& _] (throw (Exception. (tru "You cannot update a Revision!"))))
:post-select do-post-select-for-object})
;;; # Functions
......
......@@ -27,15 +27,12 @@
(derive ::mi/read-policy.superuser)
(derive ::mi/write-policy.superuser))
(u/strict-extend #_{:clj-kondo/ignore [:metabase/disallow-class-or-type-on-model]} (class Secret)
models/IModel
(merge models/IModelDefaults
{ ;:hydration-keys (constantly [:database :db]) ; don't think there's any hydration going on since other models
; won't have a direct secret-id column
:types (constantly {:value :secret-value
:kind :keyword
:source :keyword})
:properties (constantly {:timestamped? true})}))
(mi/define-methods
Secret
{:types (constantly {:value :secret-value
:kind :keyword
:source :keyword})
:properties (constantly {::mi/timestamped? true})})
;;; ---------------------------------------------- Hydration / Util Fns ----------------------------------------------
......
......@@ -34,15 +34,13 @@
(db/select-one ['Table :db_id :schema :id] :id (u/the-id (:table_id segment))))]
(mi/perms-objects-set table read-or-write)))
(u/strict-extend #_{:clj-kondo/ignore [:metabase/disallow-class-or-type-on-model]} (class Segment)
models/IModel
(merge
models/IModelDefaults
{:types (constantly {:definition :metric-segment-definition})
:properties (constantly {:timestamped? true
:entity_id true})
:hydration-keys (constantly [:segment])
:pre-update pre-update}))
(mi/define-methods
Segment
{:types (constantly {:definition :metric-segment-definition})
:properties (constantly {::mi/timestamped? true
::mi/entity-id true})
:hydration-keys (constantly [:segment])
:pre-update pre-update})
(defmethod serdes.hash/identity-hash-fields Segment
[_segment]
......
......@@ -2,9 +2,9 @@
(:require
[buddy.core.codecs :as codecs]
[buddy.core.nonce :as nonce]
[metabase.models.interface :as mi]
[metabase.server.middleware.misc :as mw.misc]
[metabase.server.request.util :as request.u]
[metabase.util :as u]
[schema.core :as s]
[toucan.models :as models]))
......@@ -25,11 +25,9 @@
(let [session-type (if anti-csrf-token :full-app-embed :normal)]
(assoc session :type session-type)))
(u/strict-extend #_{:clj-kondo/ignore [:metabase/disallow-class-or-type-on-model]} (class Session)
models/IModel
(merge
models/IModelDefaults
{:pre-insert pre-insert
:post-insert post-insert
:pre-update pre-update
:properties (constantly {:created-at-timestamped? true})}))
(mi/define-methods
Session
{:pre-insert pre-insert
:post-insert post-insert
:pre-update pre-update
:properties (constantly {::mi/created-at-timestamped? true})})
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment