Improving friend capabilities so you can now add and remove friends as you wish....
authorDan Karran <dan@karran.net>
Mon, 8 Oct 2007 22:21:15 +0000 (22:21 +0000)
committerDan Karran <dan@karran.net>
Mon, 8 Oct 2007 22:21:15 +0000 (22:21 +0000)
app/controllers/user_controller.rb
app/models/notifier.rb
app/models/user.rb
app/views/notifier/friend_notification.rhtml [new file with mode: 0644]
app/views/user/view.rhtml
config/routes.rb

index e69ce313723431055e57b2e70a7c722b78251632..a9b91098f0f2df58b96b03cc91240d57a2556e85 100644 (file)
@@ -2,8 +2,8 @@ class UserController < ApplicationController
   layout 'site'
 
   before_filter :authorize, :only => [:api_details, :api_gpx_files]
-  before_filter :authorize_web, :only => [:account, :go_public, :view, :diary, :make_friend]
-  before_filter :require_user, :only => [:set_home, :account, :go_public, :make_friend]
+  before_filter :authorize_web, :only => [:account, :go_public, :view, :diary, :make_friend, :remove_friend]
+  before_filter :require_user, :only => [:set_home, :account, :go_public, :make_friend, :remove_friend]
 
   filter_parameter_logging :password, :pass_crypt, :pass_crypt_confirmation
 
@@ -178,15 +178,16 @@ class UserController < ApplicationController
   end
 
   def make_friend
-
     if params[:display_name]     
       name = params[:display_name]
+      new_friend = User.find_by_display_name(name)
       friend = Friend.new
       friend.user_id = @user.id
-      friend.friend_user_id = User.find_by_display_name(name).id 
-      unless @user.is_friends_with?(friend)
+      friend.friend_user_id = new_friend.id
+      unless @user.is_friends_with?(new_friend)
         if friend.save
           flash[:notice] = "#{name} is now your friend."
+          Notifier::deliver_friend_notification(friend)
         else
           friend.add_error("Sorry, failed to add #{name} as a friend.")
         end
@@ -197,5 +198,19 @@ class UserController < ApplicationController
     end
   end
 
+  def remove_friend
+    if params[:display_name]     
+      name = params[:display_name]
+      friend = User.find_by_display_name(name)
+      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."
+      end
+      redirect_to :controller => 'user', :action => 'view'
+    end
+  end
+
 end
 
index 9eff2fb92eb24cbf488be67240830c3e7ad6b9a8..e471730c187f79e98cdf28fe3c5de93c60ae243f 100644 (file)
@@ -49,4 +49,14 @@ class Notifier < ActionMailer::Base
     @body['readurl'] = "http://#{SERVER_URL}/message/read/#{message.id}"
     @body['replyurl'] = "http://#{SERVER_URL}/message/new/#{message.from_user_id}"
   end
+
+  def friend_notification(friend)
+    @friend = User.find_by_id(friend.user_id)
+    @new_friend = User.find_by_id(friend.friend_user_id)
+    @recipients = @new_friend.email
+    @from = 'abuse@openstreetmap.org'
+    @subject = "[OpenStreetMap] #{@friend.display_name} added you as a friend"
+    @body['user'] = @friend.display_name
+    @body['userurl'] = "http://#{SERVER_URL}/user/#{@friend.display_name}"
+  end
 end
index 83a8194ddb78b6ed2389df29a7ee5f5e3ff0b43e..c4b81e7abdb66d26db556237e5500a670e9d2fc5 100644 (file)
@@ -93,7 +93,7 @@ class User < ActiveRecord::Base
     res = false
     @new_friend = new_friend
     self.friends.each do |friend|
-      if friend.user_id == @new_friend.user_id
+      if friend.friend_user_id == @new_friend.id
         return true
       end
     end
diff --git a/app/views/notifier/friend_notification.rhtml b/app/views/notifier/friend_notification.rhtml
new file mode 100644 (file)
index 0000000..4103a76
--- /dev/null
@@ -0,0 +1,3 @@
+<%= @user %> has added you as a friend on OpenStreetMap.
+
+You can see their profile at <%= @userurl %> and add them as a friend too if you wish.
\ No newline at end of file
index 97a90ed617bedac4433b0341e3b09cbaea413598..d0600bb8d5d60dea81862f454afe3b0a365c8046 100644 (file)
@@ -1,30 +1,35 @@
+<% @this_user = User.find_by_display_name(@this_user.display_name) %>
 <h2><%= @this_user.display_name %></h2>
-<div id="description"><%= simple_format(@this_user.description) %></div>
-
+<div id="userinformation">
 <% if @user and @this_user.id == @user.id %>
-<h3>Your diary</h3>
-<%= link_to 'View your diary', :controller => 'diary_entry', :action => 'list', :display_name => @user.display_name %><br/>
-<%= link_to 'New diary post', :controller => 'diary_entry', :action => 'new', :display_name => @user.display_name %>
-<h3>Your traces</h3>
-<%= link_to 'View your traces', :controller => 'trace', :action=>'mine' %>
-<h3>Your account</h3>
-<%= link_to 'Edit your settings', :controller => 'user', :action => 'account', :display_name => @user.display_name %>
+<%= link_to 'my diary', :controller => 'diary_entry', :action => 'list', :display_name => @user.display_name %>
+| <%= link_to 'new diary post', :controller => 'diary_entry', :action => 'new', :display_name => @user.display_name %>
+| <%= link_to 'my traces', :controller => 'trace', :action=>'mine' %>
+| <%= link_to 'my settings', :controller => 'user', :action => 'account', :display_name => @user.display_name %>
+<% else %>
+<%= link_to 'send message', :controller => 'message', :action => 'new', :user_id => @this_user.id %>
+| <%= link_to 'diary', :controller => 'diary_entry', :action => 'list', :display_name => @this_user.display_name %>
+| <%= link_to 'traces', :controller => 'trace', :action => 'view', :display_name => @this_user.display_name %>
+| <% if @user and @user.is_friends_with?(@this_user) %>
+  <%= link_to 'remove as friend', :controller => 'user', :action => 'remove_friend', :display_name => @this_user.display_name %>
 <% else %>
-<%= link_to 'Send message', :controller => 'message', :action => 'new', :user_id => @this_user.id %><br /> 
-<%= link_to 'Add as friend', :controller => 'user', :action => 'make_friend', :display_name => @this_user.display_name %><br />
-<%= link_to 'View diary', :controller => 'diary_entry', :action => 'list', :display_name => @this_user.display_name %><br />
-<%= link_to 'View traces', :controller => 'trace', :action => 'view', :display_name => @this_user.display_name %>
+  <%= link_to 'add as friend', :controller => 'user', :action => 'make_friend', :display_name => @this_user.display_name %>
 <% end %>
+<% end %>
+</div>
+
+<div id="description"><%= simple_format(@this_user.description) %></div>
 
-<h3>Nearby users</h3>
+<h3>User location</h3>
 <% if @this_user.home_lat.nil? or @this_user.home_lon.nil? %>
   No home location has been set.
   <% if @user and @this_user.id == @user.id %>
   You can set your home location on your <%= link_to 'settings', :controller => 'user', :action => 'account', :display_name => @user.display_name %> page.
   <% end %>
 <% else %>
+  Nearby users:<br/>
   <% if @this_user.nearby.empty? %>
-    There are no users who admit to mapping nearby.
+    There are no users who admit to mapping nearby yet.
   <% else %>
     <table id="nearbyusers">
     <% @this_user.nearby.each do |nearby| %>
     <%end%>
     </table>
   <%end%>
+
+  <% if @user and @this_user.id == @user.id %>
+    <br/>
+    Your friends:<br/>
+    <% if @this_user.friends.empty? %>
+      You have not added any friends yet.
+    <% else %>
+      <table id="friends">
+      <% @this_user.friends.each do |friend| %>
+      <% @friend = User.find_by_id(friend.friend_user_id) %>
+      <tr>
+      <td class="username"><%= link_to @friend.display_name, :controller => 'user', :action => 'view',  :display_name => @friend.display_name %></td>
+      <td><%= @this_user.distance(@friend).round %>km away</td>
+      <td class="message">(<%= link_to 'send message', :controller => 'message', :action => 'new', :user_id => @friend.id %>)</td>
+      </tr>
+      <%end%>
+      </table>
+    <%end%>
+  <%end%>
 <% end %>
index bf1f2a20f2bc398bb39aef200dbbfa73872765e8..81bcb52a62d9cad237e67f01cd6798e729b98478 100644 (file)
@@ -91,8 +91,9 @@ ActionController::Routing::Routes.draw do |map|
   map.connect '/user/:display_name/traces/:id/icon', :controller => 'trace', :action => 'icon'
 
   # user pages
-  map.connect '/user/:display_name/make_friend', :controller => 'user', :action => 'make_friend'
   map.connect '/user/:display_name', :controller => 'user', :action => 'view'
+  map.connect '/user/:display_name/make_friend', :controller => 'user', :action => 'make_friend'
+  map.connect '/user/:display_name/remove_friend', :controller => 'user', :action => 'remove_friend'
   map.connect '/user/:display_name/diary', :controller => 'diary_entry', :action => 'list'
   map.connect '/user/:display_name/diary/:id', :controller => 'diary_entry', :action => 'list', :id => /\d+/
   map.connect '/user/:display_name/diary/rss', :controller => 'diary_entry', :action => 'rss'