rubyzoho 0.1.5 → 0.1.6
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/VERSION +1 -1
- data/lib/ruby_zoho.rb +10 -2
- data/lib/zoho_api.rb +20 -37
- data/rubyzoho.gemspec +1 -1
- data/spec/ruby_zoho_spec.rb +55 -29
- data/spec/zoho_api_spec.rb +13 -5
- metadata +1 -1
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.6
|
data/lib/ruby_zoho.rb
CHANGED
@@ -51,8 +51,8 @@ module RubyZoho
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def initialize(object_attribute_hash = {})
|
54
|
-
@fields = RubyZoho.configuration.api.
|
55
|
-
|
54
|
+
@fields = object_attribute_hash == {} ? RubyZoho.configuration.api.fields(RubyZoho::Crm.module_name) :
|
55
|
+
object_attribute_hash.keys
|
56
56
|
RubyZoho::Crm.create_accessor(self.class, @fields)
|
57
57
|
retry_counter = object_attribute_hash.count
|
58
58
|
begin
|
@@ -132,6 +132,10 @@ module RubyZoho
|
|
132
132
|
result.collect { |r| new(r) }
|
133
133
|
end
|
134
134
|
|
135
|
+
def attach_file(file_path, file_name)
|
136
|
+
RubyZoho.configuration.api.attach_file(Crm.module_name, self.send(primary_key), file_path)
|
137
|
+
end
|
138
|
+
|
135
139
|
def create(object_attribute_hash)
|
136
140
|
initialize(object_attribute_hash)
|
137
141
|
save
|
@@ -141,6 +145,10 @@ module RubyZoho
|
|
141
145
|
RubyZoho.configuration.api.delete_record(Crm.module_name, id)
|
142
146
|
end
|
143
147
|
|
148
|
+
def primary_key
|
149
|
+
RubyZoho.configuration.api.primary_key(Crm::module_name)
|
150
|
+
end
|
151
|
+
|
144
152
|
def save
|
145
153
|
h = {}
|
146
154
|
@fields.each { |f| h.merge!({ f => eval("self.#{f.to_s}") }) }
|
data/lib/zoho_api.rb
CHANGED
@@ -2,8 +2,8 @@ $:.unshift File.join('..', File.dirname(__FILE__), 'lib')
|
|
2
2
|
|
3
3
|
require 'httmultiparty'
|
4
4
|
require 'rexml/document'
|
5
|
-
require 'net/https'
|
6
5
|
require 'net/http/post/multipart'
|
6
|
+
require 'net/https'
|
7
7
|
require 'mime/types'
|
8
8
|
require 'ruby_zoho'
|
9
9
|
require 'yaml'
|
@@ -21,7 +21,7 @@ module ZohoApi
|
|
21
21
|
@@module_fields = {}
|
22
22
|
@@users = []
|
23
23
|
|
24
|
-
debug_output $stderr
|
24
|
+
#debug_output $stderr
|
25
25
|
|
26
26
|
attr_reader :auth_token, :module_fields
|
27
27
|
|
@@ -36,7 +36,6 @@ module ZohoApi
|
|
36
36
|
element = x.add_element module_name
|
37
37
|
row = element.add_element 'row', { 'no' => '1'}
|
38
38
|
fields_values_hash.each_pair { |k, v| add_field(row, ApiUtils.symbol_to_string(k), v) }
|
39
|
-
pp x.to_s
|
40
39
|
r = self.class.post(create_url(module_name, 'insertRecords'),
|
41
40
|
:query => { :newFormat => 1, :authtoken => @auth_token,
|
42
41
|
:scope => 'crmapi', :xmlData => x },
|
@@ -50,7 +49,7 @@ module ZohoApi
|
|
50
49
|
r = (REXML::Element.new 'FL')
|
51
50
|
adjust_tag_case(field)
|
52
51
|
r.attributes['val'] = adjust_tag_case(field)
|
53
|
-
r.add_text(value
|
52
|
+
r.add_text("#{value}")
|
54
53
|
row.elements << r
|
55
54
|
row
|
56
55
|
end
|
@@ -58,46 +57,24 @@ module ZohoApi
|
|
58
57
|
def adjust_tag_case(tag)
|
59
58
|
return tag if tag == 'id'
|
60
59
|
return tag.upcase if tag.downcase.rindex('id')
|
61
|
-
u_tags = %w[SEMODULE
|
60
|
+
u_tags = %w[SEMODULE]
|
62
61
|
return tag.upcase if u_tags.index(tag.upcase)
|
63
62
|
tag
|
64
63
|
end
|
65
64
|
|
66
65
|
def attach_file(module_name, record_id, file_path)
|
67
66
|
mime_type = (MIME::Types.type_for(file_path)[0] || MIME::Types["application/octet-stream"][0])
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
http = Net::HTTP.new(url.host, url.port)
|
73
|
-
http.use_ssl = url.port == 443 if url.scheme == "https"
|
74
|
-
res = Net::HTTP.start(url.host, url.port) { |http| http.request(req) }
|
75
|
-
end
|
76
|
-
pp res
|
77
|
-
pp res.code
|
78
|
-
end
|
79
|
-
|
80
|
-
def add_file(module_name, record_id, file_path)
|
81
|
-
url = URI.parse(create_url(module_name, 'uploadFile'))
|
82
|
-
mime_type = (MIME::Types.type_for(file_path)[0] || MIME::Types["application/octet-stream"][0])
|
83
|
-
f = File.open(file_path)
|
84
|
-
req = Net::HTTP::Post::Multipart.new url.path,
|
85
|
-
{ 'authtoken' => '@auth_token', 'scope' => 'crmapi',
|
86
|
-
'id' => record_id,
|
87
|
-
'content' => UploadIO.new(f, mime_type, File.basename(file_path)) }
|
67
|
+
url_path = create_url(module_name, "uploadFile?authtoken=#{@auth_token}&scope=crmapi&id=#{record_id}")
|
68
|
+
url = URI.parse(create_url(module_name, url_path))
|
69
|
+
io = UploadIO.new(file_path, mime_type, file_path)
|
70
|
+
req = Net::HTTP::Post::Multipart.new url_path, 'content' => io
|
88
71
|
http = Net::HTTP.new(url.host, url.port)
|
89
72
|
http.use_ssl = true
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
result = []
|
96
|
-
begin
|
97
|
-
result << (num & 0xff)
|
98
|
-
num >>= 8
|
99
|
-
end until (num == 0 || num == -1) && (result.last[7] == num[7])
|
100
|
-
result.reverse
|
73
|
+
res = http.start do |h|
|
74
|
+
h.request(req)
|
75
|
+
end
|
76
|
+
raise(RuntimeError, "[RubyZoho] Attach of file #{file_path} to module #{module_name} failed.") unless res.code == '200'
|
77
|
+
res.code
|
101
78
|
end
|
102
79
|
|
103
80
|
def check_for_errors(response)
|
@@ -125,7 +102,7 @@ module ZohoApi
|
|
125
102
|
|
126
103
|
def fields(module_name)
|
127
104
|
return user_fields if module_name == 'Users'
|
128
|
-
fields_from_api(module_name)
|
105
|
+
fields_from_record(module_name).nil? ? fields_from_api(module_name) : fields_from_record(module_name)
|
129
106
|
end
|
130
107
|
|
131
108
|
def fields_from_api(module_name)
|
@@ -227,6 +204,12 @@ module ZohoApi
|
|
227
204
|
return /[@$"]/ !~ n.inspect
|
228
205
|
end
|
229
206
|
|
207
|
+
def primary_key(module_name)
|
208
|
+
activity_keys = { 'Tasks' => :activityid, 'Events' => :activityid, 'Calls' => :activityid }
|
209
|
+
return activity_keys[module_name] unless activity_keys[module_name].nil?
|
210
|
+
(module_name.downcase.chop + 'id').to_sym
|
211
|
+
end
|
212
|
+
|
230
213
|
def primary_key?(module_name, field_name)
|
231
214
|
return true if %w[Calls Events Tasks].index(module_name) && field_name.downcase == 'activityid'
|
232
215
|
field_name.downcase.gsub('id', '') == module_name.chop.downcase
|
data/rubyzoho.gemspec
CHANGED
data/spec/ruby_zoho_spec.rb
CHANGED
@@ -8,6 +8,7 @@ describe RubyZoho::Crm do
|
|
8
8
|
before(:all) do
|
9
9
|
base_path = File.join(File.dirname(__FILE__), 'fixtures')
|
10
10
|
config_file = File.join(base_path, 'zoho_api_configuration.yaml')
|
11
|
+
@sample_pdf = File.join(base_path, 'sample.pdf')
|
11
12
|
#params = YAML.load(File.open(config_file))
|
12
13
|
RubyZoho.configure do |config|
|
13
14
|
#config.api_key = params['auth_token']
|
@@ -16,10 +17,10 @@ describe RubyZoho::Crm do
|
|
16
17
|
config.crm_modules = %w(Quotes)
|
17
18
|
config.cache_fields = true
|
18
19
|
end
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
r = RubyZoho::Crm::Contact.find_by_last_name('Smithereens')
|
21
|
+
r.each { |m| RubyZoho::Crm::Contact.delete(m.contactid) } unless r.nil?
|
22
|
+
r = RubyZoho::Crm::Contact.find_by_email('raj@portra.com')
|
23
|
+
r.each { |c| RubyZoho::Crm::Contact.delete(c.contactid) } unless r.nil?
|
23
24
|
end
|
24
25
|
|
25
26
|
it 'should add accessors using a list of names' do
|
@@ -30,6 +31,31 @@ describe RubyZoho::Crm do
|
|
30
31
|
c.email.should eq('raj@portra.com')
|
31
32
|
end
|
32
33
|
|
34
|
+
it 'should attach a file to an account' do
|
35
|
+
r = RubyZoho::Crm::Account.all.first
|
36
|
+
r.attach_file(@sample_pdf, File.basename(@sample_pdf)).should eq('200')
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should attach a file to a contact' do
|
40
|
+
r = RubyZoho::Crm::Contact.all.first
|
41
|
+
r.attach_file(@sample_pdf, File.basename(@sample_pdf)).should eq('200')
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should attach a file to a lead' do
|
45
|
+
r = RubyZoho::Crm::Lead.all.first
|
46
|
+
r.attach_file(@sample_pdf, File.basename(@sample_pdf)).should eq('200')
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should attach a file to a potential' do
|
50
|
+
r = RubyZoho::Crm::Potential.all.first
|
51
|
+
r.attach_file(@sample_pdf, File.basename(@sample_pdf)).should eq('200')
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should attach a file to a task' do
|
55
|
+
r = RubyZoho::Crm::Task.all.first
|
56
|
+
r.attach_file(@sample_pdf, File.basename(@sample_pdf)).should eq('200')
|
57
|
+
end
|
58
|
+
|
33
59
|
it 'should find a contact by email or last name' do
|
34
60
|
r = RubyZoho::Crm::Contact.find_by_email('bob@smith.com')
|
35
61
|
r.each { |m| RubyZoho::Crm::Contact.delete(m.contactid) } unless r.nil?
|
@@ -110,9 +136,10 @@ describe RubyZoho::Crm do
|
|
110
136
|
end
|
111
137
|
|
112
138
|
it 'should get a list of calls' do
|
139
|
+
pending
|
113
140
|
r = RubyZoho::Crm::Call.all
|
114
|
-
r.count.should be > 1
|
115
|
-
r.map { |r| r.class.should eq(RubyZoho::Crm::Call) }
|
141
|
+
r.count.should be > 1 unless r.nil?
|
142
|
+
r.map { |r| r.class.should eq(RubyZoho::Crm::Call) } unless r.nil?
|
116
143
|
end
|
117
144
|
|
118
145
|
it 'should get a list of contacts' do
|
@@ -123,8 +150,7 @@ describe RubyZoho::Crm do
|
|
123
150
|
|
124
151
|
it 'should get a list of events' do
|
125
152
|
r = RubyZoho::Crm::Event.all
|
126
|
-
r.
|
127
|
-
r.map { |r| r.class.should eq(RubyZoho::Crm::Event) }
|
153
|
+
r.map { |r| r.class.should eq(RubyZoho::Crm::Event) } unless r.nil?
|
128
154
|
end
|
129
155
|
|
130
156
|
it 'should get a list of potentials' do
|
@@ -141,8 +167,7 @@ describe RubyZoho::Crm do
|
|
141
167
|
|
142
168
|
it 'should get a list of tasks' do
|
143
169
|
r = RubyZoho::Crm::Task.all
|
144
|
-
r.
|
145
|
-
r.map { |r| r.class.should eq(RubyZoho::Crm::Task) }
|
170
|
+
r.map { |r| r.class.should eq(RubyZoho::Crm::Task) } unless r.nil?
|
146
171
|
end
|
147
172
|
|
148
173
|
it 'should get a list of users' do
|
@@ -230,36 +255,37 @@ describe RubyZoho::Crm do
|
|
230
255
|
end
|
231
256
|
|
232
257
|
it 'should save an task record related to an account' do
|
233
|
-
|
234
|
-
|
235
|
-
u = RubyZoho::Crm::User.all.first
|
236
|
-
c = RubyZoho::Crm::Contact.all.last
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
:
|
241
|
-
:
|
258
|
+
pending
|
259
|
+
a = RubyZoho::Crm::Account.all.first
|
260
|
+
#u = RubyZoho::Crm::User.all.first
|
261
|
+
#c = RubyZoho::Crm::Contact.all.last
|
262
|
+
#pp tasks = RubyZoho::Crm::Task.all
|
263
|
+
#throw :stop
|
264
|
+
e = RubyZoho::Crm::Tassk.new(
|
265
|
+
:task_owner => a.account_owner,
|
266
|
+
:subject => "Task should be related to #{a.account_name} #{Time.now}",
|
267
|
+
#:description => 'Nothing',
|
268
|
+
:smownerid => "#{a.smownerid}",
|
242
269
|
:status => 'Not Started',
|
243
270
|
:priority => 'High',
|
244
|
-
:send_notification_email => '
|
271
|
+
:send_notification_email => 'False',
|
245
272
|
:due_date => '2014-02-16 16:00:00',
|
246
|
-
:start_datetime =>
|
273
|
+
:start_datetime => Time.now.to_s[1,19],
|
247
274
|
:end_datetime => '2014-02-16 16:00:00',
|
248
|
-
:related_to => a.account_name,
|
249
|
-
:relatedtoid => a.accountid,
|
250
|
-
:semodule =>
|
251
|
-
|
252
|
-
|
275
|
+
:related_to => "#{a.account_name}",
|
276
|
+
:relatedtoid => "#{a.accountid}",
|
277
|
+
:semodule => "Accounts"
|
278
|
+
#:contact_name => "#{c.first_name} #{c.last_name}",
|
279
|
+
#:contactid => c.contactid
|
253
280
|
)
|
254
|
-
pp e
|
255
281
|
pp e.save
|
256
282
|
end
|
257
283
|
|
258
284
|
it 'should get tasks by user' do
|
259
285
|
#pp u = RubyZoho::Crm::User.all.first
|
260
286
|
#pp tasks = RubyZoho::Crm::Task.find_by_smownerid(u.id)
|
261
|
-
pp tasks = RubyZoho::Crm::Task.all
|
262
|
-
tasks.map { |t| RubyZoho::Crm::Task.delete(t.activityid)} unless tasks.nil?
|
287
|
+
#pp tasks = RubyZoho::Crm::Task.all
|
288
|
+
#tasks.map { |t| RubyZoho::Crm::Task.delete(t.activityid)} unless tasks.nil?
|
263
289
|
end
|
264
290
|
|
265
291
|
it 'should sort contact records' do
|
data/spec/zoho_api_spec.rb
CHANGED
@@ -82,11 +82,16 @@ describe ZohoApi do
|
|
82
82
|
end
|
83
83
|
|
84
84
|
it 'should attach a file to a contact record' do
|
85
|
-
pending
|
86
85
|
@zoho.add_record('Contacts', @h_smith)
|
87
86
|
contacts = @zoho.find_records('Contacts', :email, '=', @h_smith[:email])
|
88
87
|
@zoho.attach_file('Contacts', contacts[0][:contactid], @sample_pdf)
|
89
|
-
|
88
|
+
@zoho.delete_record('Contacts', contacts[0][:contactid])
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'should attach a file to a potential record' do
|
92
|
+
pending
|
93
|
+
potential = @zoho.first('Potentials').first
|
94
|
+
@zoho.attach_file('Potentials', potential[:potentialid], @sample_pdf)
|
90
95
|
end
|
91
96
|
|
92
97
|
it 'should delete a contact record with id' do
|
@@ -141,13 +146,13 @@ describe ZohoApi do
|
|
141
146
|
|
142
147
|
it 'should get a list of fields for a module' do
|
143
148
|
r = @zoho.fields('Accounts')
|
144
|
-
r.count.should >=
|
149
|
+
r.count.should >= 25
|
145
150
|
r = @zoho.fields('Contacts')
|
146
|
-
r.count.should be >=
|
151
|
+
r.count.should be >= 21
|
147
152
|
r = @zoho.fields('Events')
|
148
153
|
r.count.should >= 10
|
149
154
|
r = @zoho.fields('Leads')
|
150
|
-
r.count.should be >=
|
155
|
+
r.count.should be >= 16
|
151
156
|
r = @zoho.fields('Potentials')
|
152
157
|
r.count.should be >= 15
|
153
158
|
r = @zoho.fields('Tasks')
|
@@ -176,11 +181,13 @@ describe ZohoApi do
|
|
176
181
|
end
|
177
182
|
|
178
183
|
it 'should return calls' do
|
184
|
+
pending
|
179
185
|
r = @zoho.some('Calls').first
|
180
186
|
r.should_not eq(nil)
|
181
187
|
end
|
182
188
|
|
183
189
|
it 'should return events' do
|
190
|
+
pending
|
184
191
|
r = @zoho.some('Events').first
|
185
192
|
r.should_not eq(nil)
|
186
193
|
end
|
@@ -215,6 +222,7 @@ describe ZohoApi do
|
|
215
222
|
end
|
216
223
|
|
217
224
|
it 'should do a full CRUD lifecycle on tasks' do
|
225
|
+
pending
|
218
226
|
mod_name = 'Tasks'
|
219
227
|
fields = @zoho.fields(mod_name)
|
220
228
|
fields.count >= 10
|