foreman_expire_hosts 6.0.0 → 7.0.2
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.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +78 -0
- data/.rubocop.yml +18 -13
- data/.rubocop_todo.yml +11 -31
- data/Gemfile +2 -0
- data/README.md +1 -0
- data/app/controllers/concerns/foreman_expire_hosts/api/v2/hosts_controller_extensions.rb +2 -0
- data/app/controllers/concerns/foreman_expire_hosts/host_controller_extensions.rb +20 -15
- data/app/helpers/concerns/foreman_expire_hosts/audits_helper_extensions.rb +4 -0
- data/app/helpers/concerns/foreman_expire_hosts/hosts_helper_extensions.rb +5 -22
- data/app/helpers/expire_hosts_mailer_helper.rb +3 -0
- data/app/helpers/foreman_expire_hosts/hosts_helper.rb +16 -0
- data/app/mailers/expire_hosts_mailer.rb +3 -0
- data/app/models/concerns/foreman_expire_hosts/host_ext.rb +9 -1
- data/app/models/host_status/expiration_status.rb +3 -0
- data/app/models/setting/expire_hosts.rb +2 -0
- data/app/overrides/add_expired_on_field_to_host_form.rb +4 -2
- data/app/overrides/add_expired_on_field_to_host_show.rb +5 -3
- data/app/overrides/deleted_expired_host_comment_in_audits.rb +8 -6
- data/app/services/foreman_expire_hosts/action/base.rb +9 -2
- data/app/services/foreman_expire_hosts/action/delete_expired_hosts.rb +3 -0
- data/app/services/foreman_expire_hosts/action/stop_expired_hosts.rb +6 -2
- data/app/services/foreman_expire_hosts/expiry_edit_authorizer.rb +2 -0
- data/app/services/foreman_expire_hosts/notification/base.rb +12 -3
- data/app/services/foreman_expire_hosts/notification/deleted_hosts.rb +2 -0
- data/app/services/foreman_expire_hosts/notification/expiry_warning.rb +2 -0
- data/app/services/foreman_expire_hosts/notification/failed_deleted_hosts.rb +2 -0
- data/app/services/foreman_expire_hosts/notification/failed_stopped_hosts.rb +2 -0
- data/app/services/foreman_expire_hosts/notification/stopped_hosts.rb +2 -0
- data/app/services/foreman_expire_hosts/safe_destroy.rb +7 -5
- data/app/services/foreman_expire_hosts/ui_notifications/hosts/base.rb +4 -1
- data/app/services/foreman_expire_hosts/ui_notifications/hosts/expiry_warning.rb +2 -0
- data/app/services/foreman_expire_hosts/ui_notifications/hosts/stopped_host.rb +2 -0
- data/app/views/api/v2/hosts/expiration.json.rabl +2 -0
- data/app/views/hosts/_expired_on_field.html.erb +11 -20
- data/app/views/hosts/select_multiple_expiration.html.erb +10 -15
- data/config/routes.rb +2 -0
- data/db/migrate/20150427101516_add_expiry_on_to_hosts.rb +2 -0
- data/db/seeds.d/80_expire_hosts_ui_notification.rb +2 -0
- data/extra/foreman_expire_hosts.cron +8 -0
- data/foreman_expire_hosts.gemspec +10 -3
- data/lib/expire_hosts_notifications.rb +3 -0
- data/lib/foreman_expire_hosts.rb +2 -0
- data/lib/foreman_expire_hosts/engine.rb +22 -10
- data/lib/foreman_expire_hosts/version.rb +3 -1
- data/lib/tasks/expired_hosts.rake +3 -1
- data/test/factories/foreman_expire_hosts_factories.rb +7 -5
- data/test/functional/api/v2/hosts_controller_test.rb +3 -1
- data/test/functional/concerns/hosts_controller_extensions_test.rb +3 -1
- data/test/helpers/hosts_helper_test.rb +5 -0
- data/test/lib/expire_hosts_notifications_test.rb +91 -45
- data/test/test_plugin_helper.rb +2 -0
- data/test/unit/concerns/host_extensions_test.rb +21 -19
- data/test/unit/expire_hosts_mailer_test.rb +6 -0
- data/test/unit/expiry_edit_authorizer_test.rb +2 -0
- data/test/unit/host_status/expiration_status_test.rb +3 -1
- data/test/unit/safe_destroy_test.rb +3 -1
- metadata +53 -26
- data/app/assets/javascripts/foreman_expire_hosts/application.js +0 -3
- data/app/assets/javascripts/foreman_expire_hosts/datepicker_for_host_expired_on_field.js +0 -27
- data/app/assets/stylesheets/foreman_expire_hosts/application.scss +0 -4
- data/app/overrides/add_js_to_host_index.rb +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f2f0094dacc9c70e393e1bf88b942e63e03d61ad43f9279dac3bc55dc8796d0f
|
4
|
+
data.tar.gz: f9768b9ad368199ed8b8d8965664788797cf59db5c0888cf4f846c324105d889
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e2093d7a71c66e85f18b2712e0bd9c39397d1f731e8cdd229a1b7e55805d97d7b751694760b2f4912b169e3110a6a9847bdff8a7d43595b6d7904f35100bd1b9
|
7
|
+
data.tar.gz: 6d24cb1a6fe7c1704680a95e06b90ebffeb8636e752e007a5bd8be48d5101fa5b25c169396ed61f7ff2320f77f46083115b78798626d371ed540fcaee632c143
|
@@ -0,0 +1,78 @@
|
|
1
|
+
name: CI
|
2
|
+
on: [push, pull_request]
|
3
|
+
env:
|
4
|
+
RAILS_ENV: test
|
5
|
+
DATABASE_URL: postgresql://postgres:@localhost/test
|
6
|
+
DATABASE_CLEANER_ALLOW_REMOTE_DATABASE_URL: true
|
7
|
+
jobs:
|
8
|
+
rubocop:
|
9
|
+
runs-on: ubuntu-latest
|
10
|
+
steps:
|
11
|
+
- uses: actions/checkout@v2
|
12
|
+
- name: Setup Ruby
|
13
|
+
uses: ruby/setup-ruby@v1
|
14
|
+
with:
|
15
|
+
ruby-version: 2.3
|
16
|
+
- name: Setup
|
17
|
+
run: |
|
18
|
+
gem install bundler
|
19
|
+
bundle install --jobs=3 --retry=3
|
20
|
+
- name: Run rubocop
|
21
|
+
run: bundle exec rubocop
|
22
|
+
test:
|
23
|
+
runs-on: ubuntu-latest
|
24
|
+
needs: rubocop
|
25
|
+
services:
|
26
|
+
postgres:
|
27
|
+
image: postgres:12.1
|
28
|
+
ports: ['5432:5432']
|
29
|
+
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
|
30
|
+
strategy:
|
31
|
+
fail-fast: false
|
32
|
+
matrix:
|
33
|
+
foreman-core-branch: [1.24-stable, 2.0-stable, 2.1-stable, develop]
|
34
|
+
ruby-version: [2.3, 2.5, 2.6]
|
35
|
+
node-version: [10]
|
36
|
+
exclude:
|
37
|
+
- foreman-core-branch: 2.0-stable
|
38
|
+
ruby-version: 2.3
|
39
|
+
- foreman-core-branch: 2.1-stable
|
40
|
+
ruby-version: 2.3
|
41
|
+
- foreman-core-branch: develop
|
42
|
+
ruby-version: 2.3
|
43
|
+
steps:
|
44
|
+
- name: Install dependencies
|
45
|
+
run: |
|
46
|
+
sudo apt-get update
|
47
|
+
sudo apt-get install build-essential libcurl4-openssl-dev libvirt-dev ruby-libvirt zlib1g-dev libpq-dev
|
48
|
+
- uses: actions/checkout@v2
|
49
|
+
with:
|
50
|
+
repository: theforeman/foreman
|
51
|
+
ref: ${{ matrix.foreman-core-branch }}
|
52
|
+
- uses: actions/checkout@v2
|
53
|
+
with:
|
54
|
+
path: foreman_expire_hosts
|
55
|
+
- name: Setup Ruby
|
56
|
+
uses: ruby/setup-ruby@v1
|
57
|
+
with:
|
58
|
+
ruby-version: ${{ matrix.ruby-version }}
|
59
|
+
- name: Setup Node
|
60
|
+
uses: actions/setup-node@v1
|
61
|
+
with:
|
62
|
+
node-version: ${{ matrix.node-version }}
|
63
|
+
- name: Setup Plugin
|
64
|
+
run: |
|
65
|
+
echo "gem 'foreman_expire_hosts', path: './foreman_expire_hosts'" > bundler.d/foreman_expire_hosts.local.rb
|
66
|
+
gem install bundler
|
67
|
+
bundle config set without journald development console mysql2 sqlite
|
68
|
+
bundle install --jobs=3 --retry=3
|
69
|
+
bundle exec rake db:create
|
70
|
+
bundle exec rake db:migrate
|
71
|
+
npm install
|
72
|
+
bundle exec rake webpack:compile
|
73
|
+
- name: Run plugin tests
|
74
|
+
run: bundle exec rake test:foreman_expire_hosts
|
75
|
+
- name: Precompile plugin assets
|
76
|
+
run: bundle exec rake 'plugin:assets:precompile[foreman_expire_hosts]'
|
77
|
+
env:
|
78
|
+
RAILS_ENV: production
|
data/.rubocop.yml
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
inherit_from:
|
2
2
|
- .rubocop_todo.yml
|
3
3
|
|
4
|
+
require:
|
5
|
+
- rubocop-minitest
|
6
|
+
- rubocop-performance
|
7
|
+
- rubocop-rails
|
8
|
+
|
4
9
|
AllCops:
|
5
|
-
TargetRubyVersion: 2.
|
10
|
+
TargetRubyVersion: 2.3
|
6
11
|
TargetRailsVersion: 5.1
|
7
12
|
Exclude:
|
8
13
|
- 'Rakefile'
|
@@ -17,18 +22,12 @@ Rails/Date:
|
|
17
22
|
Style/Documentation:
|
18
23
|
Enabled: false
|
19
24
|
|
20
|
-
Metrics/MethodLength:
|
21
|
-
Max: 40
|
22
|
-
|
23
25
|
Naming/AccessorMethodName:
|
24
26
|
Enabled: false
|
25
27
|
|
26
28
|
Style/RedundantSelf:
|
27
29
|
Enabled: false
|
28
30
|
|
29
|
-
Metrics/ClassLength:
|
30
|
-
Max: 500
|
31
|
-
|
32
31
|
Naming/FileName:
|
33
32
|
Exclude:
|
34
33
|
- 'db/seeds.d/*'
|
@@ -36,9 +35,6 @@ Naming/FileName:
|
|
36
35
|
Style/WordArray:
|
37
36
|
Enabled: false
|
38
37
|
|
39
|
-
Style/BracesAroundHashParameters:
|
40
|
-
Enabled: false
|
41
|
-
|
42
38
|
Style/RescueModifier:
|
43
39
|
Enabled: false
|
44
40
|
|
@@ -48,9 +44,6 @@ Style/ClassAndModuleChildren:
|
|
48
44
|
Style/EachWithObject:
|
49
45
|
Enabled: false
|
50
46
|
|
51
|
-
Metrics/ParameterLists:
|
52
|
-
Enabled: false
|
53
|
-
|
54
47
|
Style/SymbolArray:
|
55
48
|
Enabled: false
|
56
49
|
|
@@ -71,3 +64,15 @@ Style/CommentedKeyword:
|
|
71
64
|
|
72
65
|
Rails/LexicallyScopedActionFilter:
|
73
66
|
Enabled: false
|
67
|
+
|
68
|
+
Rails/OutputSafety:
|
69
|
+
Enabled: false
|
70
|
+
|
71
|
+
Rails/SkipsModelValidations:
|
72
|
+
Enabled: false
|
73
|
+
|
74
|
+
Metrics:
|
75
|
+
Enabled: false
|
76
|
+
|
77
|
+
Layout/LineLength:
|
78
|
+
Enabled: false
|
data/.rubocop_todo.yml
CHANGED
@@ -1,42 +1,22 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on
|
3
|
+
# on 2019-12-04 09:30:58 +0100 using RuboCop version 0.75.0.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
Max: 51
|
9
|
+
Minitest/RefuteFalse:
|
10
|
+
Enabled: false
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
Metrics/BlockLength:
|
16
|
-
Max: 35
|
17
|
-
Exclude:
|
18
|
-
- 'test/**/*.rb'
|
12
|
+
Minitest/AssertTruthy:
|
13
|
+
Enabled: false
|
19
14
|
|
20
|
-
|
21
|
-
|
22
|
-
Max: 11
|
15
|
+
Style/HashEachMethods:
|
16
|
+
Enabled: false
|
23
17
|
|
24
|
-
|
25
|
-
|
26
|
-
# URISchemes: http, https
|
27
|
-
Metrics/LineLength:
|
28
|
-
Max: 362
|
18
|
+
Style/HashTransformKeys:
|
19
|
+
Enabled: false
|
29
20
|
|
30
|
-
|
31
|
-
|
32
|
-
Metrics/ModuleLength:
|
33
|
-
Max: 110
|
34
|
-
|
35
|
-
# Offense count: 3
|
36
|
-
Metrics/PerceivedComplexity:
|
37
|
-
Max: 11
|
38
|
-
|
39
|
-
# Offense count: 2
|
40
|
-
Rails/OutputSafety:
|
41
|
-
Exclude:
|
42
|
-
- 'app/helpers/concerns/foreman_expire_hosts/audits_helper_extensions.rb'
|
21
|
+
Style/HashTransformValues:
|
22
|
+
Enabled: false
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -18,6 +18,7 @@ This plugin will send two warning notifications before host expiry (see Settings
|
|
18
18
|
| >= 1.16 | ~> 4.0 |
|
19
19
|
| >= 1.17 | ~> 5.0 |
|
20
20
|
| >= 1.18 | ~> 6.0 |
|
21
|
+
| >= 1.24 | ~> 7.0 |
|
21
22
|
|
22
23
|
# Screenshots
|
23
24
|

|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ForemanExpireHosts
|
2
4
|
module HostControllerExtensions
|
3
5
|
def self.prepended(base)
|
@@ -11,23 +13,20 @@ module ForemanExpireHosts
|
|
11
13
|
def select_multiple_expiration; end
|
12
14
|
|
13
15
|
def update_multiple_expiration
|
14
|
-
expiration_date = params[:host][:expired_on]
|
15
|
-
expiration_date = Date.parse(expiration_date) if expiration_date.present?
|
16
|
-
|
17
16
|
failed_hosts = {}
|
18
17
|
|
19
18
|
@hosts.each do |host|
|
20
19
|
begin
|
21
20
|
host.expired_on = expiration_date
|
22
21
|
host.save!
|
23
|
-
rescue StandardError =>
|
24
|
-
failed_hosts[host.name] =
|
22
|
+
rescue StandardError => e
|
23
|
+
failed_hosts[host.name] = e
|
25
24
|
message = if expiration_date.present?
|
26
25
|
_('Failed to set expiration date for %{host} to %{expiration_date}.') % { :host => host, :expiration_date => l(expiration_date) }
|
27
26
|
else
|
28
27
|
_('Failed to clear expiration date for %s.') % host
|
29
28
|
end
|
30
|
-
Foreman::Logging.exception(message,
|
29
|
+
Foreman::Logging.exception(message, e)
|
31
30
|
end
|
32
31
|
end
|
33
32
|
|
@@ -48,15 +47,21 @@ module ForemanExpireHosts
|
|
48
47
|
private
|
49
48
|
|
50
49
|
def validate_multiple_expiration
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
50
|
+
expiration_date
|
51
|
+
rescue ArgumentError
|
52
|
+
error _('Invalid expiration date!')
|
53
|
+
redirect_to(hosts_path) && (return false)
|
54
|
+
end
|
55
|
+
|
56
|
+
def expiration_date
|
57
|
+
@expiration_date ||= begin
|
58
|
+
year = params['host']['expired_on(1i)']
|
59
|
+
month = params['host']['expired_on(2i)']
|
60
|
+
day = params['host']['expired_on(3i)']
|
61
|
+
|
62
|
+
return if year.empty? && month.empty? && day.empty?
|
63
|
+
|
64
|
+
Date.parse("#{year}-#{month}-#{day}")
|
60
65
|
end
|
61
66
|
end
|
62
67
|
|
@@ -1,14 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ForemanExpireHosts
|
2
4
|
module AuditsHelperExtensions
|
3
5
|
extend ActiveSupport::Concern
|
4
6
|
|
5
7
|
def destroyed_expired_host_audit_comment_in_list(audit)
|
6
8
|
return unless audit.auditable_type.to_s == 'Host' && audit.action == 'destroy' && audit.comment.present?
|
9
|
+
|
7
10
|
"<div style='color: #737373;font-size: 14px'>Comment: #{audit.comment}</div>".html_safe
|
8
11
|
end
|
9
12
|
|
10
13
|
def destroyed_expired_host_audit_comment_in_show(audit)
|
11
14
|
return unless audit.auditable_type.to_s == 'Host' && audit.action == 'destroy' && audit.comment.present?
|
15
|
+
|
12
16
|
"<tr><td>Comment</td><td>#{audit.comment}</td></tr>".html_safe
|
13
17
|
end
|
14
18
|
end
|
@@ -1,21 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ForemanExpireHosts
|
2
4
|
module HostsHelperExtensions
|
3
5
|
extend ActiveSupport::Concern
|
4
6
|
|
5
|
-
module Overrides
|
6
|
-
def multiple_actions
|
7
|
-
actions = super
|
8
|
-
actions << [_('Change Expiration'), select_multiple_expiration_hosts_path] if authorized_for(:controller => :hosts, :action => :select_multiple_expiration)
|
9
|
-
actions
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
included do
|
14
|
-
prepend Overrides
|
15
|
-
end
|
16
|
-
|
17
7
|
def host_expiry_warning_message(host)
|
18
8
|
return nil unless host.expires?
|
9
|
+
|
19
10
|
if host.expired_past_grace_period?
|
20
11
|
message = _('This host has expired %s ago and needs to be deleted manually.') % time_ago_in_words(host.expired_on)
|
21
12
|
elsif host.expired?
|
@@ -32,18 +23,10 @@ module ForemanExpireHosts
|
|
32
23
|
distance_of_time_in_words(to_time, Time.current, options)
|
33
24
|
end
|
34
25
|
|
35
|
-
def
|
36
|
-
content_tag :span, class: 'input-group-addon' do
|
37
|
-
content_tag :span, content, options
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def datepicker_f(form, attr, options = {})
|
26
|
+
def datepicker_f(form, attr, options = {}, html_options = {})
|
42
27
|
field(form, attr, options) do
|
43
28
|
addClass options, 'form-control'
|
44
|
-
|
45
|
-
addon = input_group_addon('', :class => 'glyphicon glyphicon-calendar')
|
46
|
-
input_group date, addon
|
29
|
+
form.date_select(attr, options, html_options)
|
47
30
|
end
|
48
31
|
end
|
49
32
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ForemanExpireHosts
|
4
|
+
module HostsHelper
|
5
|
+
def expire_hosts_host_multiple_actions
|
6
|
+
actions = []
|
7
|
+
if authorized_for(:controller => :hosts, :action => :select_multiple_expiration)
|
8
|
+
actions << {
|
9
|
+
action: [_('Change Expiration'), select_multiple_expiration_hosts_path],
|
10
|
+
priority: 200
|
11
|
+
}
|
12
|
+
end
|
13
|
+
actions
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class ExpireHostsMailer < ApplicationMailer
|
2
4
|
default :content_type => 'text/html', :from => Setting[:email_reply_address] || 'noreply@your-foreman.com'
|
3
5
|
|
@@ -80,6 +82,7 @@ class ExpireHostsMailer < ApplicationMailer
|
|
80
82
|
def recipient_mail(recipient)
|
81
83
|
return recipient if recipient.is_a?(Array)
|
82
84
|
return recipient.mail if recipient.mail.present?
|
85
|
+
|
83
86
|
admin_email
|
84
87
|
end
|
85
88
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module ForemanExpireHosts
|
2
4
|
module HostExt
|
3
5
|
extend ActiveSupport::Concern
|
@@ -13,7 +15,7 @@ module ForemanExpireHosts
|
|
13
15
|
|
14
16
|
scope :expiring, -> { where('expired_on IS NOT NULL') }
|
15
17
|
scope :with_expire_date, ->(date) { expiring.where('expired_on = ?', date) }
|
16
|
-
scope :expired, -> { expiring.where('expired_on
|
18
|
+
scope :expired, -> { expiring.where('expired_on <= ?', Date.today) }
|
17
19
|
scope :expiring_today, -> { expiring.with_expire_date(Date.today) }
|
18
20
|
scope :expired_past_grace_period, -> { expiring.where('expired_on <= ?', Date.today - Setting[:days_to_delete_after_host_expiration].to_i) }
|
19
21
|
|
@@ -40,27 +42,32 @@ module ForemanExpireHosts
|
|
40
42
|
|
41
43
|
def expires_today?
|
42
44
|
return false unless expires?
|
45
|
+
|
43
46
|
expired_on.to_date == Date.today
|
44
47
|
end
|
45
48
|
|
46
49
|
def expired?
|
47
50
|
return false unless expires?
|
51
|
+
|
48
52
|
expired_on.to_date < Date.today
|
49
53
|
end
|
50
54
|
|
51
55
|
def expiration_grace_period_end_date
|
52
56
|
return nil unless expires?
|
57
|
+
|
53
58
|
expired_on + Setting[:days_to_delete_after_host_expiration].to_i
|
54
59
|
end
|
55
60
|
|
56
61
|
def expired_past_grace_period?
|
57
62
|
return false unless expires?
|
63
|
+
|
58
64
|
expiration_grace_period_end_date <= Date.today
|
59
65
|
end
|
60
66
|
|
61
67
|
def pending_expiration?
|
62
68
|
return false unless expires?
|
63
69
|
return false if expired?
|
70
|
+
|
64
71
|
expired_on - Setting['notify1_days_before_host_expiry'].to_i <= Date.today
|
65
72
|
end
|
66
73
|
|
@@ -70,6 +77,7 @@ module ForemanExpireHosts
|
|
70
77
|
return true unless User.current
|
71
78
|
return true if Authorizer.new(User.current).can?(:edit_host_expiry, self)
|
72
79
|
return true if self.owner_type.nil? || self.owner.nil?
|
80
|
+
|
73
81
|
Setting[:can_owner_modify_host_expiry_date] &&
|
74
82
|
((self.owner_type == 'User' && self.owner == User.current) ||
|
75
83
|
(self.owner_type == 'Usergroup' && self.owner.all_users.include?(User.current)))
|