ragoon 0.7.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +6 -0
- data/lib/ragoon/services.rb +15 -0
- data/lib/ragoon/services/schedule.rb +125 -48
- data/lib/ragoon/services/workflow.rb +3 -11
- data/lib/ragoon/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 37f399478c7454f731afd71d4999580936ea1b53
|
4
|
+
data.tar.gz: 12cdf219b8815923988dc421e4de9a8f0b88c795
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fdb2a9f426a97151430fb75635bcf7f8526c87633d333b92c72313939e9fcf113513702afc52d51c7ec7490d989411f3fef9e2e52aab56ac08c71f5dcc60c4a0
|
7
|
+
data.tar.gz: 24a2d356115daa93f0a9c4d5f739b25485bf41fead815d3327a333a617555d37938ff7280358138f09305077af45cb8c19410586b9301b1ec0e20492e9b6c4ed
|
data/Gemfile
CHANGED
data/lib/ragoon/services.rb
CHANGED
@@ -35,4 +35,19 @@ class Ragoon::Services
|
|
35
35
|
"#{endpoint.scheme}://#{endpoint.host}#{endpoint.path}"
|
36
36
|
end
|
37
37
|
|
38
|
+
def parse_time(str)
|
39
|
+
return nil if str.nil?
|
40
|
+
Time.parse(str).localtime
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_date_str(time)
|
44
|
+
return nil if time.nil?
|
45
|
+
time.localtime.strftime('%F')
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_datetime_str(time)
|
49
|
+
return nil if time.nil?
|
50
|
+
time.utc.strftime('%FT%TZ')
|
51
|
+
end
|
52
|
+
|
38
53
|
end
|
@@ -1,4 +1,6 @@
|
|
1
1
|
class Ragoon::Services::Schedule < Ragoon::Services
|
2
|
+
XML_NS = 'http://schemas.cybozu.co.jp/schedule/2008'
|
3
|
+
|
2
4
|
def schedule_get_events(options = {})
|
3
5
|
action_name = 'ScheduleGetEvents'
|
4
6
|
|
@@ -7,19 +9,29 @@ class Ragoon::Services::Schedule < Ragoon::Services
|
|
7
9
|
body_node = Ragoon::XML.create_node(action_name)
|
8
10
|
parameter_node = Ragoon::XML.create_node(
|
9
11
|
'parameters',
|
10
|
-
start: options[:start]
|
11
|
-
end: options[:end]
|
12
|
-
start_for_daily: options[:start]
|
13
|
-
end_for_daily: options[:end]
|
12
|
+
start: to_datetime_str(options[:start]),
|
13
|
+
end: to_datetime_str(options[:end]),
|
14
|
+
start_for_daily: to_date_str(options[:start]),
|
15
|
+
end_for_daily: to_date_str(options[:end]),
|
14
16
|
)
|
15
17
|
body_node.add_child(parameter_node)
|
16
18
|
|
17
19
|
client.request(action_name, body_node)
|
18
20
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
21
|
+
events_by_type = client.result_set.xpath('//schedule_event')
|
22
|
+
.group_by {|ev| ev[:event_type] }
|
23
|
+
|
24
|
+
# events_by_type['banner'] does not include results
|
25
|
+
[
|
26
|
+
(events_by_type['normal'] || []).map {|event|
|
27
|
+
parse_event(event)
|
28
|
+
},
|
29
|
+
(events_by_type['repeat'] || []).map {|event|
|
30
|
+
expand_repeat_event_periods(event, options[:start], options[:end]).map {|period|
|
31
|
+
parse_event(event, period)
|
32
|
+
}
|
33
|
+
}
|
34
|
+
].flatten.sort_by { |e| e[:start_at] }
|
23
35
|
end
|
24
36
|
|
25
37
|
def schedule_add_event(options = {})
|
@@ -46,10 +58,7 @@ class Ragoon::Services::Schedule < Ragoon::Services
|
|
46
58
|
)
|
47
59
|
parameter_node.add_child(schedule_event_node)
|
48
60
|
|
49
|
-
members_node = Ragoon::XML.create_node(
|
50
|
-
'members',
|
51
|
-
xmlns: 'http://schemas.cybozu.co.jp/schedule/2008'
|
52
|
-
)
|
61
|
+
members_node = Ragoon::XML.create_node('members', xmlns: XML_NS)
|
53
62
|
schedule_event_node.add_child(members_node)
|
54
63
|
if options[:users]
|
55
64
|
options[:users].each do |user|
|
@@ -60,22 +69,19 @@ class Ragoon::Services::Schedule < Ragoon::Services
|
|
60
69
|
end
|
61
70
|
end
|
62
71
|
|
63
|
-
when_node = Ragoon::XML.create_node(
|
64
|
-
'when',
|
65
|
-
xmlns: 'http://schemas.cybozu.co.jp/schedule/2008'
|
66
|
-
)
|
72
|
+
when_node = Ragoon::XML.create_node('when', xmlns: XML_NS)
|
67
73
|
date_node =
|
68
74
|
if options[:allday]
|
69
75
|
Ragoon::XML.create_node(
|
70
76
|
'date',
|
71
|
-
start: options[:start_at]
|
72
|
-
end: options[:end_at]
|
77
|
+
start: to_date_str(options[:start_at]),
|
78
|
+
end: to_date_str(options[:end_at])
|
73
79
|
)
|
74
80
|
else
|
75
81
|
Ragoon::XML.create_node(
|
76
82
|
'datetime',
|
77
|
-
start: options[:start_at]
|
78
|
-
end: options[:end_at]
|
83
|
+
start: to_datetime_str(options[:start_at]),
|
84
|
+
end: to_datetime_str(options[:end_at])
|
79
85
|
)
|
80
86
|
end
|
81
87
|
when_node.add_child(date_node)
|
@@ -89,8 +95,9 @@ class Ragoon::Services::Schedule < Ragoon::Services
|
|
89
95
|
}.first
|
90
96
|
end
|
91
97
|
|
92
|
-
def parse_event(event)
|
93
|
-
period = start_and_end(event)
|
98
|
+
def parse_event(event, period = nil)
|
99
|
+
period = start_and_end(event) if period.nil?
|
100
|
+
|
94
101
|
{
|
95
102
|
id: event[:id],
|
96
103
|
url: event_url(event[:id]),
|
@@ -102,6 +109,7 @@ class Ragoon::Services::Schedule < Ragoon::Services
|
|
102
109
|
users: users_info(event),
|
103
110
|
private: !(event[:public_type] == 'public'),
|
104
111
|
allday: event[:allday] == 'true',
|
112
|
+
event_type: event[:event_type],
|
105
113
|
}
|
106
114
|
end
|
107
115
|
|
@@ -110,14 +118,14 @@ class Ragoon::Services::Schedule < Ragoon::Services
|
|
110
118
|
end
|
111
119
|
|
112
120
|
def facility_names(event)
|
113
|
-
event.xpath('ev:members', ev:
|
114
|
-
children.map { |c| c.xpath('ev:facility', ev:
|
121
|
+
event.xpath('ev:members', ev: XML_NS).
|
122
|
+
children.map { |c| c.xpath('ev:facility', ev: XML_NS).first }.
|
115
123
|
compact.map { |n| n[:name] }
|
116
124
|
end
|
117
125
|
|
118
126
|
def users_info(event)
|
119
|
-
event.xpath('ev:members', ev:
|
120
|
-
children.map { |c| c.xpath('ev:user', ev:
|
127
|
+
event.xpath('ev:members', ev: XML_NS).
|
128
|
+
children.map { |c| c.xpath('ev:user', ev: XML_NS).first }.
|
121
129
|
compact.map do |n|
|
122
130
|
{
|
123
131
|
id: n[:id].to_i,
|
@@ -129,28 +137,21 @@ class Ragoon::Services::Schedule < Ragoon::Services
|
|
129
137
|
def start_and_end(event)
|
130
138
|
start_at = nil
|
131
139
|
end_at = nil
|
140
|
+
timezone = event[:timezone]
|
141
|
+
end_timezone = event[:end_timezone] || event[:timezone]
|
132
142
|
|
133
143
|
unless event[:allday] == 'true'
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
unless repeat_info.nil?
|
146
|
-
period = repeat_info.xpath('ev:condition', ev: 'http://schemas.cybozu.co.jp/schedule/2008').first
|
147
|
-
unless period.nil?
|
148
|
-
start_at = parse_event_time(period[:start_time])
|
149
|
-
unless event[:start_only] == 'true'
|
150
|
-
end_at = parse_event_time(period[:end_time])
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end
|
144
|
+
period = event.xpath('ev:when/ev:datetime', ev: XML_NS).first
|
145
|
+
unless period.nil?
|
146
|
+
start_at = parse_event_time(period[:start], timezone)
|
147
|
+
end_at = parse_event_time(period[:end], end_timezone)
|
148
|
+
end
|
149
|
+
|
150
|
+
else
|
151
|
+
period = event.xpath('ev:when/ev:date', ev: XML_NS).first
|
152
|
+
unless period.nil?
|
153
|
+
start_at = parse_event_time(period[:start], timezone)
|
154
|
+
end_at = parse_event_time(period[:end] + " 23:59:59", end_timezone)
|
154
155
|
end
|
155
156
|
end
|
156
157
|
|
@@ -160,8 +161,16 @@ class Ragoon::Services::Schedule < Ragoon::Services
|
|
160
161
|
}
|
161
162
|
end
|
162
163
|
|
163
|
-
def parse_event_time(time)
|
164
|
-
|
164
|
+
def parse_event_time(time, timezone = ENV['TZ'], now = Time.now)
|
165
|
+
return nil if time.nil?
|
166
|
+
|
167
|
+
begin
|
168
|
+
old_timezone = ENV['TZ']
|
169
|
+
ENV['TZ'] = timezone
|
170
|
+
Time.parse(time, now).localtime.to_s
|
171
|
+
ensure
|
172
|
+
ENV['TZ'] = old_timezone
|
173
|
+
end
|
165
174
|
end
|
166
175
|
|
167
176
|
def default_options(action_name)
|
@@ -172,4 +181,72 @@ class Ragoon::Services::Schedule < Ragoon::Services
|
|
172
181
|
{}
|
173
182
|
end
|
174
183
|
end
|
184
|
+
|
185
|
+
private
|
186
|
+
|
187
|
+
def expand_repeat_event_periods(event, start_at, end_at)
|
188
|
+
timezone = event[:timezone]
|
189
|
+
end_timezone = event[:end_timezone] || event[:timezone]
|
190
|
+
|
191
|
+
periods = []
|
192
|
+
|
193
|
+
event.xpath('ev:repeat_info/ev:condition', ev: XML_NS).each do |cond|
|
194
|
+
exclusive_dates = event.xpath('ev:repeat_info/ev:exclusive_datetimes/ev:exclusive_datetime',
|
195
|
+
ev: XML_NS).map do |exclusive_date|
|
196
|
+
Date.parse(exclusive_date[:start])
|
197
|
+
end
|
198
|
+
|
199
|
+
dates = expand_dates(start_at.to_date, end_at.to_date, cond, exclusive_dates)
|
200
|
+
|
201
|
+
periods = dates.map do |date|
|
202
|
+
{
|
203
|
+
start_at: parse_event_time(cond[:start_time], timezone, date.to_time),
|
204
|
+
end_at: parse_event_time(cond[:end_time], end_timezone, date.to_time)
|
205
|
+
}
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
periods
|
210
|
+
end
|
211
|
+
|
212
|
+
def expand_dates(start_date, end_date, cond, exclusive_dates)
|
213
|
+
(start_date..end_date).select {|date|
|
214
|
+
next false if exclusive_dates.include?(date)
|
215
|
+
|
216
|
+
case cond[:type]
|
217
|
+
when 'day' # everyday
|
218
|
+
next true
|
219
|
+
|
220
|
+
when 'week' # everyweek
|
221
|
+
next date.wday == cond[:week].to_i
|
222
|
+
|
223
|
+
when 'weekday'
|
224
|
+
next (1..5).include?(date.wday)
|
225
|
+
|
226
|
+
when '1stweek'
|
227
|
+
next nth_weekday_of_month(date) == 1 && date.wday == cond[:week].to_i
|
228
|
+
|
229
|
+
when '2ndweek'
|
230
|
+
next nth_weekday_of_month(date) == 2 && date.wday == cond[:week].to_i
|
231
|
+
|
232
|
+
when '3rdweek'
|
233
|
+
next nth_weekday_of_month(date) == 3 && date.wday == cond[:week].to_i
|
234
|
+
|
235
|
+
when '4thweek'
|
236
|
+
next nth_weekday_of_month(date) == 4 && date.wday == cond[:week].to_i
|
237
|
+
|
238
|
+
when 'lastweek'
|
239
|
+
next date.month != date.next_day(7).month &&
|
240
|
+
date.wday == cond[:week].to_i
|
241
|
+
|
242
|
+
when 'month'
|
243
|
+
next date.day == cond[:day].to_i
|
244
|
+
|
245
|
+
end
|
246
|
+
}
|
247
|
+
end
|
248
|
+
|
249
|
+
def nth_weekday_of_month(date)
|
250
|
+
(date.day + 6) / 7
|
251
|
+
end
|
175
252
|
end
|
@@ -14,7 +14,7 @@ class Ragoon::Services::Workflow < Ragoon::Services
|
|
14
14
|
options[:request_form_id] = request_form_id
|
15
15
|
[ :start_request_date, :end_request_date,
|
16
16
|
:start_approval_date, :end_approval_date ].each do |key|
|
17
|
-
options[key] =
|
17
|
+
options[key] = to_datetime_str(options[key]) if options.has_key?(key)
|
18
18
|
end
|
19
19
|
|
20
20
|
body_node = Ragoon::XML.create_node(action_name)
|
@@ -119,8 +119,8 @@ class Ragoon::Services::Workflow < Ragoon::Services
|
|
119
119
|
body_node = Ragoon::XML.create_node(action_name)
|
120
120
|
|
121
121
|
attributes = {}
|
122
|
-
attributes['start'] =
|
123
|
-
attributes['end'] =
|
122
|
+
attributes['start'] = to_datetime_str(start_date) unless start_date.nil?
|
123
|
+
attributes['end'] = to_datetime_str(end_date) unless end_date.nil?
|
124
124
|
parameter_node = Ragoon::XML.create_node('parameters', attributes)
|
125
125
|
body_node.add_child(parameter_node)
|
126
126
|
|
@@ -209,12 +209,4 @@ class Ragoon::Services::Workflow < Ragoon::Services
|
|
209
209
|
}
|
210
210
|
end
|
211
211
|
|
212
|
-
def parse_time(time)
|
213
|
-
Time.parse(time).localtime
|
214
|
-
end
|
215
|
-
|
216
|
-
def to_datetime(str)
|
217
|
-
str.utc.strftime('%FT%TZ')
|
218
|
-
end
|
219
|
-
|
220
212
|
end
|
data/lib/ragoon/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ragoon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- SHIOYA, Hiromu
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|