podio 0.8.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +3 -0
  3. data/Gemfile +9 -2
  4. data/README.md +1 -4
  5. data/examples/oauth_web_flow/Gemfile +4 -0
  6. data/examples/{sinatra.rb → oauth_web_flow/sinatra.rb} +7 -6
  7. data/lib/podio.rb +18 -3
  8. data/lib/podio/active_podio/base.rb +107 -62
  9. data/lib/podio/client.rb +30 -5
  10. data/lib/podio/error.rb +22 -10
  11. data/lib/podio/middleware/error_response.rb +23 -16
  12. data/lib/podio/middleware/json_response.rb +1 -1
  13. data/lib/podio/middleware/logger.rb +3 -0
  14. data/lib/podio/middleware/oauth2.rb +3 -0
  15. data/lib/podio/models/account_provider.rb +1 -0
  16. data/lib/podio/models/action.rb +19 -2
  17. data/lib/podio/models/activation_status.rb +8 -2
  18. data/lib/podio/models/app_store_category.rb +4 -1
  19. data/lib/podio/models/app_store_share.rb +29 -16
  20. data/lib/podio/models/application.rb +57 -2
  21. data/lib/podio/models/application_email.rb +5 -2
  22. data/lib/podio/models/application_field.rb +5 -2
  23. data/lib/podio/models/batch.rb +8 -0
  24. data/lib/podio/models/by_line.rb +2 -1
  25. data/lib/podio/models/calendar_event.rb +63 -3
  26. data/lib/podio/models/calendar_mute.rb +6 -1
  27. data/lib/podio/models/category.rb +1 -0
  28. data/lib/podio/models/comment.rb +29 -8
  29. data/lib/podio/models/condition.rb +8 -0
  30. data/lib/podio/models/condition_set.rb +40 -0
  31. data/lib/podio/models/contact.rb +13 -2
  32. data/lib/podio/models/contract.rb +85 -1
  33. data/lib/podio/models/contract_event.rb +17 -0
  34. data/lib/podio/models/contract_price.rb +3 -7
  35. data/lib/podio/models/contract_price_v2.rb +31 -0
  36. data/lib/podio/models/contract_user.rb +4 -0
  37. data/lib/podio/models/conversation.rb +114 -13
  38. data/lib/podio/models/conversation_event.rb +51 -0
  39. data/lib/podio/models/conversation_message.rb +2 -1
  40. data/lib/podio/models/conversation_participant.rb +3 -2
  41. data/lib/podio/models/date_election.rb +35 -0
  42. data/lib/podio/models/email_contact.rb +46 -0
  43. data/lib/podio/models/email_subscription_setting.rb +4 -23
  44. data/lib/podio/models/embed.rb +4 -4
  45. data/lib/podio/models/experiment.rb +71 -0
  46. data/lib/podio/models/external_file.rb +7 -2
  47. data/lib/podio/models/file_attachment.rb +23 -0
  48. data/lib/podio/models/form.rb +7 -0
  49. data/lib/podio/models/friend.rb +12 -0
  50. data/lib/podio/models/grant.rb +73 -0
  51. data/lib/podio/models/hook.rb +13 -6
  52. data/lib/podio/models/importer.rb +3 -0
  53. data/lib/podio/models/integration.rb +17 -6
  54. data/lib/podio/models/invoice.rb +30 -0
  55. data/lib/podio/models/item.rb +81 -14
  56. data/lib/podio/models/item_diff.rb +9 -5
  57. data/lib/podio/models/item_field.rb +11 -2
  58. data/lib/podio/models/item_revision.rb +5 -2
  59. data/lib/podio/models/linked_account.rb +1 -0
  60. data/lib/podio/models/live.rb +61 -0
  61. data/lib/podio/models/net_promoter_score.rb +28 -0
  62. data/lib/podio/models/notification.rb +9 -4
  63. data/lib/podio/models/notification_group.rb +5 -2
  64. data/lib/podio/models/o_auth.rb +4 -2
  65. data/lib/podio/models/o_auth_client.rb +1 -2
  66. data/lib/podio/models/organization.rb +22 -10
  67. data/lib/podio/models/organization_contact.rb +2 -1
  68. data/lib/podio/models/organization_member.rb +17 -3
  69. data/lib/podio/models/organization_profile.rb +8 -2
  70. data/lib/podio/models/pin.rb +27 -0
  71. data/lib/podio/models/profile.rb +19 -50
  72. data/lib/podio/models/promotion.rb +91 -0
  73. data/lib/podio/models/rating.rb +23 -5
  74. data/lib/podio/models/recurrence.rb +6 -3
  75. data/lib/podio/models/reference.rb +17 -1
  76. data/lib/podio/models/reminder.rb +8 -3
  77. data/lib/podio/models/search.rb +7 -1
  78. data/lib/podio/models/space.rb +41 -2
  79. data/lib/podio/models/space_contact.rb +1 -2
  80. data/lib/podio/models/space_invitation.rb +4 -5
  81. data/lib/podio/models/space_member.rb +37 -4
  82. data/lib/podio/models/status.rb +20 -8
  83. data/lib/podio/models/stream_activity_group.rb +40 -0
  84. data/lib/podio/models/stream_mute.rb +7 -8
  85. data/lib/podio/models/stream_object.rb +19 -11
  86. data/lib/podio/models/subscription.rb +7 -1
  87. data/lib/podio/models/tag.rb +6 -1
  88. data/lib/podio/models/tag_search.rb +2 -1
  89. data/lib/podio/models/task.rb +74 -18
  90. data/lib/podio/models/task_label.rb +10 -2
  91. data/lib/podio/models/user.rb +50 -6
  92. data/lib/podio/models/user_mail.rb +4 -0
  93. data/lib/podio/models/user_status.rb +7 -0
  94. data/lib/podio/models/view.rb +27 -7
  95. data/lib/podio/models/widget.rb +25 -3
  96. data/lib/podio/version.rb +1 -1
  97. data/podio.gemspec +13 -10
  98. data/script/config.example.rb +6 -0
  99. data/script/referenceGenerator.rb +87 -0
  100. data/test/active_podio_test.rb +44 -34
  101. data/test/client_test.rb +13 -2
  102. metadata +89 -36
  103. data/lib/podio/middleware/date_conversion.rb +0 -37
  104. data/lib/podio/models/bulletin.rb +0 -60
  105. data/lib/podio/models/connection.rb +0 -53
  106. data/lib/podio/models/news.rb +0 -85
@@ -1,9 +1,12 @@
1
1
  # Encapsulates a user's membership of a space.
2
+ # @see https://developers.podio.com/doc/space-members
2
3
  class Podio::SpaceMember < ActivePodio::Base
4
+ property :employee, :boolean
3
5
  property :role, :string
4
6
  property :invited_on, :datetime
5
7
  property :started_on, :datetime
6
8
  property :ended_on, :datetime
9
+ property :grants, :integer
7
10
 
8
11
  has_one :user, :class => 'User'
9
12
  has_one :contact, :class => 'Contact', :property => :profile
@@ -12,19 +15,29 @@ class Podio::SpaceMember < ActivePodio::Base
12
15
  delegate :user_id, :name, :to => :contact
13
16
 
14
17
  alias_method :id, :user_id
18
+
19
+ def employee?
20
+ employee
21
+ end
22
+
23
+ def external?
24
+ !employee
25
+ end
15
26
 
16
27
  class << self
28
+ # @see https://developers.podio.com/doc/space-members/get-space-members-by-role-68043
17
29
  def find_all_for_role(space_id, role)
18
30
  list Podio.connection.get { |req|
19
31
  req.url("/space/#{space_id}/member/#{role}/")
20
32
  }.body
21
33
  end
22
34
 
35
+ # @see https://developers.podio.com/doc/space-members/get-space-membership-22397
23
36
  def find_membership(space_id, user_id)
24
37
  response = Podio.connection.get { |req|
25
- req.url("/space/#{space_id}/member/#{user_id}")
38
+ req.url("/space/#{space_id}/member/#{user_id}/v2")
26
39
  }
27
- response.body
40
+ member response.body
28
41
  end
29
42
 
30
43
  def find_all_ended(space_id)
@@ -33,10 +46,17 @@ class Podio::SpaceMember < ActivePodio::Base
33
46
  }.body
34
47
  end
35
48
 
49
+ # @see https://developers.podio.com/doc/space-members/get-active-members-of-space-22395
36
50
  def find_all(space_id, options = {})
37
51
  list Podio.connection.get("/space/#{space_id}/member/", options).body
38
52
  end
39
53
 
54
+ # @see https://developers.podio.com/doc/space-members/get-space-members-v2-19350328
55
+ def find_all_for_space(space_id, options = {})
56
+ list Podio.connection.get("/space/#{space_id}/member/v2/", options).body
57
+ end
58
+
59
+ # @see https://developers.podio.com/doc/space-members/update-space-memberships-22398
40
60
  def update_role(space_id, user_id, role)
41
61
  response = Podio.connection.put do |req|
42
62
  req.url "/space/#{space_id}/member/#{user_id}"
@@ -45,28 +65,41 @@ class Podio::SpaceMember < ActivePodio::Base
45
65
  response.status
46
66
  end
47
67
 
68
+ # @see https://developers.podio.com/doc/space-members/end-space-memberships-22399
48
69
  def end_membership(space_id, user_id)
49
70
  Podio.connection.delete("/space/#{space_id}/member/#{user_id}").status
50
71
  end
51
72
 
52
- def find_top_contacts(space_id)
53
- result = Podio.connection.get("/space/#{space_id}/member/top/").body
73
+ # @see https://developers.podio.com/doc/space-members/get-top-users-on-space-22461
74
+ def find_top_contacts(space_id, options = {})
75
+ result = Podio.connection.get("/space/#{space_id}/member/top/", options).body
54
76
  %w(employee external).each do |section|
55
77
  result[section]['profiles'].map! { |profile| Contact.new(profile) } if result[section].present? && result[section]['profiles'].present?
56
78
  end
57
79
  result
58
80
  end
59
81
 
82
+ def find_top_active(space_id, options = {})
83
+ response = Podio.connection.get("/space/#{space_id}/member/top_active/", options)
84
+ response.body.map { |profile| Contact.new(profile) }
85
+ end
86
+
60
87
  def find_memberships_for_user_in_org(org_id, user_id)
61
88
  list Podio.connection.get("/org/#{org_id}/member/#{user_id}/space_member/").body
62
89
  end
63
90
 
91
+ # @see https://developers.podio.com/doc/space-members/request-space-membership-6146231
64
92
  def request_membership(space_id)
65
93
  Podio.connection.post("/space/#{space_id}/member_request/").status
66
94
  end
67
95
 
96
+ # @see https://developers.podio.com/doc/space-members/accept-space-membership-request-6146271
68
97
  def accept_membership_request(space_id, space_member_request_id)
69
98
  Podio.connection.post("/space/#{space_id}/member_request/#{space_member_request_id}/accept").status
70
99
  end
100
+
101
+ def get_members_count(space_id)
102
+ Podio.connection.get("/space/#{space_id}/member/total").body
103
+ end
71
104
  end
72
105
  end
@@ -1,3 +1,4 @@
1
+ # @see https://developers.podio.com/doc/status
1
2
  class Podio::Status < ActivePodio::Base
2
3
  property :status_id, :integer
3
4
  property :value, :string
@@ -7,14 +8,21 @@ class Podio::Status < ActivePodio::Base
7
8
  property :alerts, :array
8
9
  property :ratings, :hash
9
10
  property :subscribed, :boolean
11
+ property :pinned, :boolean
10
12
  property :user_ratings, :hash
13
+ property :rights, :array
14
+ property :is_liked, :boolean
15
+ property :like_count, :integer
16
+ property :subscribed_count, :integer
17
+ property :push, :hash
18
+ property :presence, :hash
11
19
 
12
20
  # Properties for create
13
21
  property :file_ids, :array
14
22
  property :embed_id, :integer
15
23
  property :embed_file_id, :integer
16
24
 
17
- has_one :created_by, :class => 'Contact'
25
+ has_one :created_by, :class => 'ByLine'
18
26
  has_one :created_via, :class => 'Via'
19
27
  has_one :embed, :class => 'Embed'
20
28
  has_one :embed_file, :class => 'FileAttachment'
@@ -24,30 +32,34 @@ class Podio::Status < ActivePodio::Base
24
32
  has_many :shares, :class => 'AppStoreShare'
25
33
  has_many :files, :class => 'FileAttachment'
26
34
  has_many :questions, :class => 'Question'
27
-
35
+
28
36
  alias_method :id, :status_id
29
37
 
38
+ # @see https://developers.podio.com/doc/status/delete-a-status-message-22339
30
39
  def destroy
31
40
  Status.delete(self.id)
32
41
  end
33
-
42
+
34
43
  class << self
44
+ # @see https://developers.podio.com/doc/status/get-status-message-22337
35
45
  def find(id)
36
46
  member Podio.connection.get("/status/#{id}").body
37
47
  end
38
48
 
39
- def create(space_id, attributes)
49
+ # @see https://developers.podio.com/doc/status/add-new-status-message-22336
50
+ def create(space_id, attributes=[], options={})
40
51
  response = Podio.connection.post do |req|
41
- req.url "/status/space/#{space_id}/"
52
+ req.url("/status/space/#{space_id}/", options)
42
53
  req.body = attributes
43
54
  end
44
55
 
45
56
  response.body['status_id']
46
57
  end
47
-
58
+
59
+ # @see https://developers.podio.com/doc/status/delete-a-status-message-22339
48
60
  def delete(id)
49
61
  Podio.connection.delete("/status/#{id}").body
50
62
  end
51
63
  end
52
-
53
- end
64
+
65
+ end
@@ -0,0 +1,40 @@
1
+ # @see https://developers.podio.com/doc/stream
2
+ class Podio::StreamActivityGroup < ActivePodio::Base
3
+
4
+ property :group_id, :integer
5
+ property :kind, :string
6
+ property :type, :string
7
+ property :created_on, :datetime
8
+ property :activities, :array
9
+
10
+ has_one :data_ref, :class => 'Reference'
11
+ has_one :created_by, :class => 'ByLine'
12
+ has_one :created_via, :class => 'Via'
13
+
14
+ has_many :authors, :class => 'ByLine'
15
+
16
+ alias_method :id, :group_id
17
+
18
+ class << self
19
+
20
+ def find_by_ref(ref_type, ref_id, options = {})
21
+ list Podio.connection.get { |req|
22
+ req.url("/stream/#{ref_type}/#{ref_id}/activity_group", options)
23
+ }.body
24
+ end
25
+
26
+ def find_by_event_id(ref_type, ref_id, event_id, options={})
27
+ member Podio.connection.get { |req|
28
+ req.url("/stream/#{ref_type}/#{ref_id}/group/#{event_id}", options)
29
+ }.body
30
+ end
31
+
32
+ def find_for_data_ref(ref_type, ref_id, data_ref_type, data_ref_id, options={})
33
+ member Podio.connection.get { |req|
34
+ req.url("/stream/#{ref_type}/#{ref_id}/activity_group/#{data_ref_type}/#{data_ref_id}", options)
35
+ }.body
36
+ end
37
+
38
+ end
39
+
40
+ end
@@ -1,26 +1,25 @@
1
+ # @see https://developers.podio.com/doc/stream
1
2
  class Podio::StreamMute < ActivePodio::Base
2
3
  property :id, :integer
3
4
  property :type, :string
4
5
  property :title, :string
5
6
  property :data, :hash
6
- property :item, :boolean
7
- property :status, :boolean
8
- property :task, :boolean
9
7
 
10
8
  class << self
9
+ # @see https://developers.podio.com/doc/stream/get-mutes-in-global-stream-62742
11
10
  def find_all
12
- list Podio.connection.get('/stream/mute/v2/').body
11
+ list Podio.connection.get('/stream/mute/v2/').body
13
12
  end
14
13
 
15
- def create(scope_type, scope_id, object_type = nil)
14
+ # @see https://developers.podio.com/doc/stream/mute-object-from-global-stream-79424
15
+ def create(scope_type, scope_id)
16
16
  path = "/stream/mute/#{scope_type}/#{scope_id}"
17
- path += "/#{object_type}" unless object_type.nil?
18
17
  Podio.connection.post(path).status
19
18
  end
20
19
 
21
- def delete(scope_type, scope_id, object_type = nil)
20
+ # @see https://developers.podio.com/doc/stream/unmute-objects-from-the-global-stream-79426
21
+ def delete(scope_type, scope_id)
22
22
  path = "/stream/mute/#{scope_type}/#{scope_id}"
23
- path += "/#{object_type}" unless object_type.nil?
24
23
  Podio.connection.delete(path).status
25
24
  end
26
25
  end
@@ -1,3 +1,4 @@
1
+ # @see https://developers.podio.com/doc/stream
1
2
  class Podio::StreamObject < ActivePodio::Base
2
3
  property :id, :integer
3
4
  property :type, :string
@@ -15,7 +16,7 @@ class Podio::StreamObject < ActivePodio::Base
15
16
  has_one :app, :class => 'Application'
16
17
  has_one :space, :class => 'Space'
17
18
  has_one :org, :class => 'Organization'
18
-
19
+
19
20
  has_many :comments, :class => 'Comment'
20
21
  has_many :files, :class => 'FileAttachment'
21
22
  has_many :activity, :class => 'Activity'
@@ -23,44 +24,51 @@ class Podio::StreamObject < ActivePodio::Base
23
24
  alias_method :activities, :activity
24
25
 
25
26
  class << self
27
+ # @see https://developers.podio.com/doc/stream/get-global-stream-80012
26
28
  def find_all(options={})
27
29
  list Podio.connection.get { |req|
28
- req.url("/stream/v2/", options)
29
- }.body
30
+ req.url("/stream/", options)
31
+ }.body
30
32
  end
31
33
 
34
+ # @see https://developers.podio.com/doc/stream/get-space-stream-80039
32
35
  def find_all_by_space_id(space_id, options={})
33
36
  list Podio.connection.get { |req|
34
37
  req.url("/stream/space/#{space_id}/v2/", options)
35
- }.body
38
+ }.body
36
39
  end
37
40
 
41
+ # @see https://developers.podio.com/doc/stream/get-organization-stream-80038
38
42
  def find_all_by_org_id(org_id, options={})
39
43
  list Podio.connection.get { |req|
40
44
  req.url("/stream/org/#{org_id}/v2/", options)
41
- }.body
45
+ }.body
42
46
  end
43
47
 
48
+ # @see https://developers.podio.com/doc/stream/get-app-stream-264673
44
49
  def find_all_by_app_id(app_id, options={})
45
50
  list Podio.connection.get { |req|
46
51
  req.url("/stream/app/#{app_id}/", options)
47
- }.body
52
+ }.body
48
53
  end
49
54
 
55
+ # @see https://developers.podio.com/doc/stream/get-user-stream-1289318
50
56
  def find_all_by_user_id(user_id, options={})
51
57
  list Podio.connection.get { |req|
52
58
  req.url("/stream/user/#{user_id}/", options)
53
- }.body
59
+ }.body
54
60
  end
55
-
61
+
62
+ # @see https://developers.podio.com/doc/stream/get-stream-object-80054
56
63
  def find_by_ref(ref_type, ref_id)
57
64
  member Podio.connection.get("/stream/#{ref_type}/#{ref_id}/v2").body
58
65
  end
59
-
66
+
67
+ # @see https://developers.podio.com/doc/stream/get-personal-stream-1656647
60
68
  def find_all_personal(options={})
61
69
  list Podio.connection.get { |req|
62
70
  req.url("/stream/personal/", options)
63
- }.body
64
- end
71
+ }.body
72
+ end
65
73
  end
66
74
  end
@@ -1,31 +1,37 @@
1
+ # @see https://developers.podio.com/doc/subscriptions
1
2
  class Podio::Subscription < ActivePodio::Base
2
3
  property :started_on, :datetime
3
4
  property :notifications, :integer
4
5
  property :ref, :hash
5
6
 
6
7
  class << self
8
+ # @see https://developers.podio.com/doc/subscriptions/get-subscription-by-id-22446
7
9
  def find(id)
8
10
  member Podio.connection.get("/subscription/#{id}").body
9
11
  end
10
12
 
13
+ # @see https://developers.podio.com/doc/subscriptions/get-subscription-by-reference-22408
11
14
  def find_by_reference(ref_type, ref_id)
12
15
  member Podio.connection.get("/subscription/#{ref_type}/#{ref_id}").body
13
16
  end
14
17
 
18
+ # @see https://developers.podio.com/doc/subscriptions/subscribe-22409
15
19
  def create(ref_type, ref_id)
16
20
  Podio.connection.post("/subscription/#{ref_type}/#{ref_id}").body['subscription_id']
17
21
  end
18
22
 
23
+ # @see https://developers.podio.com/doc/subscriptions/unsubscribe-by-id-22445
19
24
  def delete(id)
20
25
  Podio.connection.delete("/subscription/#{id}")
21
26
  end
22
27
 
28
+ # @see https://developers.podio.com/doc/subscriptions/unsubscribe-by-reference-22410
23
29
  def delete_by_reference(ref_type, ref_id)
24
30
  Podio.connection.delete("/subscription/#{ref_type}/#{ref_id}")
25
31
  end
26
32
 
27
33
  def find_subscribers_by_reference(ref_type, ref_id)
28
- User.list Podio.connection.get("/subscription/#{ref_type}/#{ref_id}/").body
34
+ User.list Podio.connection.get("/subscription/#{ref_type}/#{ref_id}/user").body
29
35
  end
30
36
  end
31
37
  end
@@ -1,8 +1,10 @@
1
+ # @see https://developers.podio.com/doc/tags
1
2
  class Podio::Tag < ActivePodio::Base
2
3
  property :count, :integer
3
4
  property :text, :string
4
-
5
+
5
6
  class << self
7
+ # @see https://developers.podio.com/doc/tags/create-tags-22464
6
8
  def create(tagable_type, tagable_id, attributes)
7
9
  response = Podio.connection.post do |req|
8
10
  req.url "/tag/#{tagable_type}/#{tagable_id}/"
@@ -12,6 +14,7 @@ class Podio::Tag < ActivePodio::Base
12
14
  response.body
13
15
  end
14
16
 
17
+ # @see https://developers.podio.com/doc/tags/update-tags-39859
15
18
  def update(tagable_type, tagable_id, attributes)
16
19
  response = Podio.connection.put do |req|
17
20
  req.url "/tag/#{tagable_type}/#{tagable_id}/"
@@ -21,11 +24,13 @@ class Podio::Tag < ActivePodio::Base
21
24
  response.body
22
25
  end
23
26
 
27
+ # @see https://developers.podio.com/doc/tags/get-tags-on-app-22467
24
28
  def find_by_app(app_id, limit, text)
25
29
  text = CGI.escape(text) if text
26
30
  list Podio.connection.get("/tag/app/#{app_id}/?limit=#{limit}&text=#{text}").body
27
31
  end
28
32
 
33
+ # @see https://developers.podio.com/doc/tags/get-tags-on-app-top-68485
29
34
  def find_top_by_app(app_id, limit, text)
30
35
  text = CGI.escape(text) if text
31
36
  Podio.connection.get("/tag/app/#{app_id}/top/?limit=#{limit}&text=#{text}").body
@@ -1,10 +1,11 @@
1
+ # @see https://developers.podio.com/doc/tags
1
2
  class Podio::TagSearch < ActivePodio::Base
2
3
  property :id, :integer
3
4
  property :type, :string
4
5
  property :title, :string
5
6
  property :link, :string
6
7
  property :created_on, :datetime
7
-
8
+
8
9
  class << self
9
10
  def search_by_space(space_id, text)
10
11
  text = CGI.escape(text) if text
@@ -1,3 +1,4 @@
1
+ # @see https://developers.podio.com/doc/tasks
1
2
  class Podio::Task < ActivePodio::Base
2
3
  include ActivePodio::Updatable
3
4
 
@@ -6,10 +7,11 @@ class Podio::Task < ActivePodio::Base
6
7
  property :group, :string
7
8
  property :text, :string
8
9
  property :description, :string
10
+ property :rights, :array
9
11
  property :private, :boolean
10
12
  property :due_date, :date
11
13
  property :due_time, :time
12
- property :due_on, :datetime, :convert_incoming_local_datetime_to_utc => true
14
+ property :due_on, :datetime
13
15
  property :responsible, :hash
14
16
  property :space_id, :integer
15
17
  property :link, :string
@@ -19,6 +21,11 @@ class Podio::Task < ActivePodio::Base
19
21
  property :label_ids, :array # when inputting tasks
20
22
  property :labels, :array # when outputting tasks
21
23
  property :external_id, :string
24
+ property :subscribed, :boolean
25
+ property :subscribed_count, :integer
26
+ property :pinned, :boolean
27
+ property :push, :hash
28
+ property :presence, :hash
22
29
 
23
30
  # old references
24
31
  property :ref_type, :string
@@ -43,6 +50,7 @@ class Podio::Task < ActivePodio::Base
43
50
 
44
51
  alias_method :id, :task_id
45
52
 
53
+ # @see https://developers.podio.com/doc/tasks/create-task-22419
46
54
  def create
47
55
  result = self.create_multiple # Could return false if API call failed
48
56
  self.task_id = result.first.id if result
@@ -58,63 +66,83 @@ class Podio::Task < ActivePodio::Base
58
66
  end
59
67
  end
60
68
 
69
+ # @see https://developers.podio.com/doc/tasks/delete-task-77179
61
70
  def destroy
62
71
  self.class.delete(self.id)
63
72
  end
64
73
 
74
+ # @see https://developers.podio.com/doc/tasks/update-task-reference-170733
65
75
  def update_reference(ref_type, ref_id)
66
76
  self.class.update_reference(self.id, ref_type, ref_id)
67
77
  end
68
78
 
79
+ # @see https://developers.podio.com/doc/tasks/remove-task-reference-6146114
69
80
  def delete_reference
70
81
  self.class.delete_reference(self.id)
71
82
  end
72
83
 
84
+ # @see https://developers.podio.com/doc/tasks/update-task-labels-151769
73
85
  def update_labels(label_ids)
74
86
  self.class.update_labels(self.id, label_ids)
75
87
  end
76
88
 
89
+ # @see https://developers.podio.com/doc/tasks/complete-task-22432
77
90
  def complete
78
91
  self.class.complete(self.id)
79
92
  end
80
93
 
94
+ # @see https://developers.podio.com/doc/tasks/incomplete-task-22433
81
95
  def uncomplete
82
96
  self.class.incomplete(self.id)
83
97
  end
84
98
 
99
+ # @see https://developers.podio.com/doc/tasks/rank-task-81015
85
100
  def rank(previous_task, next_task)
86
101
  self.class.rank(self.id, previous_task && previous_task.to_i, next_task && next_task.to_i)
87
102
  end
88
103
 
89
- handle_api_errors_for :create_multiple, :destroy, :complete, :uncomplete, :update_reference # Call must be made after the methods to handle have been defined
90
-
91
104
  class << self
92
- def create(attributes)
105
+ # @see https://developers.podio.com/doc/tasks/create-task-22419
106
+ def create(attributes, options = {})
93
107
  response = Podio.connection.post do |req|
94
- req.url "/task/"
108
+ req.url("/task/", options)
95
109
  req.body = attributes
96
110
  end
97
111
 
98
112
  list [response.body].flatten
99
113
  end
100
114
 
101
- def create_with_ref(ref_type, ref_id, attributes)
115
+ # @see https://developers.podio.com/doc/tasks/create-task-with-reference-22420
116
+ def create_with_ref(ref_type, ref_id, attributes, options = {})
102
117
  response = Podio.connection.post do |req|
103
- req.url "/task/#{ref_type}/#{ref_id}/"
118
+ req.url("/task/#{ref_type}/#{ref_id}/", options)
104
119
  req.body = attributes
105
120
  end
106
121
 
107
122
  list [response.body].flatten
108
123
  end
109
124
 
125
+ # @see https://developers.podio.com/doc/tasks/update-task-10583674
126
+ def update(id, attributes, options = {})
127
+ response = Podio.connection.put do |req|
128
+ req.url("/task/#{id}", options)
129
+ req.body = attributes
130
+ end
131
+
132
+ member response.body
133
+ end
134
+
135
+ # @see https://developers.podio.com/doc/tasks/update-task-description-76982
110
136
  def update_description(id, description)
111
137
  Podio.connection.put("/task/#{id}/description", {:description => description}).status
112
138
  end
113
139
 
140
+ # @see https://developers.podio.com/doc/tasks/update-task-text-22428
114
141
  def update_text(id, text)
115
142
  Podio.connection.put("/task/#{id}/text", {:text => text}).status
116
143
  end
117
144
 
145
+ # @see https://developers.podio.com/doc/tasks/update-task-private-22434
118
146
  def update_private(id, private_flag)
119
147
  Podio.connection.put("/task/#{id}/private", {:private => private_flag}).status
120
148
  end
@@ -123,88 +151,116 @@ class Podio::Task < ActivePodio::Base
123
151
  Podio.connection.put("/task/#{id}/due_date", {:due_date => due_date}).status
124
152
  end
125
153
 
154
+ # @see https://developers.podio.com/doc/tasks/update-task-due-on-3442633
126
155
  def update_due_on(id, options)
127
156
  Podio.connection.put("/task/#{id}/due_on", options).status
128
157
  end
129
158
 
159
+ # @see https://developers.podio.com/doc/tasks/assign-task-22412
130
160
  def update_assignee(id, user_id)
131
161
  Podio.connection.post("/task/#{id}/assign", {:responsible => user_id}).status
132
162
  end
133
163
 
164
+ # @see https://developers.podio.com/doc/tasks/update-task-reference-170733
134
165
  def update_reference(id, ref_type, ref_id)
135
166
  Podio.connection.put("/task/#{id}/ref", {:ref_type => ref_type, :ref_id => ref_id}).status
136
167
  end
137
168
 
169
+ # @see https://developers.podio.com/doc/tasks/remove-task-reference-6146114
138
170
  def delete_reference(task_id)
139
171
  Podio.connection.delete("/task/#{task_id}/ref").status
140
172
  end
141
173
 
174
+ # @see https://developers.podio.com/doc/tasks/update-task-labels-151769
142
175
  def update_labels(id, label_ids)
143
176
  Podio.connection.put("/task/#{id}/label/", label_ids).status
144
177
  end
145
178
 
179
+ # @see https://developers.podio.com/doc/tasks/delete-task-77179
146
180
  def delete(id)
147
181
  Podio.connection.delete("/task/#{id}").status
148
182
  end
149
183
 
184
+ # @see https://developers.podio.com/doc/tasks/complete-task-22432
150
185
  def complete(id)
151
186
  Podio.connection.post("/task/#{id}/complete").body
152
187
  end
153
188
 
189
+ # @see https://developers.podio.com/doc/tasks/incomplete-task-22433
154
190
  def incomplete(id)
155
191
  Podio.connection.post("/task/#{id}/incomplete").body
156
192
  end
157
193
 
194
+ # @see https://developers.podio.com/doc/tasks/rank-task-81015
158
195
  def rank(id, before_task_id, after_task_id)
159
196
  Podio.connection.post("/task/#{id}/rank", {:before => before_task_id, :after => after_task_id}).body
160
197
  end
161
198
 
162
- def find(id)
163
- member Podio.connection.get("/task/#{id}").body
199
+ # @see https://developers.podio.com/doc/tasks/get-task-22413
200
+ def find(id, options = {})
201
+ member Podio.connection.get("/task/#{id}", options).body
164
202
  end
165
203
 
204
+ # @see https://developers.podio.com/doc/tasks/get-tasks-with-reference-22426
166
205
  def find_for_reference(ref_type, ref_id)
167
206
  list Podio.connection.get("/task/#{ref_type}/#{ref_id}/").body
168
207
  end
169
208
 
209
+ # @see https://developers.podio.com/doc/tasks/get-tasks-77949
170
210
  def find_all(options={})
171
211
  list Podio.connection.get { |req|
172
212
  req.url('/task/', options)
173
213
  }.body
174
214
  end
175
215
 
176
- def find_summary
177
- response = Podio.connection.get("/task/summary").body
216
+ # @see https://developers.podio.com/doc/tasks/get-task-summary-1612017
217
+ def find_summary(options={})
218
+ response = Podio.connection.get { |req|
219
+ req.url("/task/summary", options)
220
+ }.body
178
221
  response['overdue']['tasks'] = list(response['overdue']['tasks'])
179
222
  response['today']['tasks'] = list(response['today']['tasks'])
180
223
  response['other']['tasks'] = list(response['other']['tasks'])
181
224
  response
182
225
  end
183
226
 
184
- def find_summary_for_org(org_id, limit=nil)
185
- response = Podio.connection.get("/task/org/#{org_id}/summary" +
186
- ((limit != nil) ? "?limit=#{limit}" : "")).body
227
+ # @see https://developers.podio.com/doc/tasks/get-task-summary-for-organization-1612063
228
+ def find_summary_for_org(org_id, options={})
229
+ response = Podio.connection.get { |req|
230
+ req.url("/task/org/#{org_id}/summary", options)
231
+ }.body
187
232
  response['overdue']['tasks'] = list(response['overdue']['tasks'])
188
233
  response['today']['tasks'] = list(response['today']['tasks'])
189
234
  response['other']['tasks'] = list(response['other']['tasks'])
190
235
  response
191
236
  end
192
237
 
193
- def find_summary_for_reference(ref_type, ref_id)
194
- response = Podio.connection.get("/task/#{ref_type}/#{ref_id}/summary").body
238
+ # @see https://developers.podio.com/doc/tasks/get-task-summary-for-reference-1657980
239
+ def find_summary_for_reference(ref_type, ref_id, options={})
240
+ response = Podio.connection.get { |req|
241
+ req.url("/task/#{ref_type}/#{ref_id}/summary", options)
242
+ }.body
195
243
  response['overdue']['tasks'] = list(response['overdue']['tasks'])
196
244
  response['today']['tasks'] = list(response['today']['tasks'])
197
245
  response['other']['tasks'] = list(response['other']['tasks'])
198
246
  response
199
247
  end
200
248
 
201
- def find_personal_summary
202
- response = Podio.connection.get("/task/personal/summary").body
249
+ # @see https://developers.podio.com/doc/tasks/get-task-summary-for-personal-1657217
250
+ def find_personal_summary(options={})
251
+ response = Podio.connection.get { |req|
252
+ req.url("/task/personal/summary", options)
253
+ }.body
203
254
  response['overdue']['tasks'] = list(response['overdue']['tasks'])
204
255
  response['today']['tasks'] = list(response['today']['tasks'])
205
256
  response['other']['tasks'] = list(response['other']['tasks'])
206
257
  response
207
258
  end
208
259
 
260
+ # @see https://developers.podio.com/doc/tasks/get-task-count-38316458
261
+ def count_by_ref(ref_type, ref_id)
262
+ Podio.connection.get("/task/#{ref_type}/#{ref_id}/count").body['count']
263
+ end
264
+
209
265
  end
210
266
  end