class SugarCRM::Connection

Public Class Methods

connect(url,consumer_key,consumer_secret,username,password,platform) click to toggle source
# File lib/sugarcrm_v10.rb, line 17
def self.connect(url,consumer_key,consumer_secret,username,password,platform)  
   begin
    $consumer_key = consumer_key
    $consumer_secret = consumer_secret
    $username = username
    $password = password
    $platform = platform
    
    $url=url
    uri = URI.parse(url)
  
    if uri.is_a?(URI::HTTP) && !uri.host.nil?
  
    oauth2_token_arguments = {"grant_type" =>"password", "client_id" =>consumer_key, "client_secret" =>consumer_secret, "username" =>username, "password" =>password, "platform" =>platform}
   
    http = Net::HTTP.new uri.host, uri.port  
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    request = Net::HTTP::Post.new uri.request_uri
    request["Content-Type"] = "application/x-www-form-urlencoded"
    request.body = URI.encode_www_form(oauth2_token_arguments)  
    response = http.request request
    $token = nil
                
    if response.kind_of? Net::HTTPSuccess
       $token = JSON.parse response.body
    return SugarCRM::Connection
     else 
       raise "Unable to connect to sugarcrm"
     end
   end
    rescue Exception=>e
     puts e
    end
end
create_record(module_name,record) click to toggle source
# File lib/sugarcrm_v10.rb, line 188
def self.create_record(module_name,record) #creates a new record
  begin
   if get_refreshtoken()==nil
     connect($url,$consumer_key,$consumer_secret,$username,$password,$platform)
    end
  uri = URI.parse($url)
  url = "https://"+uri.host+"/rest/v10/"+module_name
  response = execute_postreq(url,record)
  raise "Module '#{module_name}' not found" unless response.is_a? Net::HTTPSuccess
  rec= JSON.parse response.body
  id=rec["id"]
  return id
  rescue Exception =>e
  puts e
  end
 end
download_document(doc_id,path) click to toggle source
# File lib/sugarcrm_v10.rb, line 350
def self.download_document(doc_id,path) #downloads a document via document module
  begin
  if get_refreshtoken()==nil
    connect($url,$consumer_key,$consumer_secret,$username,$password,$platform)
  end
  uri= URI.parse($url)
  rec = fetch_single_record("Documents",doc_id)
  doc_rev_id =  rec['document_revision_id']
  file_name = rec['document_name']
  url = "https://"+uri.host+"/rest/v10/DocumentRevisions/#{doc_rev_id}/file/filename"  
  response = execute_uri(url)
  raise "Document id not found" unless response.is_a? Net::HTTPSuccess
  file_contents = response.body
  file_contents.force_encoding(Encoding::ISO_8859_1).encode(Encoding::UTF_8)
  file = path + file_name 
  IO.binwrite file,file_contents
  rescue =>e
  puts e

  end
 end
execute_postreq(url,record) click to toggle source
# File lib/sugarcrm_v10.rb, line 85
def self.execute_postreq(url,record)

  uri = URI.parse url
  http = Net::HTTP.new uri.host, uri.port
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  request = Net::HTTP::Post.new (url)
  request["OAuth-Token"] = $token["access_token"]
  request.add_field('Content-Type', 'application/json')
  request.body = record.to_json
  response = http.request(request)

end
execute_putreq(url,record) click to toggle source
# File lib/sugarcrm_v10.rb, line 99
def self.execute_putreq(url,record)

  uri = URI.parse url
  http = Net::HTTP.new uri.host, uri.port
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  request = Net::HTTP::Put.new (url)
  request["OAuth-Token"] = $token["access_token"]
  request.add_field('Content-Type', 'application/json')
  request.body = record.to_json
  response = http.request(request)
 
end
execute_uri(url) click to toggle source
# File lib/sugarcrm_v10.rb, line 72
def self.execute_uri(url) #getrequest
 
  uri = URI.parse url
  http = Net::HTTP.new uri.host, uri.port
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE     
  request = Net::HTTP::Get.new uri.request_uri
  request["Content-Type"] = "application/json"
  request["OAuth-Token"] = $token["access_token"]
  response = http.request request

end
fetch_all(module_name,max_num=20,offset=0) click to toggle source
# File lib/sugarcrm_v10.rb, line 134
def self.fetch_all(module_name,max_num=20,offset=0) # returns a set of records with all fields.
  begin
   if get_refreshtoken()==nil
     connect($url,$consumer_key,$consumer_secret,$username,$password,$platform)
   end
  raise "Maximum number/offset should be a numeric value" unless max_num.is_a? Integer
  raise "Maximum number/offset should be a numeric value" unless offset.is_a? Integer
  uri=URI.parse($url)
  url="https://"+uri.host+"/rest/v10/"+module_name+"?max_num=#{max_num}&offset=#{offset}"
  response=execute_uri(url)
  raise "Module '#{module_name}' not found" unless response.is_a? Net::HTTPSuccess
  resp= JSON.parse response.body
  records=resp["records"]
  raise "No records found!" if records.empty?
  return records
  rescue Exception => e
    puts e
    end
  end
fetch_any_fields(module_name,max_num=20,offset=0,fields) click to toggle source
# File lib/sugarcrm_v10.rb, line 154
def self.fetch_any_fields(module_name,max_num=20,offset=0,fields) #returns a set of records , passing required fields and module name

  begin
    if get_refreshtoken()==nil
      connect($url,$consumer_key,$consumer_secret,$username,$password,$platform)
    end
  uri = URI.parse($url)
  raise "Maximum number/offset should be a numeric value" unless max_num.is_a? Integer
  raise "Maximum number/offset should be a numeric value" unless offset.is_a? Integer
   
  if fields.kind_of?(Array)
     @field=fields[0]
      i=1
      while i<fields.length
        @field=@field+","+fields[i]
         i+=1
       end 
  else
      @field=fields
  end    
  url = "https://"+uri.host+"/rest/v10/"+module_name+"?max_num=#{max_num}&"+"fields=#{@field}&"+"offset=#{offset}"
  response = execute_uri(url)
  raise "Module '#{module_name}' not found" unless response.is_a? Net::HTTPSuccess
  
  resp = JSON.parse response.body
  records=resp["records"]
  raise "No records found!" if records.empty?
  return records
  rescue Exception=>e
    puts e
    end
  end
fetch_single_record(module_name,id) click to toggle source
# File lib/sugarcrm_v10.rb, line 114
def self.fetch_single_record(module_name,id)  # returns a single record with given id
  begin

  if get_refreshtoken()==nil
    connect($url,$consumer_key,$consumer_secret,$username,$password,$platform)
  end

  id=id.to_s
  uri = URI.parse($url)
  url = "https://"+uri.host+"/rest/v10/"+module_name+"/#{id}"
  response = execute_uri(url)
  raise "Module or record id not found" unless response.is_a? Net::HTTPSuccess
  resp = JSON.parse response.body
  return res= OpenStruct.new(resp)
  rescue =>e
    puts e
  end
end
filter_by_and_or(module_name,max_num=20,offset=2,fields=nil,filter) click to toggle source
# File lib/sugarcrm_v10.rb, line 224
def self.filter_by_and_or(module_name,max_num=20,offset=2,fields=nil,filter) # executes and/or  nested conditions
  begin
   if get_refreshtoken()==nil
     connect($url,$consumer_key,$consumer_secret,$username,$password,$platform)
  end
 
  @filter1=""
  @filter2=""
  filter.each do |key,value|
  value.each do |k,v|
  if v.class==Hash
     v.each do |x,y|
     @filter1 = "&filter"+"#{[0]}"+"[#{key}]"+"#{[0]}"+"[#{k}]"+"[#{x}]"+"="+"#{y}"+@filter1
  end
   else
     @filter2 = "&filter"+"#{[0]}"+"[#{key}]"+"#{[0]}"+"[#{k}]"+"="+"#{v}"+@filter2
    end
   end
   end
  @filter= @filter1+@filter2
  if fields!=nil
    if fields.kind_of?(Array)
      @field=fields.join(",")
    else
      @field=fields
    end  
  end 
  uri = URI.parse($url)
  url = "https://"+uri.host+"/rest/v10/"+module_name+"?max_num=#{max_num}"+"&offset=#{offset}"+"#{@filter}"+"&fields=#{@field}"
  response = execute_uri(url)
  raise "Module not found" unless response.is_a? Net::HTTPSuccess
  resp= JSON.parse response.body
  records= resp["records"]
  raise "No records found!" if records.empty?
  return records
  rescue Exception =>e
    puts e
   end
  end
filter_records(module_name,max_num=20,offset=0,fields=nil,filter) click to toggle source
# File lib/sugarcrm_v10.rb, line 264
def self.filter_records(module_name,max_num=20,offset=0,fields=nil,filter) #filter records with conditions { $starts,$contains ,$lt etc..}


 begin
  if get_refreshtoken()==nil
    connect($url,$consumer_key,$consumer_secret,$username,$password,$platform)
  end
  raise " Add filter conditions" unless filter.class==Hash
 
  @filter2=""
  @filter1=""
  filter.each do |k,v|
  if v.class == Hash
     v.each do |key,value|
     @filter1 = "&filter"+"#{[0]}"+"[#{k}]"+"[#{key}]"+"="+"#{value}" + @filter1
  end
    else
     @filter2 = "&filter"+"#{[0]}"+"[#{k}]"+"="+"#{v}" + @filter2
    end
  end
  @filter = @filter1 + @filter2

  if fields!=nil 
    if fields.kind_of?(Array)
      @field=fields.join(",")
 
    else
      @field=fields
    end   
  end
  uri = URI.parse($url)
  url = "https://"+uri.host+"/rest/v10/"+module_name+"?max_num=#{max_num}"+"#{@filter}"+"&offset=#{offset}"+"&fields=#{@field}"
  response = execute_uri(url)
  raise "Module not found" unless response.is_a? Net::HTTPSuccess
  resp= JSON.parse response.body
  records= resp["records"]

  raise "No records found!" if records.empty?
    return records 
  rescue Exception =>e
  puts e
    end
  end
get_refreshtoken() click to toggle source
# File lib/sugarcrm_v10.rb, line 53
 def self.get_refreshtoken() #generates new token
  
    uri = URI.parse($url)
    oauth2_token_arguments = {"grant_type" =>"refresh_token", "client_id" =>$consumer_key, "client_secret" =>$consumer_secret,"refresh_token"=>$token["refresh_token"]}
    http = Net::HTTP.new uri.host, uri.port  
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    request = Net::HTTP::Post.new uri.request_uri
    request["Content-Type"] = "application/x-www-form-urlencoded"
    request.body = URI.encode_www_form(oauth2_token_arguments)  
    response = http.request request
    if response.kind_of? Net::HTTPSuccess
     $token = JSON.parse response.body
     return $token["access_token"]
    else
     return nil
   end
end
update_record(module_name,id,record) click to toggle source
# File lib/sugarcrm_v10.rb, line 205
def self.update_record(module_name,id,record) #updates the given record
 begin
  if get_refreshtoken()==nil
   connect($url,$consumer_key,$consumer_secret,$username,$password,$platform)
   end
 updated = Hash.new
 id = id.to_s
 uri = URI.parse($url)
 url = "https://"+uri.host+"/rest/v10/"+module_name+"/#{id}"
 response = execute_putreq(url,record)
 raise "Module or record id not found" unless response.is_a? Net::HTTPSuccess
 rec= JSON.parse response.body
 return rec
 rescue Exception=>e
 puts e
  end
 end
upload_document(hash_options) click to toggle source
# File lib/sugarcrm_v10.rb, line 373
def self.upload_document(hash_options) #uploads a file to Documents module
  begin
  if get_refreshtoken()==nil
     connect($url,$consumer_key,$consumer_secret,$username,$password,$platform)
  end
  uri = URI.parse($url)
  
  revision =revision.to_i  
  request_opt = JSON.generate(hash_options)
  res = RestClient.post 'https://'+uri.host+'/rest/v10/Documents', request_opt, :content_type => 'application/json', :'OAuth-Token' => $token['access_token'], :'Cache-Control'  => 'no-cache', :use_ssl => true, :verify_mode => OpenSSL::SSL::VERIFY_NONE
  root = JSON.parse res.body 
  @id = root['id']
  document_id = @id
  path=hash_options["name"]
  response = RestClient.post "https://"+ uri.host+"/rest/v10/Documents/#{document_id}/file/filename", :filename => File.new(path, 'rb'), 
  :format => 'sugar-html-json',
  :'OAuth-Token' => $token['access_token'],
  :'Cache-Control' => 'no-cache',
  :use_ssl => true, 
  :verify_mode => OpenSSL::SSL::VERIFY_NONE

  return document_id
  rescue Exception =>e
   puts "Couldn't upload the file"
  end
 end