[webui] improve the services ui
[opensuse:build-service.git] / src / webui / app / controllers / request_controller.rb
1 class RequestController < ApplicationController
2
3   def addreviewer
4     if params[:id]
5       @therequest = find_cached(BsRequest, params[:id] )
6     end
7     BsRequest.free_cache( params[:id] )
8     begin
9       if params[:user]
10         r = BsRequest.addReviewByUser( params[:id], params[:user], params[:comment] )
11       elsif params[:group]
12         r = BsRequest.addReviewByGroup( params[:id], params[:group], params[:comment] )
13       else
14         render :text => "ERROR: don't know how to add reviewer"
15         return
16       end
17     rescue BsRequest::ModifyError => e
18       render :text => e.message
19       return
20     end
21     render :text => "added"
22   end
23
24   def modifyreviewer
25     if params[:id]
26       @therequest = find_cached(BsRequest, params[:id] )
27     end
28     BsRequest.free_cache( params[:id] )
29
30     begin
31       if params[:group].blank?
32         r = BsRequest.modifyReviewByUser( params[:id], params[:new_state], params[:comment], session[:login] )
33       else
34         r = BsRequest.modifyReviewByGroup( params[:id], params[:new_state], params[:comment], params[:group] )
35       end
36
37     rescue BsRequest::ModifyError => e
38       render :text => e.message
39       return
40     end
41     render :text => params[:new_state]
42   end
43
44   def show
45     @therequest = BsRequest.find_cached(params[:id]) if params[:id]
46     unless @therequest
47       flash[:error] = "Can't find request #{params[:id]}"
48       redirect_to :action => :index and return
49     end
50
51     @id = @therequest.data.attributes["id"]
52     @state = @therequest.state.data.attributes["name"]
53     @is_author = @therequest.has_element? "//state[@name='new' and @who='#{session[:login]}']"
54     @newpackage = []
55
56     @is_reviewer = false
57     @therequest.each_review do |review|
58        if review.has_attribute? :by_user
59           if review.by_user.to_s == session[:login]
60             @is_reviewer = true
61             break
62           end
63        end
64
65        if review.has_attribute? :by_group
66          if @user.is_in_group? review.by_group
67             @is_reviewer = true
68             break
69          end
70        end
71     end
72
73     @revoke_own = (["revoke"].include? params[:changestate]) ? true : false
74   
75     @is_maintainer = nil
76     @therequest.each_action do |action|
77       # FIXME: this can't handle multiple actions in a request
78       @type = action.data.attributes["type"]
79       if @type=="submit"
80         @src_project = action.source.project
81         @src_pkg = action.source.package
82       end
83       @target_project = find_cached(Project, action.target.project, :expires_in => 5.minutes)
84       @target_pkg_name = action.target.value :package
85       @target_pkg = find_cached(Package, @target_pkg_name, :project => action.target.project) if @target_pkg_name
86       if @is_maintainer == nil or @is_maintainer == true
87         @is_maintainer = @target_project && @target_project.can_edit?( session[:login] )
88         if @target_pkg
89           @is_maintainer = @is_maintainer || @target_pkg.can_edit?( session[:login] )
90         else
91           @newpackage << { :project => action.target.project, :package => @target_pkg_name }
92         end
93       end
94     end
95
96     # get the entire diff from the api
97     begin
98       transport ||= ActiveXML::Config::transport_for :bsrequest
99       @diff_text = transport.direct_http URI("/request/#{@id}?cmd=diff"), :method => "POST", :data => ""
100     rescue ActiveXML::Transport::Error => e
101       @diff_error, code, api_exception = ActiveXML::Transport.extract_error_message e
102       flash.now[:error] = "Can't get diff for request: #{@diff_error}"
103     end
104
105   end
106  
107   def change_request(changestate, params)
108     BsRequest.free_cache( params[:id] )
109     begin
110       if BsRequest.modify( params[:id], changestate, params[:reason] )
111         flash[:note] = "Request #{changestate}!"
112         return true
113       else
114         flash[:error] = "Can't change request to #{changestate}!"
115       end
116     rescue BsRequest::ModifyError => e
117       flash[:error] = e.message
118     end
119     return false
120   end
121   private :change_request
122
123
124   def changerequest
125     @therequest = find_cached(BsRequest, params[:id] ) if params[:id]
126     unless @therequest
127       flash[:error] = "Can't find request #{params[:id]}"
128       redirect_to :action => :index and return
129     end
130
131     changestate = nil
132     %w{forward accepted declined revoked}.each do |s|
133       if params.has_key? s
134         changestate = s
135         break
136       end
137     end
138
139     if changestate == 'forward' # special case
140       description = @therequest.description.text
141       logger.debug 'request ' +  @therequest.dump_xml
142
143       if @therequest.has_element? 'state'
144         who = @therequest.state.data["who"].to_s
145         description += " (forwarded request %d from %s)" % [params[:id], who]
146       end
147
148       if not change_request('accepted', params)
149         redirect_to :action => :show, :id => params[:id]
150         return
151       end
152
153       rev = Package.current_rev(@therequest.action.target.project, @therequest.action.target.package)
154       @therequest = BsRequest.new(:type => "submit", :targetproject => params[:forward_project], :targetpackage => params[:forward_package],
155         :project => @therequest.action.target.project, :package => @therequest.action.target.package, :rev => rev, :description => description)
156       @therequest.save(:create => true)
157       Rails.cache.delete "requests_new"
158       flash[:note] = "Request #{params[id]} accepted and forwarded"
159       redirect_to :controller => :request, :action => :show, :id => @therequest.data["id"]
160       return
161     end
162
163     change_request(changestate, params)
164     Directory.free_cache( :project => @therequest.action.target.project, :package => @therequest.action.target.value('package') )
165     redirect_to :action => :show, :id => params[:id]
166   end
167
168   def diff
169     # just for compatibility. OBS 1.X used this route for show
170     redirect_to :action => :show, :id => params[:id]
171   end
172
173 end