Mercurial > hg > soundsoftware-site
comparison lib/redmine/hook.rb @ 909:cbb26bc654de redmine-1.3
Update to Redmine 1.3-stable branch (Redmine SVN rev 8964)
author | Chris Cannam |
---|---|
date | Fri, 24 Feb 2012 19:09:32 +0000 |
parents | 94944d00e43c |
children | 433d4f72a19b |
comparison
equal
deleted
inserted
replaced
908:c6c2cbd0afee | 909:cbb26bc654de |
---|---|
1 # Redmine - project management software | 1 # Redmine - project management software |
2 # Copyright (C) 2006-2008 Jean-Philippe Lang | 2 # Copyright (C) 2006-2011 Jean-Philippe Lang |
3 # | 3 # |
4 # This program is free software; you can redistribute it and/or | 4 # This program is free software; you can redistribute it and/or |
5 # modify it under the terms of the GNU General Public License | 5 # modify it under the terms of the GNU General Public License |
6 # as published by the Free Software Foundation; either version 2 | 6 # as published by the Free Software Foundation; either version 2 |
7 # of the License, or (at your option) any later version. | 7 # of the License, or (at your option) any later version. |
8 # | 8 # |
9 # This program is distributed in the hope that it will be useful, | 9 # This program is distributed in the hope that it will be useful, |
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 # GNU General Public License for more details. | 12 # GNU General Public License for more details. |
13 # | 13 # |
14 # You should have received a copy of the GNU General Public License | 14 # You should have received a copy of the GNU General Public License |
15 # along with this program; if not, write to the Free Software | 15 # along with this program; if not, write to the Free Software |
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
17 | 17 |
18 module Redmine | 18 module Redmine |
20 include ActionController::UrlWriter | 20 include ActionController::UrlWriter |
21 | 21 |
22 @@listener_classes = [] | 22 @@listener_classes = [] |
23 @@listeners = nil | 23 @@listeners = nil |
24 @@hook_listeners = {} | 24 @@hook_listeners = {} |
25 | 25 |
26 class << self | 26 class << self |
27 # Adds a listener class. | 27 # Adds a listener class. |
28 # Automatically called when a class inherits from Redmine::Hook::Listener. | 28 # Automatically called when a class inherits from Redmine::Hook::Listener. |
29 def add_listener(klass) | 29 def add_listener(klass) |
30 raise "Hooks must include Singleton module." unless klass.included_modules.include?(Singleton) | 30 raise "Hooks must include Singleton module." unless klass.included_modules.include?(Singleton) |
31 @@listener_classes << klass | 31 @@listener_classes << klass |
32 clear_listeners_instances | 32 clear_listeners_instances |
33 end | 33 end |
34 | 34 |
35 # Returns all the listerners instances. | 35 # Returns all the listerners instances. |
36 def listeners | 36 def listeners |
37 @@listeners ||= @@listener_classes.collect {|listener| listener.instance} | 37 @@listeners ||= @@listener_classes.collect {|listener| listener.instance} |
38 end | 38 end |
39 | 39 |
40 # Returns the listeners instances for the given hook. | 40 # Returns the listeners instances for the given hook. |
41 def hook_listeners(hook) | 41 def hook_listeners(hook) |
42 @@hook_listeners[hook] ||= listeners.select {|listener| listener.respond_to?(hook)} | 42 @@hook_listeners[hook] ||= listeners.select {|listener| listener.respond_to?(hook)} |
43 end | 43 end |
44 | 44 |
45 # Clears all the listeners. | 45 # Clears all the listeners. |
46 def clear_listeners | 46 def clear_listeners |
47 @@listener_classes = [] | 47 @@listener_classes = [] |
48 clear_listeners_instances | 48 clear_listeners_instances |
49 end | 49 end |
50 | 50 |
51 # Clears all the listeners instances. | 51 # Clears all the listeners instances. |
52 def clear_listeners_instances | 52 def clear_listeners_instances |
53 @@listeners = nil | 53 @@listeners = nil |
54 @@hook_listeners = {} | 54 @@hook_listeners = {} |
55 end | 55 end |
56 | 56 |
57 # Calls a hook. | 57 # Calls a hook. |
58 # Returns the listeners response. | 58 # Returns the listeners response. |
59 def call_hook(hook, context={}) | 59 def call_hook(hook, context={}) |
60 [].tap do |response| | 60 [].tap do |response| |
61 hls = hook_listeners(hook) | 61 hls = hook_listeners(hook) |
99 # Default to creating links using only the path. Subclasses can | 99 # Default to creating links using only the path. Subclasses can |
100 # change this default as needed | 100 # change this default as needed |
101 def self.default_url_options | 101 def self.default_url_options |
102 {:only_path => true } | 102 {:only_path => true } |
103 end | 103 end |
104 | 104 |
105 # Helper method to directly render a partial using the context: | 105 # Helper method to directly render a partial using the context: |
106 # | 106 # |
107 # class MyHook < Redmine::Hook::ViewListener | 107 # class MyHook < Redmine::Hook::ViewListener |
108 # render_on :view_issues_show_details_bottom, :partial => "show_more_data" | 108 # render_on :view_issues_show_details_bottom, :partial => "show_more_data" |
109 # end | 109 # end |
110 # | 110 # |
111 def self.render_on(hook, options={}) | 111 def self.render_on(hook, options={}) |
112 define_method hook do |context| | 112 define_method hook do |context| |
113 context[:controller].send(:render_to_string, {:locals => context}.merge(options)) | 113 context[:controller].send(:render_to_string, {:locals => context}.merge(options)) |
114 end | 114 end |
115 end | 115 end |
116 end | 116 end |
117 | 117 |
118 # Helper module included in ApplicationHelper and ActionControllerso that | 118 # Helper module included in ApplicationHelper and ActionController so that |
119 # hooks can be called in views like this: | 119 # hooks can be called in views like this: |
120 # | 120 # |
121 # <%= call_hook(:some_hook) %> | 121 # <%= call_hook(:some_hook) %> |
122 # <%= call_hook(:another_hook, :foo => 'bar' %> | 122 # <%= call_hook(:another_hook, :foo => 'bar') %> |
123 # | 123 # |
124 # Or in controllers like: | 124 # Or in controllers like: |
125 # call_hook(:some_hook) | 125 # call_hook(:some_hook) |
126 # call_hook(:another_hook, :foo => 'bar' | 126 # call_hook(:another_hook, :foo => 'bar') |
127 # | 127 # |
128 # Hooks added to views will be concatenated into a string. Hooks added to | 128 # Hooks added to views will be concatenated into a string. Hooks added to |
129 # controllers will return an array of results. | 129 # controllers will return an array of results. |
130 # | 130 # |
131 # Several objects are automatically added to the call context: | 131 # Several objects are automatically added to the call context: |
132 # | 132 # |
133 # * project => current project | 133 # * project => current project |
134 # * request => Request instance | 134 # * request => Request instance |
135 # * controller => current Controller instance | 135 # * controller => current Controller instance |
136 # | 136 # |
137 module Helper | 137 module Helper |
138 def call_hook(hook, context={}) | 138 def call_hook(hook, context={}) |
139 if is_a?(ActionController::Base) | 139 if is_a?(ActionController::Base) |
140 default_context = {:controller => self, :project => @project, :request => request} | 140 default_context = {:controller => self, :project => @project, :request => request} |
141 Redmine::Hook.call_hook(hook, default_context.merge(context)) | 141 Redmine::Hook.call_hook(hook, default_context.merge(context)) |
142 else | 142 else |
143 default_context = {:controller => controller, :project => @project, :request => request} | 143 default_context = {:controller => controller, :project => @project, :request => request} |
144 Redmine::Hook.call_hook(hook, default_context.merge(context)).join(' ') | 144 Redmine::Hook.call_hook(hook, default_context.merge(context)).join(' ') |
145 end | 145 end |
146 end | 146 end |
147 end | 147 end |
148 end | 148 end |
149 end | 149 end |
150 | 150 |