diff --git a/app/models/application_model.rb b/app/models/application_model.rb index 6a80efbe8..2d50b4eb4 100644 --- a/app/models/application_model.rb +++ b/app/models/application_model.rb @@ -278,6 +278,31 @@ returns =begin +generate uniq name (will check name of model and generates _1 sequenze) + +Used as before_update callback, no own use needed + + name = Model.genrate_uniq_name('some name') + +returns + + result = 'some name_X' + +=end + + def self.genrate_uniq_name(name) + return name if !find_by(name: name) + (1..100).each {|counter| + name = "#{name}_#{counter}" + exists = find_by(name: name) + next if exists + break + } + name + end + +=begin + lookup model from cache (if exists) or retrieve it from db, id, name or login possible result = Model.lookup( :id => 123 ) diff --git a/app/models/calendar.rb b/app/models/calendar.rb index 925c14a33..4394ed86a 100644 --- a/app/models/calendar.rb +++ b/app/models/calendar.rb @@ -10,6 +10,36 @@ class Calendar < ApplicationModel =begin +set inital default calendar + + calendar = Calendar.init_setup + +returns calendar object + +=end + + def self.init_setup(ip = nil) + + # call for calendar suggestion + calendar_details = Service::GeoCalendar.location(ip) + return if !calendar_details + + calendar_details['name'] = Calendar.genrate_uniq_name(calendar_details['name']) + calendar_details['default'] = true + calendar_details['created_by_id'] = 1 + calendar_details['updated_by_id'] = 1 + + # find if auto generated calendar exists + calendar = Calendar.find_by(default: true, updated_by_id: 1, created_by_id: 1) + if calendar + calendar.update_attributes(calendar_details) + return calendar + end + create(calendar_details) + end + +=begin + get default calendar calendar = Calendar.default diff --git a/db/migrate/20150975000001_update_settings5.rb b/db/migrate/20150975000001_update_settings5.rb new file mode 100644 index 000000000..224c17dde --- /dev/null +++ b/db/migrate/20150975000001_update_settings5.rb @@ -0,0 +1,28 @@ +class UpdateSettings5 < ActiveRecord::Migration + def up + Setting.create_or_update( + title: 'Geo Calendar Service', + name: 'geo_calendar_backend', + area: 'System::Services', + description: 'Defines the backend for geo calendar lookups. Used for inital calendar succession.', + options: { + form: [ + { + display: '', + null: true, + name: 'geo_calendar_backend', + tag: 'select', + options: { + '' => '-', + 'Service::GeoCalendar::Zammad' => 'Zammad GeoCalendar Service', + }, + }, + ], + }, + state: 'Service::GeoCalendar::Zammad', + preferences: { prio: 2 }, + frontend: false + ) + Calendar.init_setup + end +end diff --git a/db/seeds.rb b/db/seeds.rb index 12f4474f1..ad069ec92 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -276,6 +276,30 @@ Setting.create_if_not_exists( frontend: false ) +Setting.create_if_not_exists( + title: 'Geo Calendar Service', + name: 'geo_calendar_backend', + area: 'System::Services', + description: 'Defines the backend for geo calendar lookups. Used for inital calendar succession.', + options: { + form: [ + { + display: '', + null: true, + name: 'geo_calendar_backend', + tag: 'select', + options: { + '' => '-', + 'Service::GeoCalendar::Zammad' => 'Zammad GeoCalendar Service', + }, + }, + ], + }, + state: 'Service::GeoCalendar::Zammad', + preferences: { prio: 2 }, + frontend: false +) + Setting.create_if_not_exists( title: 'Send client stats', name: 'ui_send_client_stats', @@ -1920,6 +1944,7 @@ Locale.create_if_not_exists( ) Locale.load Translation.load +Calendar.init_setup # install all packages in auto_install -Package.auto_install() +Package.auto_install diff --git a/test/integration/geo_calendar_test.rb b/test/integration/geo_calendar_test.rb new file mode 100644 index 000000000..d24881563 --- /dev/null +++ b/test/integration/geo_calendar_test.rb @@ -0,0 +1,65 @@ +# encoding: utf-8 +require 'integration_test_helper' + +class GeoIpCalendar < ActiveSupport::TestCase + + # check + test 'check some results' do + + result = Service::GeoCalendar.location( '127.0.0.0.1' ) + assert(result) + assert_equal('My Calendar', result['name']) + assert_equal('America/Los_Angeles', result['timezone']) + + result = Service::GeoCalendar.location( '127.0.0.1' ) + assert(result) + assert_equal('My Calendar', result['name']) + assert_equal('America/Los_Angeles', result['timezone']) + + result = Service::GeoCalendar.location( '195.65.29.254' ) + assert(result) + assert_equal('Switzerland', result['name']) + assert_equal('Europe/Zurich', result['timezone']) + + result = Service::GeoCalendar.location( '195.191.132.18' ) + assert(result) + assert_equal('Switzerland', result['name']) + assert_equal('Europe/Zurich', result['timezone']) + + result = Service::GeoCalendar.location( '134.109.140.74' ) + assert(result) + assert_equal('Germany', result['name']) + assert_equal('Europe/Berlin', result['timezone']) + + result = Service::GeoCalendar.location( '46.253.55.170' ) + assert(result) + assert_equal('Germany', result['name']) + assert_equal('Europe/Berlin', result['timezone']) + + result = Service::GeoCalendar.location( '169.229.216.200' ) + assert(result) + assert_equal('United States/California', result['name']) + assert_equal('America/Los_Angeles', result['timezone']) + + result = Service::GeoCalendar.location( '17.171.2.25' ) + assert(result) + assert_equal('United States/California', result['name']) + assert_equal('America/Los_Angeles', result['timezone']) + + result = Service::GeoCalendar.location( '184.168.47.225' ) + assert(result) + assert_equal('United States/Arizona', result['name']) + assert_equal('America/Phoenix', result['timezone']) + + result = Service::GeoCalendar.location( '69.172.201.245' ) + assert(result) + assert_equal('United States/New York', result['name']) + assert_equal('America/New_York', result['timezone']) + + result = Service::GeoCalendar.location( '132.247.70.37' ) + assert(result) + assert_equal('Mexico/Sonora', result['name']) + assert_equal('America/Hermosillo', result['timezone']) + + end +end diff --git a/test/integration/geo_ip_test.rb b/test/integration/geo_ip_test.rb index f9ad9d416..b38b73fa4 100644 --- a/test/integration/geo_ip_test.rb +++ b/test/integration/geo_ip_test.rb @@ -15,6 +15,15 @@ class GeoIpTest < ActiveSupport::TestCase assert_equal(nil, result['latitude']) assert_equal(nil, result['longitude']) + result = Service::GeoIp.location( '127.0.0.1' ) + assert(result) + assert_equal(nil, result['country_name']) + assert_equal(nil, result['city_name']) + assert_equal(nil, result['country_code']) + assert_equal(nil, result['continent_code']) + assert_equal(nil, result['latitude']) + assert_equal(nil, result['longitude']) + result = Service::GeoIp.location( '195.65.29.254' ) assert(result) assert_equal('Switzerland', result['country_name']) @@ -51,5 +60,14 @@ class GeoIpTest < ActiveSupport::TestCase assert_equal(37.8668, result['latitude']) assert_equal(-122.2536, result['longitude']) + result = Service::GeoIp.location( '17.171.2.25' ) + assert(result) + assert_equal('United States', result['country_name']) + assert_equal('Cupertino', result['city_name']) + assert_equal('US', result['country_code']) + assert_equal('NA', result['continent_code']) + assert_equal(37.323, result['latitude']) + assert_equal(-122.0322, result['longitude']) + end end