On 11/28/2012 05:03 AM, Matt Wagner wrote:
Build/push controls still need to be implemented,
and Backbone auto-refresh needs updating.
---
Hi Matt, this is good start. Adding a few comments inline.
.../tim/base_images_controller_decorator.rb | 19 ++++++++
src/app/helpers/images_helper.rb | 7 ---
src/app/helpers/mustache_helper.rb | 13 ++++++
.../views/tim/base_images/_status.html.mustache | 32 +++++++++++++
src/app/views/tim/base_images/show.html.haml | 54 ++++++++++++++++++++++
src/config/locales/en.yml | 1 +
6 files changed, 119 insertions(+), 7 deletions(-)
create mode 100644 src/app/views/tim/base_images/_status.html.mustache
create mode 100644 src/app/views/tim/base_images/show.html.haml
diff --git a/src/app/decorators/controllers/tim/base_images_controller_decorator.rb
b/src/app/decorators/controllers/tim/base_images_controller_decorator.rb
index 433f171..13a287b 100644
--- a/src/app/decorators/controllers/tim/base_images_controller_decorator.rb
+++ b/src/app/decorators/controllers/tim/base_images_controller_decorator.rb
@@ -8,6 +8,8 @@ Tim::BaseImagesController.class_eval do
before_filter :set_tabs_and_headers, :only => [:index]
before_filter :set_new_form_variables, :only => [:new]
+ before_filter :set_image_versions, :only => :show
+ before_filter :set_provider_accounts, :only => :show
def edit_xml
@base_image = Tim::BaseImage.new(params[:base_image])
@@ -82,4 +84,21 @@ Tim::BaseImagesController.class_eval do
list_for_user(current_session, current_user, Privilege::USE)
t("tim.base_images.flash.error.no_provider_accounts") if
@accounts.empty?
end
+
+ def set_image_versions
+ @versions = @base_image.image_versions.order('created_at DESC')
+ @latest_version = @versions.first # because we sorted above
+ # @version is the specific image version we're viewing
+ @version = if params[:version]
+ @versions.find{|v| v.id == params[:version]} || @latest_version
+ else
+ @latest_version
+ end
+ end
+
+ def set_provider_accounts
+ target_images = @version.target_images(:include => :provider_images) # don't
do multiple queries
^ it's also possible, that @version is nil if an image was not built yet
+ @targets = target_images.group_by{|ti| ti.target}
this is little bit trickier - in show page, we should display all
available provider accounts for which the image can be built
+ end
+
end
diff --git a/src/app/helpers/images_helper.rb b/src/app/helpers/images_helper.rb
index 1962fbe..3317140 100644
--- a/src/app/helpers/images_helper.rb
+++ b/src/app/helpers/images_helper.rb
@@ -18,11 +18,4 @@
# Likewise, all the methods added will be available for all controllers.
module ImagesHelper
- def options_for_build_select(builds, selected, latest)
- options_for_select(builds.map do |b|
- label = Time.at(b.timestamp.to_f).to_s
- label += " (#{t'images.show.latest'})" if b.uuid == latest
- [label, b.uuid]
- end, selected ? selected.uuid : nil)
- end
end
diff --git a/src/app/helpers/mustache_helper.rb b/src/app/helpers/mustache_helper.rb
index 25fe539..a3961bb 100644
--- a/src/app/helpers/mustache_helper.rb
+++ b/src/app/helpers/mustache_helper.rb
@@ -148,4 +148,17 @@ module MustacheHelper
result
end
+ def image_builds_for_mustache(base_image)
+ retval = []
+ base_image.each_pair do |target,target_images|
+ timg_hash = {:target => target, :combined_images => []}
+ target_images.each do |timg|
+ timg_hash [:combined_images] << {:target_image => timg,
+ :provider_images => timg.provider_images}
+ end
+ retval << timg_hash
+ end
+ retval
+ end
+
end
diff --git a/src/app/views/tim/base_images/_status.html.mustache
b/src/app/views/tim/base_images/_status.html.mustache
new file mode 100644
index 0000000..67fe988
--- /dev/null
+++ b/src/app/views/tim/base_images/_status.html.mustache
@@ -0,0 +1,32 @@
+{{#images}}
+ <li class="clearfix">
+ <dl>
+ <dt>
+ <div class="build-actions">
+ <h3>{{target}}</h3>
+ </div>
+ </dt>
+ <dd>
+ <table class="light_table">
+ <thead>
+ <tr><th>
+ <strong><%= t('tim.base_images.show.account')
%></strong>
+ </th>
+ <th>
+ <%= t('tim.base_images.show.provider') %>
+ </th>
+ <th>
+ <%= t('tim.base_images.show.providers_image_id') %>
+ </th>
+ <th class="image_controls"></th>
+ </tr></thead>
+ <tbody>
+ {{#combined_images}}
+ {{#provider_images}}
+ <tr>
+ <td><strong> {{provider_account.name}}
</strong></td>
+ <td class="light">{{provider_account.provider_name }}
</td>
+ <td class="light">{{factory_id}}</td>
+ {{/provider_images}}
+ {{/combined_images}}
+{{/images}}
diff --git a/src/app/views/tim/base_images/show.html.haml
b/src/app/views/tim/base_images/show.html.haml
new file mode 100644
index 0000000..97b3ccd
--- /dev/null
+++ b/src/app/views/tim/base_images/show.html.haml
@@ -0,0 +1,54 @@
+= render :partial => 'layouts/admin_nav'
+
+%header.page-header
+ .obj_actions
+ .return_to
+ =t'return_to'
+ = link_to t('tim.base_images.index.images'), base_images_path
+ - if @base_image.pool_family and check_privilege(Privilege::USE,
@base_image.pool_family)
+ .button-group
+ = link_to t('tim.base_images.show.new_deployable_from_image'),
main_app.new_deployable_path(:create_from_image => @base_image.id), :class =>
'button' # mawagner -- See if this exists
+ - unless @base_image.imported?
+ = link_to t('tim.base_images.show.template_xml'),
main_app.template_image_path((a)base_image.uuid), :class => 'button' # See if
this link works
+ = button_to t("delete"), base_image_path((a)base_image.id), :method
=> 'delete', :confirm => t('general.delete_confirmation'), :class
=> 'button danger', :id => 'delete'
+ %h1.no-icon= image_name(@base_image)
+
+- user_can_build = (@base_image.pool_family and check_privilege(Privilege::USE,
@base_image.pool_family))
Template and BaseImage are now permissioned models, I think perms now
might look like this (though I could be wrong in which case I hope Scott
weighs in):
require_privilege(Privilege::CREATE,
Tim::TargetImage,
@base_image.pool_family)
+%section.content-section
+ %header
+ %h2=t'properties'
+ .content
+ %table.properties_table
+ %tbody
+ %tr
+ %td= t('tim.base_images.environment')
+ %td= @base_image.pool_family.name
+ %tr
+ %td= t('tim.base_images.show.image_id')
+ %td= @base_image.uuid
+
+%section.content-section
+ %header
+ .section-controls
+ - if @versions.any?
+ %span= t'tim.base_images.show.view_build'
+ - if user_can_build
+ = form_tag image_path((a)base_image.id), :method => :get do
+ = select_tag :build, options_for_build_select(@versions, @version,
@latest_image_version)
+ = submit_tag t('tim.base_images.show.select_build'), :id =>
'select_build_button'
+ %h2= t('tim.base_images.show.provider_images')
+
+ .content
+ %ul.image_builds
+ = render :partial => 'status', :mustache => {:images =>
image_builds_for_mustache(@targets)}
+
+:javascript
+ $(document).ready(function(){
+ $("#select_build_button").hide();
+ $("#build").change(function() {
+ $("#select_build_button").click();
+ });
+ });
+
+%script#imageStatusTemplate{ :type => 'text/html' }
+ = render :partial => 'status'
diff --git a/src/config/locales/en.yml b/src/config/locales/en.yml
index a31bd01..66f3de1 100644
--- a/src/config/locales/en.yml
+++ b/src/config/locales/en.yml
@@ -1698,3 +1698,4 @@ en:
make_deployable: Automatically make "%{name}" Deployable.
edit_xml: View and Edit Template XML
save_template: Save Image Template
+ imported_parenthetical: "(Imported)"