viewpoint 0.1.12 → 0.1.13

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.
@@ -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'