ignore this please, forgot to rebase and fix some tests, will send again
On 09/30/2010 04:10 PM, jprovazn(a)redhat.com wrote:
From: Jan Provaznik<jprovazn(a)redhat.com>
- packages/groups are selected on separate page by checkboxes
- when whole group is checked, only non-optional packages are selected
- packages which are already selected are checked and disabled in selection list
---
src/app/controllers/templates_controller.rb | 46 ++++++++-------
src/app/util/image_descriptor_xml.rb | 4 +-
src/app/util/repository_manager.rb | 20 ++++++
.../util/repository_manager/comps_repository.rb | 2 +-
src/app/util/repository_manager/pulp_repository.rb | 6 +-
src/app/views/templates/_content_selection.haml | 63 ++++++++++++--------
src/app/views/templates/_managed_content.haml | 1 +
src/app/views/templates/add_software_form.haml | 1 +
src/app/views/templates/new.haml | 3 -
9 files changed, 90 insertions(+), 56 deletions(-)
create mode 100644 src/app/views/templates/add_software_form.haml
diff --git a/src/app/controllers/templates_controller.rb
b/src/app/controllers/templates_controller.rb
index 9361eff..37bf727 100644
--- a/src/app/controllers/templates_controller.rb
+++ b/src/app/controllers/templates_controller.rb
@@ -57,10 +57,20 @@ class TemplatesController< ApplicationController
# synchronize it at first to xml
@tpl.update_xml_attributes!(params[:tpl])
- # if add/remove pkg/group, we only update xml and render 'new' template
+ # if remove pkg, we only update xml and render 'new' template
# again
- if update_selection
- render :action => 'new'
+ params.keys.each do |param|
+ if param =~ /^remove_package_(.*)$/
+ update_group_or_package(:remove_package, $1, nil)
+ render :action => 'new'
+ return
+ end
+ end
+
+ if params[:add_software]
+ @repository_manager = RepositoryManager.new
+ @groups =
@repository_manager.all_groups_with_tagged_selected_packages((a)tpl.xml.packages,
params[:repository])
+ render :action => 'add_software_form'
return
end
@@ -75,6 +85,18 @@ class TemplatesController< ApplicationController
end
end
+ def add_software
+ @tpl = params[:template_id] ? Template.find(params[:template_id]) :
Template.new(params[:template_id])
+ @repository_manager = RepositoryManager.new
+ @groups = @repository_manager.all_groups(params[:repository])
+ if params[:add_selected]
+ params[:groups].to_a.each { |group| @tpl.xml.add_group(group) }
+ params[:packages].to_a.each { |pkg| @tpl.xml.add_package(pkg, nil) }
+ @tpl.save_xml!
+ end
+ render :action => 'new'
+ end
+
def build_form
raise "select template to build" unless params[:image] and
params[:image][:template_id]
@image = Image.new(params[:image])
@@ -133,24 +155,6 @@ class TemplatesController< ApplicationController
private
- def update_selection
- # TODO: don't know better way how to select package and also save other form
data than
- # passing pkg/group as part of submit button name
- params.keys.each do |param|
- if param =~ /^select_package_(.*)$/
- update_group_or_package(:add_package, $1, nil)
- return true
- elsif param =~ /^remove_package_(.*)$/
- update_group_or_package(:remove_package, $1, nil)
- return true
- elsif param =~ /^select_group_(.*)$/
- update_group_or_package(:add_group, $1)
- return true
- end
- end
- return false
- end
-
def update_group_or_package(method, *args)
@repository_manager = RepositoryManager.new
@groups = @repository_manager.all_groups(params[:repository])
diff --git a/src/app/util/image_descriptor_xml.rb b/src/app/util/image_descriptor_xml.rb
index 28effb5..f437574 100644
--- a/src/app/util/image_descriptor_xml.rb
+++ b/src/app/util/image_descriptor_xml.rb
@@ -199,8 +199,8 @@ class ImageDescriptorXML
groups_node = get_or_create_node('groups')
add_group_node(groups_node, gname)
end
- group[:packages].each do |p, type|
- next if type == 'optional'
+ group[:packages].each do |p, info|
+ next if info[:type] == 'optional'
add_package(p, group[:name])
end
end
diff --git a/src/app/util/repository_manager.rb b/src/app/util/repository_manager.rb
index 11b6c5e..7ecaf35 100644
--- a/src/app/util/repository_manager.rb
+++ b/src/app/util/repository_manager.rb
@@ -58,6 +58,26 @@ class RepositoryManager
return @all_packages
end
+ def all_groups_with_tagged_selected_packages(pkgs, repository = nil)
+ groups = all_groups(repository)
+ groups.each_value do |group|
+ pkgs.each do |pkg|
+ next unless p = group[:packages][pkg[:name]]
+ p[:selected] = true
+ end
+ # if all non-optional packages are selected, mark all
+ # group as selected
+ group[:selected] = true
+ group[:packages].each_value do |pkg|
+ if pkg[:type] != 'optional' and !pkg[:selected]
+ group[:selected] = false
+ break
+ end
+ end
+ end
+ return groups
+ end
+
private
def load_config
diff --git a/src/app/util/repository_manager/comps_repository.rb
b/src/app/util/repository_manager/comps_repository.rb
index d7e192a..9afe68b 100644
--- a/src/app/util/repository_manager/comps_repository.rb
+++ b/src/app/util/repository_manager/comps_repository.rb
@@ -74,7 +74,7 @@ class CompsRepository< AbstractRepository
def get_group_packages(group_node)
pkgs = {}
group_node.xpath('packagelist/packagereq').each do |p|
- pkgs[p.text] = p.attr('type')
+ (pkgs[p.text] ||= {})[:type] = p.attr('type')
end
return pkgs
end
diff --git a/src/app/util/repository_manager/pulp_repository.rb
b/src/app/util/repository_manager/pulp_repository.rb
index 5641f0c..be6e72e 100644
--- a/src/app/util/repository_manager/pulp_repository.rb
+++ b/src/app/util/repository_manager/pulp_repository.rb
@@ -49,9 +49,9 @@ class PulpRepository< AbstractRepository
groups = {}
WrappedRestClient.get(@groups_url, HTTP_OPTS).each do |id, info|
pkgs = {}
- info['default_package_names'].each {|p| pkgs[p] = 'default'}
- info['optional_package_names'].each {|p| pkgs[p] = 'optional'}
- info['mandatory_package_names'].each {|p| pkgs[p] = 'mandatory'}
+ info['default_package_names'].each {|p| pkgs[p] = {:type =>
'default'}}
+ info['optional_package_names'].each {|p| pkgs[p] = {:type =>
'optional'}}
+ info['mandatory_package_names'].each {|p| pkgs[p] = {:type =>
'mandatory'}}
next if pkgs.empty?
name = info['name']
groups[name] = {
diff --git a/src/app/views/templates/_content_selection.haml
b/src/app/views/templates/_content_selection.haml
index 2ca99fe..f080f4a 100644
--- a/src/app/views/templates/_content_selection.haml
+++ b/src/app/views/templates/_content_selection.haml
@@ -1,31 +1,42 @@
%h3 Managed Content Selection
%h5 Search for Content
-= text_field_tag 'search', 'Search Text', :disabled => true
-%a Advanced Search
+- form_tag :action => "add_software" do
+ = text_field_tag 'search', 'Search Text', :disabled => true
+ = hidden_field_tag :template_id, @tpl.id
+ %a Advanced Search
-%p
- Repositories to Search:
- %a (Check all)
-%fieldset
- - @repository_manager.repositories.each do |repo|
- = check_box_tag 'repositories[]', repo.id, true
- = label_tag 'repositories[]', repo.name
-%fieldset
- .grid_3.alpha
- = radio_button_tag :show_mode, 'group', true
- = label_tag :show_mode, 'Show by Group'
- .grid_2.omega
- = radio_button_tag :show_mode, 'type', false, :disabled => true
- = label_tag :show_mode, 'Show by Type'
+ %p
+ Repositories to Search:
+ %a (Check all)
+ %fieldset
+ - @repository_manager.repositories.each do |repo|
+ = check_box_tag 'repositories[]', repo.id, true
+ = label_tag 'repositories[]', repo.name
+ %fieldset
+ .grid_3.alpha
+ = radio_button_tag :show_mode, 'group', true
+ = label_tag :show_mode, 'Show by Group'
+ .grid_2.omega
+ = radio_button_tag :show_mode, 'type', false, :disabled => true
+ = label_tag :show_mode, 'Show by Type'
-%ul.sidebarcontainer
- - @groups.keys.sort.each do |group|
- %li
- %h5.grid_4.alpha= group
- = submit_tag "Add", :name => "select_group_#{group}", :id
=> "select_group_#{group}", :class => "grid_1 omega"
- %ul
- - @groups[group][:packages].each do |pkg, type|
- %li
- %span.grid_4.alpha= pkg
- = submit_tag "Add", :name =>
"select_package_#{pkg}", :id => "select_package_#{pkg}", :class
=> "grid_1 omega"
+ = submit_tag "Add Selected", :name => "add_selected", :class
=> "dialogbutton"
+ = submit_tag "Cancel", :name => "cancel", :class =>
"dialogbutton"
+ %ul.sidebarcontainer
+ - @groups.keys.sort.each do |group|
+ - group_sel = @groups[group][:selected]
+ - group_id = group.gsub(/\s/, '_')
+ %li
+ = check_box_tag 'groups[]', group, group_sel, :disabled =>
group_sel, :id => "group_#{group_id}"
+ = label_tag "group_#{group_id}", group
+ %ul
+ - @groups[group][:packages].each do |pkg, info|
+ - pkg_sel = info[:selected] ? true : false
+ - pkg_id = pkg.gsub(/\s/, '_')
+ %li
+ = check_box_tag 'packages[]', pkg, pkg_sel, :disabled =>
pkg_sel, :id => "package_#{pkg_id}"
+ = label_tag "package_#{pkg_id}", pkg
+
+ = submit_tag "Add Selected", :name => "add_selected", :class
=> "dialogbutton"
+ = submit_tag "Cancel", :name => "cancel", :class =>
"dialogbutton"
diff --git a/src/app/views/templates/_managed_content.haml
b/src/app/views/templates/_managed_content.haml
index 2ce8131..a769dbf 100644
--- a/src/app/views/templates/_managed_content.haml
+++ b/src/app/views/templates/_managed_content.haml
@@ -12,3 +12,4 @@
%button{:type => 'button', :disabled => 'disabled'}
Config
%button{:type => 'button', :disabled => 'disabled'}
Metadata
= submit_tag "Remove", :name =>
"remove_package_#{pkg[:name]}", :id =>
"remove_package_#{pkg[:name]}"
+ = submit_tag "Add Software", :name => "add_software"
diff --git a/src/app/views/templates/add_software_form.haml
b/src/app/views/templates/add_software_form.haml
new file mode 100644
index 0000000..d32729a
--- /dev/null
+++ b/src/app/views/templates/add_software_form.haml
@@ -0,0 +1 @@
+= render :partial => 'content_selection'
diff --git a/src/app/views/templates/new.haml b/src/app/views/templates/new.haml
index fa82ce4..173549e 100644
--- a/src/app/views/templates/new.haml
+++ b/src/app/views/templates/new.haml
@@ -45,6 +45,3 @@
= submit_tag "Save", :name => "save", :class =>
"dialogbutton"
= submit_tag "Cancel", :name => "cancel", :class =>
"dialogbutton"
-
- .grid_5
- = render :partial => 'content_selection'