viewpoint 0.1.9 → 0.1.10
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/lib/field_hash.txt +197 -0
- data/lib/field_hash2.txt +1 -0
- data/lib/model/calendar_folder.rb +13 -15
- data/lib/model/contact.rb +83 -0
- data/lib/model/generic_folder.rb +12 -11
- data/lib/model/item.rb +44 -5
- data/lib/model/item_attachment.rb +2 -1
- data/lib/model/item_field_uri_map.rb +206 -0
- data/lib/model/message.rb +4 -4
- data/lib/model/model.rb +41 -3
- data/lib/model/task.rb +7 -9
- data/lib/soap/handsoap/ews_service.rb +7 -3
- data/lib/soap/handsoap/parsers/ews_parser.rb +4 -1
- data/lib/viewpoint.rb +3 -0
- metadata +32 -38
- data/Rakefile +0 -79
- data/VERSION +0 -1
- data/preamble +0 -19
- data/test/.rspec +0 -7
- data/test/spec/basic_functions.spec +0 -69
- data/test/spec/folder_subscriptions.spec +0 -35
- data/test/spec/folder_synchronization.spec +0 -36
- data/test/spec/item_tests.spec +0 -44
- data/utils/ewsWSDL2rb.rb +0 -29
data/lib/field_hash.txt
ADDED
@@ -0,0 +1,197 @@
|
|
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'
|
data/lib/field_hash2.txt
ADDED
@@ -0,0 +1 @@
|
|
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'
|
@@ -43,27 +43,25 @@ module Viewpoint
|
|
43
43
|
# <SharingEffectiveRights/>
|
44
44
|
end
|
45
45
|
|
46
|
-
# Find Items
|
47
|
-
# @see GenericFolder#find_items
|
48
|
-
def find_items(start_date = nil, end_date = nil)
|
49
|
-
opts ||= {}
|
50
|
-
if(!start_date.nil? && !end_date.nil?)
|
51
|
-
opts = {:calendar_view => {:max_entries_returned => 256, :start_date => start_date, :end_date => end_date}}
|
52
|
-
end
|
53
|
-
super(opts)
|
54
|
-
end
|
55
|
-
alias :items_between :find_items
|
56
|
-
|
57
46
|
# Fetch only items from today (since midnight)
|
58
|
-
def todays_items
|
47
|
+
def todays_items(opts = {})
|
59
48
|
#This is a bit convoluted for pre-1.9.x ruby versions that don't support to_datetime
|
60
|
-
|
49
|
+
items_between(DateTime.parse(Date.today.to_s), DateTime.parse((Date.today + 1).to_s), opts)
|
61
50
|
end
|
62
51
|
|
63
52
|
# Fetch items since a give DateTime
|
64
53
|
# @param [DateTime] start_date_time the time to fetch Items since.
|
65
|
-
def items_since(start_date_time)
|
66
|
-
|
54
|
+
def items_since(start_date_time, opts = {})
|
55
|
+
items_between(start_date_time, DateTime.now, opts)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Find Calendar Items between two dates
|
59
|
+
# @param [DateTime] start_date the date to start the search from
|
60
|
+
# @param [DateTime] end_date the date to end the search at
|
61
|
+
# @param [Hash] opts misc opts like restrictions, etc
|
62
|
+
def items_between(start_date, end_date, opts = {})
|
63
|
+
opts[:calendar_view] = {:max_entries_returned => 256, :start_date => start_date, :end_date => end_date}
|
64
|
+
find_items(opts)
|
67
65
|
end
|
68
66
|
|
69
67
|
end # CalendarFolder
|
data/lib/model/contact.rb
CHANGED
@@ -87,6 +87,89 @@ module Viewpoint
|
|
87
87
|
|
88
88
|
def init_methods
|
89
89
|
super()
|
90
|
+
|
91
|
+
define_str_var :file_as, :file_as_mapping, :display_name, :job_title, :given_name, :surname
|
92
|
+
define_attr_str_var :complete_name, :first_name, :middle_name, :last_name, :initials, :full_name
|
93
|
+
define_inet_addresses :email_addresses, :im_addresses
|
94
|
+
define_phone_numbers :phone_numbers
|
95
|
+
define_physical_addresses :physical_addresses
|
96
|
+
end
|
97
|
+
|
98
|
+
# Define email_addresses or im_addresses for a Contact
|
99
|
+
def define_inet_addresses(*inet_addresses)
|
100
|
+
inet_addresses.each do |itype|
|
101
|
+
eval "@#{itype} ||= {}"
|
102
|
+
return unless self.instance_variable_get("@#{itype}").empty?
|
103
|
+
if(@ews_item.has_key?(itype))
|
104
|
+
@ews_methods << itype
|
105
|
+
if(@ews_item[itype][:entry].is_a?(Array))
|
106
|
+
@ews_item[itype][:entry].each do |entry|
|
107
|
+
next if entry.keys.length == 1
|
108
|
+
eval "@#{itype}[entry[:key].ruby_case.to_sym] = (entry.has_key?(:text) ? entry[:text] : '')"
|
109
|
+
end
|
110
|
+
else
|
111
|
+
entry = @ews_item[itype][:entry]
|
112
|
+
next if entry.keys.length == 1
|
113
|
+
eval "@#{itype}[entry[:key].ruby_case.to_sym] = (entry.has_key?(:text) ? entry[:text] : '')"
|
114
|
+
end
|
115
|
+
self.instance_eval <<-EOF
|
116
|
+
def #{itype}
|
117
|
+
self.instance_variable_get "@#{itype}"
|
118
|
+
end
|
119
|
+
EOF
|
120
|
+
else
|
121
|
+
@ews_methods_undef << itype
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def define_phone_numbers(phone_numbers)
|
127
|
+
@phone_numbers ||= {}
|
128
|
+
return unless @phone_numbers.empty?
|
129
|
+
if(@ews_item.has_key?(phone_numbers))
|
130
|
+
if(@ews_item[phone_numbers][:entry].is_a?(Array))
|
131
|
+
@ews_item[phone_numbers][:entry].each do |entry|
|
132
|
+
next if entry.keys.length == 1
|
133
|
+
@phone_numbers[entry[:key].ruby_case.to_sym] = (entry.has_key?(:text) ? entry[:text] : "")
|
134
|
+
end
|
135
|
+
else # it is a Hash then
|
136
|
+
entry = @ews_item[phone_numbers][:entry]
|
137
|
+
return if entry.keys.length == 1
|
138
|
+
@phone_numbers[entry[:key].ruby_case.to_sym] = (entry.has_key?(:text) ? entry[:text] : "")
|
139
|
+
end
|
140
|
+
self.instance_eval <<-EOF
|
141
|
+
def #{phone_numbers}
|
142
|
+
@phone_numbers
|
143
|
+
end
|
144
|
+
EOF
|
145
|
+
@ews_methods << phone_numbers
|
146
|
+
else
|
147
|
+
@ews_methods_undef << itype
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
# Define physical_addresses for a Contact
|
152
|
+
def define_physical_addresses(physical_addresses)
|
153
|
+
@physical_addresses ||= {}
|
154
|
+
return unless @physical_addresses.empty?
|
155
|
+
if(@ews_item.has_key?(physical_addresses))
|
156
|
+
@ews_methods << physical_addresses
|
157
|
+
@ews_item[physical_addresses][:entry].each do |entry|
|
158
|
+
next if entry.keys.length == 1
|
159
|
+
key = entry.delete(:key)
|
160
|
+
@physical_addresses[key.ruby_case.to_sym] = {}
|
161
|
+
entry.each_pair do |ekey,ev|
|
162
|
+
@physical_addresses[key.ruby_case.to_sym][ekey] = ev[:text]
|
163
|
+
end
|
164
|
+
end
|
165
|
+
self.instance_eval <<-EOF
|
166
|
+
def #{physical_addresses}
|
167
|
+
@physical_addresses
|
168
|
+
end
|
169
|
+
EOF
|
170
|
+
else
|
171
|
+
@ews_methods_undef << itype
|
172
|
+
end
|
90
173
|
end
|
91
174
|
|
92
175
|
end # Contact
|
data/lib/model/generic_folder.rb
CHANGED
@@ -215,7 +215,7 @@ module Viewpoint
|
|
215
215
|
|
216
216
|
# Find Items
|
217
217
|
def find_items(opts = {})
|
218
|
-
item_shape = {:base_shape => 'Default'}
|
218
|
+
item_shape = opts.has_key?(:item_shape) ? opts.delete(:item_shape) : {:base_shape => 'Default'}
|
219
219
|
item_shape[:additional_properties] = {:field_uRI => ['item:ParentFolderId']}
|
220
220
|
resp = (Viewpoint::EWS::EWS.instance).ews.find_item([@folder_id], 'Shallow', item_shape, opts)
|
221
221
|
if(resp.status == 'Success')
|
@@ -232,27 +232,27 @@ module Viewpoint
|
|
232
232
|
end
|
233
233
|
|
234
234
|
# Fetch only items from today (since midnight)
|
235
|
-
def todays_items
|
235
|
+
def todays_items(opts = {})
|
236
236
|
#opts = {:query_string => ["Received:today"]}
|
237
237
|
#This is a bit convoluted for pre-1.9.x ruby versions that don't support to_datetime
|
238
|
-
items_since(DateTime.parse(Date.today.to_s))
|
238
|
+
items_since(DateTime.parse(Date.today.to_s), opts)
|
239
239
|
end
|
240
240
|
|
241
241
|
# Fetch items since a give DateTime
|
242
242
|
# @param [DateTime] date_time the time to fetch Items since.
|
243
|
-
def items_since(date_time)
|
243
|
+
def items_since(date_time, opts = {})
|
244
244
|
restr = {:restriction =>
|
245
245
|
{:is_greater_than_or_equal_to =>
|
246
246
|
[{:field_uRI => {:field_uRI=>'item:DateTimeReceived'}},
|
247
247
|
{:field_uRI_or_constant =>{:constant => {:value=>date_time}}}]
|
248
248
|
}}
|
249
|
-
find_items(restr)
|
249
|
+
find_items(opts.merge(restr))
|
250
250
|
end
|
251
251
|
|
252
252
|
# Fetch items between a given time period
|
253
253
|
# @param [DateTime] start_date the time to start fetching Items from
|
254
254
|
# @param [DateTime] end_date the time to stop fetching Items from
|
255
|
-
def items_between(start_date, end_date)
|
255
|
+
def items_between(start_date, end_date, opts={})
|
256
256
|
restr = {:restriction => {:and => [
|
257
257
|
{:is_greater_than_or_equal_to =>
|
258
258
|
[{:field_uRI => {:field_uRI=>'item:DateTimeReceived'}},
|
@@ -261,7 +261,7 @@ module Viewpoint
|
|
261
261
|
[{:field_uRI => {:field_uRI=>'item:DateTimeReceived'}},
|
262
262
|
{:field_uRI_or_constant=>{:constant => {:value =>end_date}}}]}
|
263
263
|
]}}
|
264
|
-
find_items(restr)
|
264
|
+
find_items(opts.merge(restr))
|
265
265
|
end
|
266
266
|
|
267
267
|
# Search on the item subject
|
@@ -323,8 +323,9 @@ module Viewpoint
|
|
323
323
|
# an array of ItemIds are returned wich is a Hash in the form:
|
324
324
|
# {:id=>"item id", :change_key=>"change key"}
|
325
325
|
# See: http://msdn.microsoft.com/en-us/library/aa565609.aspx
|
326
|
-
def sync_items!(sync_amount = 256, sync_all = false)
|
327
|
-
|
326
|
+
def sync_items!(sync_amount = 256, sync_all = false, opts = {})
|
327
|
+
item_shape = opts.has_key?(:item_shape) ? opts.delete(:item_shape) : {:base_shape => 'Default'}
|
328
|
+
resp = (Viewpoint::EWS::EWS.instance).ews.sync_folder_items(@folder_id, @sync_state, sync_amount, item_shape)
|
328
329
|
parms = resp.items.shift
|
329
330
|
@sync_state = parms[:sync_state]
|
330
331
|
@synced = parms[:includes_last_item_in_range]
|
@@ -351,14 +352,14 @@ module Viewpoint
|
|
351
352
|
# additional items. Calling this method again will clear the sync_state and synchronize
|
352
353
|
# everything again.
|
353
354
|
# @return [Array<Item>] returns an array of Items
|
354
|
-
def sync_items_since!(datetime)
|
355
|
+
def sync_items_since!(datetime, opts={})
|
355
356
|
clear_sync_state!
|
356
357
|
|
357
358
|
begin
|
358
359
|
items = sync_items!
|
359
360
|
end until items.empty?
|
360
361
|
|
361
|
-
items_since(datetime)
|
362
|
+
items_since(datetime, opts)
|
362
363
|
end
|
363
364
|
|
364
365
|
# Clears out the @sync_state so you can freshly synchronize this folder if needed
|
data/lib/model/item.rb
CHANGED
@@ -26,6 +26,7 @@ module Viewpoint
|
|
26
26
|
module EWS
|
27
27
|
class Item
|
28
28
|
include Model
|
29
|
+
include ItemFieldUriMap
|
29
30
|
|
30
31
|
# This is a class method that fetches an existing Item from the
|
31
32
|
# Exchange Store.
|
@@ -69,6 +70,7 @@ module Viewpoint
|
|
69
70
|
@item_id = ews_item[:item_id][:id]
|
70
71
|
@change_key = ews_item[:item_id][:change_key]
|
71
72
|
@text_only = false
|
73
|
+
@updates = {}
|
72
74
|
|
73
75
|
init_methods
|
74
76
|
end
|
@@ -86,24 +88,60 @@ module Viewpoint
|
|
86
88
|
@text_only = ( txt == true ? true : false)
|
87
89
|
end
|
88
90
|
|
91
|
+
# Save any pending updates that were manipulated via setter methods.
|
92
|
+
def save!
|
93
|
+
return true if @updates.empty?
|
94
|
+
if update_attribs!(@updates)
|
95
|
+
@updates = {}
|
96
|
+
true
|
97
|
+
else
|
98
|
+
false
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
89
102
|
# Call UpdateItem for this item with the passed updates
|
90
103
|
# @param [Hash] updates a well-formed update hash
|
91
|
-
# @example {:
|
104
|
+
# @example {:set_item_field=>{:field_u_r_i=>{:field_u_r_i=>"message:IsRead"}, :message=>{:is_read=>{:text=>"true"}}}}
|
92
105
|
def update!(updates)
|
93
106
|
conn = Viewpoint::EWS::EWS.instance
|
94
|
-
resp = conn.ews.update_item([{:id => @item_id, :change_key => @change_key}], updates)
|
95
|
-
|
107
|
+
resp = conn.ews.update_item([{:id => @item_id, :change_key => @change_key}], {:updates => updates})
|
108
|
+
if resp.status == 'Success'
|
109
|
+
@item_id = resp.items.first[resp.items.first.keys.first][:item_id][:id]
|
110
|
+
@change_key = resp.items.first[resp.items.first.keys.first][:item_id][:change_key]
|
111
|
+
@shallow = true
|
112
|
+
deepen!
|
113
|
+
else
|
114
|
+
raise EwsError, "Trouble updating Item. #{resp.code}: #{resp.message}"
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
# This takes a hash of attributes with new values and builds the appropriate udpate hash
|
120
|
+
# @param [Hash] updates a hash that is formed like so :item_attr => newvalue
|
121
|
+
# @example {:sensitivity => {:text => 'Normal'}, :display_name => {:text => 'Test User'}}
|
122
|
+
def update_attribs!(updates)
|
123
|
+
changes = []
|
124
|
+
type = self.class.name.split(/::/).last.ruby_case.to_sym
|
125
|
+
|
126
|
+
updates.each_pair do |k,v|
|
127
|
+
raise EwsError, "Field (#{FIELD_URIS[k][:text]}) not writable by update." unless FIELD_URIS[k][:writable]
|
128
|
+
changes << {:set_item_field=>{:field_u_r_i=>{:field_u_r_i=>FIELD_URIS[k][:text]}, type=>{k => v}}}
|
129
|
+
end
|
130
|
+
|
131
|
+
update!(changes)
|
96
132
|
end
|
97
133
|
|
98
134
|
# Mark this Item as read
|
99
135
|
def mark_read!
|
100
|
-
|
136
|
+
field = :is_read
|
137
|
+
update!({:set_item_field=>{:field_u_r_i=>{:field_u_r_i=>FIELD_URIS[field][:text]}, :message=>{field=>{:text=>"true"}}}})
|
101
138
|
@is_read = true
|
102
139
|
end
|
103
140
|
|
104
141
|
# Mark this Item as unread
|
105
142
|
def mark_unread!
|
106
|
-
|
143
|
+
field = :is_read
|
144
|
+
update!({:set_item_field=>{:field_u_r_i=>{:field_u_r_i=>FIELD_URIS[field][:text]}, :message=>{field=>{:text=>"false"}}}})
|
107
145
|
@is_read = false
|
108
146
|
true
|
109
147
|
end
|
@@ -209,6 +247,7 @@ module Viewpoint
|
|
209
247
|
end
|
210
248
|
|
211
249
|
|
250
|
+
|
212
251
|
private
|
213
252
|
|
214
253
|
# @todo Handle:
|