source: subversion/sites/rails_port/app/models/user.rb @ 4898

Last change on this file since 4898 was 4898, checked in by dankarran, 10 years ago

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

File size: 3.6 KB
Line 
1class User < ActiveRecord::Base
2  require 'xml/libxml'
3
4  has_many :traces
5  has_many :diary_entries, :order => 'created_at DESC'
6  has_many :messages, :foreign_key => :to_user_id, :order => 'sent_on DESC'
7  has_many :new_messages, :class_name => "Message", :foreign_key => :to_user_id, :conditions => "message_read = 0", :order => 'sent_on DESC'
8  has_many :friends
9  has_many :tokens, :class_name => "UserToken"
10  has_many :preferences, :class_name => "UserPreference"
11
12  validates_presence_of :email, :display_name
13  validates_confirmation_of :pass_crypt, :message => 'Password must match the confirmation password'
14  validates_uniqueness_of :display_name, :allow_nil => true
15  validates_uniqueness_of :email
16  validates_length_of :pass_crypt, :minimum => 8
17  validates_length_of :display_name, :minimum => 3, :allow_nil => true
18  validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
19  validates_format_of :display_name, :with => /^[^\/;.,?]*$/
20  validates_numericality_of :home_lat, :allow_nil => true
21  validates_numericality_of :home_lon, :allow_nil => true
22  validates_numericality_of :home_zoom, :only_integer => true, :allow_nil => true
23
24  before_save :encrypt_password
25
26  def after_initialize
27    self.creation_time = Time.now if self.creation_time.nil?
28  end
29
30  def encrypt_password
31    if pass_crypt_confirmation
32      self.pass_salt = OSM::make_token(8)
33      self.pass_crypt = OSM::encrypt_password(pass_crypt, pass_salt)
34    end
35  end
36
37  def self.authenticate(options)
38    if options[:username] and options[:password]
39      user = find(:first, :conditions => ["email = ? OR display_name = ?", options[:username], options[:username]])
40      user = nil if user and user.pass_crypt != OSM::encrypt_password(options[:password], user.pass_salt)
41    elsif options[:token]
42      token = UserToken.find(:first, :include => :user, :conditions => ["user_tokens.token = ?", options[:token]])
43      user = token.user if token
44    end
45
46    if user
47      user = nil unless user.active? or options[:inactive]
48    end
49
50    token.update_attribute(:expiry, 1.week.from_now) if token and user
51
52    return user
53  end 
54
55  def to_xml
56    doc = OSM::API.new.get_xml_doc
57    doc.root << to_xml_node()
58    return doc
59  end
60
61  def to_xml_node
62    el1 = XML::Node.new 'user'
63    el1['display_name'] = self.display_name.to_s
64    el1['account_created'] = self.creation_time.xmlschema
65    if self.home_lat and self.home_lon
66      home = XML::Node.new 'home'
67      home['lat'] = self.home_lat.to_s
68      home['lon'] = self.home_lon.to_s
69      home['zoom'] = self.home_zoom.to_s
70      el1 << home
71    end
72    return el1
73  end
74
75  def nearby(radius = 50)
76    if self.home_lon and self.home_lat
77      gc = OSM::GreatCircle.new(self.home_lat, self.home_lon)
78      bounds = gc.bounds(radius)
79      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}")
80      nearby.delete_if { |u| gc.distance(u.home_lat, u.home_lon) > radius }
81      nearby.sort! { |u1,u2| gc.distance(u1.home_lat, u1.home_lon) <=> gc.distance(u2.home_lat, u2.home_lon) }
82    else
83      nearby = []
84    end
85    return nearby
86  end
87
88  def distance(nearby_user)
89    return OSM::GreatCircle.new(self.home_lat, self.home_lon).distance(nearby_user.home_lat, nearby_user.home_lon)
90  end
91
92  def is_friends_with?(new_friend)
93    res = false
94    @new_friend = new_friend
95    self.friends.each do |friend|
96      if friend.friend_user_id == @new_friend.id
97        return true
98      end
99    end
100    return false
101  end
102
103end
Note: See TracBrowser for help on using the repository browser.