sugarcrm_emp 0.10.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/.document +5 -0
- data/.gitignore +29 -0
- data/Gemfile +14 -0
- data/LICENSE +20 -0
- data/README.rdoc +275 -0
- data/Rakefile +44 -0
- data/VERSION +1 -0
- data/WATCHLIST.rdoc +7 -0
- data/bin/sugarcrm +26 -0
- data/lib/rails/generators/sugarcrm/config/config_generator.rb +22 -0
- data/lib/rails/generators/sugarcrm/config/templates/initializer.rb +4 -0
- data/lib/rails/generators/sugarcrm/config/templates/sugarcrm.yml +19 -0
- data/lib/sugarcrm/associations/association.rb +170 -0
- data/lib/sugarcrm/associations/association_cache.rb +36 -0
- data/lib/sugarcrm/associations/association_collection.rb +141 -0
- data/lib/sugarcrm/associations/association_methods.rb +91 -0
- data/lib/sugarcrm/associations/associations.rb +61 -0
- data/lib/sugarcrm/associations.rb +5 -0
- data/lib/sugarcrm/attributes/attribute_methods.rb +203 -0
- data/lib/sugarcrm/attributes/attribute_serializers.rb +55 -0
- data/lib/sugarcrm/attributes/attribute_typecast.rb +44 -0
- data/lib/sugarcrm/attributes/attribute_validations.rb +62 -0
- data/lib/sugarcrm/attributes.rb +4 -0
- data/lib/sugarcrm/base.rb +355 -0
- data/lib/sugarcrm/config/sugarcrm.yaml +10 -0
- data/lib/sugarcrm/connection/api/get_available_modules.rb +22 -0
- data/lib/sugarcrm/connection/api/get_document_revision.rb +14 -0
- data/lib/sugarcrm/connection/api/get_entries.rb +23 -0
- data/lib/sugarcrm/connection/api/get_entries_count.rb +20 -0
- data/lib/sugarcrm/connection/api/get_entry.rb +23 -0
- data/lib/sugarcrm/connection/api/get_entry_list.rb +31 -0
- data/lib/sugarcrm/connection/api/get_module_fields.rb +15 -0
- data/lib/sugarcrm/connection/api/get_note_attachment.rb +14 -0
- data/lib/sugarcrm/connection/api/get_relationships.rb +30 -0
- data/lib/sugarcrm/connection/api/get_report_entries.rb +17 -0
- data/lib/sugarcrm/connection/api/get_server_info.rb +7 -0
- data/lib/sugarcrm/connection/api/get_user_id.rb +13 -0
- data/lib/sugarcrm/connection/api/get_user_team_id.rb +14 -0
- data/lib/sugarcrm/connection/api/login.rb +18 -0
- data/lib/sugarcrm/connection/api/logout.rb +15 -0
- data/lib/sugarcrm/connection/api/seamless_login.rb +13 -0
- data/lib/sugarcrm/connection/api/search_by_module.rb +25 -0
- data/lib/sugarcrm/connection/api/set_campaign_merge.rb +15 -0
- data/lib/sugarcrm/connection/api/set_document_revision.rb +35 -0
- data/lib/sugarcrm/connection/api/set_entries.rb +15 -0
- data/lib/sugarcrm/connection/api/set_entry.rb +15 -0
- data/lib/sugarcrm/connection/api/set_note_attachment.rb +25 -0
- data/lib/sugarcrm/connection/api/set_relationship.rb +27 -0
- data/lib/sugarcrm/connection/api/set_relationships.rb +22 -0
- data/lib/sugarcrm/connection/connection.rb +201 -0
- data/lib/sugarcrm/connection/helper.rb +50 -0
- data/lib/sugarcrm/connection/request.rb +61 -0
- data/lib/sugarcrm/connection/response.rb +91 -0
- data/lib/sugarcrm/connection.rb +5 -0
- data/lib/sugarcrm/connection_pool.rb +163 -0
- data/lib/sugarcrm/exceptions.rb +23 -0
- data/lib/sugarcrm/extensions/README.txt +23 -0
- data/lib/sugarcrm/finders/dynamic_finder_match.rb +41 -0
- data/lib/sugarcrm/finders/finder_methods.rb +243 -0
- data/lib/sugarcrm/finders.rb +2 -0
- data/lib/sugarcrm/module.rb +174 -0
- data/lib/sugarcrm/module_methods.rb +91 -0
- data/lib/sugarcrm/session.rb +218 -0
- data/lib/sugarcrm.rb +22 -0
- data/sugarcrm.gemspec +178 -0
- data/test/config_test.yaml +15 -0
- data/test/connection/test_get_available_modules.rb +9 -0
- data/test/connection/test_get_entries.rb +15 -0
- data/test/connection/test_get_entry.rb +22 -0
- data/test/connection/test_get_entry_list.rb +23 -0
- data/test/connection/test_get_module_fields.rb +11 -0
- data/test/connection/test_get_relationships.rb +12 -0
- data/test/connection/test_get_server_info.rb +9 -0
- data/test/connection/test_get_user_id.rb +9 -0
- data/test/connection/test_get_user_team_id.rb +9 -0
- data/test/connection/test_login.rb +9 -0
- data/test/connection/test_logout.rb +9 -0
- data/test/connection/test_set_document_revision.rb +28 -0
- data/test/connection/test_set_entry.rb +15 -0
- data/test/connection/test_set_note_attachment.rb +16 -0
- data/test/connection/test_set_relationship.rb +18 -0
- data/test/extensions_test/patch.rb +9 -0
- data/test/helper.rb +17 -0
- data/test/test_association_collection.rb +11 -0
- data/test/test_associations.rb +156 -0
- data/test/test_connection.rb +13 -0
- data/test/test_connection_pool.rb +40 -0
- data/test/test_finders.rb +201 -0
- data/test/test_module.rb +51 -0
- data/test/test_request.rb +35 -0
- data/test/test_response.rb +26 -0
- data/test/test_session.rb +136 -0
- data/test/test_sugarcrm.rb +213 -0
- metadata +266 -0
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
module SugarCRM; class Base
|
|
2
|
+
|
|
3
|
+
# Unset all of the instance methods we don't need.
|
|
4
|
+
instance_methods.each { |m| undef_method m unless m =~ /(^__|^send$|^object_id$|^define_method$|^class$|^nil.$|^methods$|^instance_of.$|^respond_to)/ }
|
|
5
|
+
|
|
6
|
+
# Tracks if we have extended our class with attribute methods yet.
|
|
7
|
+
class_attribute :attribute_methods_generated
|
|
8
|
+
self.attribute_methods_generated = false
|
|
9
|
+
|
|
10
|
+
class_attribute :association_methods_generated
|
|
11
|
+
self.association_methods_generated = false
|
|
12
|
+
|
|
13
|
+
class_attribute :_module
|
|
14
|
+
self._module = nil
|
|
15
|
+
|
|
16
|
+
# the session to which we're linked
|
|
17
|
+
class_attribute :session
|
|
18
|
+
self.session = nil
|
|
19
|
+
|
|
20
|
+
# Contains a list of attributes
|
|
21
|
+
attr :attributes, true
|
|
22
|
+
attr :modified_attributes, true
|
|
23
|
+
attr :associations, true
|
|
24
|
+
attr :debug, true
|
|
25
|
+
attr :errors, true
|
|
26
|
+
|
|
27
|
+
class << self # Class methods
|
|
28
|
+
def find(*args, &block)
|
|
29
|
+
options = args.extract_options!
|
|
30
|
+
# add default sorting date (necessary for first and last methods to work)
|
|
31
|
+
# most modules (Contacts, Accounts, etc.) use 'date_entered' to store when the record was created
|
|
32
|
+
# other modules (e.g. EmailAddresses) use 'date_created'
|
|
33
|
+
# Here, we account for this discrepancy...
|
|
34
|
+
self.new # make sure the fields are loaded from SugarCRM so method_defined? will work properly
|
|
35
|
+
if self.method_defined? :date_entered
|
|
36
|
+
sort_criteria = 'date_entered'
|
|
37
|
+
elsif self.method_defined? :date_created
|
|
38
|
+
sort_criteria = 'date_created'
|
|
39
|
+
# Added date_modified because TeamSets doesn't have a date_created or date_entered field.
|
|
40
|
+
# There's no test for this because it's Pro and above only.
|
|
41
|
+
# Hope this doesn't break anything!
|
|
42
|
+
elsif self.method_defined? :date_modified
|
|
43
|
+
sort_criteria = 'date_modified'
|
|
44
|
+
else
|
|
45
|
+
raise InvalidAttribute, "Unable to determine record creation date for sorting criteria: expected date_entered, date_created, or date_modified attribute to be present"
|
|
46
|
+
end
|
|
47
|
+
options = {:order_by => sort_criteria}.merge(options)
|
|
48
|
+
validate_find_options(options)
|
|
49
|
+
|
|
50
|
+
case args.first
|
|
51
|
+
when :first
|
|
52
|
+
find_initial(options)
|
|
53
|
+
when :last
|
|
54
|
+
begin
|
|
55
|
+
options[:order_by] = reverse_order_clause(options[:order_by].to_s)
|
|
56
|
+
rescue Exception => e
|
|
57
|
+
raise
|
|
58
|
+
end
|
|
59
|
+
find_initial(options)
|
|
60
|
+
when :all
|
|
61
|
+
Array.wrap(find_every(options, &block)).compact
|
|
62
|
+
else
|
|
63
|
+
find_from_ids(args, options, &block)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# return the connection to the correct SugarCRM server (there can be several)
|
|
68
|
+
def connection
|
|
69
|
+
self.session.connection
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# return the number of records satifsying the options
|
|
73
|
+
# note: the REST API has a bug (documented with Sugar as bug 43339) where passing custom attributes in the options will result in the
|
|
74
|
+
# options being ignored and '0' being returned, regardless of the existence of records satisfying the options
|
|
75
|
+
def count(options={})
|
|
76
|
+
raise InvalidAttribute, 'Conditions on custom attributes are not supported due to REST API bug' if contains_custom_attribute(options[:conditions])
|
|
77
|
+
query = query_from_options(options)
|
|
78
|
+
connection.get_entries_count(self._module.name, query, options)['result_count'].to_i
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# A convenience wrapper for <tt>find(:first, *args)</tt>. You can pass in all the
|
|
82
|
+
# same arguments to this method as you can to <tt>find(:first)</tt>.
|
|
83
|
+
def first(*args, &block)
|
|
84
|
+
find(:first, *args, &block)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# A convenience wrapper for <tt>find(:last, *args)</tt>. You can pass in all the
|
|
88
|
+
# same arguments to this method as you can to <tt>find(:last)</tt>.
|
|
89
|
+
def last(*args, &block)
|
|
90
|
+
find(:last, *args, &block)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# This is an alias for find(:all). You can pass in all the same arguments to this method as you can
|
|
94
|
+
# to find(:all)
|
|
95
|
+
def all(*args, &block)
|
|
96
|
+
find(:all, *args, &block)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Creates an object (or multiple objects) and saves it to SugarCRM if validations pass.
|
|
100
|
+
# The resulting object is returned whether the object was saved successfully to the database or not.
|
|
101
|
+
#
|
|
102
|
+
# The +attributes+ parameter can be either be a Hash or an Array of Hashes. These Hashes describe the
|
|
103
|
+
# attributes on the objects that are to be created.
|
|
104
|
+
#
|
|
105
|
+
# ==== Examples
|
|
106
|
+
# # Create a single new object
|
|
107
|
+
# User.create(:first_name => 'Jamie')
|
|
108
|
+
#
|
|
109
|
+
# # Create an Array of new objects
|
|
110
|
+
# User.create([{ :first_name => 'Jamie' }, { :first_name => 'Jeremy' }])
|
|
111
|
+
#
|
|
112
|
+
# # Create a single object and pass it into a block to set other attributes.
|
|
113
|
+
# User.create(:first_name => 'Jamie') do |u|
|
|
114
|
+
# u.is_admin = false
|
|
115
|
+
# end
|
|
116
|
+
#
|
|
117
|
+
# # Creating an Array of new objects using a block, where the block is executed for each object:
|
|
118
|
+
# User.create([{ :first_name => 'Jamie' }, { :first_name => 'Jeremy' }]) do |u|
|
|
119
|
+
# u.is_admin = false
|
|
120
|
+
# end
|
|
121
|
+
def create(attributes = nil, &block)
|
|
122
|
+
if attributes.is_a?(Array)
|
|
123
|
+
attributes.collect { |attr| create(attr, &block) }
|
|
124
|
+
else
|
|
125
|
+
object = new(attributes)
|
|
126
|
+
yield(object) if block_given?
|
|
127
|
+
object.save
|
|
128
|
+
object
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Creates an instance of a Module Class, i.e. Account, User, Contact, etc.
|
|
134
|
+
def initialize(attributes={}, &block)
|
|
135
|
+
attributes.delete('id')
|
|
136
|
+
@errors = {}
|
|
137
|
+
@modified_attributes = {}
|
|
138
|
+
merge_attributes(attributes.with_indifferent_access)
|
|
139
|
+
clear_association_cache
|
|
140
|
+
define_attribute_methods
|
|
141
|
+
define_association_methods
|
|
142
|
+
typecast_attributes
|
|
143
|
+
self
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def inspect
|
|
147
|
+
self
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def to_s
|
|
151
|
+
attrs = []
|
|
152
|
+
@attributes.keys.sort.each do |k|
|
|
153
|
+
attrs << "#{k}: #{attribute_for_inspect(k)}"
|
|
154
|
+
end
|
|
155
|
+
"#<#{self.class} #{attrs.join(", ")}>"
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# objects are considered equal if they represent the same SugarCRM record
|
|
159
|
+
# this behavior is required for Rails to be able to properly cast objects to json (lists, in particular)
|
|
160
|
+
def equal?(other)
|
|
161
|
+
return false unless other && other.respond_to?(:id)
|
|
162
|
+
self.id == other.id
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# return variables that are defined in SugarCRM, instead of the object's actual variables (such as modified_attributes, errors, etc.)
|
|
166
|
+
def instance_variables
|
|
167
|
+
@_instance_variables ||= @attributes.keys.map{|i| ('@' + i).to_sym }
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# override to return the value of the SugarCRM record's attributes
|
|
171
|
+
def instance_variable_get(name)
|
|
172
|
+
name = name.to_s.gsub(/^@/,'')
|
|
173
|
+
@attributes[name]
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
# Rails requires this to (e.g.) generate json representations of models
|
|
177
|
+
# this code taken directly from the Rails project
|
|
178
|
+
if defined?(Rails)
|
|
179
|
+
def instance_values
|
|
180
|
+
Hash[instance_variables.map { |name| [name.to_s[1..-1], instance_variable_get(name)] }]
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def to_json(options={})
|
|
185
|
+
attributes.to_json
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def to_xml(options={})
|
|
189
|
+
attributes.to_xml
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
# Saves the current object, checks that required fields are present.
|
|
193
|
+
# returns true or false
|
|
194
|
+
def save(opts={})
|
|
195
|
+
options = { :validate => true }.merge(opts)
|
|
196
|
+
return false if !(new_record? || changed?)
|
|
197
|
+
if options[:validate]
|
|
198
|
+
return false if !valid?
|
|
199
|
+
end
|
|
200
|
+
begin
|
|
201
|
+
save!(options)
|
|
202
|
+
rescue
|
|
203
|
+
return false
|
|
204
|
+
end
|
|
205
|
+
true
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
# Saves the current object, and any modified associations.
|
|
209
|
+
# Raises an exceptions if save fails for any reason.
|
|
210
|
+
def save!(opts={})
|
|
211
|
+
save_modified_attributes!(opts)
|
|
212
|
+
save_modified_associations!
|
|
213
|
+
true
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def delete
|
|
217
|
+
return false if id.blank?
|
|
218
|
+
params = {}
|
|
219
|
+
params[:id] = serialize_id
|
|
220
|
+
params[:deleted]= {:name => "deleted", :value => "1"}
|
|
221
|
+
@attributes[:deleted] = (self.class.connection.set_entry(self.class._module.name, params).class == Hash)
|
|
222
|
+
end
|
|
223
|
+
alias :destroy :delete
|
|
224
|
+
|
|
225
|
+
# Returns if the record is persisted, i.e. it’s not a new record and it was not destroyed
|
|
226
|
+
def persisted?
|
|
227
|
+
!(new_record? || destroyed?)
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# Reloads the record from SugarCRM
|
|
231
|
+
def reload!
|
|
232
|
+
self.attributes = self.class.find(self.id).attributes
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
def blank?
|
|
236
|
+
@attributes.empty?
|
|
237
|
+
end
|
|
238
|
+
alias :empty? :blank?
|
|
239
|
+
|
|
240
|
+
# Returns true if +comparison_object+ is the same exact object, or +comparison_object+
|
|
241
|
+
# is of the same type and +self+ has an ID and it is equal to +comparison_object.id+.
|
|
242
|
+
#
|
|
243
|
+
# Note that new records are different from any other record by definition, unless the
|
|
244
|
+
# other record is the receiver itself. Besides, if you fetch existing records with
|
|
245
|
+
# +select+ and leave the ID out, you're on your own, this predicate will return false.
|
|
246
|
+
#
|
|
247
|
+
# Note also that destroying a record preserves its ID in the model instance, so deleted
|
|
248
|
+
# models are still comparable.
|
|
249
|
+
def ==(comparison_object)
|
|
250
|
+
comparison_object.instance_of?(self.class) &&
|
|
251
|
+
id.present? &&
|
|
252
|
+
comparison_object.id == id
|
|
253
|
+
end
|
|
254
|
+
alias :eql? :==
|
|
255
|
+
|
|
256
|
+
def update_attribute!(name, value)
|
|
257
|
+
self.send("#{name}=".to_sym, value)
|
|
258
|
+
self.save!
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
def update_attribute(name, value)
|
|
262
|
+
begin
|
|
263
|
+
update_attribute!(name, value)
|
|
264
|
+
rescue
|
|
265
|
+
return false
|
|
266
|
+
end
|
|
267
|
+
true
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
def update_attributes!(attributes)
|
|
271
|
+
attributes.each do |name, value|
|
|
272
|
+
self.send("#{name}=".to_sym, value)
|
|
273
|
+
end
|
|
274
|
+
self.save!
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
def update_attributes(attributes)
|
|
278
|
+
begin
|
|
279
|
+
update_attributes!(attributes)
|
|
280
|
+
rescue
|
|
281
|
+
return false
|
|
282
|
+
end
|
|
283
|
+
true
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
# Returns the URL (in string format) where the module instance is available in CRM
|
|
287
|
+
def url
|
|
288
|
+
"#{SugarCRM.session.config[:base_url]}/index.php?module=#{self.class._module.name}&action=DetailView&record=#{self.id}"
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
# Delegates to id in order to allow two records of the same type and id to work with something like:
|
|
292
|
+
# [ Person.find(1), Person.find(2), Person.find(3) ] & [ Person.find(1), Person.find(4) ] # => [ Person.find(1) ]
|
|
293
|
+
def hash
|
|
294
|
+
id.hash
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
def pretty_print(pp)
|
|
298
|
+
pp.text self.inspect.to_s, 0
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
def attribute_methods_generated?
|
|
302
|
+
self.class.attribute_methods_generated
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
def association_methods_generated?
|
|
306
|
+
self.class.association_methods_generated
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
def to_key
|
|
310
|
+
new_record? ? nil : [ id ]
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
def to_param
|
|
314
|
+
id.to_s
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
def is_a?(klass)
|
|
318
|
+
superclasses.include? klass
|
|
319
|
+
end
|
|
320
|
+
alias :kind_of? :is_a?
|
|
321
|
+
alias :=== :is_a?
|
|
322
|
+
|
|
323
|
+
private
|
|
324
|
+
# returns true if the hash contains a custom attribute created in Studio (and whose name therefore ends in '_c')
|
|
325
|
+
def self.contains_custom_attribute(attributes)
|
|
326
|
+
attributes ||= {}
|
|
327
|
+
attributes.each_key{|k|
|
|
328
|
+
return true if k.to_s =~ /_c$/
|
|
329
|
+
}
|
|
330
|
+
false
|
|
331
|
+
end
|
|
332
|
+
|
|
333
|
+
def superclasses
|
|
334
|
+
return @superclasses if @superclasses
|
|
335
|
+
@superclasses = [self.class]
|
|
336
|
+
current_class = self.class
|
|
337
|
+
while current_class.respond_to? :superclass
|
|
338
|
+
@superclasses << (current_class = current_class.superclass)
|
|
339
|
+
end
|
|
340
|
+
@superclasses
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
Base.class_eval do
|
|
344
|
+
extend FinderMethods::ClassMethods
|
|
345
|
+
include AttributeMethods
|
|
346
|
+
extend AttributeMethods::ClassMethods
|
|
347
|
+
include AttributeValidations
|
|
348
|
+
include AttributeTypeCast
|
|
349
|
+
include AttributeSerializers
|
|
350
|
+
include AssociationMethods
|
|
351
|
+
extend AssociationMethods::ClassMethods
|
|
352
|
+
include AssociationCache
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
end; end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# below is an example configuration file
|
|
2
|
+
#
|
|
3
|
+
# to create you own configuration file, simply copy and adapt the text below, removing the '#' in front of the key-value pairs
|
|
4
|
+
#
|
|
5
|
+
# you'll find an example of a configuration file (used for tests) in test/config_test.yaml
|
|
6
|
+
#
|
|
7
|
+
# config:
|
|
8
|
+
# base_url: http://127.0.0.1/sugarcrm # where your SugarCRM instance is located
|
|
9
|
+
# username: admin
|
|
10
|
+
# password: letmein
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module SugarCRM; class Connection
|
|
2
|
+
# Retrieves the list of modules available to the current user logged into the system.
|
|
3
|
+
def get_available_modules
|
|
4
|
+
login! unless logged_in?
|
|
5
|
+
json = <<-EOF
|
|
6
|
+
{
|
|
7
|
+
"session": "#{@sugar_session_id}"
|
|
8
|
+
}
|
|
9
|
+
EOF
|
|
10
|
+
|
|
11
|
+
json.gsub!(/^\s{6}/,'')
|
|
12
|
+
mods = send!(:get_available_modules, json)["modules"]
|
|
13
|
+
modules = []
|
|
14
|
+
mods.each do |mod|
|
|
15
|
+
modules << Module.new(@session, mod)
|
|
16
|
+
end
|
|
17
|
+
modules
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
alias :get_modules :get_available_modules
|
|
21
|
+
|
|
22
|
+
end; end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module SugarCRM; class Connection
|
|
2
|
+
# Downloads a particular revision of a document.
|
|
3
|
+
def get_document_revision(id)
|
|
4
|
+
login! unless logged_in?
|
|
5
|
+
json = <<-EOF
|
|
6
|
+
{
|
|
7
|
+
"session": "#{@sugar_session_id}",
|
|
8
|
+
"id": "#{id}"
|
|
9
|
+
}
|
|
10
|
+
EOF
|
|
11
|
+
json.gsub!(/^\s{6}/,'')
|
|
12
|
+
SugarCRM::Response.handle(send!(:get_document_revision, json), @session)
|
|
13
|
+
end
|
|
14
|
+
end; end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module SugarCRM; class Connection
|
|
2
|
+
# Retrieve a list of SugarBeans by ID. This method will not
|
|
3
|
+
# work with the report module.
|
|
4
|
+
def get_entries(module_name, ids, opts={})
|
|
5
|
+
login! unless logged_in?
|
|
6
|
+
options = {
|
|
7
|
+
:fields => [],
|
|
8
|
+
:link_fields => [],
|
|
9
|
+
}.merge! opts
|
|
10
|
+
|
|
11
|
+
json = <<-EOF
|
|
12
|
+
{
|
|
13
|
+
"session": "#{@sugar_session_id}",
|
|
14
|
+
"module_name": "#{module_name}",
|
|
15
|
+
"ids": #{ids.to_json},
|
|
16
|
+
"select_fields": #{resolve_fields(module_name, options[:fields])},
|
|
17
|
+
"link_name_to_fields_array": #{options[:link_fields].to_json}
|
|
18
|
+
}
|
|
19
|
+
EOF
|
|
20
|
+
json.gsub!(/^\s{6}/,'')
|
|
21
|
+
SugarCRM::Response.handle(send!(:get_entries, json), @session)
|
|
22
|
+
end
|
|
23
|
+
end; end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module SugarCRM; class Connection
|
|
2
|
+
# Retrieves the specified number of records in a module.
|
|
3
|
+
def get_entries_count(module_name, query, opts={})
|
|
4
|
+
login! unless logged_in?
|
|
5
|
+
options = {
|
|
6
|
+
:deleted => 0
|
|
7
|
+
}.merge! opts
|
|
8
|
+
|
|
9
|
+
json = <<-EOF
|
|
10
|
+
{
|
|
11
|
+
"session": "#{@sugar_session_id}",
|
|
12
|
+
"module_name": "#{module_name}",
|
|
13
|
+
"query": "#{query}",
|
|
14
|
+
"deleted": #{options[:deleted]}
|
|
15
|
+
}
|
|
16
|
+
EOF
|
|
17
|
+
json.gsub!(/^\s{6}/,'')
|
|
18
|
+
send!(:get_entries_count, json)
|
|
19
|
+
end
|
|
20
|
+
end; end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module SugarCRM; class Connection
|
|
2
|
+
# Retrieves a single SugarBean based on the ID.
|
|
3
|
+
def get_entry(module_name, id, opts={})
|
|
4
|
+
login! unless logged_in?
|
|
5
|
+
options = {
|
|
6
|
+
:fields => [],
|
|
7
|
+
:link_fields => [],
|
|
8
|
+
}.merge! opts
|
|
9
|
+
|
|
10
|
+
json = <<-EOF
|
|
11
|
+
{
|
|
12
|
+
"session": "#{@sugar_session_id}",
|
|
13
|
+
"module_name": "#{module_name}",
|
|
14
|
+
"id": "#{id}",
|
|
15
|
+
"select_fields": #{resolve_fields(module_name, options[:fields])},
|
|
16
|
+
"link_name_to_fields_array": #{options[:link_fields].to_json}
|
|
17
|
+
}
|
|
18
|
+
EOF
|
|
19
|
+
|
|
20
|
+
json.gsub!(/^\s{6}/,'')
|
|
21
|
+
SugarCRM::Response.handle(send!(:get_entry, json), @session)
|
|
22
|
+
end
|
|
23
|
+
end; end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module SugarCRM; class Connection
|
|
2
|
+
# Retrieve a list of SugarBeans. This is the primary method for getting
|
|
3
|
+
# a list of SugarBeans using the REST API.
|
|
4
|
+
def get_entry_list(module_name, query, opts={})
|
|
5
|
+
login! unless logged_in?
|
|
6
|
+
options = {
|
|
7
|
+
:order_by => '',
|
|
8
|
+
:offset => '',
|
|
9
|
+
:fields => [],
|
|
10
|
+
:link_fields => [],
|
|
11
|
+
:limit => '',
|
|
12
|
+
:deleted => 0
|
|
13
|
+
}.merge! opts
|
|
14
|
+
|
|
15
|
+
json = <<-EOF
|
|
16
|
+
{
|
|
17
|
+
"session": "#{@sugar_session_id}",
|
|
18
|
+
"module_name": "#{module_name}",
|
|
19
|
+
"query": "#{query}",
|
|
20
|
+
"order_by": "#{options[:order_by]}",
|
|
21
|
+
"offset": "#{options[:offset]}",
|
|
22
|
+
"select_fields": #{resolve_fields(module_name, options[:fields])},
|
|
23
|
+
"link_name_to_fields_array": #{options[:link_fields].to_json},
|
|
24
|
+
"max_results": "#{options[:limit]}",
|
|
25
|
+
"deleted": #{options[:deleted]}
|
|
26
|
+
}
|
|
27
|
+
EOF
|
|
28
|
+
json.gsub!(/^\s{6}/,'')
|
|
29
|
+
SugarCRM::Response.handle(send!(:get_entry_list, json), @session)
|
|
30
|
+
end
|
|
31
|
+
end; end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module SugarCRM; class Connection
|
|
2
|
+
# Retrieves the vardef information of the specified bean.
|
|
3
|
+
def get_module_fields(module_name)
|
|
4
|
+
login! unless logged_in?
|
|
5
|
+
json = <<-EOF
|
|
6
|
+
{
|
|
7
|
+
"session": "#{@sugar_session_id}",
|
|
8
|
+
"module_name": "#{module_name}"
|
|
9
|
+
}
|
|
10
|
+
EOF
|
|
11
|
+
json.gsub!(/^\s{6}/,'')
|
|
12
|
+
SugarCRM::Response.handle(send!(:get_module_fields, json), @session)
|
|
13
|
+
end
|
|
14
|
+
alias :get_fields :get_module_fields
|
|
15
|
+
end; end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module SugarCRM; class Connection
|
|
2
|
+
# Retrieves an attachment from a note.
|
|
3
|
+
def get_note_attachment(id)
|
|
4
|
+
login! unless logged_in?
|
|
5
|
+
json = <<-EOF
|
|
6
|
+
{
|
|
7
|
+
"session": "#{@sugar_session_id}",
|
|
8
|
+
"id": "#{id}"
|
|
9
|
+
}
|
|
10
|
+
EOF
|
|
11
|
+
json.gsub!(/^\s{6}/,'')
|
|
12
|
+
send!(:get_note_attachment, json)["note_attachment"]
|
|
13
|
+
end
|
|
14
|
+
end; end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module SugarCRM; class Connection
|
|
2
|
+
# Retrieves a collection of beans that are related
|
|
3
|
+
# to the specified bean and, optionally, returns
|
|
4
|
+
# relationship data
|
|
5
|
+
def get_relationships(module_name, id, related_to, opts={})
|
|
6
|
+
login! unless logged_in?
|
|
7
|
+
options = {
|
|
8
|
+
:query => '',
|
|
9
|
+
:fields => [],
|
|
10
|
+
:link_fields => [],
|
|
11
|
+
:deleted => 0
|
|
12
|
+
}.merge! opts
|
|
13
|
+
|
|
14
|
+
json = <<-EOF
|
|
15
|
+
{
|
|
16
|
+
"session": "#{@sugar_session_id}",
|
|
17
|
+
"module_name": "#{module_name}",
|
|
18
|
+
"module_id": "#{id}",
|
|
19
|
+
"link_field_name": "#{related_to.downcase}",
|
|
20
|
+
"related_module_query": "#{options[:query]}",
|
|
21
|
+
"related_fields": #{resolve_related_fields(module_name, related_to)},
|
|
22
|
+
"related_module_link_name_to_fields_array": #{options[:link_fields].to_json},
|
|
23
|
+
"deleted": #{options[:deleted]}
|
|
24
|
+
}
|
|
25
|
+
EOF
|
|
26
|
+
json.gsub!(/^\s{6}/,'')
|
|
27
|
+
SugarCRM::Response.new(send!(:get_relationships, json), @session, {:always_return_array => true}).to_obj
|
|
28
|
+
end
|
|
29
|
+
alias :get_relationship :get_relationships
|
|
30
|
+
end; end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module SugarCRM; class Connection
|
|
2
|
+
# Retrieves a list of report entries based on specified report IDs.
|
|
3
|
+
def get_report_entries(ids, opts={})
|
|
4
|
+
login! unless logged_in?
|
|
5
|
+
options = {:select_fields => ''}.merge! opts
|
|
6
|
+
|
|
7
|
+
json = <<-EOF
|
|
8
|
+
{
|
|
9
|
+
"session": "#{@sugar_session_id}",
|
|
10
|
+
"ids": #{ids.to_json},
|
|
11
|
+
"select_fields": "#{options[:select_fields].to_json}"
|
|
12
|
+
}
|
|
13
|
+
EOF
|
|
14
|
+
json.gsub!(/^\s{6}/,'')
|
|
15
|
+
send!(:get_report_entries, json)
|
|
16
|
+
end
|
|
17
|
+
end; end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module SugarCRM; class Connection
|
|
2
|
+
# Returns the ID of the user who is logged into the current session.
|
|
3
|
+
def get_user_id
|
|
4
|
+
login! unless logged_in?
|
|
5
|
+
json = <<-EOF
|
|
6
|
+
{
|
|
7
|
+
"session": "#{@sugar_session_id}"
|
|
8
|
+
}
|
|
9
|
+
EOF
|
|
10
|
+
json.gsub!(/^\s{6}/,'')
|
|
11
|
+
send!(:get_user_id, json)
|
|
12
|
+
end
|
|
13
|
+
end; end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module SugarCRM; class Connection
|
|
2
|
+
# Retrieves the ID of the default team of the user
|
|
3
|
+
# who is logged into the current session.
|
|
4
|
+
def get_user_team_id
|
|
5
|
+
login! unless logged_in?
|
|
6
|
+
json = <<-EOF
|
|
7
|
+
{
|
|
8
|
+
"session": "#{@sugar_session_id}"
|
|
9
|
+
}
|
|
10
|
+
EOF
|
|
11
|
+
json.gsub!(/^\s{6}/,'')
|
|
12
|
+
send!(:get_user_team_id, json)
|
|
13
|
+
end
|
|
14
|
+
end; end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module SugarCRM; class Connection
|
|
2
|
+
# Logs the user into the Sugar application.
|
|
3
|
+
def login
|
|
4
|
+
connect! unless connected?
|
|
5
|
+
json = <<-EOF
|
|
6
|
+
{
|
|
7
|
+
"user_auth": {
|
|
8
|
+
"user_name": "#{@user}",
|
|
9
|
+
"password": "#{OpenSSL::Digest::MD5.new(@pass)}",
|
|
10
|
+
"version": 2
|
|
11
|
+
},
|
|
12
|
+
"application": "sugarcrm_rubygem"
|
|
13
|
+
}
|
|
14
|
+
EOF
|
|
15
|
+
json.gsub!(/^\s{6}/,'')
|
|
16
|
+
response = send!(:login, json)
|
|
17
|
+
end
|
|
18
|
+
end; end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module SugarCRM; class Connection
|
|
2
|
+
# Logs out of the Sugar user session.
|
|
3
|
+
def logout
|
|
4
|
+
login! unless logged_in?
|
|
5
|
+
json = <<-EOF
|
|
6
|
+
{
|
|
7
|
+
"user_auth": {
|
|
8
|
+
"session": "#{@sugar_session_id}"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
EOF
|
|
12
|
+
json.gsub!(/^\s{6}/,'')
|
|
13
|
+
send!(:logout, json)
|
|
14
|
+
end
|
|
15
|
+
end; end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module SugarCRM; class Connection
|
|
2
|
+
# Performs a seamless login during synchronization.
|
|
3
|
+
def seamless_login
|
|
4
|
+
login! unless logged_in?
|
|
5
|
+
json = <<-EOF
|
|
6
|
+
{
|
|
7
|
+
"session": "#{@sugar_session_id}"
|
|
8
|
+
}
|
|
9
|
+
EOF
|
|
10
|
+
json.gsub!(/^\s{6}/,'')
|
|
11
|
+
response = send!(:seamless_login, json)
|
|
12
|
+
end
|
|
13
|
+
end; end
|