gcal4ruby 0.3.1 → 0.5.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.
- data/CHANGELOG +17 -0
- data/README +41 -29
- data/lib/gcal4ruby/calendar.rb +321 -416
- data/lib/gcal4ruby/event.rb +295 -349
- data/lib/gcal4ruby/recurrence.rb +77 -17
- data/lib/gcal4ruby/service.rb +146 -138
- data/test/unit.rb +11 -9
- metadata +15 -7
- data/lib/gcal4ruby/base.rb +0 -283
data/CHANGELOG
CHANGED
@@ -1,4 +1,21 @@
|
|
1
1
|
#=CHANGELOG
|
2
|
+
#==version 0.5.0 - MAJOR CHANGES
|
3
|
+
#* Now using GData4Ruby library as base class for service, calendar, and event objects. This removed the base.rb class, which is now inherited from
|
4
|
+
# GData4ruby
|
5
|
+
#* Added 'events' method to service to get all events for an account.
|
6
|
+
#* Major interface changes to find methods - these are not backwards compatible changes.
|
7
|
+
#* Changed Event#find default behavior to search all calendars.
|
8
|
+
#* Major interface changes to to_iframe methods - these are not backwards compatible changes.
|
9
|
+
#* Added support for multiple reminders.
|
10
|
+
#* Improved object relationship for events. Events are now service-centric, i.e. events are instantiated with a service object.
|
11
|
+
#* Event calendar is now set through a 'calendar' attribute.
|
12
|
+
#* Fixes to event recurrence handling and display.
|
13
|
+
#* Added support for reminders with recurring events.
|
14
|
+
#* Numerous improvements to performance.
|
15
|
+
#* Calendar objects no longer have to query ACL feed to determine editability.
|
16
|
+
#* Added support for event statuses: cancelled, tentative or confirmed.
|
17
|
+
#==version 0.3.2
|
18
|
+
#* Updated the Event.find method to support finding all events by passing :all as the query term.
|
2
19
|
#==version 0.3.1
|
3
20
|
#* Fixed Event.find method to work with secondary calendars and google apps accounts. Fix provided by groesser3.
|
4
21
|
#* Added max results to Calendar.find.
|
data/README
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
#and is licenses under the GPL v2. Feel free to use and update, but be sure to contribute your
|
11
11
|
#code back to the project and attribute as required by the license.
|
12
12
|
#===Website
|
13
|
-
#http://
|
13
|
+
#http://cookingandcoding.com/gcal4ruby/
|
14
14
|
#
|
15
15
|
#==Description
|
16
16
|
#GCal4Ruby has three major components: the service, calendar and event objects. Each service
|
@@ -33,53 +33,65 @@
|
|
33
33
|
#1. Create a new Calendar
|
34
34
|
# cal = Calendar.new(service)
|
35
35
|
#
|
36
|
-
#2. Find
|
37
|
-
# cal = Calendar.find(service,
|
36
|
+
#2. Find a calendar by ID
|
37
|
+
# cal = Calendar.find(service, {:id => cal_id})
|
38
38
|
#
|
39
|
-
#3.
|
40
|
-
# cal = Calendar.find(service,
|
39
|
+
#3. Get all calendar events
|
40
|
+
# cal = Calendar.find(service, {:id => cal_id})
|
41
|
+
# events = cal.events
|
42
|
+
#
|
43
|
+
#4. Find an existing calendar by title
|
44
|
+
# cal = Calendar.find(service, {:title => "New Calendar"})
|
41
45
|
#
|
42
|
-
#
|
43
|
-
# cal = Calendar.find(service,
|
46
|
+
#5. Find all calendars containing a search term
|
47
|
+
# cal = Calendar.find(service, "Soccer Team")
|
44
48
|
#===Event
|
45
49
|
#All usages assume a successfully authenticated Service and valid Calendar.
|
46
50
|
#1. Create a new Event
|
47
|
-
# event = Event.new(calendar)
|
48
|
-
# event.title = "Soccer Game"
|
49
|
-
# event.start = Time.parse("12-06-2009 at 12:30 PM")
|
50
|
-
# event.end = Time.parse("12-06-2009 at 1:30 PM")
|
51
|
-
# event.where = "Merry Playfields"
|
51
|
+
# event = Event.new(service, {:calendar => cal, :title => "Soccer Game", :start => Time.parse("12-06-2009 at 12:30 PM"), :end => Time.parse("12-06-2009 at 1:30 PM"), :where => "Merry Playfields"})
|
52
52
|
# event.save
|
53
53
|
#
|
54
|
-
#2. Find an existing Event
|
55
|
-
# event = Event.find(
|
54
|
+
#2. Find an existing Event by title
|
55
|
+
# event = Event.find(service, {:title => "Soccer Game"})
|
56
|
+
#
|
57
|
+
#3. Find an existing Event by ID
|
58
|
+
# event = Event.find(service, {:id => event.id})
|
56
59
|
#
|
57
|
-
#
|
58
|
-
# event = Event.find(
|
60
|
+
#4. Find all events containing the search term
|
61
|
+
# event = Event.find(service, "Soccer Game")
|
59
62
|
#
|
60
|
-
#
|
61
|
-
# event = Event.
|
63
|
+
#5. Find all events on a calendar containing the search term
|
64
|
+
# event = Event.find(service, "Soccer Game", {:calendar => cal.id})
|
65
|
+
#
|
66
|
+
#6. Find events within a date range
|
67
|
+
# event = Event.find(service, "Soccer Game", {'start-min' => Time.parse("01/01/2010").utc.xmlschema, 'start-max' => Time.parse("06/01/2010").utc.xmlschema})
|
68
|
+
#
|
69
|
+
#7. Create a recurring event for every saturday
|
70
|
+
# event = Event.new(service)
|
62
71
|
# event.title = "Baseball Game"
|
72
|
+
# event.calendar = cal
|
63
73
|
# event.where = "Municipal Stadium"
|
64
74
|
# event.recurrence = Recurrence.new
|
65
|
-
# event.recurrence.
|
66
|
-
# event.recurrence.
|
75
|
+
# event.recurrence.start_time = Time.parse("06/20/2009 at 4:30 PM")
|
76
|
+
# event.recurrence.end_time = Time.parse("06/20/2009 at 6:30 PM")
|
67
77
|
# event.recurrence.frequency = {"weekly" => ["SA"]}
|
68
78
|
# event.save
|
69
79
|
#
|
70
|
-
#
|
71
|
-
# event = Event.new(
|
80
|
+
#8. Create an event with a 15 minute email reminder
|
81
|
+
# event = Event.new(service)
|
82
|
+
# event.calendar = cal
|
72
83
|
# event.title = "Dinner with Kate"
|
73
|
-
# event.
|
74
|
-
# event.
|
84
|
+
# event.start_time = Time.parse("06/20/2009 at 5 pm")
|
85
|
+
# event.end_time = Time.parse("06/20/2009 at 8 pm")
|
75
86
|
# event.where = "Luigi's"
|
76
87
|
# event.reminder = {:minutes => 15, :method => 'email'}
|
77
88
|
# event.save
|
78
89
|
#
|
79
|
-
#
|
80
|
-
# event = Event.new(
|
90
|
+
#9. Create an event with attendees
|
91
|
+
# event = Event.new(service)
|
92
|
+
# event.calendar = cal
|
81
93
|
# event.title = "Dinner with Kate"
|
82
|
-
# event.
|
83
|
-
# event.
|
94
|
+
# event.start_time = Time.parse("06/20/2009 at 5 pm")
|
95
|
+
# event.end_time = Time.parse("06/20/2009 at 8 pm")
|
84
96
|
# event.attendees => {:name => "Kate", :email => "kate@gmail.com"}
|
85
|
-
# event.save
|
97
|
+
# event.save
|
data/lib/gcal4ruby/calendar.rb
CHANGED
@@ -1,451 +1,356 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
#
|
6
|
-
#
|
7
|
-
|
8
|
-
#All usages assume a successfully authenticated Service.
|
9
|
-
#1. Create a new Calendar
|
10
|
-
# cal = Calendar.new(service)
|
11
|
-
#
|
12
|
-
#2. Find an existing Calendar
|
13
|
-
# cal = Calendar.find(service, "New Calendar", :first)
|
1
|
+
# Author:: Mike Reich (mike@seabourneconsulting.com)
|
2
|
+
# Copyright:: Copyright (C) 2010 Mike Reich
|
3
|
+
# License:: GPL v2
|
4
|
+
#--
|
5
|
+
# Licensed under the General Public License (GPL), Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
14
8
|
#
|
15
|
-
#
|
16
|
-
# cal = Calendar.find(service, "Soccer Team")
|
9
|
+
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
|
17
10
|
#
|
18
|
-
#
|
19
|
-
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
20
14
|
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
#
|
29
|
-
|
30
|
-
|
31
|
-
#
|
32
|
-
|
33
|
-
|
34
|
-
#
|
35
|
-
|
36
|
-
|
37
|
-
#
|
38
|
-
|
39
|
-
|
40
|
-
#
|
41
|
-
|
42
|
-
|
43
|
-
#
|
44
|
-
|
45
|
-
|
46
|
-
#
|
47
|
-
|
48
|
-
|
49
|
-
#
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
15
|
+
# Feel free to use and update, but be sure to contribute your
|
16
|
+
# code back to the project and attribute as required by the license.
|
17
|
+
#++
|
18
|
+
require 'gdata4ruby/acl/access_rule'
|
19
|
+
module GCal4Ruby
|
20
|
+
#The Calendar Class is the representation of a Google Calendar. Each user account
|
21
|
+
#can have multiple calendars. You must have an authenticated Service object before
|
22
|
+
#using the Calendar object.
|
23
|
+
#=Usage
|
24
|
+
#All usages assume a successfully authenticated Service.
|
25
|
+
#1. Create a new Calendar
|
26
|
+
# cal = Calendar.new(service)
|
27
|
+
#
|
28
|
+
#2. Find a calendar by ID
|
29
|
+
# cal = Calendar.find(service, {:id => cal_id})
|
30
|
+
#
|
31
|
+
#3. Get all calendar events
|
32
|
+
# cal = Calendar.find(service, {:id => cal_id})
|
33
|
+
# events = cal.events
|
34
|
+
#
|
35
|
+
#4. Find an existing calendar by title
|
36
|
+
# cal = Calendar.find(service, {:title => "New Calendar"})
|
37
|
+
#
|
38
|
+
#5. Find all calendars containing a search term
|
39
|
+
# cal = Calendar.find(service, "Soccer Team")
|
40
|
+
#
|
41
|
+
#After a calendar object has been created or loaded, you can change any of the
|
42
|
+
#attributes like you would any other object. Be sure to save the calendar to write changes
|
43
|
+
#to the Google Calendar service.
|
44
|
+
class Calendar < GData4Ruby::GDataObject
|
45
|
+
CALENDAR_FEED = "http://www.google.com/calendar/feeds/default/owncalendars/full/"
|
46
|
+
CALENDAR_QUERY_FEED = "http://www.google.com/calendar/feeds/default/calendars/"
|
47
|
+
CALENDAR_XML = "<entry xmlns='http://www.w3.org/2005/Atom'
|
48
|
+
xmlns:gd='http://schemas.google.com/g/2005'
|
49
|
+
xmlns:gCal='http://schemas.google.com/gCal/2005'>
|
50
|
+
<title type='text'></title>
|
51
|
+
<summary type='text'></summary>
|
52
|
+
<gCal:timezone value='America/Los_Angeles'></gCal:timezone>
|
53
|
+
<gCal:hidden value='false'></gCal:hidden>
|
54
|
+
<gCal:color value='#2952A3'></gCal:color>
|
55
|
+
<gd:where rel='' label='' valueString='Oakland'></gd:where>
|
56
|
+
</entry>"
|
57
|
+
|
58
|
+
#A short description of the calendar
|
59
|
+
attr_accessor :summary
|
60
|
+
|
61
|
+
#Boolean value indicating the calendar visibility
|
62
|
+
attr_accessor :hidden
|
63
|
+
|
64
|
+
#The calendar timezone[http://code.google.com/apis/calendar/docs/2.0/reference.html#gCaltimezone]
|
65
|
+
attr_accessor :timezone
|
66
|
+
|
67
|
+
#The calendar color. Must be one of these[http://code.google.com/apis/calendar/docs/2.0/reference.html#gCalcolor] values.
|
68
|
+
attr_accessor :color
|
69
|
+
|
70
|
+
#The calendar geo location, if any
|
71
|
+
attr_accessor :where
|
72
|
+
|
73
|
+
#A boolean value indicating whether the calendar appears by default when viewed online
|
74
|
+
attr_accessor :selected
|
75
|
+
|
76
|
+
#A flag indicating whether the calendar is editable by this account
|
77
|
+
attr_reader :editable
|
78
|
+
|
79
|
+
#Accepts a Service object and an optional attributes hash for initialization. Returns the new Calendar
|
80
|
+
#if successful, otherwise raises the InvalidService error.
|
81
|
+
def initialize(service, attributes = {})
|
82
|
+
super(service, attributes)
|
83
|
+
if !service.is_a?(Service)
|
84
|
+
raise InvalidService
|
86
85
|
end
|
86
|
+
@xml = CALENDAR_XML
|
87
|
+
@service ||= service
|
88
|
+
@exists = false
|
89
|
+
@title ||= ""
|
90
|
+
@summary ||= ""
|
91
|
+
@public ||= false
|
92
|
+
@hidden ||= false
|
93
|
+
@timezone ||= "America/Los_Angeles"
|
94
|
+
@color ||= "#2952A3"
|
95
|
+
@where ||= ""
|
96
|
+
@permissions = ''
|
97
|
+
attributes.each do |key, value|
|
98
|
+
self.send("#{key}=", value)
|
99
|
+
end
|
100
|
+
return true
|
87
101
|
end
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
#Calendar#to_iframe for options to display a public calendar in a webpage.
|
94
|
-
def public=(p)
|
95
|
-
if p
|
96
|
-
permissions = 'http://schemas.google.com/gCal/2005#read'
|
97
|
-
else
|
98
|
-
permissions = 'none'
|
102
|
+
|
103
|
+
#Returns true if the calendar exists on the Google Calendar system (i.e. was
|
104
|
+
#loaded or has been saved). Otherwise returns false.
|
105
|
+
def exists?
|
106
|
+
return @exists
|
99
107
|
end
|
100
108
|
|
101
|
-
#if
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
109
|
+
#Returns true if the calendar is publically accessable, otherwise returns false.
|
110
|
+
def public?
|
111
|
+
return @public
|
112
|
+
end
|
113
|
+
|
114
|
+
#Returns an array of Event objects corresponding to each event in the calendar.
|
115
|
+
def events
|
116
|
+
events = []
|
117
|
+
ret = @service.send_request(GData4Ruby::Request.new(:get, @content_uri))
|
118
|
+
REXML::Document.new(ret.body).root.elements.each("entry"){}.map do |entry|
|
119
|
+
entry = GData4Ruby::Utils.add_namespaces(entry)
|
120
|
+
e = Event.new(service)
|
121
|
+
if e.load(entry.to_s)
|
122
|
+
events << e
|
107
123
|
end
|
108
|
-
|
109
|
-
end
|
110
|
-
if @service.send_put(path, request.to_s, {"Content-Type" => "application/atom+xml", "Content-Length" => request.length.to_s})
|
111
|
-
@public = p
|
112
|
-
return true
|
113
|
-
else
|
114
|
-
return false
|
115
124
|
end
|
116
|
-
|
117
|
-
end
|
118
|
-
|
119
|
-
#Accepts a Service object and an optional attributes hash for initialization. Returns the new Calendar
|
120
|
-
#if successful, otherwise raises the InvalidService error.
|
121
|
-
def initialize(service, attributes = {})
|
122
|
-
super()
|
123
|
-
if !service.is_a?(Service)
|
124
|
-
raise InvalidService
|
125
|
-
end
|
126
|
-
attributes.each do |key, value|
|
127
|
-
self.send("#{key}=", value)
|
125
|
+
return events
|
128
126
|
end
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
@timezone ||= "America/Los_Angeles"
|
137
|
-
@color ||= "#2952A3"
|
138
|
-
@where ||= ""
|
139
|
-
return true
|
140
|
-
end
|
141
|
-
|
142
|
-
#Deletes a calendar. If successful, returns true, otherwise false. If successful, the
|
143
|
-
#calendar object is cleared.
|
144
|
-
def delete
|
145
|
-
if @exists
|
146
|
-
if @service.send_delete(CALENDAR_FEED+"/"+@id)
|
147
|
-
@exists = false
|
148
|
-
@title = nil
|
149
|
-
@summary = nil
|
150
|
-
@public = false
|
151
|
-
@id = nil
|
152
|
-
@hidden = false
|
153
|
-
@timezone = nil
|
154
|
-
@color = nil
|
155
|
-
@where = nil
|
156
|
-
return true
|
127
|
+
|
128
|
+
#Set the calendar to public (p = true) or private (p = false). Publically viewable
|
129
|
+
#calendars can be accessed by anyone without having to log in to google calendar. See
|
130
|
+
#Calendar#to_iframe on how to display a public calendar in a webpage.
|
131
|
+
def public=(p)
|
132
|
+
if p
|
133
|
+
@permissions = 'http://schemas.google.com/gCal/2005#read'
|
157
134
|
else
|
158
|
-
|
135
|
+
@permissions = 'none'
|
159
136
|
end
|
160
|
-
else
|
161
|
-
return false
|
162
137
|
end
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
def save
|
168
|
-
if @exists
|
169
|
-
ret = service.send_put(@edit_feed, to_xml(), {'Content-Type' => 'application/atom+xml'})
|
170
|
-
else
|
171
|
-
ret = service.send_post(CALENDAR_FEED, to_xml(), {'Content-Type' => 'application/atom+xml'})
|
138
|
+
|
139
|
+
#Creates a new instance of the object
|
140
|
+
def create
|
141
|
+
return service.send_request(GData4Ruby::Request.new(:post, CALENDAR_FEED, to_xml()))
|
172
142
|
end
|
173
|
-
|
174
|
-
|
175
|
-
|
143
|
+
|
144
|
+
#Finds a Calendar based on a text query or by an id. Parameters are:
|
145
|
+
#*service*:: A valid Service object to search.
|
146
|
+
#*query*:: either a string containing a text query to search by, or a hash containing an +id+ key with an associated id to find, or a +query+ key containint a text query to search for, or a +title+ key containing a title to search.
|
147
|
+
#*args*:: a hash containing optional additional query paramters to use. See http://code.google.com/apis/gdata/docs/2.0/reference.html#Queries for a full list of possible values. Example:
|
148
|
+
# {'max-results' => '100'}
|
149
|
+
#If an ID is specified, a single instance of the calendar is returned if found, otherwise false.
|
150
|
+
#If a query term or title text is specified, and array of matching results is returned, or an empty array if nothing
|
151
|
+
#was found.
|
152
|
+
def self.find(service, query, args = {})
|
153
|
+
raise ArgumentError, 'query must be a hash or string' if not query.is_a? Hash and not query.is_a? String
|
154
|
+
if query.is_a? Hash and query[:id]
|
155
|
+
id = query[:id]
|
156
|
+
puts "id passed, finding calendar by id" if service.debug
|
157
|
+
puts "id = "+id if service.debug
|
158
|
+
d = service.send_request(GData4Ruby::Request.new(:get, CALENDAR_FEED+id, {"If-Not-Match" => "*"}))
|
159
|
+
puts d.inspect if service.debug
|
160
|
+
if d
|
161
|
+
return get_instance(service, d)
|
162
|
+
end
|
176
163
|
else
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
cals = service.calendars
|
190
|
-
ret = []
|
191
|
-
cals.each do |cal|
|
192
|
-
title = cal.title || ""
|
193
|
-
summary = cal.summary || ""
|
194
|
-
id = cal.id || ""
|
195
|
-
if id == query_term
|
196
|
-
return cal
|
197
|
-
end
|
198
|
-
if title.downcase.match(t) or summary.downcase.match(t)
|
199
|
-
if params[:scope] == :first
|
200
|
-
return cal
|
201
|
-
else
|
202
|
-
ret << cal
|
164
|
+
#fugly, but Google doesn't provide a way to query the calendar feed directly
|
165
|
+
old_public = service.check_public
|
166
|
+
service.check_public = false
|
167
|
+
results = []
|
168
|
+
cals = service.calendars
|
169
|
+
cals.each do |cal|
|
170
|
+
if query.is_a?(Hash)
|
171
|
+
results << cal if query[:query] and cal.title.downcase.include? query[:query].downcase
|
172
|
+
results << cal if query[:title] and cal.title == query[:query]
|
173
|
+
else
|
174
|
+
results << cal if cal.title.downcase.include? query.downcase
|
175
|
+
end
|
203
176
|
end
|
177
|
+
service.check_public = old_public
|
178
|
+
return results
|
204
179
|
end
|
205
|
-
end
|
206
|
-
ret
|
207
|
-
end
|
208
|
-
|
209
|
-
def self.get(service, id)
|
210
|
-
url = 'http://www.google.com/calendar/feeds/default/allcalendars/full/'+id
|
211
|
-
ret = service.send_get(url)
|
212
|
-
puts "==return=="
|
213
|
-
puts ret.body
|
214
|
-
end
|
215
|
-
|
216
|
-
def self.query(service, query_term)
|
217
|
-
url = 'http://www.google.com/calendar/feeds/default/allcalendars/full'+"?q="+CGI.escape(query_term)
|
218
|
-
ret = service.send_get(url)
|
219
|
-
puts "==return=="
|
220
|
-
puts ret.body
|
221
|
-
end
|
222
|
-
|
223
|
-
#Reloads the calendar objects information from the stored server version. Returns true
|
224
|
-
#if successful, otherwise returns false. Any information not saved will be overwritten.
|
225
|
-
def reload
|
226
|
-
if not @exists
|
227
|
-
return false
|
228
|
-
end
|
229
|
-
t = Calendar.find(service, @id, :first)
|
230
|
-
if t
|
231
|
-
load(t.to_xml)
|
232
|
-
else
|
233
180
|
return false
|
234
181
|
end
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
ele.text = @summary
|
246
|
-
when "timezone"
|
247
|
-
ele.attributes["value"] = @timezone
|
248
|
-
when "hidden"
|
249
|
-
ele.attributes["value"] = @hidden.to_s
|
250
|
-
when "color"
|
251
|
-
ele.attributes["value"] = @color
|
252
|
-
when "selected"
|
253
|
-
ele.attributes["value"] = @selected.to_s
|
182
|
+
|
183
|
+
#Reloads the calendar objects information from the stored server version. Returns true
|
184
|
+
#if successful, otherwise returns false. Any information not saved will be overwritten.
|
185
|
+
def reload
|
186
|
+
return false if not @exists
|
187
|
+
t = self.find(service, @id)
|
188
|
+
if t
|
189
|
+
load(t.to_xml)
|
190
|
+
else
|
191
|
+
return false
|
254
192
|
end
|
255
193
|
end
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
when "
|
267
|
-
|
268
|
-
when 'title'
|
269
|
-
@title = ele.text
|
270
|
-
when 'summary'
|
271
|
-
@summary = ele.text
|
194
|
+
|
195
|
+
#Returns the xml representation of the Calenar.
|
196
|
+
def to_xml
|
197
|
+
xml = REXML::Document.new(super)
|
198
|
+
xml.root.elements.each(){}.map do |ele|
|
199
|
+
case ele.name
|
200
|
+
when "summary"
|
201
|
+
ele.text = @summary
|
202
|
+
when "timezone"
|
203
|
+
ele.attributes["value"] = @timezone
|
204
|
+
when "hidden"
|
205
|
+
ele.attributes["value"] = @hidden.to_s
|
272
206
|
when "color"
|
273
|
-
|
274
|
-
when 'hidden'
|
275
|
-
@hidden = ele.attributes["value"] == "true" ? true : false
|
276
|
-
when 'timezone'
|
277
|
-
@timezone = ele.attributes["value"]
|
207
|
+
ele.attributes["value"] = @color
|
278
208
|
when "selected"
|
279
|
-
|
280
|
-
when
|
281
|
-
|
282
|
-
|
283
|
-
end
|
209
|
+
ele.attributes["value"] = @selected.to_s
|
210
|
+
when 'role'
|
211
|
+
ele.attributes['value'] = @permissions
|
212
|
+
end
|
284
213
|
end
|
214
|
+
xml.to_s
|
285
215
|
end
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
if
|
309
|
-
@
|
310
|
-
else
|
311
|
-
@public = false
|
216
|
+
|
217
|
+
#Loads the Calendar with returned data from Google Calendar feed. Returns true if successful.
|
218
|
+
def load(string)
|
219
|
+
super(string)
|
220
|
+
@exists = true
|
221
|
+
@xml = string
|
222
|
+
xml = REXML::Document.new(string)
|
223
|
+
xml.root.elements.each(){}.map do |ele|
|
224
|
+
case ele.name
|
225
|
+
when "id"
|
226
|
+
@id = ele.text.gsub("http://www.google.com/calendar/feeds/default/calendars/", "")
|
227
|
+
when 'summary'
|
228
|
+
@summary = ele.text
|
229
|
+
when "color"
|
230
|
+
@color = ele.attributes['value']
|
231
|
+
when 'hidden'
|
232
|
+
@hidden = ele.attributes["value"] == "true" ? true : false
|
233
|
+
when 'timezone'
|
234
|
+
@timezone = ele.attributes["value"]
|
235
|
+
when "selected"
|
236
|
+
@selected = ele.attributes["value"] == "true" ? true : false
|
237
|
+
when "link"
|
238
|
+
if ele.attributes['rel'] == 'edit'
|
239
|
+
@edit_feed = ele.attributes['href']
|
312
240
|
end
|
313
|
-
|
241
|
+
when 'accesslevel'
|
242
|
+
@editable = (ele.attributes["value"] == 'editor' or ele.attributes["value"] == 'owner' or ele.attributes["value"] == 'root')
|
314
243
|
end
|
315
244
|
end
|
316
|
-
|
317
|
-
@
|
318
|
-
|
245
|
+
|
246
|
+
if @service.check_public
|
247
|
+
puts "Getting ACL Feed" if @service.debug
|
248
|
+
|
249
|
+
#rescue error on shared calenar ACL list access
|
250
|
+
begin
|
251
|
+
ret = @service.send_request(GData4Ruby::Request.new(:get, @acl_uri))
|
252
|
+
rescue Exception => e
|
253
|
+
puts "ACL Feed Get Failed: #{e.inspect}" if @service.debug
|
254
|
+
@public = false
|
255
|
+
return true
|
256
|
+
end
|
257
|
+
r = REXML::Document.new(ret.read_body)
|
258
|
+
r.root.elements.each("entry") do |ele|
|
259
|
+
e = GData4Ruby::ACL::AccessRule.new(service, self)
|
260
|
+
ele = GData4Ruby::Utils.add_namespaces(ele)
|
261
|
+
e.load(ele.to_s)
|
262
|
+
@public == (e.role.include? 'read' and e.user == 'default')
|
263
|
+
break if @public
|
264
|
+
end
|
265
|
+
else
|
266
|
+
@public = false
|
267
|
+
end
|
268
|
+
return true
|
319
269
|
end
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
270
|
+
|
271
|
+
#Helper function to return a formatted iframe embedded google calendar. Parameters are:
|
272
|
+
#1. *params*: a hash of parameters that affect the display of the embedded calendar. Accepts any parameter that the google iframe recognizes. Here are the most common:
|
273
|
+
# height:: the height of the embedded calendar in pixels
|
274
|
+
# width:: the width of the embedded calendar in pixels
|
275
|
+
# title:: the title to display
|
276
|
+
# bgcolor:: the background color. Limited choices, see google docs for allowable values.
|
277
|
+
# color:: the color of the calendar elements. Limited choices, see google docs for allowable values.
|
278
|
+
# showTitle:: set to '0' to hide the title
|
279
|
+
# showDate:: set to '0' to hide the current date
|
280
|
+
# showNav:: set to '0 to hide the navigation tools
|
281
|
+
# showPrint:: set to '0' to hide the print icon
|
282
|
+
# showTabs:: set to '0' to hide the tabs
|
283
|
+
# showCalendars:: set to '0' to hide the calendars selection drop down
|
284
|
+
# showTz:: set to '0' to hide the timezone selection
|
285
|
+
# border:: the border width in pixels
|
286
|
+
# dates:: a range of dates to display in the format of 'yyyymmdd/yyyymmdd'. Example: 20090820/20091001
|
287
|
+
# privateKey:: use to display a private calendar. You can find this key under the calendar settings pane of the Google Calendar website.
|
288
|
+
# ctz:: The timezone to convert event times to
|
289
|
+
def to_iframe(params = {})
|
290
|
+
params[:height] ||= "600"
|
291
|
+
params[:width] ||= "600"
|
292
|
+
params[:title] ||= (self.account ? self.account : '')
|
293
|
+
params[:bgcolor] ||= "#FFFFFF"
|
294
|
+
params[:color] ||= "#2952A3"
|
295
|
+
params[:border] ||= "0"
|
296
|
+
puts "params = #{params.inspect}" if self.debug
|
297
|
+
output = "?#{params.to_a.collect{|a| a.join("=")}.join("&")}&"
|
298
|
+
puts "param_string = #{output}" if self.debug
|
299
|
+
|
300
|
+
output += "src=#{@id}&color=#{params[:color]}"
|
301
|
+
|
302
|
+
"<iframe src='http://www.google.com/calendar/embed?#{CGI.escape(output)}' style='#{params[:border]} px solid;' width='#{params[:width]}' height='#{params[:height]}' frameborder='#{params[:border]}' scrolling='no'></iframe>"
|
343
303
|
end
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
params
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
output += "&
|
304
|
+
|
305
|
+
#Helper function to return a specified calendar id as a formatted iframe embedded google calendar. This function does not require loading the calendar information from the Google calendar
|
306
|
+
#service, but does require you know the google calendar id.
|
307
|
+
#1. *id*: the unique google assigned id for the calendar to display.
|
308
|
+
#2. *params*: a hash of parameters that affect the display of the embedded calendar. Accepts any parameter that the google iframe recognizes. Here are the most common:
|
309
|
+
# height:: the height of the embedded calendar in pixels
|
310
|
+
# width:: the width of the embedded calendar in pixels
|
311
|
+
# title:: the title to display
|
312
|
+
# bgcolor:: the background color. Limited choices, see google docs for allowable values.
|
313
|
+
# color:: the color of the calendar elements. Limited choices, see google docs for allowable values.
|
314
|
+
# showTitle:: set to '0' to hide the title
|
315
|
+
# showDate:: set to '0' to hide the current date
|
316
|
+
# showNav:: set to '0 to hide the navigation tools
|
317
|
+
# showPrint:: set to '0' to hide the print icon
|
318
|
+
# showTabs:: set to '0' to hide the tabs
|
319
|
+
# showCalendars:: set to '0' to hide the calendars selection drop down
|
320
|
+
# showTz:: set to '0' to hide the timezone selection
|
321
|
+
# border:: the border width in pixels
|
322
|
+
# dates:: a range of dates to display in the format of 'yyyymmdd/yyyymmdd'. Example: 20090820/20091001
|
323
|
+
# privateKey:: use to display a private calendar. You can find this key under the calendar settings pane of the Google Calendar website.
|
324
|
+
def self.to_iframe(id, params = {})
|
325
|
+
params[:height] ||= "600"
|
326
|
+
params[:width] ||= "600"
|
327
|
+
params[:title] ||= (self.account ? self.account : '')
|
328
|
+
params[:bgcolor] ||= "#FFFFFF"
|
329
|
+
params[:color] ||= "#2952A3"
|
330
|
+
params[:border] ||= "0"
|
331
|
+
puts "params = #{params.inspect}" if self.debug
|
332
|
+
output = "?#{params.to_a.collect{|a| a.join("=")}.join("&")}&"
|
333
|
+
puts "param_string = #{output}" if self.debug
|
334
|
+
|
335
|
+
output += "src=#{id}&color=#{params[:color]}"
|
336
|
+
|
337
|
+
"<iframe src='http://www.google.com/calendar/embed?#{CGI.escape(output)}' style='#{params[:border]} px solid;' width='#{params[:width]}' height='#{params[:height]}' frameborder='#{params[:border]}' scrolling='no'></iframe>"
|
376
338
|
end
|
377
339
|
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
# height:: the height of the embedded calendar in pixels
|
388
|
-
# width:: the width of the embedded calendar in pixels
|
389
|
-
# title:: the title to display
|
390
|
-
# bgcolor:: the background color. Limited choices, see google docs for allowable values.
|
391
|
-
# color:: the color of the calendar elements. Limited choices, see google docs for allowable values.
|
392
|
-
# showTitle:: set to 'false' to hide the title
|
393
|
-
# showDate:: set to 'false' to hide the current date
|
394
|
-
# showNav:: set to 'false to hide the navigation tools
|
395
|
-
# showPrint:: set to 'false' to hide the print icon
|
396
|
-
# showTabs:: set to 'false' to hide the tabs
|
397
|
-
# showCalendars:: set to 'false' to hide the calendars selection drop down
|
398
|
-
# showTimezone:: set to 'false' to hide the timezone selection
|
399
|
-
# border:: the border width in pixels
|
400
|
-
# dates:: a range of dates to display in the format of 'yyyymmdd/yyyymmdd'. Example: 20090820/20091001
|
401
|
-
# privateKey:: use to display a private calendar. You can find this key under the calendar settings pane of the Google Calendar website.
|
402
|
-
def self.to_iframe(id, params = {})
|
403
|
-
params[:id] = id
|
404
|
-
params[:height] ||= "600"
|
405
|
-
params[:width] ||= "600"
|
406
|
-
params[:bgcolor] ||= "#FFFFFF"
|
407
|
-
params[:color] ||= "#2952A3"
|
408
|
-
params[:showTitle] = params[:showTitle] == false ? "showTitle=0" : ''
|
409
|
-
params[:showNav] = params[:showNav] == false ? "showNav=0" : ''
|
410
|
-
params[:showDate] = params[:showDate] == false ? "showDate=0" : ''
|
411
|
-
params[:showPrint] = params[:showPrint] == false ? "showPrint=0" : ''
|
412
|
-
params[:showTabs] = params[:showTabs] == false ? "showTabs=0" : ''
|
413
|
-
params[:showCalendars] = params[:showCalendars] == false ? "showCalendars=0" : ''
|
414
|
-
params[:showTimezone] = params[:showTimezone] == false ? 'showTz=0' : ''
|
415
|
-
params[:border] ||= "0"
|
416
|
-
output = ''
|
417
|
-
params.each do |key, value|
|
418
|
-
case key
|
419
|
-
when :height then output += "height=#{value}"
|
420
|
-
when :width then output += "width=#{value}"
|
421
|
-
when :title then output += "title=#{CGI.escape(value)}"
|
422
|
-
when :bgcolor then output += "bgcolor=#{CGI.escape(value)}"
|
423
|
-
when :showTitle then output += value
|
424
|
-
when :showDate then output += value
|
425
|
-
when :showNav then output += value
|
426
|
-
when :showPrint then output += value
|
427
|
-
when :showTabs then output += value
|
428
|
-
when :showCalendars then output += value
|
429
|
-
when :showTimezone then output += value
|
430
|
-
when :viewMode then output += "mode=#{value}"
|
431
|
-
when :dates then output += "dates=#{CGI.escape(value)}"
|
432
|
-
when :privateKey then output += "pvttk=#{value}"
|
340
|
+
private
|
341
|
+
def self.get_instance(service, d)
|
342
|
+
if d.is_a? Net::HTTPOK
|
343
|
+
xml = REXML::Document.new(d.read_body).root
|
344
|
+
if xml.name == 'feed'
|
345
|
+
xml = xml.elements.each("entry"){}[0]
|
346
|
+
end
|
347
|
+
else
|
348
|
+
xml = d
|
433
349
|
end
|
434
|
-
|
350
|
+
ele = GData4Ruby::Utils::add_namespaces(xml)
|
351
|
+
cal = Calendar.new(service)
|
352
|
+
cal.load(ele.to_s)
|
353
|
+
cal
|
435
354
|
end
|
436
|
-
|
437
|
-
output += "src=#{params[:id]}&color=#{CGI.escape(params[:color])}"
|
438
|
-
|
439
|
-
"<iframe src='http://www.google.com/calendar/embed?#{output}' style='#{params[:border]} px solid;' width='#{params[:width]}' height='#{params[:height]}' frameborder='#{params[:border]}' scrolling='no'></iframe>"
|
440
|
-
end
|
441
|
-
|
442
|
-
private
|
443
|
-
@xml
|
444
|
-
@exists = false
|
445
|
-
@public = false
|
446
|
-
@event_feed = ''
|
447
|
-
@edit_feed = ''
|
448
|
-
|
449
|
-
end
|
450
|
-
|
355
|
+
end
|
451
356
|
end
|