def get_api(self, entity_obj=None, entity_id=None, access_token = None, access_token_secret=None):
     if self.api is None:
         
         _api = LinkedIn(settings.LINKEDIN_OAUTH_CONSUMER_KEY, 
                                 settings.LINKEDIN_OAUTH_CONSUMER_SECRET, 
                                 settings.LINKEDIN_OAUTH_RETURN_URL)
         if access_token is None or access_token_secret is None:
             _token=super(CustomConnector, self).get_record(entity_id, ["access_token_secret",
                                                                 "access_token"])
             _api.access_token=_token['access_token']
             _api.access_token_secret=_token['access_token_secret']
         else:
             _api.access_token=access_token
             _api.access_token_secret=access_token_secret
         self.api = _api
     return self.api
    def get_oauth_url(self, entity_id=None, params={}):
        next_url=params.get('next_url', settings.LINKEDIN_OAUTH_RETURN_URL)
        decode = params.get('decode', False)

        if decode:
            next_url=urllib.unquote(next_url)
        api = LinkedIn(settings.LINKEDIN_OAUTH_CONSUMER_KEY, 
                                settings.LINKEDIN_OAUTH_CONSUMER_SECRET, 
                                next_url)
        result = api.requestToken() # result can be True or False
        # if True, you can open your browser and copy the authorization url of LinkedIn.
        if result:
            try:
                query=None
                pickled = base64.encodestring(pickle.dumps(api))
                token = api.request_token
                self.transaction_start()
                try:
                    query=QUERY_CREATE_OAUTH_TABLE % (DM_DATABASE_NAME)
                    self.do_query(query)
                except Exception, err:
                    if not ("already exists" in ("%s" % err)):
                        Logger().error("Error: %s (%s) - %s" % (err, query, Exception))
                        raise Exception, err
                
                try:
                    query=QUERY_DELETE_OAUTH_RECORD % (DM_DATABASE_NAME,token, "linkedinConnector")
                    self.do_query(query)
                except Exception, err:
                    Logger().error("Error: %s (%s)" % (err, query))
                    raise Exception, err

                
                query=QUERY_ADD_OAUTH_RECORD % (DM_DATABASE_NAME,
                                          token,
                                          pickled, 
                                          str(datetime.datetime.now()), 
                                          "linkedinConnector")
                self.do_query(query)

                self.transaction_commit()
 def oauth_validate_token(self, entity_id=None, params={}):
     api = LinkedIn(settings.LINKEDIN_OAUTH_CONSUMER_KEY, 
                             settings.LINKEDIN_OAUTH_CONSUMER_SECRET, 
                             params.get('next_url', settings.LINKEDIN_OAUTH_RETURN_URL))
     try:
         tokenized_url = params.get('tokenized_url')
         if tokenized_url and tokenized_url!="":
             decode = params.get('decode', False)
     
             if decode:
                 tokenized_url=urllib.unquote(tokenized_url)
             parsed=urlparse(tokenized_url)
             parsed_params=dict([item.split('=')[0], item.split('=')[1]] for item in parsed.query.split('&'))                
             oauth_token = urllib.unquote(parsed_params.get('oauth_token'))
             self.cursor.execute(QUERY_GET_OAUTH_RECORD % (DM_DATABASE_NAME, oauth_token, "linkedinConnector"))
 
             record=[dict(zip(['pickled'], row)) for row in self.cursor.fetchall()]
 
             api = pickle.loads(base64.decodestring(record[0].get('pickled')))
                                 
             oauth_verifier = str(parsed_params.get('oauth_verifier'))
             # After you get the verifier, you call the accessToken() method to get the access token.
             result = api.accessToken(verifier=oauth_verifier) # result can be True or False
             
             if result:
                 entity_type=self.object_name.split("_")[-1]
                 if entity_id is None:
                     profile_fields=["id", 
                        "first-name",
                        "last-name",
                        ]
                     profile = api.GetProfile(None, None, profile_fields)
                     attributes=profile.to_dict()
                     remote_id = "%s" % attributes['id']
                     entity_name="%s %s" % (attributes.get('first-name'), attributes.get('last-name'))
                     entity_slug=microtime_slug()
                     try:
                         my_entity=add_entity({"slug":entity_slug, 
                                               "name":entity_name, 
                                               "type":entity_type,
                                               "remote_id":remote_id,
                                               "attributes":{
                                                     "access_token_secret":api.access_token_secret,
                                                     "access_token": api.access_token
                                                     }
                                               })
                         entity_id=my_entity.id
                     except Exception, err:
                         try:
                             my_entity=get_entity({"remote_id":remote_id, "type":entity_type})[0]
                             entity_id=my_entity.id
                             super(CustomConnector, self).update_record(entity_id, {
                                                     "access_token_secret":api.access_token_secret,
                                                     "access_token": api.access_token
                                                     })
                         except Exception, err:
                             raise ApiError(None, 3923, "%s - %s" % (Exception, err))
                 else:
                     my_entity=get_entity({"id":str(entity_id), "type":entity_type})[0]
                     super(CustomConnector, self).update_record(entity_id, 
                                                                 {"access_token_secret":api.access_token_secret,
                                                                  "access_token": api.access_token})
                 try:
                     query=QUERY_DELETE_OAUTH_RECORD % (DM_DATABASE_NAME,oauth_token, "linkedinConnector")
                     self.do_query(query)
                 except Exception, err:
                     Logger().error("Error: %s (%s)" % (err, query))