Added geo location support.
This commit is contained in:
parent
9c5ab1897b
commit
6e08d1f3d9
3 changed files with 91 additions and 6 deletions
|
@ -1,6 +1,8 @@
|
||||||
class User < ApplicationModel
|
class User < ApplicationModel
|
||||||
before_create :check_name, :check_email, :check_image
|
include Gmaps
|
||||||
before_update :check_password
|
|
||||||
|
before_create :check_name, :check_email, :check_image, :check_geo
|
||||||
|
before_update :check_password, :check_geo
|
||||||
after_create :cache_delete
|
after_create :cache_delete
|
||||||
after_update :cache_delete
|
after_update :cache_delete
|
||||||
after_destroy :cache_delete
|
after_destroy :cache_delete
|
||||||
|
@ -191,28 +193,84 @@ Your #{config.product_name} Team
|
||||||
return data
|
return data
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# update all users geo data
|
||||||
|
def self.geo_update_all
|
||||||
|
User.all.each { |user|
|
||||||
|
user.geo_update
|
||||||
|
user.save
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
# update geo data of one user
|
||||||
|
def geo_update
|
||||||
|
address = ''
|
||||||
|
location = ['street', 'zip', 'city', 'country']
|
||||||
|
location.each { |item|
|
||||||
|
if self[item] && self[item] != ''
|
||||||
|
address = address + ',' + self[item]
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
# return if no address is given
|
||||||
|
return if address == ''
|
||||||
|
|
||||||
|
# dp lookup
|
||||||
|
latlng = Gmaps.geocode(address)
|
||||||
|
if latlng
|
||||||
|
self.preferences['lat'] = latlng[0]
|
||||||
|
self.preferences['lng'] = latlng[1]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
def check_geo
|
||||||
|
|
||||||
|
location = ['street', 'zip', 'city', 'country']
|
||||||
|
|
||||||
|
# check if geo update is needed
|
||||||
|
current = User.find( self.id )
|
||||||
|
current_location = {}
|
||||||
|
location.each { |item|
|
||||||
|
current_location[item] = current[item]
|
||||||
|
}
|
||||||
|
|
||||||
|
# get full address
|
||||||
|
next_location = {}
|
||||||
|
location.each { |item|
|
||||||
|
next_location[item] = self[item]
|
||||||
|
}
|
||||||
|
|
||||||
|
# return if address hasn't changed and geo data is already available
|
||||||
|
return if ( current_location == next_location ) && ( self.preferences['lat'] && self.preferences['lng'] )
|
||||||
|
|
||||||
|
# geo update
|
||||||
|
self.geo_update
|
||||||
|
end
|
||||||
|
|
||||||
def check_name
|
def check_name
|
||||||
if self.firstname && (!self.lastname || self.lastname == '') then
|
if self.firstname && (!self.lastname || self.lastname == '')
|
||||||
name = self.firstname.split(' ', 2)
|
name = self.firstname.split(' ', 2)
|
||||||
self.firstname = name[0]
|
self.firstname = name[0]
|
||||||
self.lastname = name[1]
|
self.lastname = name[1]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_email
|
def check_email
|
||||||
if self.email then
|
if self.email
|
||||||
self.email = self.email.downcase
|
self.email = self.email.downcase
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_image
|
def check_image
|
||||||
require 'digest/md5'
|
require 'digest/md5'
|
||||||
if !self.image || self.image == '' then
|
if !self.image || self.image == ''
|
||||||
if self.email then
|
if self.email
|
||||||
hash = Digest::MD5.hexdigest(self.email)
|
hash = Digest::MD5.hexdigest(self.email)
|
||||||
self.image = "http://www.gravatar.com/avatar/#{hash}?s=48"
|
self.image = "http://www.gravatar.com/avatar/#{hash}?s=48"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_password
|
def check_password
|
||||||
|
|
||||||
# set old password again
|
# set old password again
|
||||||
|
|
|
@ -13,5 +13,8 @@ require 'google_oauth2_database'
|
||||||
# load notification factory (replace all tags)
|
# load notification factory (replace all tags)
|
||||||
require 'notification_factory'
|
require 'notification_factory'
|
||||||
|
|
||||||
|
# load gmaps lookup
|
||||||
|
require 'gmaps'
|
||||||
|
|
||||||
# Initialize the rails application
|
# Initialize the rails application
|
||||||
Zammad::Application.initialize!
|
Zammad::Application.initialize!
|
||||||
|
|
24
lib/gmaps.rb
Normal file
24
lib/gmaps.rb
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
module Gmaps
|
||||||
|
def self.geocode(address)
|
||||||
|
url = "http://maps.googleapis.com/maps/api/geocode/json?address=#{CGI::escape address}&sensor=true"
|
||||||
|
response = Net::HTTP.get_response( URI.parse(url) )
|
||||||
|
return if response.code.to_s != '200'
|
||||||
|
|
||||||
|
result = JSON.parse( response.body )
|
||||||
|
|
||||||
|
lat = result['results'].first['geometry']['location']['lat']
|
||||||
|
lng = result['results'].first['geometry']['location']['lng']
|
||||||
|
latlng = [lat,lng]
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.reverse_geocode(lat,lng)
|
||||||
|
url = "http://maps.googleapis.com/maps/api/geocode/json?latlng=#{lat},#{lng}&sensor=true"
|
||||||
|
response = Net::HTTP.get_response( URI.parse(url) )
|
||||||
|
return if response.code.to_s != '200'
|
||||||
|
|
||||||
|
result = JSON.parse( response.body )
|
||||||
|
|
||||||
|
address = result['results'].first['address_components'].first['long_name']
|
||||||
|
return address
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue