podio 1.0.0 → 2.0.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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +1 -4
- data/README.md +82 -67
- data/lib/podio.rb +15 -2
- data/lib/podio/client.rb +11 -7
- data/lib/podio/middleware/error_response.rb +3 -1
- data/lib/podio/middleware/json_response.rb +6 -1
- data/lib/podio/middleware/logger.rb +4 -3
- data/lib/podio/middleware/oauth2.rb +5 -5
- data/lib/podio/models/answer.rb +8 -0
- data/lib/podio/models/app_store_category.rb +2 -2
- data/lib/podio/models/app_store_share.rb +1 -0
- data/lib/podio/models/application.rb +12 -4
- data/lib/podio/models/application_field.rb +10 -0
- data/lib/podio/models/batch.rb +1 -0
- data/lib/podio/models/calendar_event.rb +6 -5
- data/lib/podio/models/campaign.rb +88 -0
- data/lib/podio/models/category.rb +1 -1
- data/lib/podio/models/contract.rb +18 -20
- data/lib/podio/models/contract_attribution.rb +24 -0
- data/lib/podio/models/contract_period.rb +22 -0
- data/lib/podio/models/contract_price.rb +37 -26
- data/lib/podio/models/device.rb +22 -0
- data/lib/podio/models/email_subscription_setting.rb +8 -0
- data/lib/podio/models/embed.rb +5 -2
- data/lib/podio/models/experiment.rb +26 -3
- data/lib/podio/models/extension.rb +90 -0
- data/lib/podio/models/external_file.rb +3 -3
- data/lib/podio/models/file_attachment.rb +25 -2
- data/lib/podio/models/form.rb +2 -1
- data/lib/podio/models/grant.rb +1 -0
- data/lib/podio/models/invoice.rb +13 -0
- data/lib/podio/models/item.rb +24 -11
- data/lib/podio/models/item_field.rb +6 -0
- data/lib/podio/models/item_transaction.rb +34 -0
- data/lib/podio/models/live.rb +1 -17
- data/lib/podio/models/notification.rb +5 -0
- data/lib/podio/models/o_auth.rb +9 -2
- data/lib/podio/models/o_auth_client.rb +5 -3
- data/lib/podio/models/o_auth_scope.rb +11 -0
- data/lib/podio/models/organization.rb +26 -8
- data/lib/podio/models/organization_member.rb +6 -0
- data/lib/podio/models/organization_membership.rb +15 -0
- data/lib/podio/models/profile.rb +2 -0
- data/lib/podio/models/promotion.rb +6 -8
- data/lib/podio/models/promotion_group.rb +51 -0
- data/lib/podio/models/promotion_group_member.rb +32 -0
- data/lib/podio/models/rating.rb +4 -2
- data/lib/podio/models/reference.rb +2 -1
- data/lib/podio/models/space.rb +11 -5
- data/lib/podio/models/tag.rb +36 -0
- data/lib/podio/models/view.rb +5 -0
- data/lib/podio/models/vote.rb +8 -0
- data/lib/podio/models/voting.rb +9 -0
- data/lib/podio/models/voucher.rb +68 -0
- data/lib/podio/version.rb +1 -1
- data/podio.gemspec +10 -3
- data/test/client_test.rb +14 -0
- metadata +31 -13
- data/lib/podio/models/contract_price_v2.rb +0 -31
- data/lib/podio/models/date_election.rb +0 -35
@@ -14,8 +14,8 @@ class Podio::AppStoreCategory < ActivePodio::Base
|
|
14
14
|
end
|
15
15
|
|
16
16
|
# @see https://developers.podio.com/doc/app-market/get-categories-37009
|
17
|
-
def find_all
|
18
|
-
categories = Podio.connection.get("/app_store/category/").body
|
17
|
+
def find_all(options = {})
|
18
|
+
categories = Podio.connection.get("/app_store/category/", options).body
|
19
19
|
|
20
20
|
categories.each do | key, value |
|
21
21
|
categories[key] = list value
|
@@ -3,17 +3,21 @@ class Podio::Application < ActivePodio::Base
|
|
3
3
|
property :app_id, :integer
|
4
4
|
property :original, :integer
|
5
5
|
property :original_revision, :integer
|
6
|
+
property :current_revision, :integer
|
6
7
|
property :status, :string
|
7
8
|
property :icon, :string
|
8
9
|
property :icon_id, :integer
|
10
|
+
property :default_view_id, :integer
|
9
11
|
property :pinned, :boolean
|
10
12
|
property :space_id, :integer
|
11
13
|
property :owner_id, :integer
|
12
14
|
property :owner, :hash
|
13
15
|
property :config, :hash
|
14
16
|
property :fields, :array
|
17
|
+
property :votings, :array
|
15
18
|
property :subscribed, :boolean
|
16
19
|
property :integration, :hash
|
20
|
+
property :layouts, :hash
|
17
21
|
property :rights, :array
|
18
22
|
property :link, :string
|
19
23
|
property :url_add, :string
|
@@ -47,13 +51,17 @@ class Podio::Application < ActivePodio::Base
|
|
47
51
|
end
|
48
52
|
|
49
53
|
# @see https://developers.podio.com/doc/applications/get-app-on-space-by-url-label-477105
|
50
|
-
def find_by_url_label(space_id, url_label)
|
51
|
-
member Podio.connection.get
|
54
|
+
def find_by_url_label(space_id, url_label, options={})
|
55
|
+
member Podio.connection.get { |req|
|
56
|
+
req.url("/app/space/#{space_id}/#{url_label}", options)
|
57
|
+
}.body
|
52
58
|
end
|
53
59
|
|
54
60
|
# @see https://developers.podio.com/doc/applications/get-app-by-org-label-space-label-and-app-label-91708386
|
55
|
-
def find_by_org_space_and_app_labels(org_label, space_label, app_label)
|
56
|
-
member Podio.connection.get
|
61
|
+
def find_by_org_space_and_app_labels(org_label, space_label, app_label, options={})
|
62
|
+
member Podio.connection.get { |req|
|
63
|
+
req.url("/app/org/#{org_label}/space/#{space_label}/#{app_label}", options)
|
64
|
+
}.body
|
57
65
|
end
|
58
66
|
|
59
67
|
def find_all(options={})
|
@@ -17,5 +17,15 @@ class Podio::ApplicationField < ActivePodio::Base
|
|
17
17
|
member Podio.connection.get("/app/#{app_id}/field/#{field_id}").body
|
18
18
|
end
|
19
19
|
|
20
|
+
# @see https://developers.podio.com/doc/applications/update-an-app-field-22356
|
21
|
+
def update(app_id, field_id, attributes)
|
22
|
+
Podio.connection.put("/app/#{app_id}/field/#{field_id}", attributes).body['revision']
|
23
|
+
end
|
24
|
+
|
25
|
+
# @see https://developers.podio.com/doc/applications/add-new-app-field-22354
|
26
|
+
def create(app_id, attributes)
|
27
|
+
Podio.connection.post("/app/#{app_id}/field/", attributes).body['field_id']
|
28
|
+
end
|
29
|
+
|
20
30
|
end
|
21
31
|
end
|
data/lib/podio/models/batch.rb
CHANGED
@@ -18,7 +18,8 @@ class Podio::CalendarEvent < ActivePodio::Base
|
|
18
18
|
property :link, :string
|
19
19
|
property :app, :hash
|
20
20
|
property :source, :string
|
21
|
-
|
21
|
+
property :color, :string
|
22
|
+
|
22
23
|
alias_method :id, :uid
|
23
24
|
|
24
25
|
class << self
|
@@ -50,7 +51,7 @@ class Podio::CalendarEvent < ActivePodio::Base
|
|
50
51
|
}.body
|
51
52
|
end
|
52
53
|
|
53
|
-
# @see
|
54
|
+
# @see
|
54
55
|
def move_event(uid, attributes={})
|
55
56
|
response = Podio.connection.post do |req|
|
56
57
|
req.url "/calendar/event/#{uid}/move"
|
@@ -59,7 +60,7 @@ class Podio::CalendarEvent < ActivePodio::Base
|
|
59
60
|
member response.body
|
60
61
|
end
|
61
62
|
|
62
|
-
# @see
|
63
|
+
# @see
|
63
64
|
def move_event_external(linked_account_id, uid, attributes={})
|
64
65
|
response = Podio.connection.post do |req|
|
65
66
|
req.url "/calendar/linked_account/#{linked_account_id}/event/#{CGI.escape(uid)}/move"
|
@@ -68,7 +69,7 @@ class Podio::CalendarEvent < ActivePodio::Base
|
|
68
69
|
member response.body
|
69
70
|
end
|
70
71
|
|
71
|
-
# @see
|
72
|
+
# @see
|
72
73
|
def update_event_duration(uid, attributes={})
|
73
74
|
response = Podio.connection.put do |req|
|
74
75
|
req.url "/calendar/event/#{uid}/duration"
|
@@ -77,7 +78,7 @@ class Podio::CalendarEvent < ActivePodio::Base
|
|
77
78
|
member response.body
|
78
79
|
end
|
79
80
|
|
80
|
-
# @see
|
81
|
+
# @see
|
81
82
|
def update_event_duration_external(linked_account_id, uid, attributes={})
|
82
83
|
response = Podio.connection.put do |req|
|
83
84
|
req.url "/calendar/linked_account/#{linked_account_id}/event/#{CGI.escape(uid)}/duration"
|
@@ -0,0 +1,88 @@
|
|
1
|
+
class Podio::Campaign < ActivePodio::Base
|
2
|
+
include ActivePodio::Updatable
|
3
|
+
|
4
|
+
property :campaign_id, :integer
|
5
|
+
property :name, :string
|
6
|
+
property :description, :string
|
7
|
+
property :status, :string
|
8
|
+
property :tier, :string
|
9
|
+
property :rebate_type, :string
|
10
|
+
property :rebate_config, :hash
|
11
|
+
property :duration_type, :string
|
12
|
+
property :duration_config, :hash
|
13
|
+
property :usages, :integer
|
14
|
+
|
15
|
+
alias_method :id, :campaign_id
|
16
|
+
|
17
|
+
def create
|
18
|
+
result = self.class.create(self.attributes)
|
19
|
+
self.update_attributes(result.attributes)
|
20
|
+
end
|
21
|
+
|
22
|
+
def update
|
23
|
+
result = self.class.update(self.campaign_id, self.attributes)
|
24
|
+
self.update_attributes(result.attributes)
|
25
|
+
end
|
26
|
+
|
27
|
+
def activate
|
28
|
+
self.class.activate(self.campaign_id)
|
29
|
+
end
|
30
|
+
|
31
|
+
def deactivate
|
32
|
+
self.class.deactivate(self.campaign_id)
|
33
|
+
end
|
34
|
+
|
35
|
+
def delete
|
36
|
+
self.class.delete(self.campaign_id)
|
37
|
+
end
|
38
|
+
|
39
|
+
def active?
|
40
|
+
self.status == 'active'
|
41
|
+
end
|
42
|
+
|
43
|
+
def inactive?
|
44
|
+
self.status == 'inactive'
|
45
|
+
end
|
46
|
+
|
47
|
+
class << self
|
48
|
+
def create(attributes)
|
49
|
+
member Podio.connection.post { |req|
|
50
|
+
req.url "/campaign/"
|
51
|
+
req.body = attributes
|
52
|
+
}.body
|
53
|
+
end
|
54
|
+
|
55
|
+
def update(id, attributes)
|
56
|
+
member Podio.connection.put { |req|
|
57
|
+
req.url "/campaign/#{id}"
|
58
|
+
req.body = attributes
|
59
|
+
}.body
|
60
|
+
end
|
61
|
+
|
62
|
+
def delete(id)
|
63
|
+
Podio.connection.delete("/campaign/#{id}").status
|
64
|
+
end
|
65
|
+
|
66
|
+
def activate(id)
|
67
|
+
Podio.connection.post("/campaign/#{id}/activate").status
|
68
|
+
end
|
69
|
+
|
70
|
+
def deactivate(id)
|
71
|
+
Podio.connection.post("/campaign/#{id}/deactivate").status
|
72
|
+
end
|
73
|
+
|
74
|
+
def find(id)
|
75
|
+
member Podio.connection.get("/campaign/#{id}").body
|
76
|
+
end
|
77
|
+
|
78
|
+
def find_all(options = {})
|
79
|
+
list Podio.connection.get { |req|
|
80
|
+
req.url("/campaign/", options)
|
81
|
+
}.body
|
82
|
+
end
|
83
|
+
|
84
|
+
def find_usage(id)
|
85
|
+
Podio.connection.get("/campaign/#{id}/usage").body
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -7,6 +7,7 @@ class Podio::Contract < ActivePodio::Base
|
|
7
7
|
property :blocked, :boolean
|
8
8
|
property :created_on, :datetime
|
9
9
|
property :started_on, :datetime
|
10
|
+
property :reconciled_until, :datetime
|
10
11
|
property :created_via, :string
|
11
12
|
property :ended_on, :datetime
|
12
13
|
property :item_prices, :hash
|
@@ -35,18 +36,18 @@ class Podio::Contract < ActivePodio::Base
|
|
35
36
|
property :mrr, :decimal
|
36
37
|
property :days_overdue, :integer
|
37
38
|
property :overdue_status, :string
|
39
|
+
property :tier, :string
|
38
40
|
|
39
41
|
has_one :org, :class => 'Organization'
|
40
42
|
has_one :user, :class => 'User'
|
41
43
|
has_one :sold_by, :class => 'User'
|
42
44
|
has_one :price, :class => 'ContractPrice'
|
43
|
-
has_one :price_v2, :class => 'ContractPriceV2'
|
44
45
|
has_many :premium_spaces, :class => 'Space'
|
45
46
|
|
46
47
|
alias_method :id, :contract_id
|
47
48
|
|
48
|
-
def
|
49
|
-
self[:
|
49
|
+
def price=(attributes)
|
50
|
+
self[:price] = attributes
|
50
51
|
end
|
51
52
|
|
52
53
|
def premium_space_ids=(values)
|
@@ -63,12 +64,6 @@ class Podio::Contract < ActivePodio::Base
|
|
63
64
|
self["price"] = pricing
|
64
65
|
end
|
65
66
|
|
66
|
-
def calculate_price_v2
|
67
|
-
pricing = self.class.calculate_price_v2(self.contract_id, self.attributes.slice(:full, :premium_emp_network, :premium_space_ids))
|
68
|
-
self.clear_price_v2
|
69
|
-
self["price_v2"] = pricing
|
70
|
-
end
|
71
|
-
|
72
67
|
def create_payment(query_string)
|
73
68
|
self.class.create_payment(self.contract_id, query_string)
|
74
69
|
end
|
@@ -102,10 +97,14 @@ class Podio::Contract < ActivePodio::Base
|
|
102
97
|
def unblock
|
103
98
|
self.class.unblock(self.contract_id)
|
104
99
|
end
|
100
|
+
|
101
|
+
def tier_prices
|
102
|
+
self.class.get_tier_prices(self.contract_id)
|
103
|
+
end
|
105
104
|
|
106
105
|
class << self
|
107
|
-
def find(contract_id)
|
108
|
-
member Podio.connection.get("/contract/#{contract_id}").body
|
106
|
+
def find(contract_id, options={})
|
107
|
+
member Podio.connection.get("/contract/#{contract_id}", options).body
|
109
108
|
end
|
110
109
|
|
111
110
|
def find_all_mine
|
@@ -167,16 +166,7 @@ class Podio::Contract < ActivePodio::Base
|
|
167
166
|
req.url "/contract/#{contract_id}/price"
|
168
167
|
req.body = attributes
|
169
168
|
end
|
170
|
-
|
171
|
-
response.body
|
172
|
-
end
|
173
169
|
|
174
|
-
def calculate_price_v2(contract_id, attributes)
|
175
|
-
response = Podio.connection.post do |req|
|
176
|
-
req.url "/contract/#{contract_id}/price/v2"
|
177
|
-
req.body = attributes
|
178
|
-
end
|
179
|
-
|
180
170
|
response.body
|
181
171
|
end
|
182
172
|
|
@@ -212,5 +202,13 @@ class Podio::Contract < ActivePodio::Base
|
|
212
202
|
response = Podio.connection.post("/contract/#{contract_id}/unblock")
|
213
203
|
response.status
|
214
204
|
end
|
205
|
+
|
206
|
+
def get_tier_prices(contract_id)
|
207
|
+
Podio.connection.get("/contract/#{contract_id}/price/tier").body
|
208
|
+
end
|
209
|
+
|
210
|
+
def get_list_prices
|
211
|
+
Podio.connection.get('/contract/price/').body
|
212
|
+
end
|
215
213
|
end
|
216
214
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class Podio::ContractAttribution < ActivePodio::Base
|
2
|
+
|
3
|
+
property :contract_id, :integer
|
4
|
+
property :name, :string
|
5
|
+
property :partner_id, :string
|
6
|
+
|
7
|
+
alias_method :id, :contract_id
|
8
|
+
|
9
|
+
class << self
|
10
|
+
|
11
|
+
def find(contract_id, options={})
|
12
|
+
member Podio.connection.get("contract/attribution/#{contract_id}", options).body
|
13
|
+
end
|
14
|
+
|
15
|
+
def update(contract_id, partner_id)
|
16
|
+
member Podio.connection.put { |req|
|
17
|
+
req.url("/contract/attribution/#{contract_id}")
|
18
|
+
req.body = {:partner_id => partner_id}
|
19
|
+
}.body
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class Podio::ContractPeriod < ActivePodio::Base
|
2
|
+
property :start, :datetime
|
3
|
+
property :end, :datetime
|
4
|
+
property :prices, :hash
|
5
|
+
property :quantities, :hash
|
6
|
+
property :total_mrr, :decimal
|
7
|
+
property :mrr, :hash
|
8
|
+
property :rebate, :hash
|
9
|
+
property :saved_mrr, :float
|
10
|
+
property :list_prices, :hash
|
11
|
+
property :invoice_interval, :integer
|
12
|
+
property :tier, :string
|
13
|
+
|
14
|
+
has_many :users, :class => 'ContractUser'
|
15
|
+
|
16
|
+
class << self
|
17
|
+
def find_all_for_contract(contract_id, start_date, end_date)
|
18
|
+
list Podio.connection.get("/contract/#{contract_id}/history", {:start => start_date, :end => end_date}).body
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -1,42 +1,53 @@
|
|
1
1
|
class Podio::ContractPrice < ActivePodio::Base
|
2
|
-
property :total, :float
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
has_one :employee, :class => 'ContractPriceItem'
|
4
|
+
has_one :external, :class => 'ContractPriceItem'
|
5
|
+
has_one :item, :class => 'ContractPriceItem'
|
6
|
+
|
7
|
+
def mrr_saved
|
8
|
+
self.employee.mrr_saved + self.external.mrr_saved
|
8
9
|
end
|
9
|
-
|
10
|
-
def
|
11
|
-
|
10
|
+
|
11
|
+
def mrr_list
|
12
|
+
self.employee.mrr_list + self.external.mrr_list
|
12
13
|
end
|
13
14
|
|
14
|
-
def
|
15
|
-
|
15
|
+
def mrr
|
16
|
+
self.employee.mrr + self.external.mrr
|
16
17
|
end
|
17
18
|
|
18
|
-
def
|
19
|
-
|
19
|
+
def total
|
20
|
+
self.employee.sub_total + self.external.sub_total
|
20
21
|
end
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
if @items.nil?
|
28
|
-
@items = {}
|
29
|
-
self[:items].each do |key, attributes|
|
30
|
-
@items[key] = Podio::ContractPriceItem.new(attributes)
|
23
|
+
class << self
|
24
|
+
def calculate(contract_id, attributes)
|
25
|
+
response = Podio.connection.post do |req|
|
26
|
+
req.url "/contract/#{contract_id}/price"
|
27
|
+
req.body = attributes
|
31
28
|
end
|
29
|
+
|
30
|
+
member response.body
|
32
31
|
end
|
33
|
-
@items
|
34
|
-
end
|
35
32
|
|
33
|
+
end
|
36
34
|
end
|
37
35
|
|
38
36
|
class Podio::ContractPriceItem < ActivePodio::Base
|
39
|
-
property :
|
40
|
-
property :
|
41
|
-
property :
|
37
|
+
property :list_price, :float #The list price per user
|
38
|
+
property :price, :float # Price per user
|
39
|
+
property :price_rebate, :float # The rebate on the price
|
40
|
+
property :quantity, :integer # Number of users
|
41
|
+
property :mrr_saved, :float #The MRR saved
|
42
|
+
property :mrr_list, :float #The MRR based on the list price
|
43
|
+
property :mrr, :float #The MRR on the rebated price
|
44
|
+
|
45
|
+
def sub_total
|
46
|
+
if self.quantity
|
47
|
+
(self.quantity*self.price).to_f
|
48
|
+
else
|
49
|
+
0.to_f
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
42
53
|
end
|