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

Last change on this file since 3159 was 3159, checked in by tomhughes, 13 years ago

Don't allow ;., to be used in display names, as those are used as
separator characters by rails when routing, which means a display name
containing them will not work as part of a URL.

File size: 2.7 KB
Line 
1class User < ActiveRecord::Base
2  require 'xml/libxml'
3  require 'digest/md5'
4
5  has_many :traces
6  has_many :diary_entries
7  has_many :messages, :foreign_key => :to_user_id
8  has_many :friends
9
10  validates_confirmation_of :pass_crypt, :message => 'Password must match the confirmation password'
11  validates_uniqueness_of :display_name, :allow_nil => true
12  validates_uniqueness_of :email
13  validates_length_of :pass_crypt, :minimum => 8
14  validates_length_of :display_name, :minimum => 3, :allow_nil => true
15  validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i
16  validates_format_of :display_name, :with => /^[^\/;.,?]*$/
17
18  before_save :encrypt_password
19
20  def set_defaults
21    self.creation_time = Time.now
22    self.timeout = Time.now
23    self.token = User.make_token()
24  end
25
26  def encrypt_password
27    self.pass_crypt = Digest::MD5.hexdigest(pass_crypt) if pass_crypt_confirmation
28  end
29
30  def self.authenticate(email, passwd)
31    find(:first, :conditions => [ "email = ? AND pass_crypt = ? AND active = true", email, Digest::MD5.hexdigest(passwd)])
32  end 
33
34  def self.authenticate_token(token) 
35    find(:first, :conditions => [ "token = ? ", token])
36  end 
37
38  def self.make_token(length=30)
39    chars = 'abcdefghijklmnopqrtuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
40    confirmstring = ''
41
42    length.times do
43      confirmstring += chars[(rand * chars.length).to_i].chr
44    end
45
46    return confirmstring
47  end
48
49  def to_xml
50    doc = OSM::API.new.get_xml_doc
51    doc.root << to_xml_node()
52    return doc
53  end
54
55  def to_xml_node
56    el1 = XML::Node.new 'user'
57    el1['display_name'] = self.display_name.to_s
58    el1['account_created'] = self.creation_time.xmlschema
59    return el1
60  end
61
62  def nearby(lat_range=1, lon_range=1)
63      if self.home_lon and self.home_lat
64          nearby = User.find(:all,  :conditions => "#{self.home_lon} > home_lon - #{lon_range} and #{self.home_lon} < home_lon + #{lon_range} and  #{self.home_lat} > home_lat - #{lat_range} and #{self.home_lat} < home_lat + #{lat_range} and data_public = 1 and id != #{self.id}") 
65      else
66          nearby = []
67      end
68      return nearby
69  end
70
71  def self.has_messages?
72    if Message.fdhjklsafind_by_to_user_id(self.id) 
73      return true
74    else
75      return false
76    end
77  end
78
79  def get_new_messages
80    messages = Message.find(:all, :conditions => "message_read = 0 and to_user_id = #{self.id}")
81    return messages
82  end
83
84  def get_all_messages
85    messages = Message.find(:all, :conditions => "to_user_id = #{self.id}")
86    return messages
87  end
88
89  def is_friends_with?(new_friend)
90    res = false
91    @new_friend = new_friend
92    self.friends.each do |friend|
93      if friend.user_id == @new_friend.user_id
94        return true
95      end
96    end
97    return false
98  end
99
100end
Note: See TracBrowser for help on using the repository browser.