merged cont.
[opensuse:yast-rest-service.git] / webyast / app / controllers / controlpanel_controller.rb
1 #--
2 # Webyast Webclient framework
3 #
4 # Copyright (C) 2009, 2010 Novell, Inc. 
5 #   This library is free software; you can redistribute it and/or modify
6 # it only under the terms of version 2.1 of the GNU Lesser General Public
7 # License as published by the Free Software Foundation. 
8 #
9 #   This library is distributed in the hope that it will be useful, but WITHOUT
10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 
12 # details. 
13 #
14 #   You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software 
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 #++
18
19 #
20 # Control panel
21 #
22 # This is the default controller for webclient
23 #
24
25 require 'yaml'
26
27 class ControlpanelController < ApplicationController
28   before_filter :ensure_login
29   before_filter :ensure_wizard, :only => [:nextstep, :backstep, :thisstep]
30
31   def index
32     return false if need_redirect
33     @shortcuts = shortcuts_data
34     @count = getNumberPermittedModules(@shortcuts)
35   end
36
37   def show_all
38     @shortcut_groups = {}
39     shortcuts_data.each do |name, data|
40       data["groups"].each do |group|
41         @shortcut_groups[group] ||= Array.new
42         @shortcut_groups[group] << data
43       end
44     end
45     @shortcut_groups.each do |group,val|
46       val.sort! { |g1,g2| g1['title'] <=> g2['title'] }
47     end
48   end
49
50   def getNumberPermittedModules(shortcuts)
51     count = 0
52     unless shortcuts.empty? 
53       shortcuts.values.each do |data|
54         if data['disabled'] != false
55           count += 1
56         end
57       end
58     end 
59     return count
60   end 
61   
62   def nextstep
63     bs = Basesystem.new.load_from_session(session)
64     unless params[:done].blank?
65       #in case that user click multiple time on next button
66       #redirect correct bnc#579470
67       unless params[:done] == bs.current_step[:controller]
68         redirect_to bs.current_step 
69         return
70       end
71     end
72     flash.keep #at first keep all flash because first call of flash load it from session and mark all flash messages as used
73     flash.discard :notice #don't show success notice in basesystem (bnc#582803)
74     redirect_to bs.next_step
75   end
76
77   def backstep
78     redirect_to Basesystem.new.load_from_session(session).back_step
79   end
80
81   # when triggered by button/link from basesystem, shows current module from session
82   def thisstep
83     redirect_to Basesystem.new.load_from_session(session).current_step
84   end
85
86   protected
87
88   # nextstep and backstep expect, that wizard session variables are set
89   def ensure_wizard
90     unless Basesystem.new.load_from_session(session).in_process?
91        redirect_to "/controlpanel"
92     end
93   end
94
95   # reads the shortcuts and returns the
96   # hash with the data
97   def shortcuts_data
98     # save shortcuts in the Hash
99     # each shortcuts file has each plugin shortcut named
100     # by a key, we return the same key but namespaced with the plugin
101     # name like pluginname:shortcutkey
102     shortcuts = {}
103     # read shortcuts from plugins
104     #logger.debug Rails::Plugin::Loader.all_plugins.inspect
105     #logger.debug Rails.configuration.load_paths
106     permissions = Permission.find(:all, {:user_id => session[:user]})
107     YaST::LOADED_PLUGINS.each do |plugin|
108       logger.debug "looking into #{plugin.directory}"
109       #Skip obsolete permissions module
110       #unless plugin.name == "permissions"
111       shortcuts.merge!(plugin_shortcuts(plugin, permissions))
112       #end
113     end
114     #logger.debug shortcuts.inspect
115     shortcuts
116   end
117   
118   def translate_shortcuts(node)
119     if node.is_a? Hash
120       node.each do |key,data|
121         node[key] = translate_shortcuts data
122       end
123     elsif node.is_a? Array
124       counter = 0
125       node.each do |data|
126         node[counter] = translate_shortcuts data
127         counter +=1
128       end
129     elsif node.is_a? String
130       node = node.strip
131       if node =~ /^_\(\"/ && node =~ /\"\)$/
132         node = _(node[3..node.length-3]) #try to translate it
133       end
134     end
135     return node
136   end 
137
138   # reads shortcuts of a specific plugin directory
139   def plugin_shortcuts(plugin, all_permissions)
140     permissions = {}
141     all_permissions.each do |p|
142       permissions[p[:id]] = p[:granted]
143     end
144     shortcuts = {}
145     shortcuts_fn = File.join(plugin.directory, 'shortcuts.yml')
146     if File.exists?(shortcuts_fn)
147       #logger.debug "Shortcuts at #{plugin.directory}"
148       shortcutsdata = YAML::load(File.open(shortcuts_fn))
149       #loading translations 
150       mo_files = Dir.glob(File.join(plugin.directory, "**", "*.mo"))
151       if mo_files.size > 0
152         locale_path = File.dirname(File.dirname(File.dirname(mo_files.first))) 
153         #logger.info "Loading textdomain #{File.basename(mo_files.first, '.mo')} from #{locale_path} for shortcuts"
154         opt = {:locale_path => locale_path}
155         ActionController::Base.init_gettext(File.basename(mo_files.first, ".mo"), opt)
156       else
157         logger.warn "Cannot find shortcut translation for #{plugin.name}"
158       end
159       shortcutsdata = translate_shortcuts shortcutsdata
160       return nil unless shortcutsdata.is_a? Hash
161       # now go over each shortcut and add it to the modules
162       shortcutsdata.each do |k,v|
163         # use the plugin name and the shortcut key as
164         # the new key
165         shortcuts["#{plugin.name}:#{k}"] = v
166         v["disabled"] = false #backward compatibility
167         if v.include? "read_permissions"
168           perms = v["read_permissions"]
169           perms.each do |perm|
170             v["disabled"] = v["disabled"] || !permissions[perm]
171           end
172         end
173       end
174     end
175     shortcuts
176   end
177   
178
179   # Checks if basic system module should be shown instead of control panel
180   # and if it should, then also redirects to that module.
181   # TODO check if controller from config exists
182   def need_redirect
183     first_run = !(Basesystem.new.load_from_session(session).initialized)
184     logger.debug "first run of basesystem: #{first_run}.\n Session: #{session.inspect}."
185     bs = Basesystem.find(session)
186     # session variable is used to find out, if basic system module is needed
187     return false if bs.completed?
188     # error happen during basesystem, so show this page (prevent endless loop bnc#554989) 
189     if first_run
190       redirect_to bs.current_step
191     else 
192       logger.info "error occur during basesystem. render basesystem screen"
193       render :action => "basesystem"
194     end
195     return true
196   end
197 end