repositories - added AJAX handler for enabling/disabling a repo
[opensuse:yast-web-client.git] / plugins / software / app / controllers / repositories_controller.rb
1 require 'yast/service_resource'
2 require 'client_exception'
3
4 class RepositoriesController < ApplicationController
5
6   before_filter :login_required
7   layout 'main'
8   include ProxyLoader
9
10   # Initialize GetText and Content-Type.
11   init_gettext 'yast_webclient_repositories'
12
13   def index
14     @repos = load_proxy 'org.opensuse.yast.system.repositories', :all
15     return unless @repos
16     Rails.logger.debug "Available repositories: #{@repos.inspect}"
17   end
18
19   def show
20     if params[:id].blank?
21       flash[:error] = _('Missing repository parameter')
22       redirect_to :action => :index and return
23     end
24
25     @repo = load_proxy 'org.opensuse.yast.system.repositories', URI.escape(params[:id])
26     return unless @repo
27
28     @adding = false
29   end
30
31   def delete
32     if params[:id].blank?
33       flash[:error] = _('Missing repository parameter')
34       redirect_to :action => 'index' and return
35     end
36
37     @repo = load_proxy 'org.opensuse.yast.system.repositories', URI.escape(params[:id])
38     return unless @repo
39
40     @repo.id = URI.escape(@repo.id)
41
42     if @repo.destroy
43       flash[:message] = _("Repository '#{@repo.id}' has been deleted.")
44     end
45
46     redirect_to :action => :index and return
47   end
48
49   def update
50     if params[:id].blank?
51       flash[:error] = _('Missing repository parameter')
52       redirect_to :action => :index and return
53     end
54
55     @repo = load_proxy 'org.opensuse.yast.system.repositories', URI.escape(params[:id])
56     return unless @repo
57
58     repository = params[:repository]
59
60     @repo.name = repository[:name]
61     @repo.autorefresh = repository[:autorefresh]
62     @repo.enabled = repository[:enabled]
63     @repo.keep_packages = repository[:keep_packages]
64     @repo.url = repository[:url]
65     @repo.priority = repository[:priority].to_i
66
67     @repo.id = URI.escape(@repo.id)
68
69     begin
70       if @repo.save
71         flash[:message] = _("Repository '#{params[:id]}' has been updated.")
72       end
73     rescue ActiveResource::ServerError => ex
74       begin
75         Rails.log.error "Received ActiveResource::ServerError: #{ex.inspect}"
76         err = Hash.from_xml ex.response.body
77
78         if !err['error']['description'].blank?
79           flash[:error] = _("Cannot update repository '#{params[:id]}': #{err['error']['description']}")
80         else
81           flash[:error] = _("Unknown backend error.")
82         end
83       rescue Exception => e
84           # XML parsing has failed, display complete response
85           flash[:error] = _("Unknown backend error: #{ex.response.body}")
86       end
87     end
88
89     redirect_to :action => :show, :id => params[:id] and return
90   end
91
92   def add
93     # load only permissions
94     @client = YaST::ServiceResource.proxy_for('org.opensuse.yast.system.repositories')
95     @permissions = @client.permissions
96
97     @repo = @client.new
98
99     # add default properties
100     defaults = {
101       :id => '',
102       :name => '',
103       :url => 'http://',
104       :autorefresh => true,
105       :enabled => true,
106       :keep_packages => false,
107       :priority => 99
108     }
109
110     @repo.load(defaults)
111
112     @adding = true
113
114     render :show
115   end
116
117   def create
118     # load only permissions
119     @client = YaST::ServiceResource.proxy_for('org.opensuse.yast.system.repositories')
120     @permissions = @client.permissions
121
122     @repo = @client.new
123     repository = params[:repository]
124     @repo.load(repository)
125
126     @repo.id = URI.escape(@repo.id)
127
128     begin
129       if @repo.save
130         flash[:message] = _("Repository '#{params[:id]}' has been added.")
131       end
132     rescue ActiveResource::ServerError => ex
133       begin
134         Rails.log.error "Received ActiveResource::ServerError: #{ex.inspect}"
135         err = Hash.from_xml ex.response.body
136
137         if !err['error']['description'].blank?
138           flash[:error] = _("Cannot update repository '#{params[:id]}': #{err['error']['description']}")
139         else
140           flash[:error] = _("Unknown backend error.")
141         end
142       rescue Exception => e
143           # XML parsing has failed, display complete response
144           flash[:error] = _("Unknown backend error: #{ex.response.body}")
145       end
146     end
147
148     redirect_to :action => :index and return
149   end
150
151   def set_status
152     if params[:id].blank?
153     end
154
155     enabled = params[:enabled] == 'true'
156     Rails.logger.debug "Setting repository status: '#{params[:id]}' => #{enabled}"
157
158     @repo = load_proxy 'org.opensuse.yast.system.repositories', URI.escape(params[:id])
159     return unless @repo
160
161     @repo.enabled = enabled
162     @repo.id = URI.escape(@repo.id)
163
164     error_string = ''
165
166     begin
167       @repo.save
168     rescue ActiveResource::ServerError => ex
169       begin
170         Rails.logger.error "Received ActiveResource::ServerError: #{ex.inspect}"
171         err = Hash.from_xml ex.response.body
172
173         if !err['error']['description'].blank?
174           error_string = _("Cannot update repository '#{params[:id]}': #{err['error']['description']}")
175         else
176           error_string = _("Unknown backend error.")
177         end
178       rescue Exception => e
179           # XML parsing has failed
180           error_string = _("Unknown backend error.")
181       end
182     end
183
184     render :partial => 'repository_checkbox', :locals => {:error => error_string, :id => @repo.id, :enabled => @repo.enabled, :disabled => !@permissions[:write]}
185
186   end
187
188   end