[webui] fixed changing of attributes, gave the attribute pages some love
[opensuse:build-service.git] / src / webui / app / controllers / attribute_controller.rb
1 class AttributeController < ApplicationController
2
3   helper :all
4
5   before_filter :requires
6
7   def edit
8     if params[:namespace] and params[:name]
9       selected_attribute = @attributes.data.find_first( "attribute[@name='#{params[:name]}' and @namespace='#{params[:namespace]}']")
10       @selected_attribute_name =  "%s:%s" % [params[:namespace], params[:name]]
11       @selected_attribute_value = selected_attribute.find("value").map{|value| value.content.strip}.join(', ') if selected_attribute
12     else
13       namespaces = find_cached(Attribute, :namespaces)
14       attributes = []
15       @attribute_list = []
16       namespaces.each do |d|
17          attributes << find_cached(Attribute, :attributes, :namespace => d.data[:name].to_s, :expires_in => 10.minutes)
18       end
19       attributes.each do |d|
20         if d.has_element? :entry
21           d.each do |f|
22             @attribute_list << "#{d.init_options[:namespace]}:#{f.data[:name]}"
23           end
24         end
25       end
26       @attributes.each do |d|
27         @attribute_list.delete(d.name)  
28       end
29     end
30   end
31
32   def save
33     valid_http_methods(:post)
34     values = params[:values].split(',')
35     namespace, name = params[:attribute].split(/:/)
36     @attributes.set(namespace, name, values)
37     result = @attributes.save
38     Attribute.free_cache( @attribute_opts )
39     opt = {:controller => "attribute", :action => "show", :project => @project.name }
40     opt.store( :package, params[:package] ) if params[:package]
41     flash[result[:type]] = result[:msg]
42     redirect_to opt
43   end
44
45   def delete
46     valid_http_methods(:post, :delete)
47     result = @attributes.delete(params[:namespace], params[:name])
48     flash[result[:type]] = result[:msg]
49     Attribute.free_cache( @attribute_opts )
50     opt = {:controller => "attribute", :action => "show", :project => @project.name }
51     opt.store( :package, params[:package] ) if params[:package]
52     redirect_to opt
53   end
54
55   
56 private
57
58   def requires
59     @project = find_cached(Project, params[:project], :expires_in => 5.minutes )
60     unless @project
61       flash[:error] = "Project not found: #{params[:project]}"
62       redirect_to :controller => "project", :action => "list_public"
63       return
64     end
65     @package = params[:package] if params[:package]
66     @attribute_opts = {:project => @project.name}
67     @attribute_opts.store(:package, @package.to_s) if @package
68     @attributes = find_cached(Attribute, @attribute_opts, :expires_in => 2.minutes)
69   end
70
71 end