diff --git a/app/models/user.rb b/app/models/user.rb index ebed4e662..8662bcf4f 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,6 +1,8 @@ class User < ApplicationModel - before_create :check_name, :check_email, :check_image - before_update :check_password + include Gmaps + + before_create :check_name, :check_email, :check_image, :check_geo + before_update :check_password, :check_geo after_create :cache_delete after_update :cache_delete after_destroy :cache_delete @@ -191,28 +193,84 @@ Your #{config.product_name} Team return data 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 + 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 - if self.firstname && (!self.lastname || self.lastname == '') then + if self.firstname && (!self.lastname || self.lastname == '') name = self.firstname.split(' ', 2) self.firstname = name[0] self.lastname = name[1] end end + def check_email - if self.email then + if self.email self.email = self.email.downcase end end + def check_image require 'digest/md5' - if !self.image || self.image == '' then - if self.email then + if !self.image || self.image == '' + if self.email hash = Digest::MD5.hexdigest(self.email) self.image = "http://www.gravatar.com/avatar/#{hash}?s=48" end end end + def check_password # set old password again diff --git a/config/environment.rb b/config/environment.rb index e0f1bdf97..265657054 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -13,5 +13,8 @@ require 'google_oauth2_database' # load notification factory (replace all tags) require 'notification_factory' +# load gmaps lookup +require 'gmaps' + # Initialize the rails application Zammad::Application.initialize! diff --git a/lib/gmaps.rb b/lib/gmaps.rb new file mode 100644 index 000000000..133d0b77c --- /dev/null +++ b/lib/gmaps.rb @@ -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 \ No newline at end of file