diff --git a/app/models/deliverable.rb b/app/models/deliverable.rb index 7a488fc..92d0386 100644 --- a/app/models/deliverable.rb +++ b/app/models/deliverable.rb @@ -22,6 +22,8 @@ class Deliverable < ActiveRecord::Base delegate :name, :to => :contract, :prefix => true, :allow_nil => true + named_scope :by_title, {:order => "#{Deliverable.table_name}.title ASC"} + def short_type '' end diff --git a/init.rb b/init.rb index a3ac86e..48faf6a 100644 --- a/init.rb +++ b/init.rb @@ -44,7 +44,6 @@ end require 'dispatcher' Dispatcher.to_prepare :redmine_contracts do - gem 'inherited_resources', :version => '1.0.6' require_dependency 'inherited_resources' require_dependency 'inherited_resources/base' @@ -65,6 +64,10 @@ Dispatcher.to_prepare :redmine_contracts do Project.send(:include, RedmineContracts::Patches::ProjectPatch) require_dependency 'issue' Issue.send(:include, RedmineContracts::Patches::IssuePatch) + require_dependency 'query' + unless Query.included_modules.include? RedmineContracts::Patches::QueryPatch + Query.send(:include, RedmineContracts::Patches::QueryPatch) + end unless Query.available_columns.collect(&:name).include?(:deliverable_title) Query.add_available_column(QueryColumn.new(:deliverable_title, :sortable => "#{Deliverable.table_name}.title")) diff --git a/lib/redmine_contracts/patches/project_patch.rb b/lib/redmine_contracts/patches/project_patch.rb index 9921bfb..f462171 100644 --- a/lib/redmine_contracts/patches/project_patch.rb +++ b/lib/redmine_contracts/patches/project_patch.rb @@ -7,8 +7,8 @@ module RedmineContracts base.send(:include, InstanceMethods) base.class_eval do unloadable - has_many :contracts + has_many :deliverables, :through => :contracts end end diff --git a/lib/redmine_contracts/patches/query_patch.rb b/lib/redmine_contracts/patches/query_patch.rb new file mode 100644 index 0000000..70e9a71 --- /dev/null +++ b/lib/redmine_contracts/patches/query_patch.rb @@ -0,0 +1,40 @@ +module RedmineContracts + module Patches + module QueryPatch + def self.included(base) + base.extend(ClassMethods) + + base.send(:include, InstanceMethods) + base.class_eval do + unloadable + + alias_method_chain :available_filters, :deliverable + end + end + + module ClassMethods + end + + module InstanceMethods + # TODO: Should have an API on the Redmine core for this + def available_filters_with_deliverable + @available_filters = available_filters_without_deliverable + + if project + deliverable_filters = { + "deliverable_id" => { + :type => :list_optional, + :order => 15, + :values => project.deliverables.by_title.collect { |d| [d.title, d.id.to_s] } + } + } + return @available_filters.merge(deliverable_filters) + else + return @available_filters + end + + end + end + end + end +end diff --git a/test/unit/lib/redmine_contracts/patches/project_patch_test.rb b/test/unit/lib/redmine_contracts/patches/project_patch_test.rb index 9ab0aec..1110ed9 100644 --- a/test/unit/lib/redmine_contracts/patches/project_patch_test.rb +++ b/test/unit/lib/redmine_contracts/patches/project_patch_test.rb @@ -5,5 +5,6 @@ class RedmineContracts::Patches::ProjectTest < ActionController::TestCase context "Project" do subject { Project.new } should_have_many :contracts + should_have_many :deliverables end end diff --git a/test/unit/lib/redmine_contracts/patches/query_patch_test.rb b/test/unit/lib/redmine_contracts/patches/query_patch_test.rb new file mode 100644 index 0000000..011e76e --- /dev/null +++ b/test/unit/lib/redmine_contracts/patches/query_patch_test.rb @@ -0,0 +1,33 @@ +require File.dirname(__FILE__) + '/../../../../test_helper' + +class RedmineContracts::Patches::QueryTest < ActionController::TestCase + + context "Query" do + subject {Query.new} + + context "#available_filters with project" do + setup do + @query = Query.new + @query.project = @project = Project.generate! + @contract = Contract.generate!(:project => @project, :name => 'A Contract') + @manager = User.generate! + @deliverable1 = FixedDeliverable.generate!(:contract => @contract, :manager => @manager, :title => 'One') + @deliverable2 = FixedDeliverable.generate!(:contract => @contract, :manager => @manager, :title => 'Two') + end + + should "add a deliverable_id filter" do + filters = @query.available_filters + + assert filters.keys.include?("deliverable_id") + + deliverable_filter = filters["deliverable_id"] + assert_equal :list_optional, deliverable_filter[:type] + assert_equal [ + ["One", @deliverable1.id.to_s], + ["Two", @deliverable2.id.to_s] + ], deliverable_filter[:values] + end + end + end + +end