Blob of app/models/journal.rb (raw blob data)

1 #
2 # Journal records changes to a model
3 #
4 # You call it when create a new wiki or article etc.
5 # You call it when you update a model
6 # It records the differences
7 #
8 # You can then view the change history of a ticket etc.
9 #
10 class Journal < ActiveRecord::Base
11
12 #
13 # Create journal entry
14 # model: @wiki | @article etc.
15 # ip: IP address
16 # user_id: user id of changer
17 #
18 def self.create (model, ip, project_id, user_id)
19 # record that something has happened
20 journal = Journal.new
21 journal.action = :create
22 journal.model_type = model.class.to_s
23 journal.row_id = model.id
24 journal.ip = ip
25 journal.user_id = user_id
26 journal.summary = "Created new " << model.class.to_s
27 #TODO check saves okay
28 journal.save
29
30 for column in model.class.columns
31 #filter columns we don't want to track
32 case column.name
33 when "created_at", "updated_at", "views", "id"
34 else
35 change = Change.new
36 change.journal_id = journal.id
37 change.model_column = column.name
38 change.datatype = column.class
39 #
40 case column.type
41 when :integer
42 c = ChangedInteger.new
43 when :float
44 c = ChangedFloat.new
45 when :string
46 c = ChangedString.new
47 when :text
48 c = ChangedText.new
49 when :boolean
50 c = ChangedBoolean.new
51 when :datetime, :date, :time
52 c = ChangedDatetime.new
53 when :enum
54 c = ChangedEnum.new
55 else
56 #TODO raise some unknown type exception
57 end
58 #
59 c.data = model[column.name]
60 #TODO check saves okay
61 c.save
62 change.data_id = c.id
63 #TODO check saves okay
64 change.save
65 end
66 end
67
68 #TODO check error
69 e = Event.new
70 e.project_id = project_id if project_id
71 e.user_id = user_id if user_id
72 e.entry_type = :journal
73 e.entry_id = journal.id
74 e.save
75 end
76
77 #
78 # Update journal entry
79 # model: @wiki | @article etc.
80 # ip: IP address
81 # user_id: user id of changer
82 #
83 def self.update (original_model, updated_model, ip, project_id, user_id, summary)
84
85 # record that something has happened
86 journal = Journal.new
87 journal.action = :update
88 journal.model_type = updated_model.class.to_s
89 journal.row_id = updated_model.id
90 journal.ip = ip
91 journal.user_id = user_id
92 journal.summary = summary
93 #TODO check saves okay
94 journal.save
95 #
96 s = ""
97 for column in updated_model.type.columns
98 #s << original_model[column.name].to_s << "/" + updated_model[column.name].to_s << "</br>"
99 if original_model[column.name] != updated_model[column.name]
100 #filter columns we don't want to track
101 case column.name
102 when "created_at", "updated_at", "views", "id"
103 else
104 change = Change.new
105 change.journal_id = journal.id
106 change.model_column = column.name
107 change.datatype = column.type
108 #
109 case column.type
110 when :integer
111 c = ChangedInteger.new
112 when :float
113 c = ChangedFloat.new
114 when :string
115 c = ChangedString.new
116 when :text
117 c = ChangedText.new
118 when :boolean
119 c = ChangedBoolean.new
120 when :datetime, :date, :time
121 c = ChangedDatetime.new
122 when :enum
123 c = ChangedEnum.new
124 else
125 #TODO raise some unknown type exception
126 end
127 #
128 c.data = updated_model[column.name]
129 #TODO check saves okay
130 c.save
131 change.data_id = c.id
132 #TODO check saves okay
133 change.save
134 end
135 end
136 end
137
138 #TODO insert an event
139 e = Event.new
140 e.project_id = project_id if project_id
141 e.user_id = user_id if user_id
142 e.entry_type = :journal
143 e.entry_id = journal.id
144 e.save
145
146 end
147
148 end