viewpoint 0.1.7 → 0.1.8

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.7
1
+ 0.1.8
@@ -20,11 +20,20 @@
20
20
 
21
21
  module Viewpoint
22
22
  module EWS
23
- class MeetingMessage < Item
24
23
 
25
- def initialize(ews_item)
26
- super(ews_item)
24
+ # This represents a Mailbox object in the Exchange data store
25
+ # @see http://msdn.microsoft.com/en-us/library/aa565036.aspx MSDN docs
26
+ # @todo Design a Class method that resolves to an Array of MailboxUsers
27
+ class Attendee < MailboxUser
28
+ include Model
29
+
30
+ attr_reader :response
31
+
32
+ def initialize(attendee)
33
+ @response = attendee[:response_type][:text]
34
+ super(attendee[:mailbox])
27
35
  end
28
- end # MeetingMessage
36
+
37
+ end # Attendee
29
38
  end # EWS
30
39
  end # Viewpoint
@@ -63,6 +63,19 @@ module Viewpoint
63
63
  end
64
64
  super(opts)
65
65
  end
66
+ alias :items_between :find_items
67
+
68
+ # Fetch only items from today (since midnight)
69
+ def todays_items
70
+ #This is a bit convoluted for pre-1.9.x ruby versions that don't support to_datetime
71
+ find_items(DateTime.parse(Date.today.to_s), DateTime.parse((Date.today + 1).to_s))
72
+ end
73
+
74
+ # Fetch items since a give DateTime
75
+ # @param [DateTime] start_date_time the time to fetch Items since.
76
+ def items_since(start_date_time)
77
+ find_items(start_date_time, DateTime.now)
78
+ end
66
79
 
67
80
  end # CalendarFolder
68
81
  end # EWS
@@ -122,7 +122,7 @@ module Viewpoint
122
122
 
123
123
  def init_methods
124
124
  super
125
- define_str_var :calendar_item_type, :duration, :time_zone, :when, :location
125
+ define_str_var :calendar_item_type, :duration, :time_zone, :when, :location, :u_i_d, {:u_i_d => :uid}
126
126
  define_str_var :legacy_free_busy_status, :my_response_type, :meeting_workspace_url, :net_show_url
127
127
  define_int_var :adjacent_meeting_count, :appointment_sequence_number, :appointment_state
128
128
  define_int_var :conference_type, :conflicting_meeting_count
@@ -130,12 +130,12 @@ module Viewpoint
130
130
  define_bool_var :is_all_day_event, :is_cancelled, :is_meeting, :is_online_meeting, :is_recurring
131
131
  define_bool_var :allow_new_time_proposal, :meeting_request_was_sent
132
132
  define_datetime_var :appointment_reply_time, :start, :end, :original_start
133
+ define_attendees :required_attendees, :optional_attendees, :resources
133
134
 
134
135
  # @todo Handle:
135
136
  # <AdjacentMeetings/> <ConflictingMeetings/> <DeletedOccurrences/>
136
137
  # <FirstOccurrence/> <LastOccurrence/> <ModifiedOccurrences/>
137
138
  # <StartTimeZone/> <EndTimeZone/> <MeetingTimeZone/>
138
- # <OptionalAttendees/> <RequiredAttendees/> <Resources/>
139
139
  # <Recurrence/>
140
140
  end
141
141
 
@@ -40,6 +40,12 @@ module Viewpoint
40
40
 
41
41
  @@event_types = %w{CopiedEvent CreatedEvent DeletedEvent ModifiedEvent MovedEvent NewMailEvent}
42
42
 
43
+ # Get a specific folder by its ID.
44
+ # @param [String,Symbol] folder_id either a DistinguishedFolderID or simply a FolderID
45
+ # @param [String,nil] act_as User to act on behalf as. This user must have been given
46
+ # delegate access to this folder or else this operation will fail.
47
+ # @param [Hash] folder_shape
48
+ # @option folder_shape [String] :base_shape IdOnly/Default/AllProperties
43
49
  def self.get_folder(folder_id, act_as = nil, folder_shape = {:base_shape => 'Default'})
44
50
  resp = (Viewpoint::EWS::EWS.instance).ews.get_folder( [normalize_id(folder_id)], folder_shape, act_as )
45
51
  if(resp.status == 'Success')
@@ -88,6 +94,7 @@ module Viewpoint
88
94
 
89
95
  # Gets a folder by name. This name must match the folder name exactly.
90
96
  # @param [String] name The name of the folder to fetch.
97
+ # @param [String] shape the shape of the object to return IdOnly/Default/AllProperties
91
98
  def self.get_folder_by_name(name, shape = 'Default')
92
99
  # For now the :field_uRI and :field_uRI_or_constant must be in an Array for Ruby 1.8.7 because Hashes
93
100
  # are not positional at insertion until 1.9
@@ -212,12 +219,15 @@ module Viewpoint
212
219
  end
213
220
  end
214
221
 
222
+ # Fetch only items from today (since midnight)
215
223
  def todays_items
216
224
  #opts = {:query_string => ["Received:today"]}
217
225
  #This is a bit convoluted for pre-1.9.x ruby versions that don't support to_datetime
218
226
  items_since(DateTime.parse(Date.today.to_s))
219
227
  end
220
228
 
229
+ # Fetch items since a give DateTime
230
+ # @param [DateTime] date_time the time to fetch Items since.
221
231
  def items_since(date_time)
222
232
  restr = {:restriction =>
223
233
  {:is_greater_than_or_equal_to =>
@@ -227,6 +237,9 @@ module Viewpoint
227
237
  find_items(restr)
228
238
  end
229
239
 
240
+ # Fetch items between a given time period
241
+ # @param [DateTime] start_date the time to start fetching Items from
242
+ # @param [DateTime] end_date the time to stop fetching Items from
230
243
  def items_between(start_date, end_date)
231
244
  restr = {:restriction => {:and => [
232
245
  {:is_greater_than_or_equal_to =>
@@ -271,6 +284,9 @@ module Viewpoint
271
284
  end
272
285
 
273
286
  # Get Item
287
+ # @param [String] item_id the ID of the item to fetch
288
+ # @param [String] change_key specify an optional change_key if you want to
289
+ # make sure you are fetching a specific version of the object.
274
290
  def get_item(item_id, change_key = nil)
275
291
  resp = (Viewpoint::EWS::EWS.instance).ews.get_item([item_id])
276
292
  if(resp.status == 'Success')
@@ -209,22 +209,12 @@ module Viewpoint
209
209
  @parent_folder_id = @ews_item[:parent_folder_id][:id] if @ews_item[:parent_folder_id].is_a?(Hash)
210
210
  @conversation_id = @ews_item[:conversation_id][:id] if @ews_item[:conversation_id].is_a?(Hash)
211
211
  @ews_methods << :item_id
212
- if(@ews_item[:body] && @ews_item[:body][:body_type])
213
- @body_type = @ews_item[:body][:body_type]
214
- @ews_methods << :body_type
215
- end
216
- if(@ews_item[:unique_body] && @ews_item[:unique_body][:body_type])
217
- @unique_body_type = @ews_item[:body][:body_type]
218
- @ews_methods << :unique_body_type
219
- end
220
- if(@ews_item[:mime_content] && @ews_item[:mime_content][:character_set])
221
- @mime_charset = @ews_item[:mime_content][:character_set]
222
- @ews_methods << :mime_charset
223
- end
224
212
  define_str_var :subject, :sensitivity, :body, :item_class, :importance, :in_reply_to, :unique_body
225
213
  define_str_var :display_cc, :display_to, :culture, :last_modified_name, :mime_content
226
214
  define_str_var :web_client_read_form_query_string, :web_client_edit_form_query_string
227
215
  define_attr_str_var :body, :body_type
216
+ define_attr_str_var :unique_body, :body_type
217
+ define_attr_str_var :mime_content, :character_set
228
218
  define_int_var :size, :reminder_minutes_before_start
229
219
  define_bool_var :has_attachments, :is_submitted, :is_draft, :is_from_me, :is_resend, :is_unmodified, :reminder_is_set, :is_associated
230
220
  define_datetime_var :date_time_sent, :date_time_created, :date_time_received, :reminder_due_by, :last_modified_time
@@ -112,6 +112,15 @@ module Viewpoint
112
112
  body msg.body
113
113
  end
114
114
  end
115
+
116
+ # add attachments
117
+ if(self.has_attachments?)
118
+ self.attachments.each do |att|
119
+ if(att.is_a?(FileAttachment))
120
+ mail.attachments[att.file_name] = Base64.decode64(att.content)
121
+ end
122
+ end
123
+ end
115
124
  mail
116
125
  end
117
126
 
@@ -47,16 +47,21 @@ module Viewpoint
47
47
  # Define a method that returns a string. The vars are the keys in the
48
48
  # hash that contain a :text key. In the original SOAP packet this would
49
49
  # look something like this:
50
+ # @param [Array<Symbol,Hash>] *vars the symbols to map to methods. If the
51
+ # last item is a hash it will be used to map methods names. For instance
52
+ # UID comes through like this :u_i_d so we can map it like so {:u_i_d => :uid}
50
53
  # @example
51
54
  # <method_name>
52
55
  # This is the text
53
56
  # </method_name>
54
57
  def define_str_var(*vars)
58
+ map = ( vars.last.is_a?(Hash) ? vars.pop : {})
55
59
  vars.each do |var|
56
60
  if(@ews_item[var])
57
- @ews_methods << var
61
+ mname = ( map.has_key?(var) ? map[var] : var )
62
+ @ews_methods << mname
58
63
  self.instance_eval <<-EOF
59
- def #{var}
64
+ def #{mname}
60
65
  @ews_item[:#{var}][:text]
61
66
  end
62
67
  EOF
@@ -71,7 +76,8 @@ module Viewpoint
71
76
  # to by :text. In the orignal SOAP it may have looked like this:
72
77
  # @example
73
78
  # <node my_method='this is the text'/>
74
- # @param
79
+ # so you would specify this...
80
+ # define_attr_str_var :node, :my_method
75
81
  def define_attr_str_var(parent, *vars)
76
82
  return unless @ews_item[parent]
77
83
  vars.each do |var|
@@ -160,6 +166,7 @@ module Viewpoint
160
166
  end
161
167
  end
162
168
 
169
+
163
170
  def define_mbox_user(*vars)
164
171
  vars.each do |var|
165
172
  if(@ews_item[var])
@@ -174,6 +181,36 @@ module Viewpoint
174
181
  end
175
182
  end
176
183
  end
184
+
185
+
186
+ # Define meeting attendees
187
+ # @param [String] *attendee_types the type of attendee we are defining :required_attendees, :optional_attendees
188
+ def define_attendees(*attendee_types)
189
+ attendee_types.each do |attendee_type|
190
+ if(@ews_item.has_key?(attendee_type))
191
+ @ews_methods << attendee_type
192
+ self.instance_eval <<-EOF
193
+ def #{attendee_type}
194
+ return @#{attendee_type} if defined?(@#{attendee_type})
195
+ if( (@ews_item[:#{attendee_type}][:attendee]).is_a?(Hash) )
196
+ @#{attendee_type} = [Attendee.new(@ews_item[:#{attendee_type}][:attendee])]
197
+ elsif( (@ews_item[:#{attendee_type}][:attendee]).is_a?(Array) )
198
+ @#{attendee_type} = []
199
+ @ews_item[:#{attendee_type}][:attendee].each do |i|
200
+ @#{attendee_type} << Attendee.new(i)
201
+ end
202
+ else
203
+ raise EwsError, "Bad value for mailbox: " + @ews_item[:#{attendee_type}][:attendee]
204
+ end
205
+ @#{attendee_type}
206
+ end
207
+ EOF
208
+ else
209
+ @ews_methods_undef << attendee_type
210
+ end
211
+ end
212
+ end
213
+
177
214
 
178
215
  # After a delete is called on an object this method will clear
179
216
  # out all of the defined EWS methods so they can't be called on the
@@ -360,12 +360,22 @@ module Viewpoint
360
360
  parse!(resp)
361
361
  end
362
362
 
363
+ # Defines a request to synchronize a folder hierarchy on a client
364
+ # @see http://msdn.microsoft.com/en-us/library/aa580990.aspx
363
365
  def sync_folder_hierarchy
366
+ sync_state = nil
367
+ folder_id = :publicfoldersroot
364
368
  action = "#{SOAP_ACTION_PREFIX}/SyncFolderHierarchy"
365
- resp = invoke("#{NS_EWS_MESSAGES}:SyncFolderHierarchy", action) do |sync_folder_hierarchy|
366
- build_sync_folder_hierarchy!(sync_folder_hierarchy)
369
+ resp = invoke("#{NS_EWS_MESSAGES}:SyncFolderHierarchy", action) do |root|
370
+ build!(root) do
371
+ folder_shape!(root, {:base_shape => 'Default'})
372
+ root.add("#{NS_EWS_MESSAGES}:SyncFolderId") do |sfid|
373
+ folder_id!(sfid, folder_id)
374
+ end
375
+ sync_state!(root, sync_state) unless sync_state.nil?
376
+ end
367
377
  end
368
- parse_sync_folder_hierarchy(resp)
378
+ parse!(resp)
369
379
  end
370
380
 
371
381
  # Synchronizes items between the Exchange server and the client
@@ -33,6 +33,7 @@ require 'soap/soap_provider'
33
33
  # Base Models
34
34
  require 'model/model'
35
35
  require 'model/mailbox_user'
36
+ require 'model/attendee'
36
37
  require 'model/generic_folder'
37
38
  require 'model/item'
38
39
  # Specific Models
@@ -47,10 +48,6 @@ require 'model/message'
47
48
  require 'model/calendar_item'
48
49
  require 'model/contact'
49
50
  require 'model/distribution_list'
50
- require 'model/meeting_message'
51
- require 'model/meeting_request'
52
- require 'model/meeting_response'
53
- require 'model/meeting_cancellation'
54
51
  require 'model/task'
55
52
  require 'model/attachment'
56
53
  require 'model/file_attachment'
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 7
9
- version: 0.1.7
8
+ - 8
9
+ version: 0.1.8
10
10
  platform: ruby
11
11
  authors:
12
12
  - Dan Wanek
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-11-14 00:00:00 -06:00
17
+ date: 2010-11-24 00:00:00 -06:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -118,6 +118,7 @@ files:
118
118
  - lib/exceptions/exceptions.rb
119
119
  - lib/extensions/string.rb
120
120
  - lib/model/attachment.rb
121
+ - lib/model/attendee.rb
121
122
  - lib/model/calendar_folder.rb
122
123
  - lib/model/calendar_item.rb
123
124
  - lib/model/contact.rb
@@ -130,10 +131,6 @@ files:
130
131
  - lib/model/item.rb
131
132
  - lib/model/item_attachment.rb
132
133
  - lib/model/mailbox_user.rb
133
- - lib/model/meeting_cancellation.rb
134
- - lib/model/meeting_message.rb
135
- - lib/model/meeting_request.rb
136
- - lib/model/meeting_response.rb
137
134
  - lib/model/message.rb
138
135
  - lib/model/model.rb
139
136
  - lib/model/search_folder.rb
@@ -1,28 +0,0 @@
1
- #############################################################################
2
- # Copyright © 2010 Dan Wanek <dan.wanek@gmail.com>
3
- #
4
- #
5
- # This file is part of Viewpoint.
6
- #
7
- # Viewpoint is free software: you can redistribute it and/or
8
- # modify it under the terms of the GNU General Public License as published
9
- # by the Free Software Foundation, either version 3 of the License, or (at
10
- # your option) any later version.
11
- #
12
- # Viewpoint is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15
- # Public License for more details.
16
- #
17
- # You should have received a copy of the GNU General Public License along
18
- # with Viewpoint. If not, see <http://www.gnu.org/licenses/>.
19
- #############################################################################
20
-
21
- module Viewpoint
22
- module EWS
23
- # Meeting cancellations have the exact same elements as a Meeting Message
24
- # so MeetingCancellation is just a subclass of that.
25
- class MeetingCancellation < MeetingMessage
26
- end # MeetingCancellation
27
- end # EWS
28
- end # Viewpoint
@@ -1,41 +0,0 @@
1
- #############################################################################
2
- # Copyright © 2010 Dan Wanek <dan.wanek@gmail.com>
3
- #
4
- #
5
- # This file is part of Viewpoint.
6
- #
7
- # Viewpoint is free software: you can redistribute it and/or
8
- # modify it under the terms of the GNU General Public License as published
9
- # by the Free Software Foundation, either version 3 of the License, or (at
10
- # your option) any later version.
11
- #
12
- # Viewpoint is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15
- # Public License for more details.
16
- #
17
- # You should have received a copy of the GNU General Public License along
18
- # with Viewpoint. If not, see <http://www.gnu.org/licenses/>.
19
- #############################################################################
20
-
21
- module Viewpoint
22
- module EWS
23
- class MeetingRequest < Item
24
-
25
-
26
- private
27
-
28
- def init_methods
29
- super()
30
- define_str_var :conversation_index, :conversation_topic, :internet_message_id, :references
31
- define_mbox_users :to_recipients, :cc_recipients, :bcc_recipients, :reply_to, :required_attendees, :optional_attendees
32
- define_mbox_user :from, :sender, :received_by, :received_representing, :organizer
33
- define_bool_var :is_read, :is_read_receipt_requested, :is_response_requested, :is_delivery_receipt_requested, :is_draft, :is_from_me
34
- define_bool_var :is_all_day_event, :is_cancelled, :is_delegated, :is_meeting, :is_out_of_date, :is_recurring, :is_resend
35
- define_bool_var :is_submitted, :is_unmodified, :allow_new_time_proposal
36
- define_int_var :adjacent_meeting_count, :appointment_sequence_number, :appointment_state, :conflicting_meeting_count
37
- define_datetime_var :start, :end
38
- end
39
- end # MeetingRequest
40
- end # EWS
41
- end # Viewpoint
@@ -1,26 +0,0 @@
1
- #############################################################################
2
- # Copyright © 2010 Dan Wanek <dan.wanek@gmail.com>
3
- #
4
- #
5
- # This file is part of Viewpoint.
6
- #
7
- # Viewpoint is free software: you can redistribute it and/or
8
- # modify it under the terms of the GNU General Public License as published
9
- # by the Free Software Foundation, either version 3 of the License, or (at
10
- # your option) any later version.
11
- #
12
- # Viewpoint is distributed in the hope that it will be useful,
13
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15
- # Public License for more details.
16
- #
17
- # You should have received a copy of the GNU General Public License along
18
- # with Viewpoint. If not, see <http://www.gnu.org/licenses/>.
19
- #############################################################################
20
-
21
- module Viewpoint
22
- module EWS
23
- class MeetingResponse < Item
24
- end # MeetingResponse
25
- end # EWS
26
- end # Viewpoint