podio 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +0 -16
- data/lib/podio.rb +6 -3
- data/lib/podio/active_podio/base.rb +53 -21
- data/lib/podio/active_podio/updatable.rb +9 -14
- data/lib/podio/client.rb +46 -17
- data/lib/podio/error.rb +9 -0
- data/lib/podio/middleware/error_response.rb +5 -1
- data/lib/podio/middleware/json_request.rb +27 -5
- data/lib/podio/models/account_provider.rb +16 -0
- data/lib/podio/models/app_store_category.rb +25 -0
- data/lib/podio/models/app_store_share.rb +90 -11
- data/lib/podio/models/application.rb +52 -12
- data/lib/podio/models/application_field.rb +4 -4
- data/lib/podio/models/batch.rb +31 -0
- data/lib/podio/models/calendar_event.rb +64 -10
- data/lib/podio/models/category.rb +11 -9
- data/lib/podio/models/contact.rb +3 -1
- data/lib/podio/models/contract.rb +3 -0
- data/lib/podio/models/email_subscription_setting.rb +26 -3
- data/lib/podio/models/file_attachment.rb +3 -2
- data/lib/podio/models/form.rb +2 -2
- data/lib/podio/models/importer.rb +18 -9
- data/lib/podio/models/item.rb +87 -22
- data/lib/podio/models/item_field.rb +8 -3
- data/lib/podio/models/linked_account.rb +11 -3
- data/lib/podio/models/linked_account_data.rb +6 -0
- data/lib/podio/models/news.rb +1 -0
- data/lib/podio/models/organization.rb +4 -0
- data/lib/podio/models/organization_member.rb +17 -4
- data/lib/podio/models/organization_profile.rb +5 -1
- data/lib/podio/models/profile.rb +19 -10
- data/lib/podio/models/reference.rb +33 -0
- data/lib/podio/models/search.rb +4 -7
- data/lib/podio/models/space.rb +21 -12
- data/lib/podio/models/space_invitation.rb +7 -7
- data/lib/podio/models/space_member.rb +28 -3
- data/lib/podio/models/task.rb +38 -14
- data/lib/podio/models/user.rb +27 -5
- data/lib/podio/models/user_status.rb +5 -0
- data/lib/podio/models/view.rb +51 -0
- data/lib/podio/models/widget.rb +1 -1
- data/lib/podio/version.rb +1 -1
- data/test/client_test.rb +13 -3
- data/test/fixtures/fixtures.yaml +7 -7
- data/test/test_helper.rb +1 -24
- metadata +16 -23
- data/lib/podio/middleware/response_recorder.rb +0 -14
- data/lib/podio/models/meeting.rb +0 -151
- data/lib/podio/models/meeting_participiant.rb +0 -11
- data/test/fixtures/client/18a224aaf83ac57a7b8159cecdbb1263.rack +0 -1
- data/test/fixtures/client/a87c69a0624af0413a670094c6615651.rack +0 -1
- data/test/fixtures/client/ac493997db62308972c208afa76f8479.rack +0 -1
- data/test/fixtures/client/d7fbf422c77af768552423633d0389e8.rack +0 -1
- data/test/fixtures/client/e2d68afe39f5531195273ea259b63916.rack +0 -1
@@ -4,36 +4,38 @@ class Podio::Category < ActivePodio::Base
|
|
4
4
|
property :name, :string
|
5
5
|
|
6
6
|
alias_method :id, :category_id
|
7
|
-
|
7
|
+
|
8
8
|
class << self
|
9
9
|
def create(attributes)
|
10
10
|
response = Podio.connection.post do |req|
|
11
11
|
req.url "/app_store/category/"
|
12
12
|
req.body = attributes
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
response.status
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
def update(id, attributes)
|
19
19
|
response = Podio.connection.put do |req|
|
20
20
|
req.url "/app_store/category/#{id}"
|
21
21
|
req.body = attributes
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
response.status
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
def delete(id)
|
28
28
|
Podio.connection.delete("/app_store/category/#{id}").status
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def find(id)
|
32
32
|
member Podio.connection.get("/app_store/category/#{id}").body
|
33
33
|
end
|
34
|
-
|
35
|
-
def find_all
|
36
|
-
collection Podio.connection.get
|
34
|
+
|
35
|
+
def find_all(options = {})
|
36
|
+
collection Podio.connection.get { |req|
|
37
|
+
req.url("/app_store/category/", options)
|
38
|
+
}.body
|
37
39
|
end
|
38
40
|
|
39
41
|
private
|
data/lib/podio/models/contact.rb
CHANGED
@@ -1,14 +1,16 @@
|
|
1
1
|
class Podio::Contact < Podio::Profile
|
2
2
|
include ActivePodio::Updatable
|
3
|
-
|
3
|
+
|
4
4
|
property :user_id, :integer
|
5
5
|
property :organization, :string
|
6
6
|
property :role, :string # Only available when getting contacts for a space
|
7
7
|
property :removable, :boolean # Only available when getting contacts for a space
|
8
8
|
property :type, :string # user, space, connection - blank probably means it's a real user / Podio member
|
9
|
+
property :space_id, :integer
|
9
10
|
property :link, :string
|
10
11
|
property :last_seen_on, :datetime
|
11
12
|
property :rights, :array
|
13
|
+
property :external_id, :string
|
12
14
|
|
13
15
|
alias_method :id, :user_id
|
14
16
|
|
@@ -8,6 +8,7 @@ class Podio::Contract < ActivePodio::Base
|
|
8
8
|
property :started_on, :datetime
|
9
9
|
property :ended_on, :datetime
|
10
10
|
property :item_prices, :hash
|
11
|
+
property :item_limits, :hash
|
11
12
|
property :payment_id, :string
|
12
13
|
property :payment_status, :string
|
13
14
|
property :accounting_id, :string
|
@@ -21,6 +22,8 @@ class Podio::Contract < ActivePodio::Base
|
|
21
22
|
property :invoicing_mode, :string
|
22
23
|
property :ended_reason, :string
|
23
24
|
property :ended_comment, :string
|
25
|
+
property :billing_mail, :string
|
26
|
+
property :model, :string
|
24
27
|
|
25
28
|
has_one :org, :class => 'Organization'
|
26
29
|
has_one :user, :class => 'User'
|
@@ -10,15 +10,16 @@ class Podio::EmailSubscriptionSetting < ActivePodio::Base
|
|
10
10
|
property :subscription, :boolean
|
11
11
|
property :push_notification, :boolean
|
12
12
|
property :push_notification_sound, :boolean
|
13
|
+
property :push_notification_browser, :boolean
|
13
14
|
|
14
15
|
def self.find_for_current_user
|
15
16
|
self.get_groups
|
16
17
|
end
|
17
|
-
|
18
|
+
|
18
19
|
def update
|
19
20
|
self.class.update_groups(self.attributes)
|
20
21
|
end
|
21
|
-
|
22
|
+
|
22
23
|
class << self
|
23
24
|
def get_groups()
|
24
25
|
member Podio.connection.get { |req|
|
@@ -36,7 +37,29 @@ class Podio::EmailSubscriptionSetting < ActivePodio::Base
|
|
36
37
|
def unsubscribe(username)
|
37
38
|
Podio.connection.post("/email/unsubscribe/#{username}").status
|
38
39
|
end
|
39
|
-
|
40
|
+
|
41
|
+
def get_global_email_as_vcard(name)
|
42
|
+
Podio.connection.get("/email/contact/#{name}/vcard").body
|
43
|
+
end
|
44
|
+
|
45
|
+
def get_ref_email_as_vcard(name, ref_type, ref_id)
|
46
|
+
Podio.connection.get("/email/contact/#{name}/#{ref_type}/#{ref_id}/vcard").body
|
47
|
+
end
|
48
|
+
|
49
|
+
def export_global_contact_to_linked_acc(name, linked_acc_id)
|
50
|
+
Podio.connection.post { |req|
|
51
|
+
req.url "/email/contact/#{name}/export"
|
52
|
+
req.body = { :linked_account_id => linked_acc_id }
|
53
|
+
}.body
|
54
|
+
end
|
55
|
+
|
56
|
+
def export_ref_contact_to_linked_acc(name, ref_type, ref_id, linked_acc_id)
|
57
|
+
Podio.connection.post { |req|
|
58
|
+
req.url "/email/contact/#{name}/#{ref_type}/#{ref_id}/export"
|
59
|
+
req.body = { :linked_account_id => linked_acc_id }
|
60
|
+
}.body
|
61
|
+
end
|
62
|
+
|
40
63
|
end
|
41
64
|
|
42
65
|
end
|
@@ -33,9 +33,10 @@ class Podio::FileAttachment < ActivePodio::Base
|
|
33
33
|
class << self
|
34
34
|
# Accepts an open file stream along with a file name and uploads the file to Podio
|
35
35
|
def upload(file_stream, file_name)
|
36
|
-
response = Podio.client.
|
36
|
+
response = Podio.client.connection.post do |req|
|
37
37
|
req.options[:timeout] = 1200
|
38
38
|
req.url "/file/v2/"
|
39
|
+
req.headers['Content-Type'] = 'multipart/form-data'
|
39
40
|
req.body = {:source => Faraday::UploadIO.new(file_stream, nil, nil), :filename => file_name}
|
40
41
|
end
|
41
42
|
|
@@ -72,7 +73,7 @@ class Podio::FileAttachment < ActivePodio::Base
|
|
72
73
|
end
|
73
74
|
|
74
75
|
def find_raw(id)
|
75
|
-
Podio.client.
|
76
|
+
Podio.client.connection.get("/file/#{id}/raw").body
|
76
77
|
end
|
77
78
|
|
78
79
|
def find_for_app(app_id, options={})
|
data/lib/podio/models/form.rb
CHANGED
@@ -12,9 +12,9 @@ class Podio::Form < ActivePodio::Base
|
|
12
12
|
property :field_ids, :array
|
13
13
|
|
14
14
|
alias_method :id, :form_id
|
15
|
-
delegate_to_hash :settings, :captcha, :text, :theme, :setter => true
|
15
|
+
delegate_to_hash :settings, :captcha, :text, :theme, :css, :setter => true
|
16
16
|
delegate_to_hash :text, :submit, :success, :heading, :description, :setter => true
|
17
|
-
|
17
|
+
|
18
18
|
class << self
|
19
19
|
def create(app_id, attributes)
|
20
20
|
response = Podio.connection.post do |req|
|
@@ -1,14 +1,10 @@
|
|
1
1
|
class Podio::Importer < ActivePodio::Base
|
2
|
-
|
2
|
+
|
3
3
|
class << self
|
4
|
-
def process_file(file_id,
|
4
|
+
def process_file(file_id, options = {})
|
5
5
|
response = Podio.connection.post do |req|
|
6
6
|
req.url "/importer/#{file_id}/process"
|
7
|
-
req.body =
|
8
|
-
:app_id => app_id,
|
9
|
-
:mappings => mappings,
|
10
|
-
:tags_column_id => tags_column_id
|
11
|
-
}
|
7
|
+
req.body = options
|
12
8
|
end
|
13
9
|
|
14
10
|
response.body
|
@@ -17,6 +13,19 @@ class Podio::Importer < ActivePodio::Base
|
|
17
13
|
def get_columns(file_id)
|
18
14
|
list Podio.connection.get("/importer/#{file_id}/column/").body
|
19
15
|
end
|
20
|
-
|
16
|
+
|
17
|
+
def get_info(file_id)
|
18
|
+
Podio.connection.get("/importer/#{file_id}/info").body
|
19
|
+
end
|
20
|
+
|
21
|
+
def preview(file_id, row, options)
|
22
|
+
response = Podio.connection.post do |req|
|
23
|
+
req.url "/importer/#{file_id}/preview/#{row}"
|
24
|
+
req.body = options
|
25
|
+
end
|
26
|
+
|
27
|
+
response.body
|
28
|
+
end
|
29
|
+
|
21
30
|
end
|
22
|
-
end
|
31
|
+
end
|
data/lib/podio/models/item.rb
CHANGED
@@ -11,7 +11,7 @@ class Podio::Item < ActivePodio::Base
|
|
11
11
|
|
12
12
|
has_one :initial_revision, :class => 'ItemRevision'
|
13
13
|
has_one :current_revision, :class => 'ItemRevision'
|
14
|
-
|
14
|
+
|
15
15
|
# Also included in the full Get item
|
16
16
|
property :ratings, :hash
|
17
17
|
property :conversations, :array
|
@@ -23,28 +23,39 @@ class Podio::Item < ActivePodio::Base
|
|
23
23
|
property :user_ratings, :hash
|
24
24
|
property :link, :string
|
25
25
|
property :invite, :hash
|
26
|
+
property :participants, :hash
|
27
|
+
property :linked_account_id, :integer
|
28
|
+
property :ref, :hash # linked items
|
29
|
+
property :priority, :float
|
30
|
+
|
31
|
+
# Get items
|
32
|
+
property :comment_count, :integer
|
33
|
+
property :task_count, :integer
|
26
34
|
|
27
35
|
has_many :revisions, :class => 'ItemRevision'
|
28
36
|
has_many :files, :class => 'FileAttachment'
|
29
37
|
has_many :comments, :class => 'Comment'
|
30
38
|
has_many :shares, :class => 'AppStoreShare'
|
39
|
+
has_one :reminder, :class => 'Reminder'
|
40
|
+
has_one :recurrence, :class => 'Recurrence'
|
41
|
+
has_one :linked_account_data, :class => 'LinkedAccountData'
|
31
42
|
|
32
43
|
# For inserting/updating
|
33
44
|
property :file_ids, :array
|
34
|
-
|
45
|
+
|
35
46
|
alias_method :id, :item_id
|
36
47
|
delegate_to_hash :app, :app_id, :app_name, :item_name
|
37
48
|
|
38
49
|
def create
|
39
|
-
self.item_id =
|
50
|
+
self.item_id = self.class.create(self.app_id, prepare_item_values(self))
|
40
51
|
end
|
41
52
|
|
42
53
|
def destroy
|
43
|
-
|
54
|
+
self.class.delete(self.id)
|
44
55
|
end
|
45
56
|
|
46
57
|
def update
|
47
|
-
|
58
|
+
self.class.update(self.id, prepare_item_values(self))
|
48
59
|
end
|
49
60
|
|
50
61
|
handle_api_errors_for :create, :update
|
@@ -57,7 +68,7 @@ class Podio::Item < ActivePodio::Base
|
|
57
68
|
|
58
69
|
{:fields => fields, :file_ids => file_ids, :tags => tags }
|
59
70
|
end
|
60
|
-
|
71
|
+
|
61
72
|
class << self
|
62
73
|
def find(id)
|
63
74
|
member Podio.connection.get("/item/#{id}").body
|
@@ -71,6 +82,14 @@ class Podio::Item < ActivePodio::Base
|
|
71
82
|
Podio.connection.get("/item/#{id}/basic").body
|
72
83
|
end
|
73
84
|
|
85
|
+
def find_basic_by_field(item_id, field_id)
|
86
|
+
member Podio.connection.get("/item/#{item_id}/reference/#{field_id}/preview").body
|
87
|
+
end
|
88
|
+
|
89
|
+
def find_basic_hash_by_field(item_id, field_id)
|
90
|
+
Podio.connection.get("/item/#{item_id}/reference/#{field_id}/preview").body
|
91
|
+
end
|
92
|
+
|
74
93
|
def find_all_by_external_id(app_id, external_id)
|
75
94
|
collection Podio.connection.get("/item/app/#{app_id}/v2/?external_id=#{external_id}").body
|
76
95
|
end
|
@@ -95,14 +114,6 @@ class Podio::Item < ActivePodio::Base
|
|
95
114
|
req.body = attributes
|
96
115
|
}.body
|
97
116
|
end
|
98
|
-
|
99
|
-
def find_next(current_item_id, time = nil)
|
100
|
-
find_next_or_previous(:next, current_item_id, time)
|
101
|
-
end
|
102
|
-
|
103
|
-
def find_previous(current_item_id, time = nil)
|
104
|
-
find_next_or_previous(:previous, current_item_id, time)
|
105
|
-
end
|
106
117
|
|
107
118
|
def find_app_values(app_id)
|
108
119
|
response = Podio.connection.get { |req|
|
@@ -110,13 +121,28 @@ class Podio::Item < ActivePodio::Base
|
|
110
121
|
}
|
111
122
|
response.body
|
112
123
|
end
|
113
|
-
|
124
|
+
|
125
|
+
def find_references_by_field(item_id, field_id, options = {})
|
126
|
+
list Podio.connection.get { |req|
|
127
|
+
req.url("/item/#{item_id}/reference/field/#{field_id}", options)
|
128
|
+
}.body
|
129
|
+
end
|
130
|
+
|
131
|
+
def calculate(app_id, config)
|
132
|
+
response = Podio.connection.post do |req|
|
133
|
+
req.url "/item/app/#{app_id}/calculate"
|
134
|
+
req.body = config
|
135
|
+
end
|
136
|
+
|
137
|
+
response.body
|
138
|
+
end
|
139
|
+
|
114
140
|
def find_field_top(field_id, options={:limit => 8})
|
115
141
|
list Podio.connection.get { |req|
|
116
142
|
req.url("/item/field/#{field_id}/top/", options)
|
117
143
|
}.body
|
118
144
|
end
|
119
|
-
|
145
|
+
|
120
146
|
def xlsx(app_id, options={})
|
121
147
|
response = Podio.connection.get { |req|
|
122
148
|
req.url("/item/app/#{app_id}/xlsx/", options)
|
@@ -124,6 +150,13 @@ class Podio::Item < ActivePodio::Base
|
|
124
150
|
response.body
|
125
151
|
end
|
126
152
|
|
153
|
+
def export(app_id, exporter, options={})
|
154
|
+
response = Podio.connection.post { |req|
|
155
|
+
req.url "/item/app/#{app_id}/export/#{exporter}"
|
156
|
+
req.body = options
|
157
|
+
}.body
|
158
|
+
end
|
159
|
+
|
127
160
|
def search_field(field_id, options={})
|
128
161
|
list Podio.connection.get { |req|
|
129
162
|
req.url("/item/field/#{field_id}/find", options)
|
@@ -138,7 +171,7 @@ class Podio::Item < ActivePodio::Base
|
|
138
171
|
|
139
172
|
response.body['item_id']
|
140
173
|
end
|
141
|
-
|
174
|
+
|
142
175
|
def update(id, attributes)
|
143
176
|
response = Podio.connection.put do |req|
|
144
177
|
req.url "/item/#{id}"
|
@@ -146,21 +179,53 @@ class Podio::Item < ActivePodio::Base
|
|
146
179
|
end
|
147
180
|
response.status
|
148
181
|
end
|
149
|
-
|
182
|
+
|
150
183
|
def delete(id)
|
151
184
|
Podio.connection.delete("/item/#{id}").body
|
152
185
|
end
|
153
|
-
|
186
|
+
|
187
|
+
def delete_ref(id)
|
188
|
+
Podio.connection.delete("/item/#{id}/ref").body
|
189
|
+
end
|
190
|
+
|
191
|
+
def set_participation(id, status)
|
192
|
+
response = Podio.connection.put do |req|
|
193
|
+
req.url "/item/#{id}/participation"
|
194
|
+
req.body = { :status => status }
|
195
|
+
end
|
196
|
+
response.status
|
197
|
+
end
|
198
|
+
|
199
|
+
def cleanup_field_values(app_id)
|
200
|
+
Podio.connection.post("/item/app/#{app_id}/cleanup_field_values").body
|
201
|
+
end
|
202
|
+
|
203
|
+
def rearrange(id, attributes)
|
204
|
+
response = Podio.connection.post do |req|
|
205
|
+
req.url "/item/#{id}/rearrange"
|
206
|
+
req.body = attributes
|
207
|
+
end
|
208
|
+
|
209
|
+
member response.body
|
210
|
+
end
|
211
|
+
|
212
|
+
def find_meeting_url(id)
|
213
|
+
response = Podio.connection.get { |req|
|
214
|
+
req.url("/item/#{id}/meeting/url")
|
215
|
+
}
|
216
|
+
response.body
|
217
|
+
end
|
218
|
+
|
154
219
|
protected
|
155
|
-
|
220
|
+
|
156
221
|
def time_options(time)
|
157
222
|
time.present? ? { 'time' => (time.is_a?(String) ? time : time.to_s(:db)) } : {}
|
158
223
|
end
|
159
|
-
|
224
|
+
|
160
225
|
def find_next_or_previous(operation, current_item_id, time)
|
161
226
|
member Podio.connection.get { |req|
|
162
227
|
req.url("/item/#{current_item_id}/#{operation}", time_options(time))
|
163
228
|
}.body
|
164
229
|
end
|
165
230
|
end
|
166
|
-
end
|
231
|
+
end
|
@@ -4,9 +4,10 @@ class Podio::ItemField < ActivePodio::Base
|
|
4
4
|
property :external_id, :string
|
5
5
|
property :label, :string
|
6
6
|
property :values, :array
|
7
|
+
property :config, :hash
|
7
8
|
|
8
9
|
alias_method :id, :field_id
|
9
|
-
|
10
|
+
|
10
11
|
class << self
|
11
12
|
def update(item_id, field_id, values)
|
12
13
|
response = Podio.connection.put do |req|
|
@@ -14,6 +15,10 @@ class Podio::ItemField < ActivePodio::Base
|
|
14
15
|
req.body = values
|
15
16
|
end
|
16
17
|
response.body
|
17
|
-
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def ical_entry(item_id, field_id)
|
21
|
+
Podio.connection.get("/calendar/item/#{item_id}/field/#{field_id}/ics/").body
|
22
|
+
end
|
18
23
|
end
|
19
|
-
end
|
24
|
+
end
|
@@ -2,14 +2,15 @@ class Podio::LinkedAccount < ActivePodio::Base
|
|
2
2
|
property :linked_account_id, :integer
|
3
3
|
property :label, :string
|
4
4
|
property :provider, :string
|
5
|
+
property :provider_humanized_name, :string
|
6
|
+
property :capability_names, :hash
|
7
|
+
property :options, :hash
|
5
8
|
|
6
9
|
alias_method :id, :linked_account_id
|
7
10
|
|
8
11
|
class << self
|
9
12
|
|
10
|
-
def find_all(
|
11
|
-
options = { :provider => provider }
|
12
|
-
options[:capability] = capability if capability.present?
|
13
|
+
def find_all(options = {})
|
13
14
|
list Podio.connection.get { |req|
|
14
15
|
req.url("/linked_account/", options)
|
15
16
|
}.body
|
@@ -28,5 +29,12 @@ class Podio::LinkedAccount < ActivePodio::Base
|
|
28
29
|
Podio.connection.delete("/linked_account/#{id}").status
|
29
30
|
end
|
30
31
|
|
32
|
+
def update_options(id, attributes)
|
33
|
+
Podio.connection.put do |req|
|
34
|
+
req.url "/linked_account/#{id}/options"
|
35
|
+
req.body = attributes
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
31
39
|
end
|
32
40
|
end
|