File: app/models/watcher.rb

Overview
Module Structure
Class Hierarchy
Code

Overview

Module Structure

  module: <Toplevel Module>
  class: Watcher#18
inherits from
  Base ( ActiveRecord )
has properties
class method: prune / 1 #27
method: validate_user #41
class method: prune_single_user / 2 #47

Class Hierarchy

Object ( Builtin-Module )
Base ( ActiveRecord )
  Watcher    #18

Code

   1  # Redmine - project management software
   2  # Copyright (C) 2006-2011  Jean-Philippe Lang
   3  #
   4  # This program is free software; you can redistribute it and/or
   5  # modify it under the terms of the GNU General Public License
   6  # as published by the Free Software Foundation; either version 2
   7  # of the License, or (at your option) any later version.
   8  #
   9  # This program is distributed in the hope that it will be useful,
  10  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  # GNU General Public License for more details.
  13  #
  14  # You should have received a copy of the GNU General Public License
  15  # along with this program; if not, write to the Free Software
  16  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  17 
  18  class Watcher < ActiveRecord::Base
  19    belongs_to :watchable, :polymorphic => true
  20    belongs_to :user
  21 
  22    validates_presence_of :user
  23    validates_uniqueness_of :user_id, :scope => [:watchable_type, :watchable_id]
  24    validate :validate_user
  25 
  26    # Unwatch things that users are no longer allowed to view
  27    def self.prune(options={})
  28      if options.has_key?(:user)
  29        prune_single_user(options[:user], options)
  30      else
  31        pruned = 0
  32        User.find(:all, :conditions => "id IN (SELECT DISTINCT user_id FROM #{table_name})").each do |user|
  33          pruned += prune_single_user(user, options)
  34        end
  35        pruned
  36      end
  37    end
  38 
  39    protected
  40 
  41    def validate_user
  42      errors.add :user_id, :invalid unless user.nil? || user.active?
  43    end
  44 
  45    private
  46 
  47    def self.prune_single_user(user, options={})
  48      return unless user.is_a?(User)
  49      pruned = 0
  50      find(:all, :conditions => {:user_id => user.id}).each do |watcher|
  51        next if watcher.watchable.nil?
  52 
  53        if options.has_key?(:project)
  54          next unless watcher.watchable.respond_to?(:project) && watcher.watchable.project == options[:project]
  55        end
  56 
  57        if watcher.watchable.respond_to?(:visible?)
  58          unless watcher.watchable.visible?(user)
  59            watcher.destroy
  60            pruned += 1
  61          end
  62        end
  63      end
  64      pruned
  65    end
  66  end