diff --git a/app/controllers/deliverables_controller.rb b/app/controllers/deliverables_controller.rb index b495a7b..4656082 100644 --- a/app/controllers/deliverables_controller.rb +++ b/app/controllers/deliverables_controller.rb @@ -2,4 +2,26 @@ class DeliverablesController < InheritedResources::Base unloadable respond_to :html + + before_filter :find_contract + before_filter :authorize + + def create + @deliverable = FixedDeliverable.new(params[:deliverable]) + create! { contract_url(@project, @contract) } + end + + protected + + def begin_of_association_chain + @contract + end + + private + + def find_contract + @contract = Contract.find(params[:contract_id]) + @project = @contract.project + end + end diff --git a/app/models/fixed_deliverable.rb b/app/models/fixed_deliverable.rb new file mode 100644 index 0000000..af69de7 --- /dev/null +++ b/app/models/fixed_deliverable.rb @@ -0,0 +1,9 @@ +class FixedDeliverable < Deliverable + unloadable + + # Associations + + # Validations + + # Accessors +end diff --git a/app/views/deliverables/_form.html.erb b/app/views/deliverables/_form.html.erb new file mode 100644 index 0000000..71d01f6 --- /dev/null +++ b/app/views/deliverables/_form.html.erb @@ -0,0 +1,14 @@ +<% form.inputs do %> + <%= form.input :title, :required => true %> + <%= form.input :type, :required => true, :as => :select, :collection => [["Fixed", "fixed"]] %> + <%= form.input :manager %> + <%= form.input :start_date, :as => :string, :input_html => {:size => 10}, :hint => calendar_for('deliverable_start_date') %> + <%= form.input :end_date, :as => :string, :input_html => {:size => 10}, :hint => calendar_for('deliverable_end_date') %> + <%= form.input :notes, :input_html => {:class => 'wiki-edit', :rows => '5'} %> +<% end %> +<% form.buttons do %> + <%= form.commit_button %> + <%= link_to(l(:button_cancel), cancel_path) %> +<% end %> + +<%= wikitoolbar_for 'deliverable_notes' %> diff --git a/app/views/deliverables/new.html.erb b/app/views/deliverables/new.html.erb index 8b13789..a3438dd 100644 --- a/app/views/deliverables/new.html.erb +++ b/app/views/deliverables/new.html.erb @@ -1 +1,9 @@ +<%= content_tag(:h2, l(:text_new_deliverable)) %> +<% semantic_form_for [@project, @contract, resource], :url => contract_deliverables_path(@project, @contract), :html => {:class => 'tabular'} do |form| %> +<%= render :partial => 'form', :object => form, :locals => {:cancel_path => contract_path(@project, @contract)} %> +<% end %> + +<% content_for(:header_tags) do %> + <%= stylesheet_link_tag "redmine_contracts", :plugin => "redmine_contracts", :media => "screen" %> +<% end %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 7d9bf27..ad625da 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -21,4 +21,6 @@ en: text_payment_terms_net_30: "Net 30" text_payment_terms_net_45: "Net 45" button_add_new: Add New + text_new_deliverable: New Deliverable + field_manager: Manager diff --git a/init.rb b/init.rb index 279d7ca..0a30b1a 100644 --- a/init.rb +++ b/init.rb @@ -14,7 +14,10 @@ Redmine::Plugin.register :redmine_contracts do requires_redmine_plugin :redmine_rate, :version_or_higher => '0.1.0' project_module :contracts do - permission :manage_budget, {:contracts => [:index, :new, :create, :show, :edit, :update, :destroy] }, :public => true + permission(:manage_budget, { + :contracts => [:index, :new, :create, :show, :edit, :update, :destroy], + :deliverables => [:new, :create] + }, :public => true) end menu(:project_menu, diff --git a/test/integration/deliverables_new_test.rb b/test/integration/deliverables_new_test.rb new file mode 100644 index 0000000..e89a0aa --- /dev/null +++ b/test/integration/deliverables_new_test.rb @@ -0,0 +1,46 @@ +require 'test_helper' + +class DeliverablesNewTest < ActionController::IntegrationTest + include Redmine::I18n + + def setup + @project = Project.generate!(:identifier => 'main') + @contract = Contract.generate!(:project => @project) + end + + should "allow any user to open the new deliverable form" do + visit_contract_page(@contract) + click_link 'Add New' + assert_response :success + assert_template 'deliverables/new' + + assert_select "form#new_deliverable" + end + + should "create a new Fixed deliverable" do + @manager = User.generate! + + visit_contract_page(@contract) + click_link 'Add New' + assert_response :success + + fill_in "Title", :with => 'A New Deliverable' + select "Fixed", :from => "Type" + select @manager.name, :from => "Manager" + fill_in "Start", :with => '2010-01-01' + fill_in "End Date", :with => '2010-12-31' + fill_in "Notes", :with => 'Some notes on the deliverable' + + click_button "Create Deliverable" + + assert_response :success + assert_template 'contracts/show' + + @deliverable = Deliverable.last + assert_equal "A New Deliverable", @deliverable.title + assert_equal "FixedDeliverable", @deliverable.type + assert_equal '2010-01-01', @deliverable.start_date.to_s + assert_equal '2010-12-31', @deliverable.end_date.to_s + assert_equal @manager, @deliverable.manager + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb index 9673290..419f9e0 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -39,6 +39,14 @@ module IntegrationTestHelper assert_template 'contracts/index' end + def visit_contract_page(contract) + visit_contracts_for_project(contract.project) + click_link @contract.id + + assert_response :success + assert_template 'contracts/show' + end + def assert_forbidden assert_response :forbidden assert_template 'common/403'