-
Notifications
You must be signed in to change notification settings - Fork 4
/
datacenter_issue_hook.rb
119 lines (115 loc) · 4.7 KB
/
datacenter_issue_hook.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
class DatacenterIssueHook < Redmine::Hook::ViewListener
# Add our own elements to issue show view (in show and form sections)
#
# NB: This works too, maybe for future use if we have many things to
# do before rendering :
#
# def view_issues_form_details_bottom(context)
# template = context[:controller].instance_variable_get("@template")
# template.render :partial => "datacenter_plugin/issue_form", :locals => {:context => context}
# end
#
# def view_issues_form_details_bottom(context)
# context[:controller].send(:render, :partial => "datacenter_plugin/issue_form", :locals => {:context => context})
# end
render_on :view_issues_form_details_bottom, :partial => "datacenter_plugin/issue_form"
render_on :view_issues_show_details_bottom, :partial => "datacenter_plugin/issue_show"
# Save our elements related to issues
# It used to work out of the box before r3308, which introduced a "safe_attributes=" method
# for issues, saving only white-listed elements. Of course this is not the case of our
# elements, hence this patch..
#
# Context:
# * :params => Parameters of the request
# * :issue => Current issue object
# * :time_entry => Current time entry
# * :journal => Current journal for this issue
#
def controller_issues_edit_before_save(context)
if context[:params][:issue]
context[:issue].server_ids = context[:params][:issue][:server_ids]
context[:issue].appli_instance_ids = context[:params][:issue][:appli_instance_ids]
end
end
def controller_issues_new_before_save(context)
if context[:params][:issue]
context[:issue].server_ids = context[:params][:issue][:server_ids]
context[:issue].appli_instance_ids = context[:params][:issue][:appli_instance_ids]
end
end
# Add journal details for our elements related to the current issues
#
# Context:
# * :params => Parameters of the request
# * :issue => Current issue object
# * :time_entry => Current time entry
# * :journal => Current journal for this issue
#
def controller_issues_edit_after_save(context)
dc_elements = context[:params][:datacenter_elements_before_change]
if dc_elements
#appli_instance_ids
app_before = dc_elements[:appli_instance_ids].sort
app_after = context[:issue].appli_instance_ids.sort
context[:journal].details << JournalDetail.new(:property => 'attr',
:prop_key => 'appli_instance_ids',
:old_value => app_before,
:value => app_after) unless app_before == app_after
#server_ids
serv_before = dc_elements[:server_ids]
serv_after = context[:issue].server_ids
context[:journal].details << JournalDetail.new(:property => 'attr',
:prop_key => 'server_ids',
:old_value => serv_before,
:value => serv_after) unless serv_before == serv_after
#save changes
context[:journal].save
end
end
# Reformat journal details related to our Appli/Instance models
#
# Context:
# * :detail => Detail about de journal change
# * :label => Label for the current attribute
# * :value => New value for the current attribute
# * :old_value => Old value for the current attribute
#
def helper_issues_show_detail_after_setting(context)
#TODO: DRY it (see ApplisHelper)
#TODO: optimize it: caching between multiple journals and between these two..
d = context[:detail]
if %w(appli_instance_ids server_ids).include?(d.prop_key)
#Principle:
# d.value = YAML.load(d.value.to_s)
# d.value.map! do |a|
# type, id = a.split(":")
# Kernel.const_get(type).find(id).fullname
# end.sort.join(", ")
%w(value old_value).each do |key|
d.send("#{key}=",YAML.load(d.send(key).to_s)) if d.send(key).is_a?(String) && d.send(key).match(/^---/)
if d.send(key).respond_to?(:to_ary)
d.send("#{key}=",d.send(key).map do |value|
case d.prop_key
when 'appli_instance_ids'
if value.match(/^(Appli|Instance):(\d+)$/)
begin
Kernel.const_get($~[1]).find($~[2]).fullname
rescue
"unknown"
end
else
value
end
when 'server_ids'
begin
Server.find(value).name
rescue
"unknown"
end
end
end.compact.sort.join(", "))
end
end
end
end
end