help_desk_dashboard 0.0.3 → 0.0.5

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 (31) hide show
  1. data/lib/help_desk_dashboard/dashboard_generator.rb +20 -0
  2. data/lib/{help-desk-dashboard → help_desk_dashboard/lib}/app_config.rb +0 -0
  3. data/lib/help_desk_dashboard/lib/data_file_generator.rb +46 -0
  4. data/lib/{help-desk-dashboard → help_desk_dashboard/lib}/provider_factory.rb +0 -0
  5. data/lib/{help-desk-dashboard → help_desk_dashboard/lib}/providers/service-desk-plus/8.1/provider.rb +0 -0
  6. data/lib/help_desk_dashboard/lib/providers/track-it/2003.10.1/provider.rb +20 -0
  7. data/lib/{help-desk-dashboard → help_desk_dashboard/lib}/web/assets/bootstrap/css/bootstrap-responsive.css +0 -0
  8. data/lib/{help-desk-dashboard → help_desk_dashboard/lib}/web/assets/bootstrap/css/bootstrap-responsive.min.css +0 -0
  9. data/lib/{help-desk-dashboard → help_desk_dashboard/lib}/web/assets/bootstrap/css/bootstrap.css +0 -0
  10. data/lib/{help-desk-dashboard → help_desk_dashboard/lib}/web/assets/bootstrap/css/bootstrap.min.css +0 -0
  11. data/lib/{help-desk-dashboard → help_desk_dashboard/lib}/web/assets/bootstrap/img/glyphicons-halflings-white.png +0 -0
  12. data/lib/{help-desk-dashboard → help_desk_dashboard/lib}/web/assets/bootstrap/img/glyphicons-halflings.png +0 -0
  13. data/lib/{help-desk-dashboard → help_desk_dashboard/lib}/web/assets/bootstrap/js/bootstrap.js +0 -0
  14. data/lib/{help-desk-dashboard → help_desk_dashboard/lib}/web/assets/bootstrap/js/bootstrap.min.js +0 -0
  15. data/lib/{help-desk-dashboard → help_desk_dashboard/lib}/web/assets/css/app.css +0 -0
  16. data/lib/{help-desk-dashboard → help_desk_dashboard/lib}/web/assets/js/app.js +0 -0
  17. data/lib/{help-desk-dashboard → help_desk_dashboard/lib}/web/assets/js/jquery-1.10.1.min.js +0 -0
  18. data/lib/{help-desk-dashboard → help_desk_dashboard/lib}/web/assets/js/moment.min.js +0 -0
  19. data/lib/{help-desk-dashboard → help_desk_dashboard/lib}/web/config.ru +0 -0
  20. data/lib/{help-desk-dashboard → help_desk_dashboard/lib}/web/index.html +0 -0
  21. data/lib/help_desk_dashboard.rb +1 -0
  22. metadata +36 -43
  23. data/bin/help_desk_dashboard.rb +0 -38
  24. data/lib/help-desk-dashboard/extensions.rb +0 -6
  25. data/lib/help-desk-dashboard/providers/track-it/2003.10.1/navigator.rb +0 -13
  26. data/lib/help-desk-dashboard/providers/track-it/2003.10.1/parallel_request_scraper.rb +0 -42
  27. data/lib/help-desk-dashboard/providers/track-it/2003.10.1/provider.rb +0 -26
  28. data/lib/help-desk-dashboard/providers/track-it/2003.10.1/request_scraper.rb +0 -48
  29. data/lib/help-desk-dashboard/providers/track-it/2003.10.1/user_operations.rb +0 -40
  30. data/lib/help-desk-dashboard/providers/track-it/2003.10.1/user_request_scraper.rb +0 -33
  31. data/lib/help-desk-dashboard/web_generator.rb +0 -27
@@ -0,0 +1,20 @@
1
+ require 'fileutils'
2
+ require_relative 'lib/app_config'
3
+ require_relative 'lib/data_file_generator'
4
+
5
+ class DashboardGenerator
6
+
7
+ def initialize(config)
8
+ @config = AppConfig.new config
9
+ end
10
+
11
+ def generate
12
+ output_dir = @config[:output_dir]
13
+ FileUtils.mkdir_p output_dir
14
+ data_file_generator = DataFileGenerator.new @config, File.join(output_dir, 'data')
15
+ data_file_generator.generate
16
+ source_dir = File.join File.dirname(__FILE__), 'lib', 'web'
17
+ FileUtils.cp_r "#{source_dir}/.", output_dir
18
+ end
19
+
20
+ end
@@ -0,0 +1,46 @@
1
+ require 'fileutils'
2
+ require_relative 'app_config'
3
+ require_relative 'provider_factory'
4
+
5
+ class DataFileGenerator
6
+
7
+ def initialize(config, output_dir)
8
+ @config = config
9
+ @output_dir = output_dir
10
+ end
11
+
12
+ def generate
13
+ provider_factory = ProviderFactory.new
14
+ provider = provider_factory.create @config[:provider]
15
+ requests = provider.get_requests @config.users_with_password, threads: @config[:threads]
16
+ requests_by_submitter = requests.group_by { |r| r[:submitted_by] }
17
+ teams = @config[:teams].map do |team|
18
+ {
19
+ team_name: team[:name],
20
+ title: "#{team[:name]} Help Desk Requests",
21
+ requests: team[:members].map { |username| requests_by_submitter[username] }.flatten.compact
22
+ }
23
+ end
24
+
25
+ requests.each do |r|
26
+ user = config[:users].find { |u| u[:username] == r[:assigned_to] }
27
+ r[:assigned_to] = user[:name] if user
28
+ user = config[:users].find { |u| u[:username] == r[:submitted_by] }
29
+ r[:submitted_by] = user[:name] if user
30
+ end
31
+
32
+ FileUtils.rm_rf @output_dir
33
+ FileUtils.mkdir_p @output_dir
34
+ teams.each { |t| create_data_file t }
35
+
36
+ end
37
+
38
+ private
39
+
40
+ def create_data_file(team)
41
+ file_name = "#{team[:team_name]}.json".downcase.gsub(' ', '-')
42
+ path = File.join @output_dir, file_name
43
+ File.write path, team.to_json
44
+ end
45
+
46
+ end
@@ -0,0 +1,20 @@
1
+ require 'hashie'
2
+ require 'json'
3
+ require 'trackit_scraper/2003.10.1'
4
+
5
+ class Provider
6
+
7
+ def initialize(url)
8
+ @url = url
9
+ end
10
+
11
+ def get_requests(users, options={})
12
+ Dir.mktmpdir do |output_dir|
13
+ options[:output_dir] = output_dir
14
+ trackit = TrackIt.new @url, users[0][:username], users[0][:password], options
15
+ trackit.scrape_requests_for_users users
16
+ return Dir["#{output_dir}/*"].map { |f| Hashie::Mash.new JSON.parse(File.read(f)) }
17
+ end
18
+ end
19
+
20
+ end
@@ -0,0 +1 @@
1
+ require_relative 'help_desk_dashboard/dashboard_generator'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: help_desk_dashboard
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-07-01 00:00:00.000000000 Z
12
+ date: 2013-07-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: hashie
16
- requirement: &70277845991220 !ruby/object:Gem::Requirement
16
+ requirement: &70198175013500 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 2.0.5
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70277845991220
24
+ version_requirements: *70198175013500
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: json
27
- requirement: &70277845990740 !ruby/object:Gem::Requirement
27
+ requirement: &70198175013020 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,63 +32,56 @@ dependencies:
32
32
  version: 1.7.7
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70277845990740
35
+ version_requirements: *70198175013020
36
36
  - !ruby/object:Gem::Dependency
37
- name: watir-webdriver
38
- requirement: &70277845990280 !ruby/object:Gem::Requirement
37
+ name: rack
38
+ requirement: &70198175012560 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
42
42
  - !ruby/object:Gem::Version
43
- version: 0.6.4
43
+ version: 1.5.2
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70277845990280
46
+ version_requirements: *70198175012560
47
47
  - !ruby/object:Gem::Dependency
48
- name: rack
49
- requirement: &70277845989820 !ruby/object:Gem::Requirement
48
+ name: trackit_scraper
49
+ requirement: &70198175012100 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: 1.5.2
54
+ version: 1.0.0
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70277845989820
57
+ version_requirements: *70198175012100
58
58
  description:
59
59
  email: matthew-github@matthewriley.name
60
- executables:
61
- - help_desk_dashboard.rb
60
+ executables: []
62
61
  extensions: []
63
62
  extra_rdoc_files: []
64
63
  files:
65
- - lib/help-desk-dashboard/app_config.rb
66
- - lib/help-desk-dashboard/extensions.rb
67
- - lib/help-desk-dashboard/provider_factory.rb
68
- - lib/help-desk-dashboard/providers/service-desk-plus/8.1/provider.rb
69
- - lib/help-desk-dashboard/providers/track-it/2003.10.1/navigator.rb
70
- - lib/help-desk-dashboard/providers/track-it/2003.10.1/parallel_request_scraper.rb
71
- - lib/help-desk-dashboard/providers/track-it/2003.10.1/provider.rb
72
- - lib/help-desk-dashboard/providers/track-it/2003.10.1/request_scraper.rb
73
- - lib/help-desk-dashboard/providers/track-it/2003.10.1/user_operations.rb
74
- - lib/help-desk-dashboard/providers/track-it/2003.10.1/user_request_scraper.rb
75
- - lib/help-desk-dashboard/web/assets/bootstrap/css/bootstrap-responsive.css
76
- - lib/help-desk-dashboard/web/assets/bootstrap/css/bootstrap-responsive.min.css
77
- - lib/help-desk-dashboard/web/assets/bootstrap/css/bootstrap.css
78
- - lib/help-desk-dashboard/web/assets/bootstrap/css/bootstrap.min.css
79
- - lib/help-desk-dashboard/web/assets/bootstrap/img/glyphicons-halflings-white.png
80
- - lib/help-desk-dashboard/web/assets/bootstrap/img/glyphicons-halflings.png
81
- - lib/help-desk-dashboard/web/assets/bootstrap/js/bootstrap.js
82
- - lib/help-desk-dashboard/web/assets/bootstrap/js/bootstrap.min.js
83
- - lib/help-desk-dashboard/web/assets/css/app.css
84
- - lib/help-desk-dashboard/web/assets/js/app.js
85
- - lib/help-desk-dashboard/web/assets/js/jquery-1.10.1.min.js
86
- - lib/help-desk-dashboard/web/assets/js/moment.min.js
87
- - lib/help-desk-dashboard/web/config.ru
88
- - lib/help-desk-dashboard/web/index.html
89
- - lib/help-desk-dashboard/web_generator.rb
90
- - !binary |-
91
- YmluL2hlbHBfZGVza19kYXNoYm9hcmQucmI=
64
+ - lib/help_desk_dashboard/dashboard_generator.rb
65
+ - lib/help_desk_dashboard/lib/app_config.rb
66
+ - lib/help_desk_dashboard/lib/data_file_generator.rb
67
+ - lib/help_desk_dashboard/lib/provider_factory.rb
68
+ - lib/help_desk_dashboard/lib/providers/service-desk-plus/8.1/provider.rb
69
+ - lib/help_desk_dashboard/lib/providers/track-it/2003.10.1/provider.rb
70
+ - lib/help_desk_dashboard/lib/web/assets/bootstrap/css/bootstrap-responsive.css
71
+ - lib/help_desk_dashboard/lib/web/assets/bootstrap/css/bootstrap-responsive.min.css
72
+ - lib/help_desk_dashboard/lib/web/assets/bootstrap/css/bootstrap.css
73
+ - lib/help_desk_dashboard/lib/web/assets/bootstrap/css/bootstrap.min.css
74
+ - lib/help_desk_dashboard/lib/web/assets/bootstrap/img/glyphicons-halflings-white.png
75
+ - lib/help_desk_dashboard/lib/web/assets/bootstrap/img/glyphicons-halflings.png
76
+ - lib/help_desk_dashboard/lib/web/assets/bootstrap/js/bootstrap.js
77
+ - lib/help_desk_dashboard/lib/web/assets/bootstrap/js/bootstrap.min.js
78
+ - lib/help_desk_dashboard/lib/web/assets/css/app.css
79
+ - lib/help_desk_dashboard/lib/web/assets/js/app.js
80
+ - lib/help_desk_dashboard/lib/web/assets/js/jquery-1.10.1.min.js
81
+ - lib/help_desk_dashboard/lib/web/assets/js/moment.min.js
82
+ - lib/help_desk_dashboard/lib/web/config.ru
83
+ - lib/help_desk_dashboard/lib/web/index.html
84
+ - lib/help_desk_dashboard.rb
92
85
  homepage:
93
86
  licenses: []
94
87
  post_install_message:
@@ -1,38 +0,0 @@
1
- $stdout.sync = true
2
-
3
- require_relative '../lib/help-desk-dashboard/app_config'
4
- require_relative '../lib/help-desk-dashboard/extensions'
5
- require_relative '../lib/help-desk-dashboard/provider_factory'
6
- require_relative '../lib/help-desk-dashboard/web_generator'
7
-
8
- ENV['HTTP_PROXY'] = nil
9
- ENV['CONFIG_FILE'] ||= 'config.json'
10
- config = AppConfig.from_file ENV['CONFIG_FILE']
11
-
12
- provider_factory = ProviderFactory.new
13
- provider = provider_factory.create config[:provider]
14
- requests = provider.get_requests(config.users_with_password, threads: config[:threads]).map do |r|
15
- r.pick :id, :title, :status, :deadline, :assigned_to, :submitted_by, :submitted_on, :resolved_on
16
- end
17
-
18
- requests_by_submitter = requests.group_by { |r| r[:submitted_by] }
19
-
20
- teams = config[:teams].map do |team|
21
- {
22
- team_name: team[:name],
23
- title: "#{team[:name]} Help Desk Requests",
24
- requests: team[:members].map { |username| requests_by_submitter[username] }.flatten
25
- }
26
- end
27
-
28
- requests.each do |r|
29
- user = config[:users].find { |u| u[:username] == r[:assigned_to] }
30
- r[:assigned_to] = user[:name] if user
31
- user = config[:users].find { |u| u[:username] == r[:submitted_by] }
32
- r[:submitted_by] = user[:name] if user
33
- end
34
-
35
- generator = WebGenerator.new config[:output_dir]
36
- generator.generate teams
37
-
38
- puts 'Done.'
@@ -1,6 +0,0 @@
1
- class Hash
2
- def pick(*keys)
3
- values = values_at(*keys)
4
- Hash[keys.zip(values)]
5
- end
6
- end
@@ -1,13 +0,0 @@
1
- class Navigator
2
-
3
- def initialize(b, base_url)
4
- @b = b
5
- @base_url = base_url
6
- end
7
-
8
- def goto(relative_url)
9
- url = File.join @base_url, relative_url
10
- @b.goto url
11
- end
12
-
13
- end
@@ -1,42 +0,0 @@
1
- require 'thread'
2
- require 'watir-webdriver'
3
- require_relative 'request_scraper'
4
- require_relative 'user_operations'
5
-
6
- class ParallelRequestScraper
7
-
8
- def initialize(url, user, thread_limit)
9
- @url = url
10
- @user = user
11
- @thread_limit = thread_limit
12
- end
13
-
14
- def scrape(request_ids)
15
- queue = request_ids.clone
16
- threads = []
17
- requests = []
18
- mutex = Mutex.new
19
-
20
- @thread_limit.times do
21
- threads << Thread.new do
22
- b = Watir::Browser.new
23
- navigator = Navigator.new b, @url
24
- user_operations = UserOperations.new b, navigator
25
- user_operations.login @user
26
- request_scraper = RequestScraper.new b, navigator
27
- until queue.empty?
28
- id = nil
29
- mutex.synchronize do
30
- id = queue.pop
31
- end
32
- break unless id
33
- requests << request_scraper.scrape(id)
34
- end
35
- b.close
36
- end
37
- end
38
- threads.each { |t| t.join }
39
- requests
40
- end
41
-
42
- end
@@ -1,26 +0,0 @@
1
- require 'watir-webdriver'
2
- require_relative 'navigator'
3
- require_relative 'parallel_request_scraper'
4
- require_relative 'user_operations'
5
-
6
- class Provider
7
-
8
- def initialize(url)
9
- @url = url
10
- end
11
-
12
- def get_requests(users, options={})
13
- threads = options[:threads] || 5
14
-
15
- b = Watir::Browser.new
16
- navigator = Navigator.new b, @url
17
- user_operations = UserOperations.new b, navigator
18
- request_ids = user_operations.get_request_ids users
19
- b.close
20
-
21
- user = users.first
22
- parallel_request_scraper = ParallelRequestScraper.new @url, user, threads
23
- parallel_request_scraper.scrape request_ids
24
- end
25
-
26
- end
@@ -1,48 +0,0 @@
1
- require 'time'
2
-
3
- class RequestScraper
4
-
5
- def initialize(b, navigator)
6
- @b = b
7
- @navigator = navigator
8
- end
9
-
10
- def scrape(id)
11
- @navigator.goto "hd/ticket/euTicketView.ssp?ticket_id=#{id}&log=show"
12
- cells = @b.tables[1].tds.to_a
13
- {
14
- id: @b.text.match(/Request #(\d+)/)[1],
15
- title: cells[0].text,
16
- status: cells[2].text,
17
- service: cells[3].text,
18
- request_type: cells[4].text,
19
- time_spent: cells[6].text,
20
- priority: cells[7].text,
21
- deadline: Time.parse(cells[8].text),
22
- submitted_to: cells[10].text,
23
- submitted_by: cells[11].text.upcase,
24
- submitted_on: Time.parse(cells[12].text),
25
- assigned_to: cells[15].text.upcase,
26
- assigned_by: cells[16].text,
27
- assigned_on: Time.parse(cells[17].text),
28
- department_id: cells[19].text,
29
- closed_by: cells[20].text,
30
- closed_on: cells[21].text == 'None' ? 'None' : Time.parse(cells[21].text)
31
- }.merge scrape_resolved_data_from_audit_log
32
- end
33
-
34
- private
35
-
36
- def scrape_resolved_data_from_audit_log
37
- rows = @b.tables[3].trs.to_a
38
- index = rows.index { |r| r.text =~ /Resolved by/ }
39
- return {} unless index
40
- text = rows[index-1].text
41
- matches = text.match /(.+) by (.+)/
42
- {
43
- resolved_on: Time.parse(matches[1]),
44
- resolved_by: matches[2].upcase
45
- }
46
- end
47
-
48
- end
@@ -1,40 +0,0 @@
1
- class UserOperations
2
-
3
- def initialize(b, navigator)
4
- @b = b
5
- @navigator = navigator
6
- end
7
-
8
- def login(user)
9
- @navigator.goto 'hd/index.ssp'
10
- @b.text_field(name: 'user_id').set user['username']
11
- @b.text_field(name: 'user_pwd').set user['password']
12
- @b.button(value: 'Log on').click
13
- end
14
-
15
- def get_request_ids(users)
16
- users = [users].flatten
17
- request_ids = users.map do |user|
18
- login user
19
- @navigator.goto 'hd/ticket/euTicketFind.ssp'
20
- @b.button(value: 'Find').click
21
- request_locations = get_request_locations
22
- request_locations.map { |l| l.match(/ticket_id=(\d+)/)[1].to_i }
23
- end
24
- request_ids.flatten
25
- end
26
-
27
- private
28
-
29
- def get_request_locations
30
- links = []
31
- 5.times do
32
- links = @b.links(href: /euTicketView\.ssp\?ticket_id=/).to_a
33
- break unless links.empty?
34
- sleep 2
35
- end
36
- puts "No requests found.\n\n#{@b.html}" if links.empty?
37
- links.map { |link| link.href }.reverse
38
- end
39
-
40
- end
@@ -1,33 +0,0 @@
1
- require 'time'
2
- require 'watir-webdriver'
3
- require_relative 'request_scraper'
4
-
5
- class UserRequestScraper
6
-
7
- def initialize(b)
8
- @b = b
9
- end
10
-
11
- def scrape
12
- @b.goto 'hd/ticket/euTicketFind.ssp'
13
- @b.button(value: 'Find').click
14
- request_locations = get_request_locations
15
- request_ids = request_locations.map { |l| l.match(/ticket_id=(\d+)/)[1].to_i }
16
- request_scraper = RequestScraper.new @b
17
- request_scraper.scrape_range request_ids
18
- end
19
-
20
- private
21
-
22
- def get_request_locations
23
- links = []
24
- 5.times do
25
- links = @b.links(href: /euTicketView\.ssp\?ticket_id=/).to_a
26
- break unless links.empty?
27
- sleep 2
28
- end
29
- puts "No requests found.\n\n#{@b.html}" if links.empty?
30
- links.map { |link| link.href }.reverse
31
- end
32
-
33
- end
@@ -1,27 +0,0 @@
1
- require 'fileutils'; include FileUtils
2
- require 'json'
3
-
4
- class WebGenerator
5
-
6
- def initialize(dest_dir)
7
- @dest_dir = dest_dir
8
- @dest_data_dir = File.join @dest_dir, 'data'
9
- @source_dir = File.join File.dirname(__FILE__), 'web'
10
- end
11
-
12
- def generate(teams)
13
- rm_rf @dest_dir
14
- cp_r "#{@source_dir}/.", @dest_dir
15
- mkdir_p @dest_data_dir
16
- teams.each { |t| create_data_file t }
17
- end
18
-
19
- private
20
-
21
- def create_data_file(team)
22
- file_name = "#{team[:team_name]}.json".downcase.gsub(' ', '-')
23
- path = File.join @dest_data_dir, file_name
24
- File.write path, team.to_json
25
- end
26
-
27
- end