Merge branch 'master' into openstreetbugs

Conflicts:
	lib/osm.rb
This commit is contained in:
Tom Hughes 2010-05-07 22:29:09 +01:00
commit 160429e62d
48 changed files with 583 additions and 105 deletions

View file

@ -8,7 +8,7 @@ class DiaryEntry < ActiveRecord::Base
has_many :visible_comments, :class_name => "DiaryComment",
:include => :user,
:conditions => {
:users => { :visible => true },
:users => { :status => ["active", "confirmed" ] },
:visible => true
},
:order => "diary_comments.id"

View file

@ -0,0 +1,15 @@
class SpamObserver < ActiveRecord::Observer
observe User, DiaryEntry, DiaryComment
def after_save(record)
case
when record.is_a?(User): user = record
when record.is_a?(DiaryEntry): user = record.user
when record.is_a?(DiaryComment): user = record.user
end
if user.status == "active" and user.spam_score > APP_CONFIG['spam_threshold']
user.update_attributes(:status => "suspended")
end
end
end

View file

@ -3,10 +3,11 @@ class User < ActiveRecord::Base
has_many :traces, :conditions => { :visible => true }
has_many :diary_entries, :order => 'created_at DESC'
has_many :diary_comments, :order => 'created_at DESC'
has_many :messages, :foreign_key => :to_user_id, :conditions => { :to_user_visible => true }, :order => 'sent_on DESC'
has_many :new_messages, :class_name => "Message", :foreign_key => :to_user_id, :conditions => { :to_user_visible => true, :message_read => false }, :order => 'sent_on DESC'
has_many :sent_messages, :class_name => "Message", :foreign_key => :from_user_id, :conditions => { :from_user_visible => true }, :order => 'sent_on DESC'
has_many :friends, :include => :befriendee, :conditions => ["users.visible = ?", true]
has_many :friends, :include => :befriendee, :conditions => "users.status IN ('active', 'confirmed')"
has_many :tokens, :class_name => "UserToken"
has_many :preferences, :class_name => "UserPreference"
has_many :changesets
@ -55,8 +56,11 @@ class User < ActiveRecord::Base
user = token.user if token
end
if user
user = nil unless user.visible? and (user.active? or options[:inactive])
if user and
( user.status == "deleted" or
( user.status == "pending" and not options[:pending] ) or
( user.status == "suspended" and not options[:suspended] ) )
user = nil
end
token.update_attribute(:expiry, 1.week.from_now) if token and user
@ -106,7 +110,8 @@ class User < ActiveRecord::Base
bounds = gc.bounds(radius)
sql_for_distance = gc.sql_for_distance("home_lat", "home_lon")
nearby = User.find(:all,
:conditions => ["id != ? AND visible = ? AND data_public = ? AND #{sql_for_distance} <= ?", id, true, true, radius], :order => sql_for_distance, :limit => num)
:conditions => ["id != ? AND status IN (\'active\', \'confirmed\') AND data_public = ? AND #{sql_for_distance} <= ?", id, true, radius],
:order => sql_for_distance, :limit => num)
else
nearby = []
end
@ -128,6 +133,18 @@ class User < ActiveRecord::Base
return false
end
##
# returns true if a user is visible
def visible?
["pending","active","confirmed"].include? self.status
end
##
# returns true if a user is active
def active?
["active","confirmed"].include? self.status
end
##
# returns true if the user has the moderator role, false otherwise
def moderator?
@ -153,8 +170,9 @@ class User < ActiveRecord::Base
active_blocks.detect { |b| b.needs_view? }
end
##
# delete a user - leave the account but purge most personal data
def delete
self.active = false
self.display_name = "user_#{self.id}"
self.description = ""
self.home_lat = nil
@ -162,8 +180,24 @@ class User < ActiveRecord::Base
self.image = nil
self.email_valid = false
self.new_email = nil
self.visible = false
self.status = "deleted"
self.save
end
##
# return a spam score for a user
def spam_score
changeset_score = self.changesets.find(:all, :limit => 10).length * 50
trace_score = self.traces.find(:all, :limit => 10).length * 50
diary_entry_score = self.diary_entries.inject(0) { |s,e| s += OSM.spam_score(e.body) }
diary_comment_score = self.diary_comments.inject(0) { |s,e| s += OSM.spam_score(e.body) }
score = OSM.spam_score(self.description) * 2
score += diary_entry_score / self.diary_entries.length if self.diary_entries.length > 0
score += diary_comment_score / self.diary_comments.length if self.diary_comments.length > 0
score -= changeset_score
score -= trace_score
return score.to_i
end
end

View file

@ -14,7 +14,7 @@ private
def expire_cache_for(old_record, new_record)
if old_record and
(new_record.nil? or
old_record.visible != new_record.visible or
old_record.visible? != new_record.visible? or
old_record.display_name != new_record.display_name)
old_record.diary_entries.each do |entry|
expire_action(:controller => 'diary_entry', :action => 'view', :display_name => old_record.display_name, :id => entry.id)