Chris@0
|
1 # Redmine - project management software
|
Chris@1494
|
2 # Copyright (C) 2006-2014 Jean-Philippe Lang
|
Chris@0
|
3 #
|
Chris@0
|
4 # This program is free software; you can redistribute it and/or
|
Chris@0
|
5 # modify it under the terms of the GNU General Public License
|
Chris@0
|
6 # as published by the Free Software Foundation; either version 2
|
Chris@0
|
7 # of the License, or (at your option) any later version.
|
Chris@0
|
8 #
|
Chris@0
|
9 # This program is distributed in the hope that it will be useful,
|
Chris@0
|
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
|
Chris@0
|
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
Chris@0
|
12 # GNU General Public License for more details.
|
Chris@0
|
13 #
|
Chris@0
|
14 # You should have received a copy of the GNU General Public License
|
Chris@0
|
15 # along with this program; if not, write to the Free Software
|
Chris@0
|
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
Chris@0
|
17
|
Chris@0
|
18 module Redmine
|
Chris@0
|
19 module Utils
|
Chris@0
|
20 class << self
|
Chris@0
|
21 # Returns the relative root url of the application
|
Chris@0
|
22 def relative_url_root
|
Chris@0
|
23 ActionController::Base.respond_to?('relative_url_root') ?
|
Chris@0
|
24 ActionController::Base.relative_url_root.to_s :
|
Chris@1115
|
25 ActionController::Base.config.relative_url_root.to_s
|
Chris@0
|
26 end
|
Chris@909
|
27
|
Chris@0
|
28 # Sets the relative root url of the application
|
Chris@0
|
29 def relative_url_root=(arg)
|
Chris@0
|
30 if ActionController::Base.respond_to?('relative_url_root=')
|
Chris@0
|
31 ActionController::Base.relative_url_root=arg
|
Chris@0
|
32 else
|
Chris@1115
|
33 ActionController::Base.config.relative_url_root = arg
|
Chris@1115
|
34 end
|
Chris@1115
|
35 end
|
Chris@1115
|
36
|
Chris@1115
|
37 # Generates a n bytes random hex string
|
Chris@1115
|
38 # Example:
|
Chris@1115
|
39 # random_hex(4) # => "89b8c729"
|
Chris@1115
|
40 def random_hex(n)
|
Chris@1115
|
41 SecureRandom.hex(n)
|
Chris@1115
|
42 end
|
Chris@1115
|
43 end
|
Chris@1115
|
44
|
Chris@1115
|
45 module Shell
|
Chris@1115
|
46 def shell_quote(str)
|
Chris@1115
|
47 if Redmine::Platform.mswin?
|
Chris@1115
|
48 '"' + str.gsub(/"/, '\\"') + '"'
|
Chris@1115
|
49 else
|
Chris@1115
|
50 "'" + str.gsub(/'/, "'\"'\"'") + "'"
|
Chris@1115
|
51 end
|
Chris@1115
|
52 end
|
Chris@1115
|
53 end
|
Chris@1115
|
54
|
Chris@1115
|
55 module DateCalculation
|
Chris@1115
|
56 # Returns the number of working days between from and to
|
Chris@1115
|
57 def working_days(from, to)
|
Chris@1115
|
58 days = (to - from).to_i
|
Chris@1115
|
59 if days > 0
|
Chris@1115
|
60 weeks = days / 7
|
Chris@1115
|
61 result = weeks * (7 - non_working_week_days.size)
|
Chris@1115
|
62 days_left = days - weeks * 7
|
Chris@1115
|
63 start_cwday = from.cwday
|
Chris@1115
|
64 days_left.times do |i|
|
Chris@1115
|
65 unless non_working_week_days.include?(((start_cwday + i - 1) % 7) + 1)
|
Chris@1115
|
66 result += 1
|
Chris@1115
|
67 end
|
Chris@1115
|
68 end
|
Chris@1115
|
69 result
|
Chris@1115
|
70 else
|
Chris@1115
|
71 0
|
Chris@1115
|
72 end
|
Chris@1115
|
73 end
|
Chris@1115
|
74
|
Chris@1115
|
75 # Adds working days to the given date
|
Chris@1115
|
76 def add_working_days(date, working_days)
|
Chris@1115
|
77 if working_days > 0
|
Chris@1115
|
78 weeks = working_days / (7 - non_working_week_days.size)
|
Chris@1115
|
79 result = weeks * 7
|
Chris@1115
|
80 days_left = working_days - weeks * (7 - non_working_week_days.size)
|
Chris@1115
|
81 cwday = date.cwday
|
Chris@1115
|
82 while days_left > 0
|
Chris@1115
|
83 cwday += 1
|
Chris@1115
|
84 unless non_working_week_days.include?(((cwday - 1) % 7) + 1)
|
Chris@1115
|
85 days_left -= 1
|
Chris@1115
|
86 end
|
Chris@1115
|
87 result += 1
|
Chris@1115
|
88 end
|
Chris@1115
|
89 next_working_date(date + result)
|
Chris@1115
|
90 else
|
Chris@1115
|
91 date
|
Chris@1115
|
92 end
|
Chris@1115
|
93 end
|
Chris@1115
|
94
|
Chris@1115
|
95 # Returns the date of the first day on or after the given date that is a working day
|
Chris@1115
|
96 def next_working_date(date)
|
Chris@1115
|
97 cwday = date.cwday
|
Chris@1115
|
98 days = 0
|
Chris@1115
|
99 while non_working_week_days.include?(((cwday + days - 1) % 7) + 1)
|
Chris@1115
|
100 days += 1
|
Chris@1115
|
101 end
|
Chris@1115
|
102 date + days
|
Chris@1115
|
103 end
|
Chris@1115
|
104
|
Chris@1115
|
105 # Returns the index of non working week days (1=monday, 7=sunday)
|
Chris@1115
|
106 def non_working_week_days
|
Chris@1115
|
107 @non_working_week_days ||= begin
|
Chris@1115
|
108 days = Setting.non_working_week_days
|
Chris@1115
|
109 if days.is_a?(Array) && days.size < 7
|
Chris@1115
|
110 days.map(&:to_i)
|
Chris@1115
|
111 else
|
Chris@1115
|
112 []
|
Chris@1115
|
113 end
|
Chris@0
|
114 end
|
Chris@0
|
115 end
|
Chris@0
|
116 end
|
Chris@0
|
117 end
|
Chris@0
|
118 end
|