Skip to content
Snippets Groups Projects
Commit d8e75747 authored by Cam Saul's avatar Cam Saul
Browse files

track whether revisions are reversions

parent 46266e46
No related branches found
No related tags found
No related merge requests found
......@@ -42,6 +42,12 @@ databaseChangeLog:
type: varchar
constraints:
nullable: false
- column:
name: is_reversion
type: boolean
defaultValueBoolean: false
constraints:
nullable: false
- createIndex:
tableName: revision
indexName: idx_revision_model_model_id
......
......@@ -4,10 +4,10 @@
[metabase.db :refer [sel ins upd] :as db]
[metabase.api.common :refer [*current-user-id* let-404]]
(metabase.models [card :refer [Card]]
[diff :refer [diff-str]]
[hydrate :refer [hydrate]]
[interface :refer :all]
[user :refer [User]])
[metabase.models.revision.diff :refer [diff-str]]
[metabase.util :as u]))
(def ^:const max-revisions
......@@ -92,7 +92,7 @@
(defn push-revision
"Record a new `Revision` for ENTITY with ID.
Returns OBJECT."
[& {object :object, :keys [entity id user-id skip-serialization?], :or {user-id *current-user-id*, id (:id object), skip-serialization? false}}]
[& {object :object, :keys [entity id user-id skip-serialization? is-reversion?], :or {user-id *current-user-id*, id (:id object), skip-serialization? false, is-reversion? false}}]
{:pre [(metabase-entity? entity)
(integer? user-id)
(db/exists? User :id user-id)
......@@ -102,7 +102,7 @@
(let [object (if skip-serialization? object
(serialize-instance entity id object))]
(assert (map? object))
(ins Revision :model (:name entity) :model_id id, :user_id user-id, :object object))
(ins Revision :model (:name entity) :model_id id, :user_id user-id, :object object, :is_reversion is-reversion?))
(delete-old-revisions entity id)
object)
......@@ -133,7 +133,7 @@
(let-404 [serialized-instance (sel :one :field [Revision :object] :model (:name entity), :model_id id, :id revision-id)]
(revert-to-revision entity id serialized-instance)
;; Push a new revision to record this reversion
(push-revision :entity entity, :id id, :object serialized-instance, :user-id user-id, :skip-serialization? true)))
(push-revision :entity entity, :id id, :object serialized-instance, :user-id user-id, :skip-serialization? true, :is-reversion? true)))
(defn a []
......
(ns metabase.models.diff
(ns metabase.models.revision.diff
(:require [clojure.core.match :refer [match]]
(clojure [data :as data]
[string :as s])))
......@@ -6,7 +6,7 @@
(defn- diff-str* [t k v1 v2]
(match [t k v1 v2]
[_ :name _ _]
(format "renamed it from \"%s\" to \"%s\"" (clojure.string/upper-case v1) v2)
(format "renamed it from \"%s\" to \"%s\"" v1 v2)
[_ :private true false]
"made it public"
......@@ -23,12 +23,12 @@
[_ _ _ _]
(format "changed %s from \"%s\" to \"%s\"" (name k) v1 v2)))
(defn- interpose-build-runon-sentence [parts]
(defn- build-sentence [parts]
(when (seq parts)
(cond
(= (count parts) 1) (str (first parts) \.)
(= (count parts) 2) (format "%s and %s." (first parts) (second parts))
:else (format "%s, %s" (first parts) (interpose-build-runon-sentence (rest parts))))))
:else (format "%s, %s" (first parts) (build-sentence (rest parts))))))
(defn diff-str
([t o1 o2]
......@@ -37,7 +37,7 @@
(let [ks (keys before)]
(some-> (filter identity (for [k ks]
(diff-str* t k (k before) (k after))))
interpose-build-runon-sentence
build-sentence
(s/replace-first #" it " (format " this %s " t)))))))
([username t o1 o2]
(let [s (diff-str t o1 o2)]
......
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