diff --git a/app/controllers/todos_controller.rb b/app/controllers/todos_controller.rb
index 12b2dbd4..8442763f 100644
--- a/app/controllers/todos_controller.rb
+++ b/app/controllers/todos_controller.rb
@@ -49,6 +49,7 @@ class TodosController < ApplicationController
@source_view = params['_source_view'] || 'todo'
p = TodoCreateParamsHelper.new(params, prefs)
p.parse_dates() unless mobile?
+ tag_list = p.tag_list
@todo = current_user.todos.build(p.attributes)
@@ -56,6 +57,11 @@ class TodosController < ApplicationController
project = current_user.projects.find_or_create_by_name(p.project_name)
@new_project_created = project.new_record_before_save?
@todo.project_id = project.id
+ if tag_list.blank?
+ tag_list = project.default_tags unless project.default_tags.blank?
+ else
+ tag_list += ','+project.default_tags unless project.default_tags.blank?
+ end
end
if p.context_specified_by_name?
@@ -67,8 +73,8 @@ class TodosController < ApplicationController
@todo.update_state_from_project
@saved = @todo.save
- unless (@saved == false) || p.tag_list.blank?
- @todo.tag_with(p.tag_list)
+ unless (@saved == false) || tag_list.blank?
+ @todo.tag_with(tag_list)
@todo.tags.reload
end
diff --git a/app/views/projects/_project_form.rhtml b/app/views/projects/_project_form.rhtml
index 8aab07b9..10aa601a 100644
--- a/app/views/projects/_project_form.rhtml
+++ b/app/views/projects/_project_form.rhtml
@@ -19,6 +19,10 @@
<%= render :partial => 'default_context_autocomplete' %>
+
+ <%= text_field_tag("project[default_tags]", project.default_tags, {:tabindex=>2,:size=> 25}) %>
+
+
+
+
+
+
+
+
<%= render :partial => "shared/add_new_item_form" %>
diff --git a/db/migrate/20090301154745_add_default_tags_to_project.rb b/db/migrate/20090301154745_add_default_tags_to_project.rb
new file mode 100644
index 00000000..378edbd7
--- /dev/null
+++ b/db/migrate/20090301154745_add_default_tags_to_project.rb
@@ -0,0 +1,9 @@
+class AddDefaultTagsToProject < ActiveRecord::Migration
+ def self.up
+ add_column :projects, :default_tags, :string
+ end
+
+ def self.down
+ remove_column :projects, :default_tags
+ end
+end
diff --git a/public/stylesheets/standard.css b/public/stylesheets/standard.css
index 8ad037b7..fbc7ded0 100644
--- a/public/stylesheets/standard.css
+++ b/public/stylesheets/standard.css
@@ -480,6 +480,9 @@ div#project_status > div {
div#default_context > div{
padding:10px;
}
+div#default_tags > div{
+ padding:10px;
+}
a.footer_link {color: #cc3334; font-style: normal;}
a.footer_link:hover {color: #fff; background-color: #cc3334 !important;}
diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb
new file mode 100644
index 00000000..98e77093
--- /dev/null
+++ b/spec/controllers/projects_controller_spec.rb
@@ -0,0 +1,21 @@
+require File.dirname(__FILE__) + '/../spec_helper'
+
+describe ProjectsController do
+ it "should save default tags" do
+ project = Project.new
+
+ projects = mock(:project_list, :build => project,
+ :active => mock(:meh, :count => 0), :size => 0)
+
+ user = mock_model(User, :projects => projects, :prefs => {},
+ :contexts => mock(:context_list, :find => []))
+ controller.stub!(:current_user).and_return(user)
+ controller.stub!(:login_required).and_return(true)
+ controller.stub!(:set_time_zone).and_return(true)
+ controller.stub!(:mobile?).and_return(true)
+
+ get 'create', :project => {:name => "fooproject", :default_tags => "a,b"}
+
+ project.default_tags.should == 'a,b'
+ end
+end
diff --git a/spec/controllers/todos_controller_spec.rb b/spec/controllers/todos_controller_spec.rb
new file mode 100644
index 00000000..3ef2c590
--- /dev/null
+++ b/spec/controllers/todos_controller_spec.rb
@@ -0,0 +1,41 @@
+require File.dirname(__FILE__) + '/../spec_helper'
+
+describe TodosController do
+ it "should add project's default tags to todos" do
+ p = mock_model(Project, :new_record_before_save? => false)
+ p.should_receive(:default_tags).twice.and_return('abcd,efgh')
+ todo = mock_model(Todo, :save => true, :update_state_from_project => nil,
+ :tags => mock(:tag_list, :reload => nil))
+ todo.stub!(:project_id=)
+ todo.should_receive(:tag_with).with('abcd,efgh')
+ projects = mock(:project_list, :find_or_create_by_name => p, :find => [p])
+ todos = mock(:todo_list, :build => todo)
+
+ user = mock_model(User, :todos => todos, :projects => projects, :prefs => {},
+ :contexts => mock(:context_list, :find => []))
+ controller.stub!(:current_user).and_return(user)
+ controller.stub!(:login_required).and_return(true)
+ controller.stub!(:set_time_zone).and_return(true)
+ controller.stub!(:mobile?).and_return(true)
+ get 'create', :project_name => "zzzz", :tag_list => '', :todo => {}
+ end
+
+ it "should append project's default tags to todos" do
+ p = mock_model(Project, :new_record_before_save? => false)
+ p.should_receive(:default_tags).twice.and_return('abcd,efgh')
+ todo = mock_model(Todo, :save => true, :update_state_from_project => nil,
+ :tags => mock(:tag_list, :reload => nil))
+ todo.stub!(:project_id=)
+ todo.should_receive(:tag_with).with('111,222,abcd,efgh')
+ projects = mock(:project_list, :find_or_create_by_name => p, :find => [p])
+ todos = mock(:todo_list, :build => todo)
+
+ user = mock_model(User, :todos => todos, :projects => projects, :prefs => {},
+ :contexts => mock(:context_list, :find => []))
+ controller.stub!(:current_user).and_return(user)
+ controller.stub!(:login_required).and_return(true)
+ controller.stub!(:set_time_zone).and_return(true)
+ controller.stub!(:mobile?).and_return(true)
+ get 'create', :project_name => "zzzz", :tag_list => '111,222', :todo => {}
+ end
+end