ifd_tools 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/MIT-LICENSE +20 -0
- data/README.md +28 -0
- data/Rakefile +40 -0
- data/app/admin/emergency_messages.rb +33 -0
- data/app/admin/notifier_updates.rb +42 -0
- data/app/admin/software_updates.rb +42 -0
- data/app/admin/users.rb +48 -0
- data/app/assets/javascripts/ifd_tools/base.js +4 -0
- data/app/assets/javascripts/ifd_tools/fusion_charts.js +361 -0
- data/app/assets/stylesheets/ifd_tools/active_admin/_analytics.scss +32 -0
- data/app/assets/stylesheets/ifd_tools/active_admin/_cleanup.scss +15 -0
- data/app/assets/stylesheets/ifd_tools/active_admin/_footer.scss +87 -0
- data/app/assets/stylesheets/ifd_tools/active_admin/_square_admin_buttons.scss +27 -0
- data/app/assets/stylesheets/ifd_tools/base.scss +4 -0
- data/app/assets/swfs/FCF_Area2D.swf +0 -0
- data/app/assets/swfs/usa_map.swf +0 -0
- data/app/controllers/ifd_tools/application_controller.rb +4 -0
- data/app/helpers/ifd_tools/application_helper.rb +30 -0
- data/app/models/ifd_tools/emergency_message.rb +27 -0
- data/app/models/ifd_tools/notifier_update.rb +28 -0
- data/app/models/ifd_tools/software_update.rb +28 -0
- data/app/models/ifd_tools/tracking/application_event.rb +6 -0
- data/app/models/ifd_tools/tracking/event.rb +51 -0
- data/app/models/ifd_tools/tracking.rb +7 -0
- data/app/uploaders/software_uploader.rb +18 -0
- data/app/views/admin/customers/_trend.html.haml +7 -0
- data/app/views/admin/customers/_trend_info_sidebar.html.haml +11 -0
- data/app/views/admin/customers/demographic_data.builder +11 -0
- data/app/views/admin/customers/events_data.builder +6 -0
- data/app/views/admin/customers/filter_events.js.erb +6 -0
- data/app/views/admin/customers/trends.html.haml +11 -0
- data/app/views/admin/dashboard/_line_graph.html.haml +11 -0
- data/app/views/admin/dashboard/_usa_map.html.haml +2 -0
- data/app/views/admin/emergency_messages/_form.html.haml +6 -0
- data/app/views/admin/notifier_updates/_form.html.haml +9 -0
- data/app/views/admin/shared/_footer.html.haml +6 -0
- data/app/views/admin/software_updates/_form.html.haml +9 -0
- data/app/views/admin/users/_form.html.haml +9 -0
- data/app/views/api/emergency_messages.builder +12 -0
- data/app/views/api/notifier_updates.builder +15 -0
- data/app/views/api/software_updates.builder +15 -0
- data/app/views/api/track.builder +6 -0
- data/app/views/layouts/ifd_tools/application.html.erb +14 -0
- data/config/routes.rb +2 -0
- data/db/migrate/20121010183004_create_ifd_tools_emergency_messages.rb +11 -0
- data/db/migrate/20121011150939_create_ifd_tools_notifier_updates.rb +14 -0
- data/db/migrate/20121011151124_create_ifd_tools_software_updates.rb +14 -0
- data/db/migrate/20121011205911_devise_create_users.rb +57 -0
- data/db/migrate/20121012123505_create_customers.rb +52 -0
- data/db/migrate/20121012133303_create_ifd_tools_tracking_events.rb +14 -0
- data/lib/generators/ifd_tools/install/USAGE +5 -0
- data/lib/generators/ifd_tools/install/install_generator.rb +153 -0
- data/lib/generators/ifd_tools/install/templates/admin/customers.rb +108 -0
- data/lib/generators/ifd_tools/install/templates/admin/dashboard.rb +47 -0
- data/lib/generators/ifd_tools/install/templates/assets/active_admin.css.scss +7 -0
- data/lib/generators/ifd_tools/install/templates/assets/active_admin.js +2 -0
- data/lib/generators/ifd_tools/install/templates/assets/application.css.scss +46 -0
- data/lib/generators/ifd_tools/install/templates/assets/application.js +2 -0
- data/lib/generators/ifd_tools/install/templates/assets/ckeditor.js.coffee +13 -0
- data/lib/generators/ifd_tools/install/templates/capistrano/Capfile +5 -0
- data/lib/generators/ifd_tools/install/templates/capistrano/deploy/production.rb +2 -0
- data/lib/generators/ifd_tools/install/templates/capistrano/deploy/staging.rb +2 -0
- data/lib/generators/ifd_tools/install/templates/capistrano/deploy.rb +50 -0
- data/lib/generators/ifd_tools/install/templates/config/en.yml +17 -0
- data/lib/generators/ifd_tools/install/templates/config/ifd_tools.rb +4 -0
- data/lib/generators/ifd_tools/install/templates/config/schedule.rb.erb +28 -0
- data/lib/generators/ifd_tools/install/templates/controllers/api_controller.rb +8 -0
- data/lib/generators/ifd_tools/install/templates/controllers/application_controller.rb +19 -0
- data/lib/generators/ifd_tools/install/templates/controllers/customer_session_controller.rb +39 -0
- data/lib/generators/ifd_tools/install/templates/foreman/Procfile +2 -0
- data/lib/generators/ifd_tools/install/templates/layouts/application.html.haml +29 -0
- data/lib/generators/ifd_tools/install/templates/layouts/application_logged_out.html.haml +21 -0
- data/lib/generators/ifd_tools/install/templates/models/ability.rb +23 -0
- data/lib/generators/ifd_tools/install/templates/models/customer.rb +60 -0
- data/lib/generators/ifd_tools/install/templates/models/settings.rb +5 -0
- data/lib/generators/ifd_tools/install/templates/models/user.rb +31 -0
- data/lib/generators/ifd_tools/install/templates/settings/application.yml +16 -0
- data/lib/generators/ifd_tools/install/templates/views/customers/_form.html.haml +8 -0
- data/lib/ifd_tools/active_admin/base.rb +18 -0
- data/lib/ifd_tools/api_controller/emergency_messages.rb +9 -0
- data/lib/ifd_tools/api_controller/notifier_updates.rb +9 -0
- data/lib/ifd_tools/api_controller/software_updates.rb +9 -0
- data/lib/ifd_tools/api_controller/tracking.rb +44 -0
- data/lib/ifd_tools/api_controller_extensions.rb +18 -0
- data/lib/ifd_tools/configure.rb +27 -0
- data/lib/ifd_tools/date_time_additions.rb +11 -0
- data/lib/ifd_tools/engine.rb +17 -0
- data/lib/ifd_tools/states.rb +59 -0
- data/lib/ifd_tools/tracking/customer_tracking.rb +143 -0
- data/lib/ifd_tools/tracking/trackable.rb +28 -0
- data/lib/ifd_tools/validations/phone.rb +17 -0
- data/lib/ifd_tools/version.rb +3 -0
- data/lib/ifd_tools.rb +26 -0
- data/lib/tasks/ifd_tools_tasks.rake +2 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config/application.rb +59 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/schema.rb +24 -0
- data/test/dummy/log/development.log +15 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/fixtures/ifd_tools/emergency_messages.yml +11 -0
- data/test/fixtures/ifd_tools/notifier_updates.yml +17 -0
- data/test/fixtures/ifd_tools/software_updates.yml +17 -0
- data/test/fixtures/ifd_tools/tracking/events.yml +17 -0
- data/test/ifd_tools_test.rb +7 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/test_helper.rb +15 -0
- data/test/unit/ifd_tools/emergency_message_test.rb +9 -0
- data/test/unit/ifd_tools/notifier_update_test.rb +9 -0
- data/test/unit/ifd_tools/software_update_test.rb +9 -0
- data/test/unit/ifd_tools/tracking/event_test.rb +9 -0
- metadata +464 -0
@@ -0,0 +1,52 @@
|
|
1
|
+
class CreateCustomers < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table(:customers) do |t|
|
4
|
+
## Database authenticatable
|
5
|
+
t.string :email, :null => false, :default => ""
|
6
|
+
t.string :encrypted_password, :null => false, :default => ""
|
7
|
+
|
8
|
+
## Recoverable
|
9
|
+
t.string :reset_password_token
|
10
|
+
t.datetime :reset_password_sent_at
|
11
|
+
|
12
|
+
## Rememberable
|
13
|
+
t.datetime :remember_created_at
|
14
|
+
|
15
|
+
## Trackable
|
16
|
+
t.integer :sign_in_count, :default => 0
|
17
|
+
t.datetime :current_sign_in_at
|
18
|
+
t.datetime :last_sign_in_at
|
19
|
+
t.string :current_sign_in_ip
|
20
|
+
t.string :last_sign_in_ip
|
21
|
+
|
22
|
+
## Confirmable
|
23
|
+
t.string :confirmation_token
|
24
|
+
t.datetime :confirmed_at
|
25
|
+
t.datetime :confirmation_sent_at
|
26
|
+
t.string :unconfirmed_email # Only if using reconfirmable
|
27
|
+
|
28
|
+
## Token authenticatable
|
29
|
+
t.string :authentication_token
|
30
|
+
|
31
|
+
# Additional Fields
|
32
|
+
t.string :first_name
|
33
|
+
t.string :last_name
|
34
|
+
t.string :phone
|
35
|
+
t.string :street
|
36
|
+
t.string :city
|
37
|
+
t.string :state, length: 2
|
38
|
+
t.string :zip, length: 15
|
39
|
+
t.string :platform
|
40
|
+
t.string :status, default: "pending"
|
41
|
+
t.string :url
|
42
|
+
|
43
|
+
t.timestamps
|
44
|
+
end
|
45
|
+
|
46
|
+
add_index :customers, :email, :unique => true
|
47
|
+
add_index :customers, :reset_password_token, :unique => true
|
48
|
+
add_index :customers, :confirmation_token, :unique => true
|
49
|
+
add_index :customers, :authentication_token, :unique => true
|
50
|
+
add_index :customers, :platform
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class CreateIfdToolsTrackingEvents < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :ifd_tools_tracking_events do |t|
|
4
|
+
t.references :customer
|
5
|
+
t.string :ip_address
|
6
|
+
t.string :type
|
7
|
+
t.datetime :timestamp
|
8
|
+
t.string :platform
|
9
|
+
t.references :trackable, polymorphic: true
|
10
|
+
end
|
11
|
+
add_index :ifd_tools_tracking_events, :customer_id
|
12
|
+
add_index :ifd_tools_tracking_events, :trackable_id
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
# http://rdoc.info/github/wycats/thor/master/Thor/Actions#inside-instance_method
|
2
|
+
# http://guides.rubyonrails.org/generators.html#customizing-your-workflow-by-changing-generators-templates
|
3
|
+
module IfdTools
|
4
|
+
class InstallGenerator < Rails::Generators::Base
|
5
|
+
|
6
|
+
desc "Will setup new Rails app for use with IfdTools"
|
7
|
+
source_root File.expand_path('../templates', __FILE__)
|
8
|
+
|
9
|
+
def add_gems
|
10
|
+
gem "capistrano", group: :development
|
11
|
+
gem "rvm-capistrano", group: :development
|
12
|
+
gem 'foreman', group: :development
|
13
|
+
gem 'thin'
|
14
|
+
end
|
15
|
+
|
16
|
+
def setup_delayed_job
|
17
|
+
generate "delayed_job:active_record"
|
18
|
+
end
|
19
|
+
|
20
|
+
def setup_wheneverize
|
21
|
+
gem 'whenever', require: false
|
22
|
+
template "config/schedule.rb.erb", "#{Rails.root}/config/schedule.rb"
|
23
|
+
end
|
24
|
+
|
25
|
+
def setup_active_admin
|
26
|
+
generate "active_admin:install", "User"
|
27
|
+
remove_file "#{Rails.root}/app/admin/user.rb", verbose: false
|
28
|
+
remove_file "#{Rails.root}/app/models/user.rb", verbose: false
|
29
|
+
template "models/user.rb", "#{Rails.root}/app/models/user.rb"
|
30
|
+
application(nil, env: :production) do
|
31
|
+
'config.assets.precompile += %w( ckeditor/config.js active_admin.css active_admin.js active_admin/print.css )'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def cleanup_assets
|
36
|
+
|
37
|
+
remove_file "#{Rails.root}/app/assets/stylesheets/active_admin.css.scss", verbose: false
|
38
|
+
template "assets/active_admin.css.scss", "#{Rails.root}/app/assets/stylesheets/active_admin.css.scss"
|
39
|
+
|
40
|
+
remove_file "#{Rails.root}/app/assets/stylesheets/application.css", verbose: false
|
41
|
+
template "assets/application.css.scss", "#{Rails.root}/app/assets/stylesheets/application.css.scss"
|
42
|
+
|
43
|
+
|
44
|
+
%w(active_admin.js application.js).each do |js|
|
45
|
+
remove_file "#{Rails.root}/app/assets/javascripts/#{js}", verbose: false
|
46
|
+
template "assets/#{js}", "#{Rails.root}/app/assets/javascripts/#{js}"
|
47
|
+
end
|
48
|
+
|
49
|
+
empty_directory "#{Rails.root}/app/assets/javascripts/ckeditor", verbose: false
|
50
|
+
copy_file "assets/ckeditor.js.coffee", "#{Rails.root}/app/assets/javascripts/ckeditor/config.js.coffee"
|
51
|
+
|
52
|
+
remove_file "#{Rails.root}/app/assets/images/rails.png"
|
53
|
+
remove_file "#{Rails.root}/public/index.html"
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
def setup_foreman
|
58
|
+
template "foreman/Procfile", "#{Rails.root}/Procfile"
|
59
|
+
end
|
60
|
+
|
61
|
+
def setup_routes
|
62
|
+
route %q{match '/api/:action(.:format)', to: 'api'}
|
63
|
+
end
|
64
|
+
|
65
|
+
def set_defaults_in_application_config
|
66
|
+
application 'config.autoload_paths += %W(#{config.root}/lib)'
|
67
|
+
application "config.time_zone = 'Eastern Time (US & Canada)'"
|
68
|
+
application "config.assets.initialize_on_precompile = false"
|
69
|
+
end
|
70
|
+
|
71
|
+
def configure_devise_async
|
72
|
+
initializer "devise_async.rb", "Devise::Async.backend = :delayed_job"
|
73
|
+
|
74
|
+
devise_init = "#{Rails.root}/config/initializers/devise.rb"
|
75
|
+
gsub_file devise_init, %r{mailer = ".*"}, %q{mailer = "Devise::Async::Proxy"}
|
76
|
+
gsub_file devise_init, %r{mailer_sender = ".*"}, %q{mailer_sender = Settings.notifications_email}
|
77
|
+
|
78
|
+
uncomment_lines devise_init, /token_authentication_key/
|
79
|
+
uncomment_lines devise_init, /mailer = /
|
80
|
+
end
|
81
|
+
|
82
|
+
def setup_cancan
|
83
|
+
template "models/ability.rb", "#{Rails.root}/app/models/ability.rb"
|
84
|
+
remove_file "#{Rails.root}/app/controllers/application_controller.rb", verbose: false
|
85
|
+
template "controllers/application_controller.rb", "#{Rails.root}/app/controllers/application_controller.rb"
|
86
|
+
end
|
87
|
+
|
88
|
+
def install_settingslogic
|
89
|
+
gem "settingslogic"
|
90
|
+
template "models/settings.rb", "#{Rails.root}/app/models/settings.rb"
|
91
|
+
template "settings/application.yml", "#{Rails.root}/config/application.yml"
|
92
|
+
end
|
93
|
+
|
94
|
+
def install_migrations
|
95
|
+
Dir["#{Rails.root}/db/migrate/*.rb"].select { |f| f.end_with? "create_users.rb" }.map { |f| File.delete f }
|
96
|
+
rake "railties:install:migrations FROM=ifd_tools"
|
97
|
+
end
|
98
|
+
|
99
|
+
def setup_customers
|
100
|
+
template "models/customer.rb", "#{Rails.root}/app/models/customer.rb"
|
101
|
+
template "admin/customers.rb", "#{Rails.root}/app/admin/customers.rb"
|
102
|
+
template "controllers/customer_session_controller.rb", "#{Rails.root}/app/controllers/customer_session_controller.rb"
|
103
|
+
empty_directory "#{Rails.root}/app/views/admin/customers"
|
104
|
+
template "views/customers/_form.html.haml", "#{Rails.root}/app/views/admin/customers/_form.html.haml"
|
105
|
+
route "devise_for :customers, path: '', controllers: { sessions: 'customer_session' }"
|
106
|
+
|
107
|
+
remove_file "#{Rails.root}/config/locales/en.yml", verbose: false
|
108
|
+
template "config/en.yml", "#{Rails.root}/config/locales/en.yml"
|
109
|
+
end
|
110
|
+
|
111
|
+
def install_controllers
|
112
|
+
template "controllers/api_controller.rb", "#{Rails.root}/app/controllers/api_controller.rb"
|
113
|
+
end
|
114
|
+
|
115
|
+
def install_layouts
|
116
|
+
remove_file "#{Rails.root}/app/views/layouts/application.html.erb", verbose: false
|
117
|
+
template "layouts/application.html.haml", "#{Rails.root}/app/views/layouts/application.html.haml"
|
118
|
+
template "layouts/application_logged_out.html.haml", "#{Rails.root}/app/views/layouts/application_logged_out.html.haml"
|
119
|
+
end
|
120
|
+
|
121
|
+
def setup_capistrano
|
122
|
+
template "capistrano/Capfile", "#{Rails.root}/Capfile"
|
123
|
+
template "capistrano/deploy.rb", "#{Rails.root}/config/deploy.rb"
|
124
|
+
|
125
|
+
empty_directory "#{Rails.root}/config/deploy"
|
126
|
+
template "capistrano/deploy/staging.rb", "#{Rails.root}/config/deploy/staging.rb"
|
127
|
+
template "capistrano/deploy/production.rb", "#{Rails.root}/config/deploy/production.rb"
|
128
|
+
|
129
|
+
copy_file "#{Rails.root}/config/environments/production.rb", "#{Rails.root}/config/environments/staging.rb"
|
130
|
+
end
|
131
|
+
|
132
|
+
def install_our_initializer
|
133
|
+
template "config/ifd_tools.rb", "#{Rails.root}/config/initializers/ifd_tools.rb"
|
134
|
+
end
|
135
|
+
|
136
|
+
def install_dashboard
|
137
|
+
remove_file "#{Rails.root}/app/admin/dashboard.rb", verbose: false
|
138
|
+
template "admin/dashboard.rb", "#{Rails.root}/app/admin/dashboard.rb"
|
139
|
+
end
|
140
|
+
|
141
|
+
def add_to_gitignore
|
142
|
+
append_to_file "#{Rails.root}/.gitignore", <<-GITIGNORE
|
143
|
+
.DS_Store
|
144
|
+
/config/database.yml
|
145
|
+
GITIGNORE
|
146
|
+
end
|
147
|
+
|
148
|
+
def last_tasks
|
149
|
+
rake "db:migrate"
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
ActiveAdmin.register Customer do
|
2
|
+
|
3
|
+
config.sort_order = "last_name_asc"
|
4
|
+
controller.authorize_resource
|
5
|
+
controller.resources_configuration[:self][:finder] = :find_by_url!
|
6
|
+
|
7
|
+
before_filter only: [:activate, :deactivate] do
|
8
|
+
@customer = Customer.find_by_url! params[:id]
|
9
|
+
end
|
10
|
+
|
11
|
+
filter :last_name
|
12
|
+
filter :first_name
|
13
|
+
filter :email
|
14
|
+
filter :platform, as: :select, collection: %w(pc mac), member_label: :titleize
|
15
|
+
filter :phone
|
16
|
+
filter :state, as: :select, collection: IfdTools::States::all.invert
|
17
|
+
filter :created_at
|
18
|
+
filter :updated_at
|
19
|
+
|
20
|
+
scope :all
|
21
|
+
scope :pending, default: true
|
22
|
+
scope :active
|
23
|
+
scope :banned
|
24
|
+
scope :unconfirmed
|
25
|
+
|
26
|
+
action_item only: [:show, :edit] do
|
27
|
+
if resource.active?
|
28
|
+
link_to "Deactivate", [:deactivate, :admin, resource], title: "Deactivate this user", confirm: I18n.t('customer.deactivation_confirmation.singular')
|
29
|
+
else
|
30
|
+
link_to "Activate", [:activate, :admin, resource], title: "Activate this user", confirm: I18n.t('customer.activation_confirmation.singular')
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
batch_action :activate, confirm: I18n.t('customer.activation_confirmation.plural') do |ids|
|
35
|
+
Customer.find_each(conditions: { id: ids}) { |c| c.activate! }
|
36
|
+
redirect_to collection_path, notice: I18n.t('customer.activated', count: ids.count)
|
37
|
+
end
|
38
|
+
|
39
|
+
batch_action :deactivate, confirm: I18n.t('customer.deactivation_confirmation.plural') do |ids|
|
40
|
+
Customer.find_each(conditions: { id: ids}) { |c| c.deactivate! }
|
41
|
+
redirect_to collection_path, notice: I18n.t('customer.deactivated', count: ids.count)
|
42
|
+
end
|
43
|
+
|
44
|
+
csv do
|
45
|
+
column :id
|
46
|
+
column :email
|
47
|
+
column :first_name
|
48
|
+
column :last_name
|
49
|
+
column(:phone) { |c| phone_number(c.phone) }
|
50
|
+
column :state
|
51
|
+
column :status
|
52
|
+
column :platform
|
53
|
+
column :current_sign_in_at
|
54
|
+
column :last_sign_in_at
|
55
|
+
column :confirmed_at
|
56
|
+
column :confirmation_sent_at
|
57
|
+
end
|
58
|
+
|
59
|
+
index do
|
60
|
+
selectable_column
|
61
|
+
column(:last, sortable: :last_name) { |c| c.last_name }
|
62
|
+
column(:first, sortable: :first_name) { |c| c.first_name }
|
63
|
+
column(:email, sortable: :email) { |c| link_to c.email, "mailto:#{c.email}" if c.email.present? }
|
64
|
+
column(:phone, sortable: :phone) { |c| number_to_phone c.phone, area_code: true, delimiter: "." }
|
65
|
+
column("") do |c|
|
66
|
+
actions = link_to "View", [:admin, c], class: "member_link view_link"
|
67
|
+
actions << link_to("Edit", [:edit, :admin, c], class: "member_link edit_link")
|
68
|
+
actions << link_to("Delete", [:admin, c], method: :delete, confirm: "Are you sure you want to delete this Customer?", class: "member_link delete_link")
|
69
|
+
if c.active?
|
70
|
+
actions << link_to("Deactivate", [:deactivate, :admin, c], title: "Deactivate this user", confirm: I18n.t('customer.deactivation_confirmation.singular'), class: "member_link")
|
71
|
+
actions << link_to("Trends", [:trends, :admin, c], class: "member_link")
|
72
|
+
else
|
73
|
+
actions << link_to("Activate", [:activate, :admin, c], title: "Activate this user", confirm: I18n.t('customer.activation_confirmation.singular'), class: "member_link")
|
74
|
+
end
|
75
|
+
actions
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
form partial: "form"
|
80
|
+
|
81
|
+
show title: proc { "Customer: #{resource.full_name}" } do
|
82
|
+
panel "Customer Information" do
|
83
|
+
attributes_table_for resource do
|
84
|
+
row(:name) { resource.full_name }
|
85
|
+
row(:email) { mailto resource.email, resource.email if resource.email.present? }
|
86
|
+
row(:phone) { number_to_phone :phone, area_code: true, delimiter: "." }
|
87
|
+
row(:state)
|
88
|
+
row(:platform)
|
89
|
+
row(:created_at) { resource.created_at.humanize }
|
90
|
+
row(:updated_at) { resource.updated_at.humanize }
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
member_action :deactivate do
|
96
|
+
@customer.deactivate!
|
97
|
+
redirect_to collection_path, notice: I18n.t('customer.deactivated', count: 1)
|
98
|
+
end
|
99
|
+
|
100
|
+
member_action :activate do
|
101
|
+
@customer.activate!
|
102
|
+
redirect_to collection_path, notice: I18n.t('customer.approved', count: 1)
|
103
|
+
end
|
104
|
+
|
105
|
+
# Provides functionality for customer trends and for XML generation used on the dashboard
|
106
|
+
include IfdTools::Tracking::CustomerTracking
|
107
|
+
|
108
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
ActiveAdmin.register_page "Dashboard" do
|
2
|
+
|
3
|
+
menu :priority => 1, :label => proc{ I18n.t("active_admin.dashboard") }
|
4
|
+
|
5
|
+
content :title => proc{ I18n.t("active_admin.dashboard") } do
|
6
|
+
|
7
|
+
# First row of content
|
8
|
+
columns do
|
9
|
+
column do
|
10
|
+
panel "Top Users" do
|
11
|
+
div(id: :top_users_panel) { render "usa_map" }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
column do
|
16
|
+
panel "Top Content" do
|
17
|
+
div(id: :top_content_panel) { render "line_graph" }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# Second row of content
|
23
|
+
columns do
|
24
|
+
column do
|
25
|
+
panel "Most Active Users" do
|
26
|
+
table_for Customer.top_users.limit(25) do
|
27
|
+
column(:name) { |c| link_to c.full_name, [:admin, c] }
|
28
|
+
column(:email) { |c| mail_to c.email, c.email }
|
29
|
+
column(:phone) { |c| number_to_phone c.phone, area_code: true }
|
30
|
+
column(:activity) { |c| c.tracking_events.count }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
column do
|
35
|
+
panel "Most Active Content" do
|
36
|
+
table_for IfdTools::Tracking::Event.top_content do
|
37
|
+
column(:name) { |event| link_to event.trackable_title, [:admin, event.trackable_resource] }
|
38
|
+
column(:type) { |event| event.trackable_type }
|
39
|
+
column(:activity) { |event| event.trackable_activity }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
@import "compass/reset";
|
2
|
+
@import "compass/utilities";
|
3
|
+
@import "active_admin/mixins";
|
4
|
+
$primary-color: #083974;
|
5
|
+
|
6
|
+
@import "active_admin/base";
|
7
|
+
@import "ifd_tools/base";
|
8
|
+
|
9
|
+
#wrapper {
|
10
|
+
display:block;
|
11
|
+
width:auto;
|
12
|
+
}
|
13
|
+
|
14
|
+
#header {
|
15
|
+
|
16
|
+
#utility_nav {
|
17
|
+
@include clearfix;
|
18
|
+
font-size: 14px;
|
19
|
+
margin-right: 71px;
|
20
|
+
margin-top: 23px;
|
21
|
+
}
|
22
|
+
}
|
23
|
+
|
24
|
+
#content_wrapper{
|
25
|
+
margin: 20px auto !important;
|
26
|
+
width: 500px
|
27
|
+
}
|
28
|
+
|
29
|
+
body.logged_in .flash {
|
30
|
+
top:0px;
|
31
|
+
}
|
32
|
+
|
33
|
+
.devise_passwords, .devise_confirmations {
|
34
|
+
#active_admin_content {
|
35
|
+
form {
|
36
|
+
margin-bottom:15px;
|
37
|
+
div:last-child {
|
38
|
+
margin-top:10px;
|
39
|
+
}
|
40
|
+
}
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
.clearBoth {
|
45
|
+
clear:both;
|
46
|
+
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.config.html
|
2
|
+
CKEDITOR.editorConfig = (config) ->
|
3
|
+
|
4
|
+
config.pasteFromWordPromptCleanup = true
|
5
|
+
|
6
|
+
config.toolbar_Full = [
|
7
|
+
{ name: 'basicstyles', items : [ 'Bold','Italic','Underline','-','RemoveFormat' ] },
|
8
|
+
{ name: 'links', items : [ 'Link','Unlink','Anchor' ] },
|
9
|
+
{ name: 'clipboard', items : [ 'Cut','Copy','Paste','PasteText','PasteFromWord','-','Undo','Redo' ] },
|
10
|
+
{ name: 'editing', items : [ 'Find','Replace','-','SelectAll','-','SpellChecker' ] }
|
11
|
+
]
|
12
|
+
|
13
|
+
true
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'bundler/capistrano'
|
2
|
+
require 'rvm/capistrano'
|
3
|
+
require "delayed/recipes"
|
4
|
+
require "whenever/capistrano"
|
5
|
+
|
6
|
+
set :stages, %w(staging production)
|
7
|
+
set :default_stage, "staging"
|
8
|
+
require 'capistrano/ext/multistage'
|
9
|
+
|
10
|
+
set :application, "Your application name here"
|
11
|
+
set :repository, "ssh repo from github"
|
12
|
+
|
13
|
+
set :scm, :git
|
14
|
+
|
15
|
+
# This is configured per env on this server
|
16
|
+
#set :deploy_to, "/var/www/vhosts/petsafe.gigmark.com/httpdocs"
|
17
|
+
|
18
|
+
set :deploy_via, :copy
|
19
|
+
set :user, 'ssh username'
|
20
|
+
set :use_sudo, false
|
21
|
+
|
22
|
+
set :shared_children, shared_children + %w{public/uploads}
|
23
|
+
|
24
|
+
set :whenever_roles, :app
|
25
|
+
set :whenever_identifier, :MAKE_SURE_TO_SET_THIS_UNIQUE_ON_SERVER
|
26
|
+
set :whenever_environment, defer { rails_env }
|
27
|
+
set :whenever_command, "bundle exec whenever"
|
28
|
+
|
29
|
+
set :bundle_flags, "--deployment"
|
30
|
+
set :bundle_without, [:development, :test]
|
31
|
+
set :rvm_type, :system
|
32
|
+
|
33
|
+
server "SERVER IP OR DOMAIN", :app, :web, :db, :primary => true
|
34
|
+
|
35
|
+
# Apache Passenger support
|
36
|
+
namespace :deploy do
|
37
|
+
task :start do ; end
|
38
|
+
task :stop do ; end
|
39
|
+
task :restart, :roles => :app, :except => { :no_release => true } do
|
40
|
+
run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
|
41
|
+
end
|
42
|
+
task :config_symlink do
|
43
|
+
run "ln -s #{shared_path}/database.yml #{release_path}/config/database.yml"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
after "deploy:stop", "delayed_job:stop"
|
48
|
+
after "deploy:start", "delayed_job:start"
|
49
|
+
after "deploy:restart", "delayed_job:restart"
|
50
|
+
before "deploy:assets:precompile", "deploy:config_symlink"
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Sample localization file for English. Add more files in this directory for other locales.
|
2
|
+
# See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
|
3
|
+
|
4
|
+
en:
|
5
|
+
customer:
|
6
|
+
activation_confirmation:
|
7
|
+
singular: "Are you sure you want to allow this customer access to the IFD and companion microsite?"
|
8
|
+
plural: "Are you sure you want to allow these customers access to the IFD and companion microsite?"
|
9
|
+
deactivation_confirmation:
|
10
|
+
singular: "Are you sure you want to block this customer from the IFD and companion microsite?"
|
11
|
+
plural: "Are you sure you want to block these customers from the IFD and companion microsite?"
|
12
|
+
approval_confirmation:
|
13
|
+
singular: "Are you sure you want to approve this customers and provide him access to the IFD and companion microsite?"
|
14
|
+
plural: "Are you sure you want to approve these customers and provide them access to the IFD and companion microsite?"
|
15
|
+
activated: "Succesfully activated %{count} customers."
|
16
|
+
deactivated: "Succesfully deactivated %{count} customers."
|
17
|
+
approved: "Succesfully approved %{count} customers."
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Use this file to easily define all of your cron jobs.
|
2
|
+
#
|
3
|
+
# It's helpful, but not entirely necessary to understand cron before proceeding.
|
4
|
+
# http://en.wikipedia.org/wiki/Cron
|
5
|
+
|
6
|
+
# Example:
|
7
|
+
#
|
8
|
+
# set :output, "/path/to/my/cron_log.log"
|
9
|
+
#
|
10
|
+
# every 2.hours do
|
11
|
+
# command "/usr/bin/some_great_command"
|
12
|
+
# runner "MyModel.some_method"
|
13
|
+
# rake "some:great:rake:task"
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# every 4.days do
|
17
|
+
# runner "AnotherModel.prune_old_records"
|
18
|
+
# end
|
19
|
+
|
20
|
+
# Learn more: http://github.com/javan/whenever
|
21
|
+
|
22
|
+
# custom job type to control delayed_job
|
23
|
+
job_type :delayed_job, 'cd :path;RAILS_ENV=:environment script/delayed_job ":task"'
|
24
|
+
|
25
|
+
# delayed job start on boot
|
26
|
+
every :reboot do
|
27
|
+
delayed_job "start"
|
28
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class ApplicationController < ActionController::Base
|
2
|
+
|
3
|
+
protect_from_forgery
|
4
|
+
layout :layout_by_resource
|
5
|
+
|
6
|
+
before_filter do
|
7
|
+
Time.zone = current_user.time_zone if current_user and !current_user.time_zone.blank?
|
8
|
+
end
|
9
|
+
|
10
|
+
rescue_from CanCan::AccessDenied do |exception|
|
11
|
+
redirect_to admin_dashboard_url, alert: exception.message
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
def layout_by_resource
|
16
|
+
devise_controller? ? 'application_logged_out' : 'application'
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class CustomerSessionController < Devise::SessionsController
|
2
|
+
|
3
|
+
def create
|
4
|
+
@resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")
|
5
|
+
respond_to do |format|
|
6
|
+
if @resource.banned?
|
7
|
+
reset_session
|
8
|
+
format.json do
|
9
|
+
render json: { response: 'failure', message: "Account has been suspended" }.to_json, status: :ok
|
10
|
+
end
|
11
|
+
format.html { redirect_to root_path }
|
12
|
+
elsif @resource.pending?
|
13
|
+
reset_session
|
14
|
+
format.json do
|
15
|
+
render json: { response: 'failure', message: "Account is pending approval" }.to_json, status: :ok
|
16
|
+
end
|
17
|
+
format.html { redirect_to root_path }
|
18
|
+
else
|
19
|
+
set_flash_message(:notice, :signed_in) if is_navigational_format?
|
20
|
+
result = sign_in(resource_name, @resource)
|
21
|
+
format.json do
|
22
|
+
render json: { response: 'success', auth_token: current_customer.authentication_token, first_name: current_customer.first_name, email: current_customer.email }.to_json, status: :ok
|
23
|
+
end
|
24
|
+
format.html do
|
25
|
+
respond_with @resource, :location => redirect_location(resource_name, @resource)
|
26
|
+
end
|
27
|
+
format.xml
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def redirect_location(resource_name, resource)
|
33
|
+
root_path
|
34
|
+
end
|
35
|
+
|
36
|
+
def after_sign_out_path_for(r)
|
37
|
+
root_path
|
38
|
+
end
|
39
|
+
end
|