Add basic support for logically deleting a user.
authorTom Hughes <tom@compton.nu>
Sun, 24 Aug 2008 16:53:42 +0000 (16:53 +0000)
committerTom Hughes <tom@compton.nu>
Sun, 24 Aug 2008 16:53:42 +0000 (16:53 +0000)
app/controllers/application.rb
app/controllers/diary_entry_controller.rb
app/controllers/trace_controller.rb
app/controllers/user_controller.rb
app/models/friend.rb
app/models/user.rb
db/migrate/015_add_user_visible.rb [new file with mode: 0644]

index 918e4b617822610bcd33c23ae5c48660af7e8b08..ce13a6aa3a6ae625407d3ac7fe2eaa11f7ab6ed9 100644 (file)
@@ -8,7 +8,7 @@ class ApplicationController < ActionController::Base
 
   def authorize_web
     if session[:user]
-      @user = User.find(session[:user])
+      @user = User.find(session[:user], :conditions => "visible = 1")
     elsif session[:token]
       @user = User.authenticate(:token => session[:token])
       session[:user] = @user.id
index 21c817414afda03c90123ad0e4b2e59dbc05f0f8..b425ef4b6e844ddb6e34d288c74a160bf8ea8414 100644 (file)
@@ -54,7 +54,8 @@ class DiaryEntryController < ApplicationController
 
   def list
     if params[:display_name]
-      @this_user = User.find_by_display_name(params[:display_name])
+      @this_user = User.find_by_display_name(params[:display_name], :conditions => "visible = 1")
+
       if @this_user
         @title = @this_user.display_name + "'s diary"
         @entry_pages, @entries = paginate(:diary_entries,
@@ -76,7 +77,7 @@ class DiaryEntryController < ApplicationController
 
   def rss
     if params[:display_name]
-      user = User.find_by_display_name(params[:display_name])
+      user = User.find_by_display_name(params[:display_name], :conditions => "visible = 1")
 
       if user
         @entries = DiaryEntry.find(:all, :conditions => ['user_id = ?', user.id], :order => 'created_at DESC', :limit => 20)
@@ -99,7 +100,7 @@ class DiaryEntryController < ApplicationController
   end
 
   def view
-    user = User.find_by_display_name(params[:display_name])
+    user = User.find_by_display_name(params[:display_name], :conditions => "visible = 1")
 
     if user
       @entry = DiaryEntry.find(:first, :conditions => ['user_id = ? AND id = ?', user.id, params[:id]])
index 41ff34303758d59b59c2771ff588e2d5c6f6049f..899df05dfc021d1d683012bfbb8b995f42579d04 100644 (file)
@@ -12,7 +12,7 @@ class TraceController < ApplicationController
     # from display name, pick up user id if one user's traces only
     display_name = params[:display_name]
     if target_user.nil? and !display_name.blank?
-      target_user = User.find(:first, :conditions => [ "display_name = ?", display_name])
+      target_user = User.find(:first, :conditions => [ "visible = 1 and display_name = ?", display_name])
     end
 
     # set title
index 2bb4eb5772ff329d047ead6a0005a9730a4a625c..d88de5ff397cd271e398c6f478d89e400157d938 100644 (file)
@@ -13,6 +13,7 @@ class UserController < ApplicationController
     @title = 'create account'
     @user = User.new(params[:user])
 
+    @user.visible = true
     @user.data_public = true
     @user.description = "" if @user.description.nil?
 
@@ -75,7 +76,8 @@ class UserController < ApplicationController
   def lost_password
     @title = 'lost password'
     if params[:user] and params[:user][:email]
-      user = User.find_by_email(params[:user][:email])
+      user = User.find_by_email(params[:user][:email], :conditions => "visible = 1")
+
       if user
         token = user.tokens.create
         Notifier.deliver_lost_password(user, token)
@@ -214,7 +216,7 @@ class UserController < ApplicationController
   end
 
   def view
-    @this_user = User.find_by_display_name(params[:display_name])
+    @this_user = User.find_by_display_name(params[:display_name], :conditions => "visible = 1")
 
     if @this_user
       @title = @this_user.display_name
@@ -227,7 +229,7 @@ class UserController < ApplicationController
   def make_friend
     if params[:display_name]     
       name = params[:display_name]
-      new_friend = User.find_by_display_name(name)
+      new_friend = User.find_by_display_name(name, :conditions => "visible = 1")
       friend = Friend.new
       friend.user_id = @user.id
       friend.friend_user_id = new_friend.id
@@ -249,12 +251,12 @@ class UserController < ApplicationController
   def remove_friend
     if params[:display_name]     
       name = params[:display_name]
-      friend = User.find_by_display_name(name)
+      friend = User.find_by_display_name(name, :conditions => "visible = 1")
       if @user.is_friends_with?(friend)
         Friend.delete_all "user_id = #{@user.id} AND friend_user_id = #{friend.id}"
         flash[:notice] = "#{friend.display_name} was removed from your friends."
       else
-        flash[:notice] = "#{friend.display_name} was not already one of your friends."
+        flash[:notice] = "#{friend.display_name} is not one of your friends."
       end
 
       redirect_to :controller => 'user', :action => 'view'
index 242b7425127f5f976bf2d08a158f3689c6cf3b1e..d740a711cfaef4c97dcbcb7d17a2de812f0e2b16 100644 (file)
@@ -1,4 +1,4 @@
 class Friend < ActiveRecord::Base
-  belongs_to :user
-  
+  belongs_to :befriender, :class_name => "User", :foreign_key => :user_id
+  belongs_to :befriendee, :class_name => "User", :foreign_key => :friend_user_id
 end
index 61c76898a0f2b754eab98e7c257145ed33289e2b..9b5bfd59528538f1826e6fc993a26eafb4c7301e 100644 (file)
@@ -6,7 +6,7 @@ class User < ActiveRecord::Base
   has_many :messages, :foreign_key => :to_user_id, :order => 'sent_on DESC'
   has_many :new_messages, :class_name => "Message", :foreign_key => :to_user_id, :conditions => "message_read = 0", :order => 'sent_on DESC'
   has_many :sent_messages, :class_name => "Message", :foreign_key => :from_user_id, :order => 'sent_on DESC'
-  has_many :friends
+  has_many :friends, :include => :befriendee, :conditions => "users.visible = 1"
   has_many :tokens, :class_name => "UserToken"
   has_many :preferences, :class_name => "UserPreference"
 
@@ -48,7 +48,7 @@ class User < ActiveRecord::Base
     end
 
     if user
-      user = nil unless user.active? or options[:inactive]
+      user = nil unless user.visible? and (user.active? or options[:inactive])
     end
 
     token.update_attribute(:expiry, 1.week.from_now) if token and user
@@ -80,7 +80,7 @@ class User < ActiveRecord::Base
     if self.home_lon and self.home_lat 
       gc = OSM::GreatCircle.new(self.home_lat, self.home_lon)
       bounds = gc.bounds(radius)
-      nearby = User.find(:all, :conditions => "home_lat between #{bounds[:minlat]} and #{bounds[:maxlat]} and home_lon between #{bounds[:minlon]} and #{bounds[:maxlon]} and data_public = 1 and id != #{self.id}")
+      nearby = User.find(:all, :conditions => "visible = 1 and home_lat between #{bounds[:minlat]} and #{bounds[:maxlat]} and home_lon between #{bounds[:minlon]} and #{bounds[:maxlon]} and data_public = 1 and id != #{self.id}")
       nearby.delete_if { |u| gc.distance(u.home_lat, u.home_lon) > radius }
       nearby.sort! { |u1,u2| gc.distance(u1.home_lat, u1.home_lon) <=> gc.distance(u2.home_lat, u2.home_lon) }
     else
diff --git a/db/migrate/015_add_user_visible.rb b/db/migrate/015_add_user_visible.rb
new file mode 100644 (file)
index 0000000..3b14aad
--- /dev/null
@@ -0,0 +1,10 @@
+class AddUserVisible < ActiveRecord::Migration
+  def self.up
+    add_column "users", "visible", :boolean
+    User.update_all("visible = 1")
+  end
+
+  def self.down
+    remove_column "users", "visible"
+  end
+end