podio 0.5.1 → 0.6.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/.travis.yml +9 -0
- data/Gemfile +2 -0
- data/Rakefile +2 -0
- data/lib/podio.rb +19 -43
- data/lib/podio/active_podio/base.rb +83 -23
- data/lib/podio/client.rb +14 -3
- data/lib/podio/models/action.rb +15 -0
- data/lib/podio/models/activation_status.rb +9 -0
- data/lib/podio/models/activity.rb +10 -0
- data/lib/podio/models/app_store_share.rb +2 -0
- data/lib/podio/models/application.rb +30 -1
- data/lib/podio/models/application_field.rb +2 -1
- data/lib/podio/models/bulletin.rb +1 -0
- data/lib/podio/models/calendar.rb +45 -0
- data/lib/podio/models/calendar_mute.rb +27 -0
- data/lib/podio/models/comment.rb +1 -0
- data/lib/podio/models/connection.rb +7 -1
- data/lib/podio/models/contact.rb +9 -1
- data/lib/podio/models/contract.rb +113 -0
- data/lib/podio/models/contract_accounting.rb +33 -0
- data/lib/podio/models/contract_price.rb +46 -0
- data/lib/podio/models/email_subscription_setting.rb +2 -0
- data/lib/podio/models/file_attachment.rb +16 -7
- data/lib/podio/models/filter.rb +11 -0
- data/lib/podio/models/form.rb +26 -2
- data/lib/podio/models/item.rb +32 -13
- data/lib/podio/models/item_diff.rb +4 -0
- data/lib/podio/models/item_field.rb +1 -1
- data/lib/podio/models/meeting.rb +126 -0
- data/lib/podio/models/meeting_participiant.rb +5 -0
- data/lib/podio/models/news.rb +2 -1
- data/lib/podio/models/notification_group.rb +6 -1
- data/lib/podio/models/organization.rb +12 -2
- data/lib/podio/models/organization_member.rb +2 -3
- data/lib/podio/models/profile.rb +49 -1
- data/lib/podio/models/rating.rb +6 -0
- data/lib/podio/models/recurrence.rb +25 -0
- data/lib/podio/models/reminder.rb +33 -0
- data/lib/podio/models/search.rb +20 -0
- data/lib/podio/models/space.rb +22 -6
- data/lib/podio/models/{space_invite.rb → space_invitation.rb} +1 -3
- data/lib/podio/models/space_member.rb +7 -0
- data/lib/podio/models/status.rb +16 -0
- data/lib/podio/models/stream_mute.rb +27 -0
- data/lib/podio/models/stream_object.rb +66 -0
- data/lib/podio/models/tag.rb +2 -0
- data/lib/podio/models/tag_search.rb +14 -0
- data/lib/podio/models/task.rb +33 -0
- data/lib/podio/models/user.rb +60 -6
- data/lib/podio/models/user_mail.rb +7 -0
- data/lib/podio/models/user_status.rb +3 -0
- data/lib/podio/models/widget.rb +1 -0
- data/lib/podio/version.rb +1 -1
- data/podio.gemspec +3 -4
- data/test/active_podio_test.rb +36 -9
- data/test/models_sanity_test.rb +5 -3
- metadata +69 -68
data/lib/podio/models/form.rb
CHANGED
@@ -1,12 +1,19 @@
|
|
1
1
|
class Podio::Form < ActivePodio::Base
|
2
2
|
property :form_id, :integer
|
3
3
|
property :app_id, :integer
|
4
|
+
property :space_id, :integer
|
4
5
|
property :settings, :hash
|
5
6
|
property :domains, :array
|
6
|
-
property :
|
7
|
+
property :fields, :array
|
7
8
|
property :attachments, :boolean
|
8
|
-
|
9
|
+
property :status, :string
|
10
|
+
|
11
|
+
# Deprecated
|
12
|
+
property :field_ids, :array
|
13
|
+
|
9
14
|
alias_method :id, :form_id
|
15
|
+
delegate_to_hash :settings, :captcha, :text, :theme, :setter => true
|
16
|
+
delegate_to_hash :text, :submit, :success, :heading, :description, :setter => true
|
10
17
|
|
11
18
|
class << self
|
12
19
|
def create(app_id, attributes)
|
@@ -18,6 +25,15 @@ class Podio::Form < ActivePodio::Base
|
|
18
25
|
response.body['form_id']
|
19
26
|
end
|
20
27
|
|
28
|
+
def update(form_id, attributes)
|
29
|
+
response = Podio.connection.put do |req|
|
30
|
+
req.url "/form/#{form_id}"
|
31
|
+
req.body = attributes
|
32
|
+
end
|
33
|
+
|
34
|
+
response.status
|
35
|
+
end
|
36
|
+
|
21
37
|
def find_all_for_app(app_id)
|
22
38
|
list Podio.connection.get { |req|
|
23
39
|
req.url("/form/app/#{app_id}/")
|
@@ -27,5 +43,13 @@ class Podio::Form < ActivePodio::Base
|
|
27
43
|
def find(form_id)
|
28
44
|
member Podio.connection.get("/form/#{form_id}").body
|
29
45
|
end
|
46
|
+
|
47
|
+
def disable(form_id)
|
48
|
+
Podio.connection.post("/form/#{form_id}/deactivate").body
|
49
|
+
end
|
50
|
+
|
51
|
+
def enable(form_id)
|
52
|
+
Podio.connection.post("/form/#{form_id}/activate").body
|
53
|
+
end
|
30
54
|
end
|
31
55
|
end
|
data/lib/podio/models/item.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
class Podio::Item < ActivePodio::Base
|
2
|
+
include ActivePodio::Updatable
|
2
3
|
|
3
4
|
# Included Get Item basic
|
4
5
|
property :item_id, :integer
|
@@ -33,9 +34,28 @@ class Podio::Item < ActivePodio::Base
|
|
33
34
|
alias_method :id, :item_id
|
34
35
|
delegate_to_hash :app, :app_id, :app_name, :item_name
|
35
36
|
|
37
|
+
def create
|
38
|
+
self.item_id = Item.create(self.app_id, prepare_item_values(self))
|
39
|
+
end
|
40
|
+
|
36
41
|
def destroy
|
37
42
|
Item.delete(self.id)
|
38
43
|
end
|
44
|
+
|
45
|
+
def update
|
46
|
+
Item.update(self.id, prepare_item_values(self))
|
47
|
+
end
|
48
|
+
|
49
|
+
handle_api_errors_for :create, :update
|
50
|
+
|
51
|
+
protected
|
52
|
+
def prepare_item_values(item)
|
53
|
+
fields = item.fields.collect { |field| field.values.nil? ? nil : { :external_id => field.external_id, :values => field.values } }.compact
|
54
|
+
file_ids = item[:file_ids]
|
55
|
+
tags = item.tags.collect(&:presence).compact
|
56
|
+
|
57
|
+
{:fields => fields, :file_ids => file_ids, :tags => tags }
|
58
|
+
end
|
39
59
|
|
40
60
|
class << self
|
41
61
|
def find(id)
|
@@ -46,6 +66,10 @@ class Podio::Item < ActivePodio::Base
|
|
46
66
|
member Podio.connection.get("/item/#{id}/basic").body
|
47
67
|
end
|
48
68
|
|
69
|
+
def find_basic_hash(id)
|
70
|
+
Podio.connection.get("/item/#{id}/basic").body
|
71
|
+
end
|
72
|
+
|
49
73
|
def find_all_by_external_id(app_id, external_id)
|
50
74
|
collection Podio.connection.get("/item/app/#{app_id}/v2/?external_id=#{external_id}").body
|
51
75
|
end
|
@@ -69,6 +93,13 @@ class Podio::Item < ActivePodio::Base
|
|
69
93
|
req.url("/item/field/#{field_id}/top/", options)
|
70
94
|
}.body
|
71
95
|
end
|
96
|
+
|
97
|
+
def xlsx(app_id, options={})
|
98
|
+
response = Podio.connection.get { |req|
|
99
|
+
req.url("/item/app/#{app_id}/xlsx/", options)
|
100
|
+
}
|
101
|
+
response.body
|
102
|
+
end
|
72
103
|
|
73
104
|
def search_field(field_id, options={})
|
74
105
|
list Podio.connection.get { |req|
|
@@ -76,18 +107,6 @@ class Podio::Item < ActivePodio::Base
|
|
76
107
|
}.body
|
77
108
|
end
|
78
109
|
|
79
|
-
# Deprecated. Use method in ItemRevision instead.
|
80
|
-
# def revisions(item_id)
|
81
|
-
# collection Podio.connection.get("/item/#{item_id}/revision/").body
|
82
|
-
# end
|
83
|
-
|
84
|
-
# Deprecated. Use method in ItemDiff instead.
|
85
|
-
# def revision_difference(item_id, revision_from_id, revision_to_id)
|
86
|
-
# list Podio.connection.get{ |req|
|
87
|
-
# req.url("/item/#{item_id}/revision/#{revision_from_id}/#{revision_to_id}")
|
88
|
-
# }.body
|
89
|
-
# end
|
90
|
-
|
91
110
|
def create(app_id, attributes)
|
92
111
|
response = Podio.connection.post do |req|
|
93
112
|
req.url "/item/app/#{app_id}/"
|
@@ -119,6 +138,6 @@ class Podio::Item < ActivePodio::Base
|
|
119
138
|
member Podio.connection.get { |req|
|
120
139
|
req.url("/item/#{current_item_id}/#{operation}", time_options(time))
|
121
140
|
}.body
|
122
|
-
end
|
141
|
+
end
|
123
142
|
end
|
124
143
|
end
|
@@ -12,5 +12,9 @@ class Podio::ItemDiff < ActivePodio::Base
|
|
12
12
|
def find_by_item_and_revisions(item_id, revision_from_id, revision_to_id)
|
13
13
|
list Podio.connection.get("/item/#{item_id}/revision/#{revision_from_id}/#{revision_to_id}").body
|
14
14
|
end
|
15
|
+
|
16
|
+
def revert(item_id, revision_id)
|
17
|
+
Podio.connection.delete("/item/#{item_id}/revision/#{revision_id}").body
|
18
|
+
end
|
15
19
|
end
|
16
20
|
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
class Podio::Meeting < ActivePodio::Base
|
2
|
+
include ActivePodio::Updatable, HasReference
|
3
|
+
|
4
|
+
property :meeting_id, :integer
|
5
|
+
property :title, :string
|
6
|
+
property :starts_on, :datetime, :convert_incoming_local_datetime_to_utc => true
|
7
|
+
property :ends_on, :datetime, :convert_incoming_local_datetime_to_utc => true
|
8
|
+
property :participant_ids, :array
|
9
|
+
property :is_remote, :boolean
|
10
|
+
property :status, :string
|
11
|
+
property :location, :string
|
12
|
+
property :agenda, :string
|
13
|
+
property :notes, :string
|
14
|
+
property :transcript, :string
|
15
|
+
property :external_id, :string
|
16
|
+
property :external_url, :string
|
17
|
+
property :external_phone, :string
|
18
|
+
property :external_password, :string
|
19
|
+
property :external_recording_url, :string
|
20
|
+
property :created_on, :datetime
|
21
|
+
property :deleted_on, :datetime
|
22
|
+
property :link, :string
|
23
|
+
property :ref, :hash
|
24
|
+
property :space_id, :integer
|
25
|
+
|
26
|
+
# For creation only
|
27
|
+
property :ref_id, :integer
|
28
|
+
property :ref_type, :string
|
29
|
+
property :file_ids, :array
|
30
|
+
|
31
|
+
has_one :created_by, :class => 'User'
|
32
|
+
has_one :created_via, :class => 'Via'
|
33
|
+
has_one :deleted_by, :class => 'User'
|
34
|
+
has_one :deleted_via, :class => 'Via'
|
35
|
+
has_many :participants, :class => 'MeetingParticipant'
|
36
|
+
has_many :files, :class => 'FileAttachment'
|
37
|
+
has_many :comments, :class => 'Comment'
|
38
|
+
|
39
|
+
alias_method :id, :meeting_id
|
40
|
+
|
41
|
+
def create
|
42
|
+
compacted_attributes = remove_nil_values(self.attributes)
|
43
|
+
created_model = if(self.ref_type.present? && self.ref_id.present?)
|
44
|
+
self.class.create_with_ref(self.ref_type, self.ref_id, compacted_attributes)
|
45
|
+
else
|
46
|
+
self.class.create(compacted_attributes)
|
47
|
+
end
|
48
|
+
|
49
|
+
self.attributes = created_model.attributes
|
50
|
+
end
|
51
|
+
|
52
|
+
def update
|
53
|
+
compacted_attributes = remove_nil_values(self.attributes)
|
54
|
+
updated_model = self.class.update(self.id, compacted_attributes)
|
55
|
+
self.attributes = updated_model.attributes
|
56
|
+
end
|
57
|
+
|
58
|
+
def destroy
|
59
|
+
self.class.delete(self.id)
|
60
|
+
end
|
61
|
+
|
62
|
+
def start
|
63
|
+
self.class.start(self.id)
|
64
|
+
end
|
65
|
+
|
66
|
+
def stop
|
67
|
+
self.class.stop(self.id)
|
68
|
+
end
|
69
|
+
|
70
|
+
handle_api_errors_for :create, :destroy, :start, :stop # Call must be made after the methods to handle have been defined
|
71
|
+
|
72
|
+
class << self
|
73
|
+
def create(attributes)
|
74
|
+
response = Podio.connection.post do |req|
|
75
|
+
req.url "/meeting/"
|
76
|
+
req.body = attributes
|
77
|
+
end
|
78
|
+
|
79
|
+
member response.body
|
80
|
+
end
|
81
|
+
|
82
|
+
def create_with_ref(ref_type, ref_id, attributes)
|
83
|
+
response = Podio.connection.post do |req|
|
84
|
+
req.url "/meeting/#{ref_type}/#{ref_id}/"
|
85
|
+
req.body = attributes
|
86
|
+
end
|
87
|
+
|
88
|
+
member response.body
|
89
|
+
end
|
90
|
+
|
91
|
+
def update(id, attributes)
|
92
|
+
response = Podio.connection.put do |req|
|
93
|
+
req.url "/meeting/#{id}"
|
94
|
+
req.body = attributes
|
95
|
+
end
|
96
|
+
|
97
|
+
member response.body
|
98
|
+
end
|
99
|
+
|
100
|
+
def delete(id)
|
101
|
+
Podio.connection.delete("/meeting/#{id}").status
|
102
|
+
end
|
103
|
+
|
104
|
+
def start(id)
|
105
|
+
Podio.connection.post("/meeting/#{id}/start").body
|
106
|
+
end
|
107
|
+
|
108
|
+
def stop(id)
|
109
|
+
Podio.connection.post("/meeting/#{id}/stop").body
|
110
|
+
end
|
111
|
+
|
112
|
+
def find(id)
|
113
|
+
member Podio.connection.get("/meeting/#{id}").body
|
114
|
+
end
|
115
|
+
|
116
|
+
def find_for_reference(ref_type, ref_id)
|
117
|
+
list Podio.connection.get("/meeting/#{ref_type}/#{ref_id}/").body
|
118
|
+
end
|
119
|
+
|
120
|
+
def find_all(options={})
|
121
|
+
list Podio.connection.get { |req|
|
122
|
+
req.url('/meeting/', options)
|
123
|
+
}.body
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
data/lib/podio/models/news.rb
CHANGED
@@ -19,7 +19,8 @@ class Podio::News < ActivePodio::Base
|
|
19
19
|
|
20
20
|
class << self
|
21
21
|
def find_stream()
|
22
|
-
Podio.connection.get("/news/stream").body
|
22
|
+
result = Podio.connection.get("/news/stream").body
|
23
|
+
result.blank? ? nil : member(result)
|
23
24
|
end
|
24
25
|
|
25
26
|
def get_news_redirect(news_id, type=nil)
|
@@ -2,7 +2,7 @@
|
|
2
2
|
class Podio::NotificationGroup < ActivePodio::Base
|
3
3
|
property :context, :hash
|
4
4
|
property :notifications, :hash
|
5
|
-
delegate_to_hash :context, :ref, :data
|
5
|
+
delegate_to_hash :context, :ref, :data, :comment_count
|
6
6
|
delegate_to_hash :data, :link
|
7
7
|
|
8
8
|
class << self
|
@@ -11,6 +11,11 @@ class Podio::NotificationGroup < ActivePodio::Base
|
|
11
11
|
req.url('/notification/', options)
|
12
12
|
}.body
|
13
13
|
end
|
14
|
+
|
15
|
+
def find(id)
|
16
|
+
member Podio.connection.get("/notification/#{id}/v2").body
|
17
|
+
end
|
18
|
+
|
14
19
|
|
15
20
|
def mark_as_viewed_by_ref(ref_type, ref_id)
|
16
21
|
Podio.connection.post("/notification/#{ref_type}/#{ref_id}/viewed").status
|
@@ -17,13 +17,19 @@ class Podio::Organization < ActivePodio::Base
|
|
17
17
|
property :member_count, :integer
|
18
18
|
property :contact_count, :integer
|
19
19
|
property :billing_interval, :integer
|
20
|
+
property :rights, :array
|
21
|
+
property :verified_domain, :string
|
22
|
+
property :rank, :integer
|
23
|
+
property :contract_status, :string
|
24
|
+
property :type, :string
|
25
|
+
property :segment, :string
|
20
26
|
|
21
27
|
has_one :created_by, :class => 'ByLine'
|
22
28
|
|
23
29
|
alias_method :id, :org_id
|
24
30
|
|
25
31
|
def create
|
26
|
-
attributes = Organization.create(:name => name)
|
32
|
+
attributes = Organization.create(:name => name, :logo => logo)
|
27
33
|
self.org_id = attributes['org_id']
|
28
34
|
self.url = attributes['url']
|
29
35
|
self.url_label = attributes['url_label']
|
@@ -75,10 +81,14 @@ class Podio::Organization < ActivePodio::Base
|
|
75
81
|
def find_all
|
76
82
|
list Podio.connection.get("/org/").body
|
77
83
|
end
|
78
|
-
|
84
|
+
|
79
85
|
def get_statistics(id)
|
80
86
|
Podio.connection.get("/org/#{id}/statistics").body
|
81
87
|
end
|
88
|
+
|
89
|
+
def get_member_count(id)
|
90
|
+
Podio.connection.get("/org/#{id}/member/count").body
|
91
|
+
end
|
82
92
|
|
83
93
|
def get_login_report(id, options = {})
|
84
94
|
Podio.connection.get { |req|
|
@@ -1,14 +1,13 @@
|
|
1
1
|
# Encapsulates a user's indirect membership (through spaces) of an organization.
|
2
2
|
class Podio::OrganizationMember < ActivePodio::Base
|
3
|
-
property :spaces, :hash
|
4
3
|
property :profile, :hash
|
5
4
|
property :admin, :boolean
|
6
5
|
|
7
6
|
has_one :user, :class => 'User'
|
8
7
|
has_one :contact, :class => 'Contact', :property => :profile
|
9
8
|
|
10
|
-
delegate :user_id, :mail, :
|
11
|
-
delegate :name, :avatar, :title, :organization, :title_and_org, :avatar_url, :to => :contact
|
9
|
+
delegate :user_id, :mail, :to => :user
|
10
|
+
delegate :name, :avatar, :title, :organization, :title_and_org, :default_title, :avatar_url, :last_seen_on, :to => :contact
|
12
11
|
|
13
12
|
class << self
|
14
13
|
def find_all_for_org(org_id, options = {})
|
data/lib/podio/models/profile.rb
CHANGED
@@ -13,13 +13,28 @@ class Podio::Profile < ActivePodio::Base
|
|
13
13
|
property :zip, :string
|
14
14
|
property :city, :string
|
15
15
|
property :country, :string
|
16
|
+
property :state, :string
|
16
17
|
property :im, :array
|
17
18
|
property :location, :array
|
18
19
|
property :mail, :array
|
19
20
|
property :phone, :array
|
20
21
|
property :title, :array
|
21
22
|
property :url, :array
|
23
|
+
property :skill, :array
|
24
|
+
property :linkedin, :string
|
25
|
+
property :twitter, :string
|
22
26
|
|
27
|
+
property :app_store_about, :string
|
28
|
+
property :app_store_organization, :string
|
29
|
+
property :app_store_location, :string
|
30
|
+
property :app_store_title, :string
|
31
|
+
property :app_store_url, :string
|
32
|
+
|
33
|
+
property :last_seen_on, :datetime
|
34
|
+
property :is_employee, :boolean
|
35
|
+
|
36
|
+
alias_method :employee?, :is_employee
|
37
|
+
|
23
38
|
class << self
|
24
39
|
def all(options={})
|
25
40
|
options[:exclude_self] = (options[:exclude_self] == false ? "0" : "1" )
|
@@ -35,8 +50,31 @@ class Podio::Profile < ActivePodio::Base
|
|
35
50
|
}.body
|
36
51
|
end
|
37
52
|
|
53
|
+
def top_for_space(space_id, options={})
|
54
|
+
list Podio.connection.get { |req|
|
55
|
+
req.url("/contact/space/#{space_id}/top/", options)
|
56
|
+
}.body
|
57
|
+
end
|
58
|
+
|
59
|
+
def top_for_org(org_id, options={})
|
60
|
+
list Podio.connection.get { |req|
|
61
|
+
req.url("/contact/org/#{org_id}/top/", options)
|
62
|
+
}.body
|
63
|
+
end
|
64
|
+
|
65
|
+
def top_for_personal(options={})
|
66
|
+
list Podio.connection.get { |req|
|
67
|
+
req.url("/contact/personal/top/", options)
|
68
|
+
}.body
|
69
|
+
end
|
70
|
+
|
38
71
|
def find(profile_id)
|
39
|
-
|
72
|
+
result = Podio.connection.get("/contact/#{profile_id}/v2").body
|
73
|
+
if result.is_a?(Array)
|
74
|
+
return list result
|
75
|
+
else
|
76
|
+
return member result
|
77
|
+
end
|
40
78
|
end
|
41
79
|
|
42
80
|
def find_all_for_org(org_id, options={})
|
@@ -89,10 +127,20 @@ class Podio::Profile < ActivePodio::Base
|
|
89
127
|
Podio.connection.get("/contact/totals/").body
|
90
128
|
end
|
91
129
|
|
130
|
+
def totals_by_space_v2(space_id)
|
131
|
+
Podio.connection.get("/contact/space/#{space_id}/totals/space").body
|
132
|
+
end
|
133
|
+
|
92
134
|
def totals_by_org_and_space
|
93
135
|
Podio.connection.get("/contact/totals/v2/").body
|
94
136
|
end
|
95
137
|
|
138
|
+
def skills(options)
|
139
|
+
Podio.connection.get { |req|
|
140
|
+
req.url("/contact/skill/", options)
|
141
|
+
}.body
|
142
|
+
end
|
143
|
+
|
96
144
|
def totals_by_space(space_id, options = {})
|
97
145
|
options[:exclude_self] = (options[:exclude_self] == false ? "0" : "1" )
|
98
146
|
|