device-tracker 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.
Files changed (111) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/Gemfile +4 -0
  4. data/Rakefile +6 -0
  5. data/Readme.md +32 -0
  6. data/bin/console +14 -0
  7. data/bin/setup +7 -0
  8. data/device-tracker.gemspec +54 -0
  9. data/exe/device-tracker +50 -0
  10. data/lib/device/tracker.rb +19 -0
  11. data/lib/device/tracker/app.rb +25 -0
  12. data/lib/device/tracker/config-schema.json +53 -0
  13. data/lib/device/tracker/config.ru +9 -0
  14. data/lib/device/tracker/controllers/application_controller.rb +215 -0
  15. data/lib/device/tracker/controllers/devices_controller.rb +315 -0
  16. data/lib/device/tracker/controllers/heartbeat_controller.rb +55 -0
  17. data/lib/device/tracker/controllers/os_controller.rb +43 -0
  18. data/lib/device/tracker/controllers/transactions_controller.rb +21 -0
  19. data/lib/device/tracker/controllers/users_controller.rb +193 -0
  20. data/lib/device/tracker/db/data/devices.xlsx +0 -0
  21. data/lib/device/tracker/db/migrate/20150521071815_create_users.rb +13 -0
  22. data/lib/device/tracker/db/migrate/20150521082155_create_devices.rb +23 -0
  23. data/lib/device/tracker/db/migrate/20150521120335_create_operating_systems.rb +8 -0
  24. data/lib/device/tracker/db/migrate/20150527162242_create_transactions.rb +13 -0
  25. data/lib/device/tracker/db/migrate/20151027073050_create_heartbeat.rb +10 -0
  26. data/lib/device/tracker/db/migrate/20151028132946_add_user_verification.rb +7 -0
  27. data/lib/device/tracker/db/migrate/20151028141328_remove_is_active_from_users.rb +5 -0
  28. data/lib/device/tracker/db/migrate/20151029085629_add_password_reset_code_to_users.rb +7 -0
  29. data/lib/device/tracker/db/migrate/20151030130341_add_missing_column_to_devices.rb +7 -0
  30. data/lib/device/tracker/db/migrate/20151102141601_add_serial_number_to_devices.rb +7 -0
  31. data/lib/device/tracker/db/schema.rb +74 -0
  32. data/lib/device/tracker/db/seeds.rb +18 -0
  33. data/lib/device/tracker/dependencies.rb +15 -0
  34. data/lib/device/tracker/helpers/application_helper.rb +84 -0
  35. data/lib/device/tracker/models/device.rb +39 -0
  36. data/lib/device/tracker/models/heartbeat.rb +9 -0
  37. data/lib/device/tracker/models/operating_system.rb +8 -0
  38. data/lib/device/tracker/models/transaction.rb +56 -0
  39. data/lib/device/tracker/models/user.rb +22 -0
  40. data/lib/device/tracker/public/css/bootstrap-sortable.css +100 -0
  41. data/lib/device/tracker/public/css/bootstrap.min.css +5 -0
  42. data/lib/device/tracker/public/css/custom.css +88 -0
  43. data/lib/device/tracker/public/favicon.png +0 -0
  44. data/lib/device/tracker/public/favicon/android-chrome-144x144.png +0 -0
  45. data/lib/device/tracker/public/favicon/android-chrome-192x192.png +0 -0
  46. data/lib/device/tracker/public/favicon/android-chrome-36x36.png +0 -0
  47. data/lib/device/tracker/public/favicon/android-chrome-48x48.png +0 -0
  48. data/lib/device/tracker/public/favicon/android-chrome-72x72.png +0 -0
  49. data/lib/device/tracker/public/favicon/android-chrome-96x96.png +0 -0
  50. data/lib/device/tracker/public/favicon/apple-touch-icon-114x114.png +0 -0
  51. data/lib/device/tracker/public/favicon/apple-touch-icon-120x120.png +0 -0
  52. data/lib/device/tracker/public/favicon/apple-touch-icon-144x144.png +0 -0
  53. data/lib/device/tracker/public/favicon/apple-touch-icon-152x152.png +0 -0
  54. data/lib/device/tracker/public/favicon/apple-touch-icon-180x180.png +0 -0
  55. data/lib/device/tracker/public/favicon/apple-touch-icon-57x57.png +0 -0
  56. data/lib/device/tracker/public/favicon/apple-touch-icon-60x60.png +0 -0
  57. data/lib/device/tracker/public/favicon/apple-touch-icon-72x72.png +0 -0
  58. data/lib/device/tracker/public/favicon/apple-touch-icon-76x76.png +0 -0
  59. data/lib/device/tracker/public/favicon/apple-touch-icon-precomposed.png +0 -0
  60. data/lib/device/tracker/public/favicon/apple-touch-icon.png +0 -0
  61. data/lib/device/tracker/public/favicon/browserconfig.xml +12 -0
  62. data/lib/device/tracker/public/favicon/favicon-16x16.png +0 -0
  63. data/lib/device/tracker/public/favicon/favicon-32x32.png +0 -0
  64. data/lib/device/tracker/public/favicon/favicon-96x96.png +0 -0
  65. data/lib/device/tracker/public/favicon/favicon.ico +0 -0
  66. data/lib/device/tracker/public/favicon/manifest.json +41 -0
  67. data/lib/device/tracker/public/favicon/mstile-144x144.png +0 -0
  68. data/lib/device/tracker/public/favicon/mstile-150x150.png +0 -0
  69. data/lib/device/tracker/public/favicon/mstile-310x150.png +0 -0
  70. data/lib/device/tracker/public/favicon/mstile-310x310.png +0 -0
  71. data/lib/device/tracker/public/favicon/mstile-70x70.png +0 -0
  72. data/lib/device/tracker/public/favicon/safari-pinned-tab.svg +21 -0
  73. data/lib/device/tracker/public/fonts/glyphicons-halflings-regular.eot +0 -0
  74. data/lib/device/tracker/public/fonts/glyphicons-halflings-regular.svg +288 -0
  75. data/lib/device/tracker/public/fonts/glyphicons-halflings-regular.ttf +0 -0
  76. data/lib/device/tracker/public/fonts/glyphicons-halflings-regular.woff +0 -0
  77. data/lib/device/tracker/public/fonts/glyphicons-halflings-regular.woff2 +0 -0
  78. data/lib/device/tracker/public/js/bootstrap-sortable.js +211 -0
  79. data/lib/device/tracker/public/js/bootstrap.min.js +7 -0
  80. data/lib/device/tracker/public/js/jquery-2.1.4.min.js +4 -0
  81. data/lib/device/tracker/version.rb +5 -0
  82. data/lib/device/tracker/views/404.erb +25 -0
  83. data/lib/device/tracker/views/_alert.erb +5 -0
  84. data/lib/device/tracker/views/_device_form.erb +52 -0
  85. data/lib/device/tracker/views/_device_list.erb +47 -0
  86. data/lib/device/tracker/views/_footer.erb +3 -0
  87. data/lib/device/tracker/views/_header.erb +97 -0
  88. data/lib/device/tracker/views/_heartbeat_list.erb +25 -0
  89. data/lib/device/tracker/views/_user_form.erb +30 -0
  90. data/lib/device/tracker/views/devices/edit.erb +11 -0
  91. data/lib/device/tracker/views/devices/index.erb +12 -0
  92. data/lib/device/tracker/views/devices/new.erb +10 -0
  93. data/lib/device/tracker/views/devices/show.erb +283 -0
  94. data/lib/device/tracker/views/devices/users.erb +14 -0
  95. data/lib/device/tracker/views/emails/new_password.erb +17 -0
  96. data/lib/device/tracker/views/emails/password_reset.erb +18 -0
  97. data/lib/device/tracker/views/emails/registration.erb +16 -0
  98. data/lib/device/tracker/views/emails/reminder.erb +15 -0
  99. data/lib/device/tracker/views/emails/verification.erb +18 -0
  100. data/lib/device/tracker/views/forgot_password.erb +6 -0
  101. data/lib/device/tracker/views/index.erb +38 -0
  102. data/lib/device/tracker/views/layout.erb +8 -0
  103. data/lib/device/tracker/views/login.erb +14 -0
  104. data/lib/device/tracker/views/operating_system/operating_systems.json.jbuilder +9 -0
  105. data/lib/device/tracker/views/os/manage.erb +38 -0
  106. data/lib/device/tracker/views/transactions/_transactions_list.erb +18 -0
  107. data/lib/device/tracker/views/transactions/index.erb +3 -0
  108. data/lib/device/tracker/views/users/edit.erb +9 -0
  109. data/lib/device/tracker/views/users/manage.erb +31 -0
  110. data/lib/device/tracker/views/users/new.erb +7 -0
  111. metadata +427 -0
@@ -0,0 +1,315 @@
1
+ require_relative 'application_controller'
2
+
3
+ module Device
4
+ module Tracker
5
+
6
+ class DevicesController < ApplicationController
7
+
8
+ before do
9
+ protected!
10
+ end
11
+
12
+ get "/new" do
13
+ perform_admin_check
14
+
15
+ @device = Device.new
16
+
17
+ @operating_systems = OperatingSystem.select(:name, :id).distinct.order(:name)
18
+
19
+ erb :"devices/new"
20
+ end
21
+
22
+ post "/create" do
23
+ perform_admin_check
24
+
25
+ attributes = {
26
+ unid: params[:device][:unid],
27
+ manufacturer: params[:device][:manufacturer],
28
+ device: params[:device][:device],
29
+ description: params[:device][:description],
30
+ imei: params[:device][:imei],
31
+ serial_number: params[:device][:serial_number],
32
+ operating_system_id: params[:device][:operating_system_id]
33
+ }
34
+
35
+ if params[:device][:sim_card]
36
+ attributes[:sim_card] = true
37
+ end
38
+
39
+ if params[:device][:debug_device]
40
+ attributes[:debug_device] = true
41
+ end
42
+
43
+ attributes.each do |key, value|
44
+ flash[key] = value
45
+ end
46
+
47
+ @device = Device.new(attributes)
48
+
49
+ if @device.valid?
50
+ @device.save
51
+ create_flash "success", ["Created new device #{@device.full_name}"]
52
+ redirect "/devices/#{@device.id}"
53
+ else
54
+ create_flash "warning", @device.errors.full_messages
55
+ redirect back
56
+ end
57
+ end
58
+
59
+ get "/" do
60
+ @title = "All Devices"
61
+
62
+ @devices = Device.all
63
+ @users = User.all
64
+
65
+ @show_search = true
66
+
67
+ if params[:device_name] && ! params[:device_name].empty?
68
+ @show_search = false
69
+ @devices = @devices.where("device like ? or manufacturer like ?", "%#{params[:device_name]}%", "%#{params[:device_name]}%")
70
+ end
71
+
72
+ @devices = @devices.sort { |a, b| a.full_name <=> b.full_name }
73
+
74
+ erb :"devices/index"
75
+ end
76
+
77
+ get "/checked-out" do
78
+ @devices = Device.where(available: false).order(checked_out_since: :desc)
79
+ @users = User.all
80
+
81
+ if params[:device_name] && ! params[:device_name].empty?
82
+ @devices = @devices.where("description like ?", "%#{params[:device_name]}%")
83
+ end
84
+
85
+ @title = "Checked out Devices"
86
+
87
+ erb :"devices/index"
88
+ end
89
+
90
+ get "/:device_id" do |device_id|
91
+
92
+ unless Device.exists?(device_id)
93
+ raise Sinatra::NotFound
94
+ end
95
+
96
+ @users = User.where(is_verified: true).order(email: :desc)
97
+
98
+ @device = Device.find(device_id)
99
+
100
+ if @device.missing?
101
+ @last_checkout_transaction = Transaction
102
+ .where(transaction_type: 'CHECKOUT', device_id: @device.id)
103
+ .order(id: :desc).first
104
+ end
105
+
106
+ @transactions = @device.transactions.order(created_at: :desc).take(10)
107
+
108
+ @current_user = get_logged_in_user
109
+
110
+ erb :"devices/show"
111
+ end
112
+
113
+ put "/:device_id" do |device_id|
114
+ perform_admin_check
115
+
116
+ unless Device.exists?(device_id)
117
+ raise Sinatra::NotFound
118
+ end
119
+
120
+ params[:device].each do |key, value|
121
+ flash[key.to_sym] = value
122
+ end
123
+
124
+ @device = Device.find(device_id)
125
+ @device.update(params[:device])
126
+
127
+ if @device.save
128
+
129
+ create_flash "success", ["The device has been successfully updated."]
130
+ redirect "/devices/#{device_id}"
131
+ else
132
+ create_flash "warning", @device.errors.full_messages
133
+ redirect back
134
+ end
135
+
136
+ end
137
+
138
+ # devices/users/1
139
+ get "/users/:user_id" do |user_id|
140
+
141
+ user = get_logged_in_user
142
+
143
+ if user[:id] != user_id.to_i
144
+ create_flash "warning", ["You don't have permission to view this page."]
145
+ redirect back
146
+ end
147
+
148
+ unless User.exists?(user_id)
149
+ raise Sinatra::NotFound
150
+ end
151
+
152
+ # Get the user
153
+ @user = User.find(user_id)
154
+
155
+ @devices = @user.devices
156
+
157
+ erb :"devices/users", devices: @devices
158
+ end
159
+
160
+ put "/:device_id/return" do |device_id|
161
+
162
+ unid = device_id.upcase
163
+
164
+ if Device.exists?(unid: unid)
165
+ @device = Device.find_by_unid(unid)
166
+
167
+ user = @device.user
168
+
169
+ current_user = get_logged_in_user
170
+ if current_user[:id] == @device.user.id
171
+ report_transaction("#{user.email} returned #{@device.device}", Transaction.return, @device)
172
+ else
173
+ report_transaction("#{current_user[:email]} returned #{@device.device} on behalf of #{@device.user.email}", Transaction.return, @device)
174
+ end
175
+
176
+ @device.user = nil
177
+ @device.available = true
178
+ @device.checked_out_since = nil
179
+
180
+ @device.save
181
+
182
+ create_flash "success", ["The device has been successfully returned, thank you."]
183
+ redirect back
184
+ else
185
+ create_flash "warning", ["Device not found with id #{device_id}."]
186
+ redirect back
187
+ end
188
+ end
189
+
190
+ put "/:device_id/checkout" do |device_id|
191
+
192
+ unid = device_id.upcase
193
+
194
+ if Device.exists?(unid: unid)
195
+
196
+ @user = User.find(session[:user][:id])
197
+
198
+ device = Device.find_by_unid(unid)
199
+ device.user = @user
200
+
201
+ device.available = false
202
+ device.checked_out_since = Time.now.utc.iso8601
203
+
204
+ if device.save
205
+ report_transaction("#{@user.email} checked out #{device.device}.", Transaction.checkout, device)
206
+
207
+ create_flash "success", ["You have successfully checked out the device."]
208
+ redirect back
209
+
210
+ else
211
+ create_flash "warning", device.errors.full_messages
212
+ redirect back
213
+ end
214
+
215
+ end
216
+
217
+ end
218
+
219
+ # /devices/<%= @device.id %>/assign
220
+ put "/:device_id/assign" do |device_id|
221
+ perform_admin_check
222
+
223
+ if Device.exists?(device_id)
224
+
225
+ user_id = params[:user_id]
226
+
227
+ if user_id.nil?
228
+ create_flash "warning", ["You must select a user to assign the device to"]
229
+ redirect back
230
+ end
231
+
232
+ @current_user = User.find(session[:user][:id])
233
+ if ! User.exists?(user_id)
234
+ create_flash "danger", ["User not found with id #{user_id}"]
235
+ end
236
+
237
+ @assigned_user = User.find(user_id)
238
+
239
+ device = Device.find(device_id)
240
+ device.user = @assigned_user
241
+
242
+ device.available = false
243
+ device.checked_out_since = Time.now.utc.iso8601
244
+
245
+ if device.save
246
+ report_transaction("#{@current_user.email} checked out #{device.device} on behalf of #{@assigned_user.email}", Transaction.checkout, device)
247
+ end
248
+
249
+ create_flash "success", ["You have successfully assigned out the device to #{@assigned_user.name}."]
250
+ redirect back
251
+
252
+ end
253
+ end
254
+
255
+ post "/:device_id/send_reminder" do |device_id|
256
+ perform_admin_check
257
+
258
+ if Device.exists?(device_id)
259
+
260
+ @device = Device.find(device_id)
261
+ @device_url = request.base_url + '/devices/' + device_id
262
+
263
+ body = ERB.new(File.read(EMAILS_PATH + "/reminder.erb")).result(binding)
264
+
265
+ begin
266
+ Pony.mail(
267
+ :to => [@device.user.email],
268
+ :from => 'no-reply@device-tracker',
269
+ :subject => 'Reminder | Device Tracker',
270
+ :html_body => body
271
+ )
272
+ rescue Net::OpenTimeout => e
273
+ puts "ERROR: Error sending email"
274
+ end
275
+
276
+ # Send email
277
+ create_flash "success", ["A reminder email has been sent out to #{@device.user.name}."]
278
+ redirect "/devices/#{device_id}"
279
+
280
+ else
281
+ # Feedback
282
+ create_flash "warning", ["Sorry but that device doesn't exists.."]
283
+ redirect "/devices/#{device_id}"
284
+ end
285
+
286
+ end
287
+
288
+ get "/:device_id/edit" do |device_id|
289
+ perform_admin_check
290
+
291
+ unless Device.exists?(device_id)
292
+ raise Sinatra::NotFound
293
+ end
294
+
295
+ @device = Device.find(device_id)
296
+ @operating_systems = OperatingSystem.select(:name, :id).distinct.order(:name)
297
+
298
+ erb :"devices/edit"
299
+ end
300
+
301
+ delete "/:device_id" do |device_id|
302
+ perform_admin_check
303
+
304
+ unless Device.exists?(device_id)
305
+ raise Sinatra::NotFound
306
+ end
307
+
308
+ @device = Device.find(device_id).destroy
309
+ create_flash "success", ["Deleted device #{@device.unid}"]
310
+ redirect "/devices"
311
+ end
312
+
313
+ end
314
+ end
315
+ end
@@ -0,0 +1,55 @@
1
+ require_relative 'application_controller'
2
+
3
+ module Device
4
+ module Tracker
5
+
6
+ class HeartbeatController < ApplicationController
7
+
8
+ post "/" do
9
+ begin
10
+ heartbeat = JSON.parse(request.body.read)
11
+ rescue Exception => e
12
+ halt 412, {
13
+ error: true,
14
+ message: "#{e.message}"
15
+ }.to_json
16
+ end
17
+
18
+ # {"heartbeat": {"device_id": "BBCFM003", "longitude": 53.470096, "latitude": -2.281457}}
19
+ if valid_heartbeat?(heartbeat)
20
+
21
+ heartbeat = heartbeat["heartbeat"]
22
+
23
+ unid = heartbeat["device_id"].upcase
24
+
25
+ if Device.exists?(unid: unid)
26
+ device = Device.find_by_unid(unid)
27
+
28
+ Heartbeat.create({
29
+ longitude: heartbeat["longitude"],
30
+ latitude: heartbeat["latitude"],
31
+ device_id: device.id
32
+ })
33
+
34
+ halt 201, {
35
+ error: false,
36
+ message: "Heartbeat for device: #{unid} received."
37
+ }.to_json
38
+ else
39
+ halt 404, {
40
+ error: true,
41
+ message: "The device with id: #{unid} doesn't exist."
42
+ }.to_json
43
+ end
44
+
45
+ else
46
+ halt 412, {
47
+ error: true,
48
+ message: "Manformed heartbeat received, so will not be processed."
49
+ }.to_json
50
+ end
51
+
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,43 @@
1
+ require_relative 'application_controller'
2
+ module Device
3
+ module Tracker
4
+ class OSController < ApplicationController
5
+
6
+ before do
7
+ perform_admin_check
8
+ end
9
+
10
+ get "/manage" do
11
+ @os = OperatingSystem.all.order(:name)
12
+ erb :"os/manage"
13
+ end
14
+
15
+ post "/create" do
16
+
17
+ @os = OperatingSystem.create(params[:os])
18
+
19
+ if @os.valid?
20
+ @os.save
21
+ create_flash "success", ["Successfully added #{@os.name}"]
22
+ redirect back
23
+ else
24
+ create_flash "warning", @os.errors.full_messages
25
+ redirect back
26
+ end
27
+ end
28
+
29
+ delete "/:os_id/delete" do |os_id|
30
+
31
+ if OperatingSystem.exists?(os_id)
32
+ OperatingSystem.destroy(os_id)
33
+ create_flash "success", ["Operating system deleted."]
34
+ redirect back
35
+ else
36
+ create_flash "warning", ["Operating system not found."]
37
+ redirect back
38
+ end
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,21 @@
1
+ require_relative 'application_controller'
2
+
3
+ module Device
4
+ module Tracker
5
+ class TransactionsController < ApplicationController
6
+
7
+ get "/" do
8
+
9
+ @transactions = Transaction.limit(100).order(created_at: :desc).all
10
+
11
+ erb :"transactions/index"
12
+ end
13
+
14
+ get "/:device_id" do |device_id|
15
+ @transactions = Transaction.where(device_id: device_id).limit(100).order(created_at: :desc).all
16
+ erb :"transactions/index"
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,193 @@
1
+ require_relative 'application_controller'
2
+
3
+ module Device
4
+ module Tracker
5
+ class UsersController < ApplicationController
6
+
7
+ before do
8
+
9
+ if ! %w[new create].include? request.path_info.split('/')[1]
10
+ protected!
11
+ end
12
+
13
+ if %w[manage].include? request.path_info.split('/')[1]
14
+ perform_admin_check
15
+ end
16
+ end
17
+
18
+ get "/manage" do
19
+
20
+ @users = User.all
21
+
22
+ erb :"users/manage", users: @users
23
+ end
24
+
25
+ get "/new" do
26
+ erb :"users/new"
27
+ end
28
+
29
+ get "/:user_id/edit" do |user_id|
30
+ # TODO Move this out into its own function
31
+ user = get_logged_in_user
32
+
33
+ if user[:is_admin] != true and user[:id] != user_id.to_i
34
+ create_flash "warning", ["You don't have permission to view this page."]
35
+ redirect back
36
+ end
37
+
38
+ if User.exists?(user_id)
39
+ @user = User.find(user_id)
40
+ @is_admin = user[:is_admin]
41
+ erb :"users/edit"
42
+ else
43
+ create_flash "warning", ["Sorry, but that user doesn't exist"]
44
+ redirect back
45
+ end
46
+ end
47
+
48
+ put "/:user_id" do |user_id|
49
+
50
+ if get_logged_in_user[:is_admin] != true and get_logged_in_user[:id] != user_id.to_i
51
+ create_flash "warning", ["You don't have permission to view this page."]
52
+ redirect back
53
+ end
54
+
55
+ if User.exists?(user_id)
56
+
57
+ attributes = {
58
+ username: params[:user][:username],
59
+ email: params[:user][:email],
60
+ name: params[:user][:name]
61
+ }
62
+
63
+ # Only admins have access to these attributes
64
+ if is_admin?
65
+ attributes[:is_admin] = (!params[:user][:is_admin].nil? and params[:user][:is_admin] == "on")
66
+ attributes[:is_verified] = (!params[:user][:is_verified].nil? and params[:user][:is_verified] == "on")
67
+ end
68
+
69
+ # Should we change the password?
70
+
71
+ if change_password?(params)
72
+ attributes[:password] = params[:user][:password]
73
+ attributes[:password_confirmation] = params[:user][:password_confirmation]
74
+ end
75
+
76
+ user = User.find(user_id)
77
+ users_previous_verification = user.is_verified
78
+
79
+ if user.update(attributes)
80
+ if user.is_verified && users_previous_verification == false
81
+ verification_email(user)
82
+ end
83
+ create_flash "success", ["The account was successfully updated."]
84
+ redirect back
85
+ else
86
+ create_flash "warning", user.errors.full_messages
87
+ redirect back
88
+ end
89
+ end
90
+
91
+ create_flash "warning", ["I'm sorry but that user does not exist!"]
92
+ redirect back
93
+
94
+ end
95
+
96
+ post "/create" do
97
+
98
+ user = User.new
99
+
100
+ attributes = {
101
+ username: params[:user][:username],
102
+ password: params[:user][:password],
103
+ password_confirmation: params[:user][:password_confirmation],
104
+ name: params[:user][:name],
105
+ email: params[:user][:email]
106
+ }
107
+
108
+ user.username = attributes[:username]
109
+ user.password = attributes[:password]
110
+ user.email = attributes[:email]
111
+ user.name = attributes[:name]
112
+ user.password_confirmation = attributes[:password_confirmation]
113
+
114
+ attributes.each do |key, value|
115
+ flash[key] = value if key != :password
116
+ end
117
+
118
+ if user.valid? and user.save
119
+
120
+ report_transaction("#{user.email} registered a new account.", Transaction.registration)
121
+
122
+ # Account is awaiting activation
123
+ admin_email_registration(request, user)
124
+ create_flash "info", ["Registration successful, please wait for your account to be activated."]
125
+ redirect "/"
126
+ else
127
+ create_flash "warning", [user.errors.full_messages.first]
128
+ redirect back
129
+ end
130
+ end
131
+
132
+ delete "/:user_id/delete" do |user_id|
133
+ if User.exists?(user_id)
134
+ user = User.find(user_id)
135
+
136
+ email = user.email
137
+
138
+ if user.devices.count > 0
139
+ Device.where(user_id: user.id).update_all(available: true, checked_out_since: nil, user_id: nil)
140
+ end
141
+
142
+ if user.destroy
143
+ report_transaction("#{email} was deleted by #{get_logged_in_user[:email]}.", Transaction.deletion)
144
+ end
145
+
146
+ create_flash "success", ["The user account has been successfully removed!"]
147
+ else
148
+ create_flash "warning", ["Unable to remove the user account, try again."]
149
+ end
150
+
151
+ redirect back
152
+ end
153
+
154
+ def verification_email(user)
155
+
156
+ @user = user
157
+ @get_started_link = request.base_url + '/devices'
158
+ body = ERB.new(File.read(EMAILS_PATH + "/verification.erb")).result(binding)
159
+
160
+ begin
161
+ Pony.mail(
162
+ :to => [@user.email],
163
+ :from => 'no-reply@device-tracker',
164
+ :subject => 'Account Verified | Device Tracker',
165
+ :html_body => body
166
+ )
167
+ rescue Net::OpenTimeout => e
168
+ puts "ERROR: Error sending email"
169
+ end
170
+
171
+ end
172
+
173
+ def admin_email_registration(request, user)
174
+ @user = user
175
+ @verification_link = request.base_url + '/users/' + user.id.to_s + '/edit'
176
+
177
+ body = ERB.new(File.read(EMAILS_PATH + "/registration.erb")).result(binding)
178
+
179
+ begin
180
+ Pony.mail(
181
+ :to => [User.where(is_admin: true).map {|u| u.email }],
182
+ :from => 'no-reply@device-tracker',
183
+ :subject => 'New Registration | Device Tracker',
184
+ :html_body => body
185
+ )
186
+ rescue Net::OpenTimeout => e
187
+ puts "ERROR: Error sending email"
188
+ end
189
+ end
190
+
191
+ end
192
+ end
193
+ end