sidekiq-cron 1.0.4 → 1.3.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.
@@ -13,7 +13,9 @@ module Sidekiq
13
13
  #how long we would like to store informations about previous enqueues
14
14
  REMEMBER_THRESHOLD = 24 * 60 * 60
15
15
  LAST_ENQUEUE_TIME_FORMAT = '%Y-%m-%d %H:%M:%S %z'
16
- LAST_ENQUEUE_TIME_FORMAT_OLD = '%Y-%m-%d %H:%M:%S'
16
+
17
+ # Use the exists? method if we're on a newer version of redis.
18
+ REDIS_EXISTS_METHOD = Gem.loaded_specs['redis'].version < Gem::Version.new('4.2') ? :exists : :exists?
17
19
 
18
20
  #crucial part of whole enquing job
19
21
  def should_enque? time
@@ -57,21 +59,23 @@ module Sidekiq
57
59
  nil
58
60
  end
59
61
 
60
- if klass_const
61
- if defined?(ActiveJob::Base) && klass_const < ActiveJob::Base
62
- enqueue_active_job(klass_const)
63
- else
64
- enqueue_sidekiq_worker(klass_const)
65
- end
66
- else
67
- if @active_job
68
- Sidekiq::Client.push(active_job_message)
62
+ jid =
63
+ if klass_const
64
+ if defined?(ActiveJob::Base) && klass_const < ActiveJob::Base
65
+ enqueue_active_job(klass_const).try :provider_job_id
66
+ else
67
+ enqueue_sidekiq_worker(klass_const)
68
+ end
69
69
  else
70
- Sidekiq::Client.push(sidekiq_worker_message)
70
+ if @active_job
71
+ Sidekiq::Client.push(active_job_message)
72
+ else
73
+ Sidekiq::Client.push(sidekiq_worker_message)
74
+ end
71
75
  end
72
- end
73
76
 
74
77
  save_last_enqueue_time
78
+ add_jid_history jid
75
79
  logger.debug { "enqueued #{@name}: #{@message}" }
76
80
  end
77
81
 
@@ -83,14 +87,10 @@ module Sidekiq
83
87
 
84
88
  def enqueue_active_job(klass_const)
85
89
  klass_const.set(queue: @queue).perform_later(*@args)
86
-
87
- true
88
90
  end
89
91
 
90
92
  def enqueue_sidekiq_worker(klass_const)
91
93
  klass_const.set(queue: queue_name_with_prefix).perform_async(*@args)
92
-
93
- true
94
94
  end
95
95
 
96
96
  # siodekiq worker message
@@ -206,9 +206,9 @@ module Sidekiq
206
206
  job_hashes = nil
207
207
  Sidekiq.redis do |conn|
208
208
  set_members = conn.smembers(jobs_key)
209
- job_hashes = conn.pipelined do
209
+ job_hashes = conn.pipelined do |pipeline|
210
210
  set_members.each do |key|
211
- conn.hgetall(key)
211
+ pipeline.hgetall(key)
212
212
  end
213
213
  end
214
214
  end
@@ -236,7 +236,7 @@ module Sidekiq
236
236
  output = Job.new conn.hgetall( redis_key(name) )
237
237
  end
238
238
  end
239
- output
239
+ output if output && output.valid?
240
240
  end
241
241
 
242
242
  # create new instance of cron job
@@ -282,7 +282,9 @@ module Sidekiq
282
282
  end
283
283
 
284
284
  #get right arguments for job
285
+ @symbolize_args = args["symbolize_args"] == true || ("#{args["symbolize_args"]}" =~ (/^(true|t|yes|y|1)$/i)) == 0 || false
285
286
  @args = args["args"].nil? ? [] : parse_args( args["args"] )
287
+ @args += [Time.now.to_f] if args["date_as_argument"]
286
288
 
287
289
  @active_job = args["active_job"] == true || ("#{args["active_job"]}" =~ (/^(true|t|yes|y|1)$/i)) == 0 || false
288
290
  @active_job_queue_name_prefix = args["queue_name_prefix"]
@@ -350,6 +352,12 @@ module Sidekiq
350
352
  !enabled?
351
353
  end
352
354
 
355
+ def pretty_message
356
+ JSON.pretty_generate Sidekiq.load_json(message)
357
+ rescue JSON::ParserError
358
+ message
359
+ end
360
+
353
361
  def status_from_redis
354
362
  out = "enabled"
355
363
  if fetch_missing_args
@@ -371,6 +379,18 @@ module Sidekiq
371
379
  out
372
380
  end
373
381
 
382
+ def jid_history_from_redis
383
+ out =
384
+ Sidekiq.redis do |conn|
385
+ conn.lrange(jid_history_key, 0, -1) rescue nil
386
+ end
387
+
388
+ # returns nil if out nil
389
+ out && out.map do |jid_history_raw|
390
+ Sidekiq.load_json jid_history_raw
391
+ end
392
+ end
393
+
374
394
  #export job data to hash
375
395
  def to_hash
376
396
  {
@@ -385,6 +405,7 @@ module Sidekiq
385
405
  queue_name_prefix: @active_job_queue_name_prefix,
386
406
  queue_name_delimiter: @active_job_queue_name_delimiter,
387
407
  last_enqueue_time: @last_enqueue_time,
408
+ symbolize_args: @symbolize_args,
388
409
  }
389
410
  end
390
411
 
@@ -445,7 +466,7 @@ module Sidekiq
445
466
 
446
467
  #add information about last time! - don't enque right after scheduler poller starts!
447
468
  time = Time.now.utc
448
- conn.zadd(job_enqueued_key, time.to_f.to_s, formated_last_time(time).to_s) unless conn.exists(job_enqueued_key)
469
+ conn.zadd(job_enqueued_key, time.to_f.to_s, formated_last_time(time).to_s) unless conn.public_send(REDIS_EXISTS_METHOD, job_enqueued_key)
449
470
  end
450
471
  logger.info { "Cron Jobs - add job with name: #{@name}" }
451
472
  end
@@ -457,6 +478,20 @@ module Sidekiq
457
478
  end
458
479
  end
459
480
 
481
+ def add_jid_history(jid)
482
+ jid_history = {
483
+ jid: jid,
484
+ enqueued: @last_enqueue_time
485
+ }
486
+ @history_size ||= (Sidekiq.options[:cron_history_size] || 10).to_i - 1
487
+ Sidekiq.redis do |conn|
488
+ conn.lpush jid_history_key,
489
+ Sidekiq.dump_json(jid_history)
490
+ # keep only last 10 entries in a fifo manner
491
+ conn.ltrim jid_history_key, 0, @history_size
492
+ end
493
+ end
494
+
460
495
  # remove job from cron jobs by name
461
496
  # input:
462
497
  # first arg: name (string) - name of job (must be same - case sensitive)
@@ -468,6 +503,9 @@ module Sidekiq
468
503
  #delete runned timestamps
469
504
  conn.del job_enqueued_key
470
505
 
506
+ # delete jid_history
507
+ conn.del jid_history_key
508
+
471
509
  #delete main job
472
510
  conn.del redis_key
473
511
  end
@@ -507,7 +545,7 @@ module Sidekiq
507
545
  def self.exists? name
508
546
  out = false
509
547
  Sidekiq.redis do |conn|
510
- out = conn.exists redis_key name
548
+ out = conn.public_send(REDIS_EXISTS_METHOD, redis_key(name))
511
549
  end
512
550
  out
513
551
  end
@@ -538,23 +576,44 @@ module Sidekiq
538
576
  case args
539
577
  when String
540
578
  begin
541
- Sidekiq.load_json(args)
579
+ parsed_args = Sidekiq.load_json(args)
580
+ symbolize_args? ? symbolize_args(parsed_args) : parsed_args
542
581
  rescue JSON::ParserError
543
582
  [*args] # cast to string array
544
583
  end
545
584
  when Hash
546
- [args] # just put hash into array
585
+ symbolize_args? ? [symbolize_args(args)] : [args]
547
586
  when Array
548
- args # do nothing, already array
587
+ symbolize_args? ? symbolize_args(args) : args
549
588
  else
550
589
  [*args] # cast to string array
551
590
  end
552
591
  end
553
592
 
593
+ def symbolize_args?
594
+ @symbolize_args
595
+ end
596
+
597
+ def symbolize_args(input)
598
+ if input.is_a?(Array)
599
+ input.map do |arg|
600
+ if arg.respond_to?(:symbolize_keys)
601
+ arg.symbolize_keys
602
+ else
603
+ arg
604
+ end
605
+ end
606
+ elsif input.is_a?(Hash) && input.respond_to?(:symbolize_keys)
607
+ input.symbolize_keys
608
+ else
609
+ input
610
+ end
611
+ end
612
+
554
613
  def parse_enqueue_time(timestamp)
555
614
  DateTime.strptime(timestamp, LAST_ENQUEUE_TIME_FORMAT).to_time.utc
556
615
  rescue ArgumentError
557
- DateTime.strptime(timestamp, LAST_ENQUEUE_TIME_FORMAT_OLD).to_time.utc
616
+ DateTime.parse(timestamp).to_time.utc
558
617
  end
559
618
 
560
619
  def not_past_scheduled_time?(current_time)
@@ -586,12 +645,20 @@ module Sidekiq
586
645
  "cron_job:#{name}:enqueued"
587
646
  end
588
647
 
648
+ def self.jid_history_key name
649
+ "cron_job:#{name}:jid_history"
650
+ end
651
+
589
652
  # Redis key for storing one cron job run times
590
653
  # (when poller added job to queue)
591
654
  def job_enqueued_key
592
655
  self.class.job_enqueued_key @name
593
656
  end
594
657
 
658
+ def jid_history_key
659
+ self.class.jid_history_key @name
660
+ end
661
+
595
662
  # Give Hash
596
663
  # returns array for using it for redis.hmset
597
664
  def hash_to_redis hash
@@ -1,6 +1,3 @@
1
- # require Sidekiq original launcher
2
- require 'sidekiq/launcher'
3
-
4
1
  # require cron poller
5
2
  require 'sidekiq/cron/poller'
6
3
 
@@ -10,44 +7,41 @@ require 'sidekiq/cron/poller'
10
7
  # we are creating new cron poller instance and
11
8
  # adding start and stop commands to launcher
12
9
  module Sidekiq
13
- class Launcher
14
- # Add cron poller to launcher
15
- attr_reader :cron_poller
16
-
17
- # remember old initialize
18
- alias_method :old_initialize, :initialize
19
-
20
- # add cron poller and execute normal initialize of Sidekiq launcher
21
- def initialize(options)
22
- @cron_poller = Sidekiq::Cron::Poller.new
23
- old_initialize options
24
- end
25
-
26
- # remember old run
27
- alias_method :old_run, :run
28
-
29
- # execute normal run of launcher and run cron poller
30
- def run
31
- old_run
32
- cron_poller.start
33
- end
34
-
35
- # remember old quiet
36
- alias_method :old_quiet, :quiet
37
-
38
- # execute normal quiet of launcher and quiet cron poller
39
- def quiet
40
- cron_poller.terminate
41
- old_quiet
10
+ module Cron
11
+ module Launcher
12
+ # Add cron poller to launcher
13
+ attr_reader :cron_poller
14
+
15
+ # add cron poller and execute normal initialize of Sidekiq launcher
16
+ def initialize(options)
17
+ @cron_poller = Sidekiq::Cron::Poller.new
18
+ super(options)
19
+ end
20
+
21
+ # execute normal run of launcher and run cron poller
22
+ def run
23
+ super
24
+ cron_poller.start
25
+ end
26
+
27
+ # execute normal quiet of launcher and quiet cron poller
28
+ def quiet
29
+ cron_poller.terminate
30
+ super
31
+ end
32
+
33
+ # execute normal stop of launcher and stop cron poller
34
+ def stop
35
+ cron_poller.terminate
36
+ super
37
+ end
42
38
  end
39
+ end
40
+ end
43
41
 
44
- # remember old stop
45
- alias_method :old_stop, :stop
42
+ Sidekiq.configure_server do
43
+ # require Sidekiq original launcher
44
+ require 'sidekiq/launcher'
46
45
 
47
- # execute normal stop of launcher and stop cron poller
48
- def stop
49
- cron_poller.terminate
50
- old_stop
51
- end
52
- end
46
+ ::Sidekiq::Launcher.prepend(Sidekiq::Cron::Launcher)
53
47
  end
@@ -8,6 +8,6 @@ de:
8
8
  NoCronJobsWereFound: Keine Cronjobs gefunden
9
9
  Enable: Aktivieren
10
10
  Disable: Deaktivieren
11
- 'Last enque': Eingereiht
11
+ 'Last enqueued': Eingereiht
12
12
  disabled: deaktiviert
13
13
  enabled: aktiviert
@@ -8,11 +8,15 @@ en:
8
8
  EnqueueAll: Enqueue All
9
9
  DeleteAll: Delete All
10
10
  'Cron string': Cron
11
+ AreYouSureEnqueueCronJobs: Are you sure you want to enqueue ALL cron jobs?
12
+ AreYouSureEnqueueCronJob: Are you sure you want to enqueue the %{job} cron job?
11
13
  AreYouSureDeleteCronJobs: Are you sure you want to delete ALL cron jobs?
12
14
  AreYouSureDeleteCronJob: Are you sure you want to delete the %{job} cron job?
13
15
  NoCronJobsWereFound: No cron jobs were found
14
16
  Enable: Enable
15
17
  Disable: Disable
16
- 'Last enque': Last enqueued
18
+ 'Last enqueued': Last enqueued
17
19
  disabled: disabled
18
20
  enabled: enabled
21
+ NoHistoryWereFound: No history were found
22
+ Description: Description
@@ -13,6 +13,6 @@ ja:
13
13
  NoCronJobsWereFound: Cronジョブが見つかりませんでした
14
14
  Enable: 有効にする
15
15
  Disable: 無効にする
16
- 'Last enque': 最後のキュー
16
+ 'Last enqueued': 最後のキュー
17
17
  disabled: 無効
18
18
  enabled: 有効
@@ -9,6 +9,6 @@ ru:
9
9
  NoCronJobsWereFound: Не найдено периодических задач
10
10
  Enable: Включить
11
11
  Disable: Отключить
12
- 'Last enque': Последний запуск
12
+ 'Last enqueued': Последний запуск
13
13
  disabled: отключено
14
14
  enabled: включено
@@ -13,7 +13,7 @@ zh-CN:
13
13
  NoCronJobsWereFound: 没有定时任务
14
14
  Enable: 启用
15
15
  Disable: 禁用
16
- 'Last enque': 放入队列时间
16
+ 'Last enqueued': 放入队列时间
17
17
  disabled: 已禁用
18
18
  enabled: 已启用
19
19
 
@@ -17,8 +17,8 @@ module Sidekiq
17
17
  rescue => ex
18
18
  # Most likely a problem with redis networking.
19
19
  # Punt and try again at the next interval
20
- logger.error ex.message
21
- logger.error ex.backtrace.first
20
+ Sidekiq.logger.error ex.message
21
+ Sidekiq.logger.error ex.backtrace.first
22
22
  handle_exception(ex) if respond_to?(:handle_exception)
23
23
  end
24
24
 
@@ -28,13 +28,13 @@ module Sidekiq
28
28
  job.test_and_enque_for_time! time if job && job.valid?
29
29
  rescue => ex
30
30
  # problem somewhere in one job
31
- logger.error "CRON JOB: #{ex.message}"
32
- logger.error "CRON JOB: #{ex.backtrace.first}"
31
+ Sidekiq.logger.error "CRON JOB: #{ex.message}"
32
+ Sidekiq.logger.error "CRON JOB: #{ex.backtrace.first}"
33
33
  handle_exception(ex) if respond_to?(:handle_exception)
34
34
  end
35
35
 
36
36
  def poll_interval_average
37
- Sidekiq.options[:poll_interval] || POLL_INTERVAL
37
+ Sidekiq.options[:average_scheduled_poll_interval] || Sidekiq.options[:poll_interval] || POLL_INTERVAL
38
38
  end
39
39
  end
40
40
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sidekiq
4
+ module Cron
5
+ VERSION = "1.3.0"
6
+ end
7
+ end
@@ -1,12 +1,12 @@
1
1
  <header class='row'>
2
2
  <div class='col-sm-5 pull-left'>
3
- <h3><%=t 'CronJobs' %></h3>
3
+ <h3><%= t('CronJobs') %></h3>
4
4
  </div>
5
5
  <div class='col-sm-7 pull-right' style="margin-top: 20px; margin-bottom: 10px;">
6
6
  <% if @cron_jobs.size > 0 %>
7
7
  <form action="<%= root_path %>cron/__all__/delete" method="post" class="pull-right">
8
8
  <%= csrf_tag if respond_to?(:csrf_tag) %>
9
- <input class="btn btn-small btn-danger" type="submit" name="delete" value="<%= t('DeleteAll') %>" data-confirm="<%= t('AreYouSureDeleteCronJobs') %>">
9
+ <input class="btn btn-small btn-danger" type="submit" name="delete" value="<%= t('DeleteAll') %>" data-confirm="<%= t('AreYouSureDeleteCronJobs') %>" />
10
10
  </form>
11
11
  <form action="<%= root_path %>cron/__all__/disable" method="post" class="pull-right">
12
12
  <%= csrf_tag if respond_to?(:csrf_tag) %>
@@ -18,7 +18,7 @@
18
18
  </form>
19
19
  <form action="<%= root_path %>cron/__all__/enque" method="post" class="pull-right">
20
20
  <%= csrf_tag if respond_to?(:csrf_tag) %>
21
- <input class="btn btn-small" type="submit" name="enque" value="<%= t('EnqueueAll') %>" />
21
+ <input class="btn btn-small" type="submit" name="enque" value="<%= t('EnqueueAll') %>" data-confirm="<%= t('AreYouSureEnqueueCronJobs') %>" />
22
22
  </form>
23
23
  <% end %>
24
24
  </div>
@@ -31,7 +31,7 @@
31
31
  <th><%= t('Status') %></th>
32
32
  <th><%= t('Name') %></th>
33
33
  <th><%= t('Cron string') %></th>
34
- <th><%= t('Last enque') %></th>
34
+ <th><%= t('Last enqueued') %></th>
35
35
  <th width="180"><%= t('Actions')%></th>
36
36
  </thead>
37
37
 
@@ -41,7 +41,9 @@
41
41
  <tr>
42
42
  <td style="<%= style %>"><%= t job.status %></td>
43
43
  <td style="<%= style %>">
44
- <b><%= job.name %></b>
44
+ <a href="<%= root_path %>cron/<%= CGI.escape(job.name).gsub('+', '%20') %>">
45
+ <b><%= job.name %></b>
46
+ </a>
45
47
  <hr style="margin:3px;border:0;">
46
48
  <small>
47
49
  <% if job.message and job.message.to_s.size > 100 %>
@@ -59,7 +61,7 @@
59
61
  <% if job.status == 'enabled' %>
60
62
  <form action="<%= root_path %>cron/<%= CGI.escape(job.name).gsub('+', '%20') %>/enque" method="post">
61
63
  <%= csrf_tag if respond_to?(:csrf_tag) %>
62
- <input class='btn btn-xs pull-left' type="submit" name="enque" value="<%= t('EnqueueNow') %>"/>
64
+ <input class='btn btn-xs pull-left' type="submit" name="enque" value="<%= t('EnqueueNow') %>" data-confirm="<%= t('AreYouSureEnqueueCronJob', :job => job.name) %>"/>
63
65
  </form>
64
66
  <form action="<%= root_path %>cron/<%= CGI.escape(job.name).gsub('+', '%20') %>/disable" method="post">
65
67
  <%= csrf_tag if respond_to?(:csrf_tag) %>
@@ -15,7 +15,7 @@ header.row
15
15
  input.btn.btn-small.pull-left type="submit" name="enque" value="#{t('EnableAll')}"
16
16
  form.pull-right action="#{root_path}cron/__all__/enque" method="post"
17
17
  = csrf_tag if respond_to?(:csrf_tag)
18
- input.btn.btn-small.pull-left type="submit" name="enque" value="#{t('EnqueueAll')}"
18
+ input.btn.btn-small.pull-left type="submit" name="enque" value="#{t('EnqueueAll')}" data-confirm="#{t('AreYouSureEnqueueCronJobs')}"
19
19
 
20
20
  - if @cron_jobs.size > 0
21
21
 
@@ -24,7 +24,7 @@ header.row
24
24
  th = t('Status')
25
25
  th = t('Name')
26
26
  th = t('Cron')
27
- th = t('Last enque')
27
+ th = t('Last enqueued')
28
28
  th width="180px"
29
29
  = t('Actions')
30
30
 
@@ -34,7 +34,8 @@ header.row
34
34
  tr
35
35
  td[style="#{style}"]= job.status
36
36
  td[style="#{style}"]
37
- b job.name
37
+ a href="#{root_path}cron/#{CGI.escape(job.name).gsub('+', '%20')}"
38
+ b = job.name
38
39
  hr style="margin:3px;border:0;"
39
40
  small
40
41
  - if job.message and job.message.to_s.size > 100
@@ -58,7 +59,7 @@ header.row
58
59
  -else
59
60
  form action="#{root_path}cron/#{CGI.escape(job.name).gsub('+', '%20')}/enque" method="post"
60
61
  = csrf_tag if respond_to?(:csrf_tag)
61
- input.btn.btn-small.pull-left type="submit" name="enque" value="#{t('EnqueueNow')}"
62
+ input.btn.btn-small.pull-left type="submit" name="enque" value="#{t('EnqueueNow')}" data-confirm="#{t('AreYouSureEnqueueCronJob', :job => job.name)}"
62
63
  form action="#{root_path}cron/#{CGI.escape(job.name).gsub('+', '%20')}/enable" method="post"
63
64
  = csrf_tag if respond_to?(:csrf_tag)
64
65
  input.btn.btn-small.pull-left type="submit" name="enable" value="#{t('Enable')}"
@@ -0,0 +1,88 @@
1
+ <header class="row">
2
+ <div class="span col-sm-5 pull-left">
3
+ <h3>
4
+ <%= "#{t('Cron')} #{t('Job')}" %>
5
+ <small><%= @job.name %></small>
6
+ </h3>
7
+ </div>
8
+ <div class="span col-sm-7 pull-right" style="margin-top: 20px; margin-bottom: 10px;">
9
+ <% cron_job_path = "#{root_path}cron/#{CGI.escape(@job.name).gsub('+', '%20')}" %>
10
+ <form action="<%= cron_job_path %>/enque?redirect=<%= cron_job_path %>" class="pull-right" method="post">
11
+ <%= csrf_tag if respond_to?(:csrf_tag) %>
12
+ <input class="btn btn-small pull-left" name="enque" type="submit" value="<%= t('EnqueueNow') %>" data-confirm="<%= t('AreYouSureEnqueueCronJob', :job => @job.name) %>" />
13
+ </form>
14
+ <% if @job.status == 'enabled' %>
15
+ <form action="<%= cron_job_path %>/disable?redirect=<%= cron_job_path %>" class="pull-right" method="post">
16
+ <%= csrf_tag if respond_to?(:csrf_tag) %>
17
+ <input class="btn btn-small pull-left" name="disable" type="submit" value="<%= t('Disable') %>" />
18
+ </form>
19
+ <% else %>
20
+ <form action="<%= cron_job_path %>/enable?redirect=<%= cron_job_path %>" class="pull-right" method="post">
21
+ <%= csrf_tag if respond_to?(:csrf_tag) %>
22
+ <input class="btn btn-small pull-left" name="enable" type="submit" value="<%= t('Enable') %>" />
23
+ </form>
24
+ <form action="<%= cron_job_path %>/delete" class="pull-right" method="post">
25
+ <%= csrf_tag if respond_to?(:csrf_tag) %>
26
+ <input class="btn btn-danger btn-small" data-confirm="<%= t('AreYouSureDeleteCronJob', :job => @job.name) %>" name="delete" type="submit" value="<%= t('Delete') %>" />
27
+ </form>
28
+ <% end %>
29
+ </div>
30
+ </header>
31
+
32
+ <table class="table table-bordered table-striped">
33
+ <tbody>
34
+ <tr>
35
+ <th><%= t 'Status' %></th>
36
+ <td><%= @job.status %></td>
37
+ </tr>
38
+ <tr>
39
+ <th><%= t 'Name' %></th>
40
+ <td><%= @job.name %></td>
41
+ </tr>
42
+ <tr>
43
+ <th><%= t 'Description' %></th>
44
+ <td><%= @job.description %></td>
45
+ </tr>
46
+ <tr>
47
+ <th><%= t 'Message' %></th>
48
+ <td><pre><%= @job.pretty_message %></pre></td>
49
+ </tr>
50
+ <tr>
51
+ <th><%= t 'Cron' %></th>
52
+ <td><%= @job.cron.gsub(" ", "&nbsp;") %></td>
53
+ </tr>
54
+ <tr>
55
+ <th><%= t 'Last enqueued' %></th>
56
+ <td><%= @job.last_enqueue_time ? relative_time(@job.last_enqueue_time) : "-" %></td>
57
+ </tr>
58
+ </tbody>
59
+ </table>
60
+
61
+ <header class="row">
62
+ <div class="col-sm-12">
63
+ <h4>
64
+ <%= t 'History' %>
65
+ </h4>
66
+ </div>
67
+ </header>
68
+
69
+ <% if @job.jid_history_from_redis.size > 0 %>
70
+ <table class="table table-hover table-bordered table-striped">
71
+ <thead>
72
+ <tr>
73
+ <th><%= t 'Enqueued' %></th>
74
+ <th><%= t 'JID' %></th>
75
+ </tr>
76
+ </thead>
77
+ <tbody>
78
+ <% @job.jid_history_from_redis.each do |jid_history| %>
79
+ <tr>
80
+ <td><%= jid_history['enqueued'] %></td>
81
+ <td><%= jid_history['jid'] %></td>
82
+ </tr>
83
+ <% end %>
84
+ </tbody>
85
+ </table>
86
+ <% else %>
87
+ <div class='alert alert-success'><%= t 'NoHistoryWereFound' %></div>
88
+ <% end %>
@@ -0,0 +1,61 @@
1
+ header.row
2
+ .span.col-sm-5.pull-left
3
+ h3
4
+ = "#{t('Cron')} #{t('Job')}"
5
+ small= @job.name
6
+ .span.col-sm-7.pull-right style=("margin-top: 20px; margin-bottom: 10px;")
7
+ - cron_job_path = "#{root_path}cron/#{CGI.escape(@job.name).gsub('+', '%20')}"
8
+ form.pull-right action="#{cron_job_path}/enque?redirect=#{cron_job_path}" method="post"
9
+ = csrf_tag if respond_to?(:csrf_tag)
10
+ input.btn.btn-small.pull-left data-confirm="#{t('AreYouSureEnqueueCronJob', :job => @job.name)}" name="enque" type="submit" value="#{t('EnqueueNow')}"
11
+ - if @job.status == 'enabled'
12
+ form.pull-right action="#{cron_job_path}/disable?redirect=#{cron_job_path}" method="post"
13
+ = csrf_tag if respond_to?(:csrf_tag)
14
+ input.btn.btn-small.pull-left name="disable" type="submit" value="#{t('Disable')}"
15
+ - else
16
+ form.pull-right action="#{cron_job_path}/enable?redirect=#{cron_job_path}" method="post"
17
+ = csrf_tag if respond_to?(:csrf_tag)
18
+ input.btn.btn-small.pull-left name="enable" type="submit" value="#{t('Enable')}"
19
+ form.pull-right action="#{cron_job_path}/delete" method="post"
20
+ = csrf_tag if respond_to?(:csrf_tag)
21
+ input.btn.btn-danger.btn-small data-confirm="#{t('AreYouSureDeleteCronJob', :job => @job.name)}" name="delete" type="submit" value="#{t('Delete')}" /
22
+
23
+ table.table.table-bordered.table-striped
24
+ tbody
25
+ tr
26
+ th= t 'Status'
27
+ td= @job.status
28
+ tr
29
+ th= t 'Name'
30
+ td= @job.name
31
+ tr
32
+ th= t 'Description'
33
+ td= @job.description
34
+ tr
35
+ th= t 'Message'
36
+ td
37
+ pre= @job.pretty_message
38
+ tr
39
+ th= t 'Cron'
40
+ td= @job.cron.gsub(" ", "&nbsp;")
41
+ tr
42
+ th= t 'Last enqueued'
43
+ td= @job.last_enqueue_time ? relative_time(@job.last_enqueue_time) : "-"
44
+
45
+ header.row
46
+ .col-sm-12
47
+ h4= t 'History'
48
+
49
+ - if @job.jid_history_from_redis.size > 0
50
+ table.table.table-hover.table-bordered.table-striped
51
+ thead
52
+ tr
53
+ th= t 'Enqueued'
54
+ th= t 'JID'
55
+ tbody
56
+ - @job.jid_history_from_redis.each do |jid_history|
57
+ tr
58
+ td= jid_history['enqueued']
59
+ td= jid_history['jid']
60
+ - else
61
+ .alert.alert-success= t 'NoHistoryWereFound'