viewpoint 0.1.12 → 0.1.13

Sign up to get free protection for your applications and to get access to all the features.
@@ -37,6 +37,9 @@ module Viewpoint
37
37
  class EwsNotImplemented < StandardError
38
38
  end
39
39
 
40
+ # Raised when an method is called in the wrong way
41
+ class EwsBadArgumentError < StandardError; end
42
+
40
43
  end # EWS
41
44
  end # Viewpoint
42
45
 
@@ -53,6 +53,26 @@ module Viewpoint
53
53
  raise EwsError, "Could not create CalendarItem. #{resp.code}: #{resp.message}"
54
54
  end
55
55
  end
56
+
57
+ # Format attendees (usually called from #add_attendees!
58
+ # @param [Array,String,Hash,MailboxUser] attendees
59
+ # @param [Symbol] type the type of the attendees :required_attendees/:optional_attendees/:resources
60
+ def self.format_attendees(attendees, type=:required_attendees)
61
+ case attendees.class.to_s
62
+ when 'String'
63
+ return {type => [{:attendee => {:mailbox => {:email_address => {:text => attendees}}}}]}
64
+ when /Attendee|MailboxUser/
65
+ return {type => [{:attendee => {:mailbox => [{:name => {:text => attendees.name}}, {:email_address => {:text => attendees.email_address}}]}}]}
66
+ when 'Hash'
67
+ return {type => [{:attendee => {:mailbox => [{:name => {:text => attendees[:name]}}, {:email_address => {:text => attendees[:email_address]}}]}}]}
68
+ when 'Array'
69
+ as = {type => []}
70
+ attendees.each do |a|
71
+ as.merge!(format_attendees(a, type)) {|k,v1,v2| v1 + v2}
72
+ end
73
+ return as
74
+ end
75
+ end
56
76
 
57
77
  # Create a new CalendarItem.
58
78
  # @param [DateTime] v_start The date and time when the CalendarItem begins
@@ -60,9 +80,9 @@ module Viewpoint
60
80
  # @param [String] subject The subject of this Item
61
81
  # @param [String,optional] body The body of this object
62
82
  # @param [String,optional] location The location where this calendar item will ocurr
63
- # @param [Array<String>,optional] required_attendees An Array of e-mail addresses of required attendees
64
- # @param [Array<String>,optional] optional_attendees An Array of e-mail addresses of optional attendees
65
- # @param [Array<String>,optional] resources An Array of e-mail addresses of resources
83
+ # @param [Array<String,MailboxUser,Attendee>,optional] required_attendees An Array of e-mail addresses of required attendees
84
+ # @param [Array<String,MailboxUser,Attendee>,optional] optional_attendees An Array of e-mail addresses of optional attendees
85
+ # @param [Array<String,MailboxUser,Attendee>,optional] resources An Array of e-mail addresses of resources
66
86
  def self.create_item(v_start, v_end, subject, body = nil, location = nil, required_attendees=[], optional_attendees=[], resources=[])
67
87
  item = {}
68
88
  item[:start] = {:text => v_start.to_s}
@@ -70,19 +90,12 @@ module Viewpoint
70
90
  item[:subject] = {:text => subject}
71
91
  item[:body] = {:text => body, :body_type => 'Text'} unless body.nil?
72
92
  item[:location] = {:text => location} unless location.nil?
73
- required_attendees.each do |a|
74
- item[:required_attendees] = [] unless item[:required_attendees].is_a?(Array)
75
- item[:required_attendees] << {:attendee => {:mailbox => {:email_address => {:text => a}}}}
76
- end
77
- optional_attendees.each do |a|
78
- item[:optional_attendees] = [] unless item[:optional_attendees].is_a?(Array)
79
- item[:optional_attendees] << {:attendee => {:mailbox => {:email_address => {:text => a}}}}
80
- end
93
+ item.merge!(self.format_attendees(required_attendees)) unless required_attendees.empty?
94
+ item.merge!(self.format_attendees(optional_attendees, :optional_attendees)) unless optional_attendees.empty?
81
95
  resources.each do |a|
82
96
  item[:resources] = [] unless item[:resources].is_a?(Array)
83
97
  item[:resources] << {:attendee => {:mailbox => {:email_address => {:text => a}}}}
84
98
  end
85
- puts item
86
99
  self.create_item_from_hash(item)
87
100
  end
88
101
 
@@ -91,6 +104,95 @@ module Viewpoint
91
104
  super(ews_item)
92
105
  end
93
106
 
107
+ # Add attendees to this CalendarItem. This does not commit the changes so you will have to use #save! to
108
+ # commit them back. If you want to commit them at once look at the #add_attendees! method.
109
+ # @param [Array] required Required attendees to add to this object
110
+ # Array values of attendees may be simple email strings, MailboxUser items or Hashes in the form
111
+ # {:email_address => 'email@test', :name => 'My Name'}.
112
+ # @param [Array] optional Optional attendees to add to this object
113
+ # see the notes for the 'required' parameter.
114
+ # @example
115
+ # ['user1@example.org', 'user2@example.org']
116
+ # or
117
+ # [{:name => 'User1', :email_address => 'user1@example.org'}, {:name => 'User2', :email_address => 'user2@example.org'}]
118
+ # or
119
+ # ['user1@example.org', 'user2@example.org'], ['user3@example.org', 'user4@example.org']
120
+ # or
121
+ # [{:name => 'User1', :email_address => 'user1@example.org'}, {:name => 'User2', :email_address => 'user2@example.org'}],
122
+ # [{:name => 'User3', :email_address => 'user3@example.org'}, {:name => 'User4', :email_address => 'user4@example.org'}]
123
+ # @return [Boolean] true on success, false otherwise
124
+ # @todo add ability to add resources
125
+ def add_attendees(required, optional = [], resources = [])
126
+ update = {}
127
+ update.merge!(self.class.format_attendees(required)) unless required.empty? || required.nil?
128
+ update.merge!(self.class.format_attendees(optional, :optional_attendees)) unless optional.empty? || optional.nil?
129
+
130
+ return false if update.empty?
131
+
132
+ @required_attendees, @optional_attendees = nil, nil
133
+ changes = update_attribs(update, :append)
134
+ @updates.merge!({:preformatted => changes}) {|k,v1,v2| v1 + v2}
135
+ true
136
+ end
137
+
138
+ # This is the same as the #add_attendees method, but it actually commits the change back to Exchange
139
+ # @see #add_attendees
140
+ def add_attendees!(required, optional = [], resources = [])
141
+ add_attendees(required, optional, resources)
142
+ save!
143
+ end
144
+
145
+ # Remove the attendees from the attendee list. This does not commit the changes so you will have to use
146
+ # #save! to commit them back. If you want to commit them at once look at the #remove_attendees! method.
147
+ # @param [Array] attendees the attendees to remove from this CalendarItem
148
+ # [Viewpoint::EWS::Attendee<user1>, Viewpoint::EWS::Attendee<user2>] or
149
+ # ['user1@example.org', 'user2@example.org']
150
+ # @return [Boolean] false if the object is not updated, true otherwise
151
+ def remove_attendees(attendees)
152
+ return false if attendees.empty?
153
+
154
+ emails = attendees.is_a?(Array) ? attendees : attendees.values
155
+ emails = emails.collect do |v|
156
+ case v.class.to_s
157
+ when 'String'
158
+ v
159
+ when /MailboxUser|Attendee/
160
+ v.email_address
161
+ when 'Hash'
162
+ v[:email_address]
163
+ end
164
+ end
165
+
166
+ update = {}
167
+ [:required_attendees, :optional_attendees].each do |type|
168
+ ivar = self.send(type.to_s)
169
+ next if ivar.nil?
170
+
171
+ required_a = ivar.select {|v| !emails.include?(v.email_address) }
172
+ formatted_a = self.class.format_attendees(required_a, type)
173
+ if formatted_a[type].empty?
174
+ update[:preformatted] ||= []
175
+ update[:preformatted] << {:delete_item_field => [{:field_uRI => {:field_uRI=>FIELD_URIS[type][:text]}}]}
176
+ self.instance_eval "undef #{type}"
177
+ else
178
+ update.merge!(formatted_a)
179
+ end
180
+ end
181
+
182
+ return false if update.empty?
183
+
184
+ @required_attendees, @optional_attendees = nil, nil
185
+ @updates.merge!(update) {|k,v1,v2| v1 + v2}
186
+ true
187
+ end
188
+
189
+ # This is the same as the #remove_attendees method, but it actually commits the change back to Exchange
190
+ # @see #remove_attendees
191
+ def remove_attendees!(attendees)
192
+ remove_attendees(attendees)
193
+ save!
194
+ end
195
+
94
196
  # Call UpdateItem for this item with the passed updates
95
197
  # @param [Hash] updates a well-formed update hash
96
198
  # @example {:set_item_field=>{:field_u_r_i=>{:field_u_r_i=>"message:IsRead"}, :message=>{:is_read=>{:text=>"true"}}}}
@@ -102,7 +102,7 @@ module Viewpoint
102
102
 
103
103
  # Call UpdateItem for this item with the passed updates
104
104
  # @param [Hash] updates a well-formed update hash
105
- # @example {:set_item_field=>{:field_u_r_i=>{:field_u_r_i=>"message:IsRead"}, :message=>{:is_read=>{:text=>"true"}}}}
105
+ # @example {:set_item_field=>{:field_uRI=>{:field_uRI=>"message:IsRead"}, :message=>{:is_read=>{:text=>"true"}}}}
106
106
  def update!(updates)
107
107
  conn = Viewpoint::EWS::EWS.instance
108
108
  resp = conn.ews.update_item([{:id => @item_id, :change_key => @change_key}], {:updates => updates})
@@ -117,32 +117,52 @@ module Viewpoint
117
117
 
118
118
  end
119
119
 
120
- # This takes a hash of attributes with new values and builds the appropriate udpate hash
120
+ # This takes a hash of attributes with new values and builds the appropriate udpate hash.
121
+ # It does not commit the changes to Exchange, call #update! with the returned values from
122
+ # this method or look at #update_attribs! for a version of this method that autocommits the
123
+ # changes back.
124
+ #
125
+ # You can also specify a preformatted Array of data like so:
126
+ # {:preformatted => [misc data]}
127
+ # This will simply be passed to the update! method
121
128
  # @param [Hash] updates a hash that is formed like so :item_attr => newvalue
129
+ # @param [Symbol] update_type :append, :replace, :delete
122
130
  # @example {:sensitivity => {:text => 'Normal'}, :display_name => {:text => 'Test User'}}
123
- def update_attribs!(updates)
131
+ def update_attribs(updates, update_type = :replace)
132
+ utype_map = {:append => :append_to_item_field, :replace => :set_item_field, :delete => :delete_item_field}
124
133
  changes = []
125
134
  type = self.class.name.split(/::/).last.ruby_case.to_sym
126
135
 
127
136
  updates.each_pair do |k,v|
137
+ if(k == :preformatted)
138
+ changes += v
139
+ next
140
+ end
128
141
  raise EwsError, "Field (#{FIELD_URIS[k][:text]}) not writable by update." unless FIELD_URIS[k][:writable]
129
- changes << {:set_item_field=>[{:field_u_r_i => {:field_u_r_i=>FIELD_URIS[k][:text]}}, {type=>{k => v}}]}
142
+ changes << {utype_map[update_type]=>[{:field_uRI => {:field_uRI=>FIELD_URIS[k][:text]}}, {type=>{k => v}}]}
130
143
  end
131
144
 
145
+ changes
146
+ end
147
+
148
+ # This is the same as #update_attribs, but it will commit the changes back to Exchange.
149
+ # @see #update_attribs
150
+ def update_attribs!(updates, update_type = :replace)
151
+ changes = update_attribs(updates, update_type)
132
152
  update!(changes)
133
153
  end
134
154
 
135
155
  # Mark this Item as read
136
156
  def mark_read!
137
157
  field = :is_read
138
- update!({:set_item_field=>{:field_u_r_i=>{:field_u_r_i=>FIELD_URIS[field][:text]}, :message=>{field=>{:text=>"true"}}}})
158
+ update!({:set_item_field=>{:field_uRI=>{:field_uRI=>FIELD_URIS[field][:text]}, :message=>{field=>{:text=>"true"}}}})
139
159
  @is_read = true
140
160
  end
141
161
 
142
162
  # Mark this Item as unread
143
163
  def mark_unread!
144
164
  field = :is_read
145
- update!({:set_item_field=>{:field_u_r_i=>{:field_u_r_i=>FIELD_URIS[field][:text]}, :message=>{field=>{:text=>"false"}}}})
165
+ update!({:set_item_field=>{:field_uRI=>{:field_uRI=>FIELD_URIS[field][:text]}, :message=>{field=>{:text=>"false"}}}})
146
166
  @is_read = false
147
167
  true
148
168
  end
@@ -230,7 +230,7 @@ module Viewpoint
230
230
  @ews_methods << attendee_type
231
231
  self.instance_eval <<-EOF
232
232
  def #{attendee_type}
233
- return @#{attendee_type} if defined?(@#{attendee_type})
233
+ return @#{attendee_type} if(defined?(@#{attendee_type}) && !@#{attendee_type}.nil?)
234
234
  if( (@ews_item[:#{attendee_type}][:attendee]).is_a?(Hash) )
235
235
  @#{attendee_type} = [Attendee.new(@ews_item[:#{attendee_type}][:attendee])]
236
236
  elsif( (@ews_item[:#{attendee_type}][:attendee]).is_a?(Array) )
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 12
9
- version: 0.1.12
8
+ - 13
9
+ version: 0.1.13
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-12-29 00:00:00 -06:00
17
+ date: 2010-12-31 00:00:00 -06:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -114,8 +114,6 @@ files:
114
114
  - COPYING.txt
115
115
  - TODO
116
116
  - lib/exceptions/exceptions.rb
117
- - lib/field_hash2.txt
118
- - lib/field_hash.txt
119
117
  - lib/soap/soap_provider.rb
120
118
  - lib/soap/handsoap/builder.rb
121
119
  - lib/soap/handsoap/ews_service.rb
@@ -1,197 +0,0 @@
1
- FolderId => 'older:FolderId'
2
- ParentFolderId => 'folder:ParentFolderId'
3
- DisplayName => 'folder:DisplayName'
4
- UnreadCount => 'folder:UnreadCount'
5
- TotalCount => 'folder:TotalCount'
6
- ChildFolderCount => 'folder:ChildFolderCount'
7
- FolderClass => 'folder:FolderClass'
8
- SearchParameters => 'folder:SearchParameters'
9
- ManagedFolderInformation => 'folder:ManagedFolderInformation'
10
- PermissionSet => 'folder:PermissionSet'
11
- EffectiveRights => 'folder:EffectiveRights'
12
- SharingEffectiveRights => 'folder:SharingEffectiveRights'
13
- ItemId => 'item:ItemId'
14
- ParentFolderId => 'item:ParentFolderId'
15
- ItemClass => 'item:ItemClass'
16
- MimeContent => 'item:MimeContent'
17
- Attachments => 'item:Attachments'
18
- Subject => 'item:Subject'
19
- DateTimeReceived => 'item:DateTimeReceived'
20
- Size => 'item:Size'
21
- Categories => 'item:Categories'
22
- HasAttachments => 'item:HasAttachments'
23
- Importance => 'item:Importance'
24
- InReplyTo => 'item:InReplyTo'
25
- InternetMessageHeaders => 'item:InternetMessageHeaders'
26
- IsAssociated => 'item:IsAssociated'
27
- IsDraft => 'item:IsDraft'
28
- IsFromMe => 'item:IsFromMe'
29
- IsResend => 'item:IsResend'
30
- IsSubmitted => 'item:IsSubmitted'
31
- IsUnmodified => 'item:IsUnmodified'
32
- DateTimeSent => 'item:DateTimeSent'
33
- DateTimeCreated => 'item:DateTimeCreated'
34
- Body => 'item:Body'
35
- ResponseObjects => 'item:ResponseObjects'
36
- Sensitivity => 'item:Sensitivity'
37
- ReminderDueBy => 'item:ReminderDueBy'
38
- ReminderIsSet => 'item:ReminderIsSet'
39
- ReminderMinutesBeforeStart => 'item:ReminderMinutesBeforeStart'
40
- DisplayTo => 'item:DisplayTo'
41
- DisplayCc => 'item:DisplayCc'
42
- Culture => 'item:Culture'
43
- EffectiveRights => 'item:EffectiveRights'
44
- LastModifiedName => 'item:LastModifiedName'
45
- LastModifiedTime => 'item:LastModifiedTime'
46
- ConversationId => 'item:ConversationId'
47
- UniqueBody => 'item:UniqueBody'
48
- WebClientReadFormQueryString => 'item:WebClientReadFormQueryString'
49
- WebClientEditFormQueryString => 'item:WebClientEditFormQueryString'
50
- ConversationIndex => 'message:ConversationIndex'
51
- ConversationTopic => 'message:ConversationTopic'
52
- InternetMessageId => 'message:InternetMessageId'
53
- IsRead => 'message:IsRead'
54
- IsResponseRequested => 'message:IsResponseRequested'
55
- IsReadReceiptRequested => 'message:IsReadReceiptRequested'
56
- IsDeliveryReceiptRequested => 'message:IsDeliveryReceiptRequested'
57
- References => 'message:References'
58
- ReplyTo => 'message:ReplyTo'
59
- From => 'message:From'
60
- Sender => 'message:Sender'
61
- ToRecipients => 'message:ToRecipients'
62
- CcRecipients => 'message:CcRecipients'
63
- BccRecipients => 'message:BccRecipients'
64
- AssociatedCalendarItemId => 'meeting:AssociatedCalendarItemId'
65
- IsDelegated => 'meeting:IsDelegated'
66
- IsOutOfDate => 'meeting:IsOutOfDate'
67
- HasBeenProcessed => 'meeting:HasBeenProcessed'
68
- ResponseType => 'meeting:ResponseType'
69
- MeetingRequestType => 'meetingRequest:MeetingRequestType'
70
- IntendedFreeBusyStatus => 'meetingRequest:IntendedFreeBusyStatus'
71
- Start => 'calendar:Start'
72
- End => 'calendar:End'
73
- OriginalStart => 'calendar:OriginalStart'
74
- IsAllDayEvent => 'calendar:IsAllDayEvent'
75
- LegacyFreeBusyStatus => 'calendar:LegacyFreeBusyStatus'
76
- Location => 'calendar:Location'
77
- When => 'calendar:When'
78
- IsMeeting => 'calendar:IsMeeting'
79
- IsCancelled => 'calendar:IsCancelled'
80
- IsRecurring => 'calendar:IsRecurring'
81
- MeetingRequestWasSent => 'calendar:MeetingRequestWasSent'
82
- IsResponseRequested => 'calendar:IsResponseRequested'
83
- CalendarItemType => 'calendar:CalendarItemType'
84
- MyResponseType => 'calendar:MyResponseType'
85
- Organizer => 'calendar:Organizer'
86
- RequiredAttendees => 'calendar:RequiredAttendees'
87
- OptionalAttendees => 'calendar:OptionalAttendees'
88
- Resources => 'calendar:Resources'
89
- ConflictingMeetingCount => 'calendar:ConflictingMeetingCount'
90
- AdjacentMeetingCount => 'calendar:AdjacentMeetingCount'
91
- ConflictingMeetings => 'calendar:ConflictingMeetings'
92
- AdjacentMeetings => 'calendar:AdjacentMeetings'
93
- Duration => 'calendar:Duration'
94
- TimeZone => 'calendar:TimeZone'
95
- AppointmentReplyTime => 'calendar:AppointmentReplyTime'
96
- AppointmentSequenceNumber => 'calendar:AppointmentSequenceNumber'
97
- AppointmentState => 'calendar:AppointmentState'
98
- Recurrence => 'calendar:Recurrence'
99
- FirstOccurrence => 'calendar:FirstOccurrence'
100
- LastOccurrence => 'calendar:LastOccurrence'
101
- ModifiedOccurrences => 'calendar:ModifiedOccurrences'
102
- DeletedOccurrences => 'calendar:DeletedOccurrences'
103
- MeetingTimeZone => 'calendar:MeetingTimeZone'
104
- ConferenceType => 'calendar:ConferenceType'
105
- AllowNewTimeProposal => 'calendar:AllowNewTimeProposal'
106
- IsOnlineMeeting => 'calendar:IsOnlineMeeting'
107
- MeetingWorkspaceUrl => 'calendar:MeetingWorkspaceUrl'
108
- NetShowUrl => 'calendar:NetShowUrl'
109
- UID => 'calendar:UID'
110
- RecurrenceId => 'calendar:RecurrenceId'
111
- DateTimeStamp => 'calendar:DateTimeStamp'
112
- StartTimeZone => 'calendar:StartTimeZone'
113
- EndTimeZone => 'calendar:EndTimeZone'
114
- ActualWork => 'task:ActualWork'
115
- AssignedTime => 'task:AssignedTime'
116
- BillingInformation => 'task:BillingInformation'
117
- ChangeCount => 'task:ChangeCount'
118
- Companies => 'task:Companies'
119
- CompleteDate => 'task:CompleteDate'
120
- Contacts => 'task:Contacts'
121
- DelegationState => 'task:DelegationState'
122
- Delegator => 'task:Delegator'
123
- DueDate => 'task:DueDate'
124
- IsAssignmentEditable => 'task:IsAssignmentEditable'
125
- IsComplete => 'task:IsComplete'
126
- IsRecurring => 'task:IsRecurring'
127
- IsTeamTask => 'task:IsTeamTask'
128
- Mileage => 'task:Mileage'
129
- Owner => 'task:Owner'
130
- PercentComplete => 'task:PercentComplete'
131
- Recurrence => 'task:Recurrence'
132
- StartDate => 'task:StartDate'
133
- Status => 'task:Status'
134
- StatusDescription => 'task:StatusDescription'
135
- TotalWork => 'task:TotalWork'
136
- AssistantName => 'contacts:AssistantName'
137
- Birthday => 'contacts:Birthday'
138
- BusinessHomePage => 'contacts:BusinessHomePage'
139
- Children => 'contacts:Children'
140
- Companies => 'contacts:Companies'
141
- CompanyName => 'contacts:CompanyName'
142
- CompleteName => 'contacts:CompleteName'
143
- ContactSource => 'contacts:ContactSource'
144
- Culture => 'contacts:Culture'
145
- Department => 'contacts:Department'
146
- DisplayName => 'contacts:DisplayName'
147
- EmailAddresses => 'contacts:EmailAddresses'
148
- FileAs => 'contacts:FileAs'
149
- FileAsMapping => 'contacts:FileAsMapping'
150
- Generation => 'contacts:Generation'
151
- GivenName => 'contacts:GivenName'
152
- HasPicture => 'contacts:HasPicture'
153
- ImAddresses => 'contacts:ImAddresses'
154
- Initials => 'contacts:Initials'
155
- JobTitle => 'contacts:JobTitle'
156
- Manager => 'contacts:Manager'
157
- MiddleName => 'contacts:MiddleName'
158
- Mileage => 'contacts:Mileage'
159
- Nickname => 'contacts:Nickname'
160
- OfficeLocation => 'contacts:OfficeLocation'
161
- PhoneNumbers => 'contacts:PhoneNumbers'
162
- PhysicalAddresses => 'contacts:PhysicalAddresses'
163
- PostalAddressIndex => 'contacts:PostalAddressIndex'
164
- Profession => 'contacts:Profession'
165
- SpouseName => 'contacts:SpouseName'
166
- Surname => 'contacts:Surname'
167
- WeddingAnniversary => 'contacts:WeddingAnniversary'
168
- Members => 'distributionlist:Members'
169
- PostedTime => 'postitem:PostedTime'
170
- ConversationId => 'conversation:ConversationId'
171
- ConversationTopic => 'conversation:ConversationTopic'
172
- UniqueRecipients => 'conversation:UniqueRecipients'
173
- GlobalUniqueRecipients => 'conversation:GlobalUniqueRecipients'
174
- UniqueUnreadSenders => 'conversation:UniqueUnreadSenders'
175
- GlobalUniqueUnreadSenders => 'conversation:GlobalUniqueUnreadSenders'
176
- UniqueSenders => 'conversation:UniqueSenders'
177
- GlobalUniqueSenders => 'conversation:GlobalUniqueSenders'
178
- LastDeliveryTime => 'conversation:LastDeliveryTime'
179
- GlobalLastDeliveryTime => 'conversation:GlobalLastDeliveryTime'
180
- Categories => 'conversation:Categories'
181
- GlobalCategories => 'conversation:GlobalCategories'
182
- FlagStatus => 'conversation:FlagStatus'
183
- GlobalFlagStatus => 'conversation:GlobalFlagStatus'
184
- HasAttachments => 'conversation:HasAttachments'
185
- GlobalHasAttachments => 'conversation:GlobalHasAttachments'
186
- MessageCount => 'conversation:MessageCount'
187
- GlobalMessageCount => 'conversation:GlobalMessageCount'
188
- UnreadCount => 'conversation:UnreadCount'
189
- GlobalUnreadCount => 'conversation:GlobalUnreadCount'
190
- Size => 'conversation:Size'
191
- GlobalSize => 'conversation:GlobalSize'
192
- ItemClasses => 'conversation:ItemClasses'
193
- GlobalItemClasses => 'conversation:GlobalItemClasses'
194
- Importance => 'conversation:Importance'
195
- GlobalImportance => 'conversation:GlobalImportance'
196
- ItemIds => 'conversation:ItemIds'
197
- GlobalItemIds => 'conversation:GlobalItemIds'
@@ -1 +0,0 @@
1
- :folder_id => 'older:FolderId', :parent_folder_id => 'folder:ParentFolderId', :display_name => 'folder:DisplayName', :unread_count => 'folder:UnreadCount', :total_count => 'folder:TotalCount', :child_folder_count => 'folder:ChildFolderCount', :folder_class => 'folder:FolderClass', :search_parameters => 'folder:SearchParameters', :managed_folder_information => 'folder:ManagedFolderInformation', :permission_set => 'folder:PermissionSet', :effective_rights => 'folder:EffectiveRights', :sharing_effective_rights => 'folder:SharingEffectiveRights', :item_id => 'item:ItemId', :parent_folder_id => 'item:ParentFolderId', :item_class => 'item:ItemClass', :mime_content => 'item:MimeContent', :attachments => 'item:Attachments', :subject => 'item:Subject', :date_time_received => 'item:DateTimeReceived', :size => 'item:Size', :categories => 'item:Categories', :has_attachments => 'item:HasAttachments', :importance => 'item:Importance', :in_reply_to => 'item:InReplyTo', :internet_message_headers => 'item:InternetMessageHeaders', :is_associated => 'item:IsAssociated', :is_draft => 'item:IsDraft', :is_from_me => 'item:IsFromMe', :is_resend => 'item:IsResend', :is_submitted => 'item:IsSubmitted', :is_unmodified => 'item:IsUnmodified', :date_time_sent => 'item:DateTimeSent', :date_time_created => 'item:DateTimeCreated', :body => 'item:Body', :response_objects => 'item:ResponseObjects', :sensitivity => 'item:Sensitivity', :reminder_due_by => 'item:ReminderDueBy', :reminder_is_set => 'item:ReminderIsSet', :reminder_minutes_before_start => 'item:ReminderMinutesBeforeStart', :display_to => 'item:DisplayTo', :display_cc => 'item:DisplayCc', :culture => 'item:Culture', :effective_rights => 'item:EffectiveRights', :last_modified_name => 'item:LastModifiedName', :last_modified_time => 'item:LastModifiedTime', :conversation_id => 'item:ConversationId', :unique_body => 'item:UniqueBody', :web_client_read_form_query_string => 'item:WebClientReadFormQueryString', :web_client_edit_form_query_string => 'item:WebClientEditFormQueryString', :conversation_index => 'message:ConversationIndex', :conversation_topic => 'message:ConversationTopic', :internet_message_id => 'message:InternetMessageId', :is_read => 'message:IsRead', :is_response_requested => 'message:IsResponseRequested', :is_read_receipt_requested => 'message:IsReadReceiptRequested', :is_delivery_receipt_requested => 'message:IsDeliveryReceiptRequested', :references => 'message:References', :reply_to => 'message:ReplyTo', :from => 'message:From', :sender => 'message:Sender', :to_recipients => 'message:ToRecipients', :cc_recipients => 'message:CcRecipients', :bcc_recipients => 'message:BccRecipients', :associated_calendar_item_id => 'meeting:AssociatedCalendarItemId', :is_delegated => 'meeting:IsDelegated', :is_out_of_date => 'meeting:IsOutOfDate', :has_been_processed => 'meeting:HasBeenProcessed', :response_type => 'meeting:ResponseType', :meeting_request_type => 'meetingRequest:MeetingRequestType', :intended_free_busy_status => 'meetingRequest:IntendedFreeBusyStatus', :start => 'calendar:Start', :end => 'calendar:End', :original_start => 'calendar:OriginalStart', :is_all_day_event => 'calendar:IsAllDayEvent', :legacy_free_busy_status => 'calendar:LegacyFreeBusyStatus', :location => 'calendar:Location', :when => 'calendar:When', :is_meeting => 'calendar:IsMeeting', :is_cancelled => 'calendar:IsCancelled', :is_recurring => 'calendar:IsRecurring', :meeting_request_was_sent => 'calendar:MeetingRequestWasSent', :is_response_requested => 'calendar:IsResponseRequested', :calendar_item_type => 'calendar:CalendarItemType', :my_response_type => 'calendar:MyResponseType', :organizer => 'calendar:Organizer', :required_attendees => 'calendar:RequiredAttendees', :optional_attendees => 'calendar:OptionalAttendees', :resources => 'calendar:Resources', :conflicting_meeting_count => 'calendar:ConflictingMeetingCount', :adjacent_meeting_count => 'calendar:AdjacentMeetingCount', :conflicting_meetings => 'calendar:ConflictingMeetings', :adjacent_meetings => 'calendar:AdjacentMeetings', :duration => 'calendar:Duration', :time_zone => 'calendar:TimeZone', :appointment_reply_time => 'calendar:AppointmentReplyTime', :appointment_sequence_number => 'calendar:AppointmentSequenceNumber', :appointment_state => 'calendar:AppointmentState', :recurrence => 'calendar:Recurrence', :first_occurrence => 'calendar:FirstOccurrence', :last_occurrence => 'calendar:LastOccurrence', :modified_occurrences => 'calendar:ModifiedOccurrences', :deleted_occurrences => 'calendar:DeletedOccurrences', :meeting_time_zone => 'calendar:MeetingTimeZone', :conference_type => 'calendar:ConferenceType', :allow_new_time_proposal => 'calendar:AllowNewTimeProposal', :is_online_meeting => 'calendar:IsOnlineMeeting', :meeting_workspace_url => 'calendar:MeetingWorkspaceUrl', :net_show_url => 'calendar:NetShowUrl', :u_i_d => 'calendar:UID', :recurrence_id => 'calendar:RecurrenceId', :date_time_stamp => 'calendar:DateTimeStamp', :start_time_zone => 'calendar:StartTimeZone', :end_time_zone => 'calendar:EndTimeZone', :actual_work => 'task:ActualWork', :assigned_time => 'task:AssignedTime', :billing_information => 'task:BillingInformation', :change_count => 'task:ChangeCount', :companies => 'task:Companies', :complete_date => 'task:CompleteDate', :contacts => 'task:Contacts', :delegation_state => 'task:DelegationState', :delegator => 'task:Delegator', :due_date => 'task:DueDate', :is_assignment_editable => 'task:IsAssignmentEditable', :is_complete => 'task:IsComplete', :is_recurring => 'task:IsRecurring', :is_team_task => 'task:IsTeamTask', :mileage => 'task:Mileage', :owner => 'task:Owner', :percent_complete => 'task:PercentComplete', :recurrence => 'task:Recurrence', :start_date => 'task:StartDate', :status => 'task:Status', :status_description => 'task:StatusDescription', :total_work => 'task:TotalWork', :assistant_name => 'contacts:AssistantName', :birthday => 'contacts:Birthday', :business_home_page => 'contacts:BusinessHomePage', :children => 'contacts:Children', :companies => 'contacts:Companies', :company_name => 'contacts:CompanyName', :complete_name => 'contacts:CompleteName', :contact_source => 'contacts:ContactSource', :culture => 'contacts:Culture', :department => 'contacts:Department', :display_name => 'contacts:DisplayName', :email_addresses => 'contacts:EmailAddresses', :file_as => 'contacts:FileAs', :file_as_mapping => 'contacts:FileAsMapping', :generation => 'contacts:Generation', :given_name => 'contacts:GivenName', :has_picture => 'contacts:HasPicture', :im_addresses => 'contacts:ImAddresses', :initials => 'contacts:Initials', :job_title => 'contacts:JobTitle', :manager => 'contacts:Manager', :middle_name => 'contacts:MiddleName', :mileage => 'contacts:Mileage', :nickname => 'contacts:Nickname', :office_location => 'contacts:OfficeLocation', :phone_numbers => 'contacts:PhoneNumbers', :physical_addresses => 'contacts:PhysicalAddresses', :postal_address_index => 'contacts:PostalAddressIndex', :profession => 'contacts:Profession', :spouse_name => 'contacts:SpouseName', :surname => 'contacts:Surname', :wedding_anniversary => 'contacts:WeddingAnniversary', :members => 'distributionlist:Members', :posted_time => 'postitem:PostedTime', :conversation_id => 'conversation:ConversationId', :conversation_topic => 'conversation:ConversationTopic', :unique_recipients => 'conversation:UniqueRecipients', :global_unique_recipients => 'conversation:GlobalUniqueRecipients', :unique_unread_senders => 'conversation:UniqueUnreadSenders', :global_unique_unread_senders => 'conversation:GlobalUniqueUnreadSenders', :unique_senders => 'conversation:UniqueSenders', :global_unique_senders => 'conversation:GlobalUniqueSenders', :last_delivery_time => 'conversation:LastDeliveryTime', :global_last_delivery_time => 'conversation:GlobalLastDeliveryTime', :categories => 'conversation:Categories', :global_categories => 'conversation:GlobalCategories', :flag_status => 'conversation:FlagStatus', :global_flag_status => 'conversation:GlobalFlagStatus', :has_attachments => 'conversation:HasAttachments', :global_has_attachments => 'conversation:GlobalHasAttachments', :message_count => 'conversation:MessageCount', :global_message_count => 'conversation:GlobalMessageCount', :unread_count => 'conversation:UnreadCount', :global_unread_count => 'conversation:GlobalUnreadCount', :size => 'conversation:Size', :global_size => 'conversation:GlobalSize', :item_classes => 'conversation:ItemClasses', :global_item_classes => 'conversation:GlobalItemClasses', :importance => 'conversation:Importance', :global_importance => 'conversation:GlobalImportance', :item_ids => 'conversation:ItemIds', :global_item_ids => 'conversation:GlobalItemIds'