Improving friend capabilities so you can now add and remove friends as you wish. Friends will be notified when you add them. You can view a list of friends on your profile page (which has been reorganised a little).

This commit is contained in:
Dan Karran 2007-10-08 22:21:15 +00:00
parent 822e48850d
commit d320673cc7
6 changed files with 77 additions and 24 deletions

View 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

View 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

View 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

View file

@ -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.

View file

@ -1,30 +1,35 @@
<% @this_user = User.find_by_display_name(@this_user.display_name) %>
<h2><%= @this_user.display_name %></h2>
<div id="userinformation">
<% if @user and @this_user.id == @user.id %>
<%= 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 '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>
<% 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 %>
<% 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 %>
<% end %>
<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| %>
@ -36,4 +41,23 @@
<%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 %>

View 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'