module GeocoderHelper def lookup_ip if request.remote_ip == '127.0.0.1' || request.remote_ip == '::1' session['remote_ip'] || (session['remote_ip'] = open("http://checkip.dyndns.org").first.gsub(/^.*\s([\d\.]+).*$/s, '\1').gsub(/[^\.\d]/, '')) else request.remote_ip end end def get_remote_location Geocoder.search(session['remote_ip'] || (session['remote_ip'] = open("http://checkip.dyndns.org").first.gsub(/^.*\s([\d\.]+).*$/s, '\1').gsub(/[^\.\d]/, '')), language: 'en').first end def lookup_ip_location begin if is_test? && ApplicationController::get_location.present? Geocoder.search(ApplicationController::get_location, language: 'en').first elsif request.remote_ip == '127.0.0.1' || request.remote_ip == '::1' get_remote_location else request.location || get_remote_location end rescue nil end end def potential_provider(registration) return false unless registration.present? && registration.city.present? && registration.conference.present? conditions = registration.conference.provider_conditions || Conference.default_provider_conditions return city_distance_less_than(registration.conference.city, registration.city, conditions['distance']['number'], conditions['distance']['unit']) end def city_distance_less_than(city1, city2, max_distance, unit) return false if city1.nil? || city2.nil? return true if city1.id == city2.id return false if max_distance < 1 return Geocoder::Calculations.distance_between( [city1.latitude, city1.longitude], [city2.latitude, city2.longitude], units: unit.to_sym) < max_distance end def location(location, locale = I18n.locale) return nil if location.blank? city = nil region = nil country = nil if location.is_a?(Location) || location.is_a?(City) country = location.country region = location.territory city = location.city elsif location.data.present? && location.data['address_components'].present? component_map = { 'locality' => :city, 'administrative_area_level_1' => :region, 'country' => :country } location.data['address_components'].each do | component | types = component['types'] country = component['short_name'] if types.include? 'country' region = component['short_name'] if types.include? 'administrative_area_level_1' city = component['long_name'] if types.include? 'locality' end else country = location.data['country_code'] region = location.data['region_code'] city = location.data['city'] end # we need cities for our logic, don't let this continue if we don't have one return nil unless city.present? hash = Hash.new region_translation = region.present? && country.present? ? I18n.t("geography.subregions.#{country}.#{region}", locale: locale, resolve: false) : '' country_translation = country.present? ? _("geography.countries.#{country}", locale: locale) : '' hash[:city] = _!(city) if city.present? hash[:region] = region_translation if region_translation.present? hash[:country] = country_translation if country_translation.present? # return the formatted location or the first value if we only have one value return hash.length > 1 ? _("geography.formats.#{hash.keys.join('_')}", locale: locale, vars: hash) : hash.values.first end def location_link(location, text = nil) return '' unless location.present? address = if text.is_a?(Symbol) location.send(text) elsif text.is_a?(String) text elsif location.is_a?(Location) location.street else location.address end return '' unless address.present? content_tag(:a, (_!address), href: "http://www.google.com/maps/place/#{location.latitude},#{location.longitude}") end def same_city?(location1, location2) return false unless location1.present? && location2.present? location1 = location(location1) unless location1.is_a?(String) location2 = location(location2) unless location2.is_a?(String) location1.eql? location2 end end