_redmine_-0002-Added-named-scopes-in-Issue-and-ActsAsWatchable-inst.diff

Patch against trunk, r2250 - Nikos Dimitrakopoulos, 2009-01-09 18:15

Download (5.84 KB)

View differences:

test/unit/issue_test.rb (working copy)
203 203
    assert !Issue.new(:due_date => 1.day.from_now.to_date).overdue?
204 204
    assert !Issue.new(:due_date => nil).overdue?
205 205
  end
206

  
207
  def test_recently_updated_with_limit_scopes
208
    #should return the last updated issue
209
    assert_equal 1, Issue.recently_updated.with_limit(1).size
210
    assert_equal Issue.find(:first, :order => "updated_on DESC"), Issue.recently_updated.with_limit(1).first
211
  end
212

  
213
  def test_on_active_projects_scope
214
    before = Issue.on_active_project.size
215
    # test inclusion to results
216
    issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 3, :status_id => 1, :priority => Enumeration.get_values('IPRI').first, :subject => 'test_create', :description => 'IssueTest#test_create', :estimated_hours => '1:30')
217
    issue.save!
218
    assert Issue.on_active_project.size == (before + 1)
219

  
220
    #test exclusion from results
221
    issue.move_to(Project.find(6))  # Move to an archived peoject
222
    issue.reload
223
    assert Issue.on_active_project.size == before
224
  end
206 225
end
test/unit/project_test.rb (working copy)
47 47
  
48 48
  def test_public_projects
49 49
    public_projects = Project.find(:all, :conditions => ["is_public=?", true])
50
    assert_equal 3, public_projects.length
50
    assert_equal 4, public_projects.length
51 51
    assert_equal true, public_projects[0].is_public?
52 52
  end
53 53
  
test/fixtures/projects.yml (working copy)
54 54
  is_public: false
55 55
  identifier: private_child
56 56
  parent_id: 1
57
  
57
projects_006:
58
  created_on: 2006-07-19 19:13:59 +02:00
59
  name: Dead Project
60
  updated_on: 2006-07-19 22:53:01 +02:00
61
  projects_count: 0
62
  id: 6
63
  description: A vaporware project
64
  homepage: ""
65
  is_public: true
66
  identifier: vaporware
67
  status: <%= Project::STATUS_ARCHIVED %>
68
  parent_id:
app/models/issue.rb (working copy)
44 44
  
45 45
  acts_as_activity_provider :find_options => {:include => [:project, :author, :tracker]},
46 46
                            :author_key => :author_id
47
  
47

  
48
  named_scope :recently_updated, :order => "#{self.table_name}.updated_on DESC"
49
  named_scope :with_limit, lambda { |limit| { :limit => limit} }
50
  named_scope :on_active_project, :include => [:status, :project, :tracker],
51
                                  :conditions => ["#{Project.table_name}.status=#{Project::STATUS_ACTIVE}"]
52

  
48 53
  validates_presence_of :subject, :priority, :project, :tracker, :author, :status
54

  
49 55
  validates_length_of :subject, :maximum => 255
50 56
  validates_inclusion_of :done_ratio, :in => 0..100
51 57
  validates_numericality_of :estimated_hours, :allow_nil => true
app/views/my/blocks/_issueswatched.rhtml (working copy)
1 1
<h3><%=l(:label_watched_issues)%></h3>
2
<% watched_issues = Issue.find(:all, 
3
                               :include => [:status, :project, :tracker, :watchers],
4
                               :limit => 10, 
5
                               :conditions => ["#{Watcher.table_name}.user_id = ? AND #{Project.table_name}.status=#{Project::STATUS_ACTIVE}", user.id],
6
                               :order => "#{Issue.table_name}.updated_on DESC") %>
2
<% watched_issues = Issue.on_active_project.watched_by(user.id).recently_updated.with_limit(10) %>
7 3
<%= render :partial => 'issues/list_simple', :locals => { :issues => watched_issues } %>
8 4
<% if watched_issues.length > 0 %>
9 5
<p><%=lwr(:label_last_updates, watched_issues.length)%></p>
vendor/plugins/acts_as_watchable/lib/acts_as_watchable.rb (working copy)
7 7
      end 
8 8

  
9 9
      module ClassMethods
10
        # Additional to the instance methods it adds class method watched_by(user)
11
        # which returns the objects that are watched by the _user_ object or _user_id_
12
        # which is passed as an argument.
10 13
        def acts_as_watchable(options = {})
11 14
          return if self.included_modules.include?(Redmine::Acts::Watchable::InstanceMethods)          
12 15
          send :include, Redmine::Acts::Watchable::InstanceMethods
......
15 18
            has_many :watchers, :as => :watchable, :dependent => :delete_all
16 19
            has_many :watcher_users, :through => :watchers, :source => :user
17 20
            
21
            named_scope :watched_by, lambda { |user|
22
              { :include => :watchers,
23
                :conditions => ["#{Watcher.table_name}.user_id = ?", user] }
24
            }
18 25
            attr_protected :watcher_ids, :watcher_user_ids
19 26
          end
20 27
        end
......
57 64
          self.watchers.collect { |w| w.user.mail if w.user.active? }.compact
58 65
        end
59 66

  
60
        module ClassMethods
61
          # Returns the objects that are watched by user
62
          def watched_by(user)
63
            find(:all, 
64
                 :include => :watchers,
65
                 :conditions => ["#{Watcher.table_name}.user_id = ?", user.id])
66
          end
67
        end
67
        module ClassMethods; end
68 68
      end
69 69
    end
70 70
  end