podio 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|