Ejemplo n.º 1
0
def box_download_file(request):
    boxsearch = BoxDotNet()
    query = "blah" # obviously, not going to be used here, fileid should be param?
    auth_token = request.user.get_profile().token
    fileid = boxsearch.get_search(settings.BOX_API_KEY, auth_token, query) # change eventually
    downloadurl = 'https://www.box.net/api/1.0/download/%s/%s' % (auth_token, fileid)
    return HttpResponseRedirect(downloadurl) # change
Ejemplo n.º 2
0
    def _login(self):
        """
        Logs the user in to box.net
        """
        if self.boxapi == None:
            self.boxapi = BoxDotNet()

        # login if not done yet, we only login once to prevent
        # the browser for popping up each time
        if not self.token:
            # get the ticket and open login url
            self._set_ticket()
            url = BoxDotNet.get_login_url(self.ticket)

            #wait for log in
            Web.LoginMagic("Log into Box.net", url, login_function=self._try_login)
Ejemplo n.º 3
0
def get_similar_docs(request):
    profile = request.user.get_profile()
    text = request.POST['text']
    text = filter_html_tags(text)

    keywords = get_keywords_from_text(text, 2)

    query = ' '.join(keywords)
    sim_box_docs = boxdocsims.box_search_file(profile, query,
                                              settings.BOX_API_KEY)

    files_info = []
    if sim_box_docs == -1:
        return HttpResponse(BoxDotNet().get_login_url(settings.BOX_API_KEY))
    elif sim_box_docs is not None:
        num_docs = 1
        for files in sim_box_docs.file:
            if num_docs > MAX_DOCS:
                break
            file_id = files.id[0].elementText
            file_name = files.name[0].elementText
            url = boxdocsims.box_preview(file_id, profile,
                                         settings.BOX_API_KEY)
            files_info.append(
                dict(file_id=file_id, file_name=file_name, url=url))
            num_docs = num_docs + 1

    json = simplejson.dumps(files_info)
    return HttpResponse(json, mimetype='application/json')
Ejemplo n.º 4
0
def box_login(request, extra_context=dict(), account_inactive_template='TODO'):
    box = BoxDotNet()
    
    # if initial visit of this page, redirect to the box login screen
    if not 'ticket' in request.GET:
        url = box.get_login_url(settings.BOX_API_KEY)
        return HttpResponseRedirect(url)
    
    # if we have a ticket, then get the auth token
    tokenNode = box.login(settings.BOX_API_KEY, request.GET['ticket'])
	
    token = tokenNode.auth_token[0].elementText
    user_id = tokenNode.user[0].user_id[0].elementText
    print user_id
    
    # authenticate the user using this auth token
    user = authenticate(box_user_id=user_id)
    
    if user is None:
        # we have a token but no user, create one
        user = User()
        user.email = tokenNode.user[0].email[0].elementText
        # use box.net user_id as username
        user.username = user_id
        user.save()
        
        user_profile = UserProfile()
        user_profile.user = user
        user_profile.token = token
        user_profile.box_user_id = user_id
        user_profile.save()
        
        user = authenticate(box_user_id=user_id)
    
    # here we will have valid user so login
    login(request, user)

    if not user.is_active:
        return render_to_response(account_inactive_template, extra_context,
             context_instance=RequestContext(request))
             
    # update user's auth token
    profile = user.get_profile()
    profile.token = token
    profile.save()
    
    return HttpResponseRedirect(_get_next(request))
Ejemplo n.º 5
0
    def _login(self):
        """
        Logs the user in to box.net
        """
        if self.boxapi == None:
            self.boxapi = BoxDotNet()

        # login if not done yet, we only login once to prevent
        # the browser for popping up each time
        if not self.token:
            # get the ticket and open login url
            self._set_ticket()
            url = BoxDotNet.get_login_url(self.ticket)

            #wait for log in
            Web.LoginMagic("Log into Box.net",
                           url,
                           login_function=self._try_login)
Ejemplo n.º 6
0
def box_versions(request):
    box = BoxDotNet()
    auth_token = request.user.get_profile().token
    fileid = box.get_search(settings.BOX_API_KEY, auth_token, 'blah') # change eventually
    versions = box.get_version_history(settings.BOX_API_KEY, auth_token, fileid)
    print versions.version[0].author[0].elementText
Ejemplo n.º 7
0
def box_search_file(request):
	box = BoxDotNet()
	profile = request.user.get_profile()
	query = "word" # change, need query to be part of request
	searchFiles = box.get_search(settings.BOX_API_KEY, profile.token, query)
	return HttpResponseRedirect("http://www.google.com") # change
Ejemplo n.º 8
0
class BoxDotNetTwoWay(DataProvider.TwoWay):

    _name_ = _("Box.net")
    _description_ = _("Synchronize your Box.net files")
    _category_ = conduit.dataproviders.CATEGORY_FILES
    _module_type_ = "twoway"
    _in_type_ = "file"
    _out_type_ = "file"
    _icon_ = "boxdotnet"
    _configurable_ = True

    API_KEY="nt0v6a232z6r47iftjx7g0azu6dg4p10"

    def __init__(self, *args):
        DataProvider.TwoWay.__init__(self)

        self.boxapi = None
        self.user_id = None
        self.token = None
        self.foldername = ""
        self.folder_id = None

        self.files = {}

    #------------------------------------------
    # File info related functions
    #------------------------------------------
    def _get_file_info(self, fileID):
        """
        Returns the id, if the id is present in the configured folder
        """
        self.files = self._get_files(self.folder_id)

        if self.files.has_key(fileID):
            log.debug("File [%s] does exist" % fileID)
            return fileID
        else:
            log.debug("File [%s] does not exist" % fileID)
            return None

    def _get_files(self,folderID):
        """
        Gets a list of files present in the configured folder
        """
        rsp = self.boxapi.get_account_tree (api_key=BoxDotNetTwoWay.API_KEY,
                                            auth_token=self.token,
                                            folder_id=folderID,
                                            params=['nozip'])
        files = {}

        try:
            for file in rsp.tree[0].folder[0].files[0].file:
                files[file.attrib['id']] = file.attrib['file_name']
        finally:
            return files

    def _get_raw_file_url(self, fileID):
        """
        Format an url that can be used for downloading a file
        """
        return "http://box.net/api/1.0/download/%s/%s" % (self.token, fileID)

    #------------------------------------------
    # Upload functions
    #------------------------------------------
    def _upload_file (self, file_path, filename):
        """
        Upload the file to box.net
        @returns: uid of the file
        """
        rsp = self.boxapi.upload(file_path, 
                        auth_token=self.token, 
                        folder_id=self.folder_id, 
                        share=0,
                        filename=filename
                        )

        uid = rsp.files[0].file[0].attrib['id']
        return uid

    def _replace_file (self, fileID, url, name):
        """
        Box.net automatically replaces files with same name, so we can
        use the plain upload method
        @returns: uid of the file
        """
        return self._upload_file(url, name)

    #------------------------------------------
    # File info related functions
    #------------------------------------------
    def _get_folder_id(self):
        """
        Returns a folder id for the configured folder name, it re-uses existing ones
        and creates a new folder if it isn't present
        """
        id = None

        # see if folder already exists
        folders = self._get_folders()

        if folders.has_key (self.foldername):
            id = folders[self.foldername]

        # return if it does
        if id:
            return id
        # create otherwise
        else:
            return self._create_folder ()

    def _get_folders(self):
        """
        Returns a dictionary of name-id representing the upper-level
        folders
        """
        rsp = self.boxapi.get_account_tree(api_key=BoxDotNetTwoWay.API_KEY,
                                           auth_token=self.token,
                                           folder_id=0,
                                           params=['nozip'])

        folders = {}

        try:
            # this might throw an exception if user has no folders yet
            for folder in rsp.tree[0].folder[0].folders[0].folder:
                folders[folder.attrib['name']] = folder.attrib['id']
        finally:
            return folders

    def _create_folder(self):
        """
        Create a top-level folder with the configured name, and return the id
        """
        rsp = self.boxapi.create_folder(api_key=BoxDotNetTwoWay.API_KEY,
                                        auth_token=self.token,
                                        parent_id=0,
                                        name=self.foldername,
                                        share=0)

        return rsp.folder[0].folder_id[0].elementText

    #------------------------------------------
    # Authentication methods
    #------------------------------------------
    def _login(self):
        """
        Logs the user in to box.net
        """
        if self.boxapi == None:
            self.boxapi = BoxDotNet()

        # login if not done yet, we only login once to prevent
        # the browser for popping up each time
        if not self.token:
            # get the ticket and open login url
            self._set_ticket()
            url = BoxDotNet.get_login_url(self.ticket)

            #wait for log in
            Web.LoginMagic("Log into Box.net", url, login_function=self._try_login)

    def _try_login (self):
        """
        Try to perform a login, return None if it does not succeed
        """
        try:
            self._set_login_info(self.ticket)
            return self.token
        except:
            return None

    def _set_ticket(self):
        """
        Get the ticket that can be used for logging in for real
        """
        rsp = self.boxapi.get_ticket(api_key=self.API_KEY)
        self.ticket = rsp.ticket[0].elementText

    def _set_login_info (self, ticket):
        """
        Get a token and the user id
        """
        rsp = self.boxapi.get_auth_token(api_key=self.API_KEY, ticket=ticket)

        self.user_id = rsp.user[0].user_id[0].elementText
        self.token = rsp.auth_token[0].elementText
        self.ticket = None

    #------------------------------------------
    # Dataprovider Functions
    #------------------------------------------
    def refresh(self):
        DataProvider.TwoWay.refresh(self)
        self._login()

        # set folder id if not done yet or configuration changed
        folder_id = self._get_folder_id()

        if not self.folder_id or self.folder_id != folder_id: 
            self.folder_id = folder_id

        self.files = self._get_files(self.folder_id)

    def put (self, file, overwrite, LUID=None):
        """
        Puts the file in the sink, this uploads the file if it is not present yet
        or updates it if necessary
        """
        DataProvider.TwoWay.put(self, file, overwrite, LUID)

        originalName = file.get_filename()
        #Gets the local URI (/foo/bar). If this is a remote file then
        #it is first transferred to the local filesystem
        fileURI = file.get_local_uri()
        mimeType = file.get_mimetype()

        if LUID == None:
            log.debug("Uploading file URI = %s, Mimetype = %s, Original Name = %s" % (fileURI, mimeType, originalName))
            LUID = self._upload_file (fileURI, originalName)
        else:
            #check if a file exists at that UID
            id = self._get_file_info(LUID)
            if id != None:
                if overwrite == True:
                    log.debug("Replacing file URI = %s, Mimetype = %s, Original Name = %s" % (fileURI, mimeType, originalName))
                    LUID = self._replace_file(LUID, fileURI, originalName)
                else:
                    #Only upload the file if it is newer than the Remote one
                    url = self._get_raw_file_url(id)
                    remoteFile = File.File(url)

                    #this is a limited test for equality type comparison
                    comp = file.compare(remoteFile,True)
                    log.debug("Compared %s with %s to check if they are the same (size). Result = %s" % (file.get_filename(),remoteFile.get_filename(),comp))
                    if comp != conduit.datatypes.COMPARISON_EQUAL:
                        raise Exceptions.SynchronizeConflictError(comp, file, remoteFile)
            
        return self.get(LUID).get_rid()

    def delete(self, LUID):
        """
        Simply call the delete method on the api
        """
        self.boxapi.delete (api_key=BoxDotNetTwoWay.API_KEY, 
                            auth_token=self.token,
                            target='file',
                            target_id=LUID)

    def configure(self, window):
        """
        Configures the BoxDotNet sink
        """
        import gtk
        import gobject
        def on_login_finish(*args):
            if self.token:
                build_folder_store()
            Utils.dialog_reset_cursor(dlg)
            
        def on_response(sender, responseID):
            if responseID == gtk.RESPONSE_OK:
                self.foldername = foldernamecombo.child.get_text()
                
        def load_button_clicked(button):
            Utils.dialog_set_busy_cursor(dlg)
            conduit.GLOBALS.syncManager.run_blocking_dataprovider_function_calls(
                                            self,
                                            on_login_finish,
                                            self._login)

        def build_folder_store():
            folder_store.clear()
            folder_count = 0
            folder_iter = None
            for folder_name in self._get_folders().keys():
                iter = folder_store.append((folder_name,))
                if folder_name != "" and folder_name == self.foldername:
                    folder_iter = iter
                folder_count += 1

            if folder_iter:
                foldernamecombo.set_active_iter(folder_iter)
            elif self.foldername:
                foldernamecombo.child.set_text(self.foldername)
            elif folder_count:
                foldernamecombo.set_active(0)

        tree = Utils.dataprovider_glade_get_widget(
                        __file__,
                        "config.glade",
                        "BoxDotNetConfigDialog")

        #get a whole bunch of widgets
        foldernamecombo = tree.get_widget("foldernamecombo")
        load_button = tree.get_widget("load_button")
        dlg = tree.get_widget("BoxDotNetConfigDialog")

        # setup combobox
        folder_store = gtk.ListStore(gobject.TYPE_STRING)
        foldernamecombo.set_model(folder_store)
        cell = gtk.CellRendererText()
        foldernamecombo.pack_start(cell, True)
        foldernamecombo.set_text_column(0)

        # load button
        load_button.connect('clicked', load_button_clicked)
        foldernamecombo.child.set_text(self.foldername)

        # run the dialog
        Utils.run_dialog_non_blocking(dlg, on_response, window)

    def is_configured (self, isSource, isTwoWay):
        return len(self.foldername) > 0

    def get_configuration(self):
        return {
            "foldername" : self.foldername
            }

    def get_UID(self):
        return "%s-%s" % (self.user_id, self.foldername)

    def get(self, LUID):
        DataProvider.TwoWay.get(self, LUID)
        url = self._get_raw_file_url(LUID)
        f = File.File(
                    URI=        url,
                    group=      self.foldername
                    )
        try:
            #gnomevfs doesnt like unicode
            f.force_new_filename(str(self.files[LUID]))
        except KeyError:
            #occurs on put() returning get() because we have
            #not refreshed since. Not a problem because the point
            #of put returning get() is to make the rids() in the same
            #scheme, and not actually do something with the returned file. 
            pass
        f.set_open_URI(url)
        f.set_UID(LUID)

        return f
                
    def get_all(self):
        DataProvider.TwoWay.get_all(self)
        return self.files.keys()
        
    def get_name(self):
        if len(self.foldername) > 0:
            return self.foldername
        else:
            return self._name_
Ejemplo n.º 9
0
from boxdotnet import BoxDotNet

box = BoxDotNet()


# take a user, and search his files for a given query - HA
# Returns XMLNode of files in search results
# Returns None if no results found
def box_search_file(profile, query, api_key):
    return box.get_search(api_key, profile.token, query)


def box_preview(fileid, profile, api_key):
    folder_id = box.get_folder_id(fileid, profile.token, api_key)
    preview_url = 'https://www.box.net/files#/files/0/f/%s/1/f_%s' % (
        folder_id, fileid)
    return preview_url
Ejemplo n.º 10
0
class BoxDotNetTwoWay(DataProvider.TwoWay):

    _name_ = _("Box.net")
    _description_ = _("Synchronize your Box.net files")
    _category_ = conduit.dataproviders.CATEGORY_FILES
    _module_type_ = "twoway"
    _in_type_ = "file"
    _out_type_ = "file"
    _icon_ = "boxdotnet"
    _configurable_ = True

    API_KEY = "nt0v6a232z6r47iftjx7g0azu6dg4p10"

    def __init__(self, *args):
        DataProvider.TwoWay.__init__(self)

        self.update_configuration(foldername="", )
        self.boxapi = None
        self.user_id = None
        self.token = None
        self.folder_id = None

        self.files = {}

    #------------------------------------------
    # File info related functions
    #------------------------------------------
    def _get_file_info(self, fileID):
        """
        Returns the id, if the id is present in the configured folder
        """
        self.files = self._get_files(self.folder_id)

        if self.files.has_key(fileID):
            log.debug("File [%s] does exist" % fileID)
            return fileID
        else:
            log.debug("File [%s] does not exist" % fileID)
            return None

    def _get_files(self, folderID):
        """
        Gets a list of files present in the configured folder
        """
        rsp = self.boxapi.get_account_tree(api_key=BoxDotNetTwoWay.API_KEY,
                                           auth_token=self.token,
                                           folder_id=folderID,
                                           params=['nozip'])
        files = {}

        try:
            for file in rsp.tree[0].folder[0].files[0].file:
                files[file.attrib['id']] = file.attrib['file_name']
        finally:
            return files

    def _get_raw_file_url(self, fileID):
        """
        Format an url that can be used for downloading a file
        """
        return "http://box.net/api/1.0/download/%s/%s" % (self.token, fileID)

    #------------------------------------------
    # Upload functions
    #------------------------------------------
    def _upload_file(self, file_path, filename):
        """
        Upload the file to box.net
        @returns: uid of the file
        """
        rsp = self.boxapi.upload(file_path,
                                 auth_token=self.token,
                                 folder_id=self.folder_id,
                                 share=0,
                                 filename=filename)

        uid = rsp.files[0].file[0].attrib['id']
        return uid

    def _replace_file(self, fileID, url, name):
        """
        Box.net automatically replaces files with same name, so we can
        use the plain upload method
        @returns: uid of the file
        """
        return self._upload_file(url, name)

    #------------------------------------------
    # File info related functions
    #------------------------------------------
    def _get_folder_id(self):
        """
        Returns a folder id for the configured folder name, it re-uses existing ones
        and creates a new folder if it isn't present
        """
        id = None

        # see if folder already exists
        folders = self._get_folders()

        if folders.has_key(self.foldername):
            id = folders[self.foldername]

        # return if it does
        if id:
            return id
        # create otherwise
        else:
            return self._create_folder()

    def _get_folders(self):
        """
        Returns a dictionary of name-id representing the upper-level
        folders
        """
        rsp = self.boxapi.get_account_tree(api_key=BoxDotNetTwoWay.API_KEY,
                                           auth_token=self.token,
                                           folder_id=0,
                                           params=['nozip'])

        folders = {}

        try:
            # this might throw an exception if user has no folders yet
            for folder in rsp.tree[0].folder[0].folders[0].folder:
                folders[folder.attrib['name']] = folder.attrib['id']
        finally:
            return folders

    def _create_folder(self):
        """
        Create a top-level folder with the configured name, and return the id
        """
        rsp = self.boxapi.create_folder(api_key=BoxDotNetTwoWay.API_KEY,
                                        auth_token=self.token,
                                        parent_id=0,
                                        name=self.foldername,
                                        share=0)

        return rsp.folder[0].folder_id[0].elementText

    #------------------------------------------
    # Authentication methods
    #------------------------------------------
    def _login(self):
        """
        Logs the user in to box.net
        """
        if self.boxapi == None:
            self.boxapi = BoxDotNet()

        # login if not done yet, we only login once to prevent
        # the browser for popping up each time
        if not self.token:
            # get the ticket and open login url
            self._set_ticket()
            url = BoxDotNet.get_login_url(self.ticket)

            #wait for log in
            Web.LoginMagic("Log into Box.net",
                           url,
                           login_function=self._try_login)

    def _try_login(self):
        """
        Try to perform a login, return None if it does not succeed
        """
        try:
            self._set_login_info(self.ticket)
            return self.token
        except:
            return None

    def _set_ticket(self):
        """
        Get the ticket that can be used for logging in for real
        """
        rsp = self.boxapi.get_ticket(api_key=self.API_KEY)
        self.ticket = rsp.ticket[0].elementText

    def _set_login_info(self, ticket):
        """
        Get a token and the user id
        """
        rsp = self.boxapi.get_auth_token(api_key=self.API_KEY, ticket=ticket)

        self.user_id = rsp.user[0].user_id[0].elementText
        self.token = rsp.auth_token[0].elementText
        self.ticket = None

    #------------------------------------------
    # Dataprovider Functions
    #------------------------------------------
    def refresh(self):
        DataProvider.TwoWay.refresh(self)
        self._login()

        # set folder id if not done yet or configuration changed
        folder_id = self._get_folder_id()

        if not self.folder_id or self.folder_id != folder_id:
            self.folder_id = folder_id

        self.files = self._get_files(self.folder_id)

    def put(self, file, overwrite, LUID=None):
        """
        Puts the file in the sink, this uploads the file if it is not present yet
        or updates it if necessary
        """
        DataProvider.TwoWay.put(self, file, overwrite, LUID)

        originalName = file.get_filename()
        #Gets the local URI (/foo/bar). If this is a remote file then
        #it is first transferred to the local filesystem
        fileURI = file.get_local_uri()
        mimeType = file.get_mimetype()

        if LUID == None:
            log.debug(
                "Uploading file URI = %s, Mimetype = %s, Original Name = %s" %
                (fileURI, mimeType, originalName))
            LUID = self._upload_file(fileURI, originalName)
        else:
            #check if a file exists at that UID
            id = self._get_file_info(LUID)
            if id != None:
                if overwrite == True:
                    log.debug(
                        "Replacing file URI = %s, Mimetype = %s, Original Name = %s"
                        % (fileURI, mimeType, originalName))
                    LUID = self._replace_file(LUID, fileURI, originalName)
                else:
                    #Only upload the file if it is newer than the Remote one
                    url = self._get_raw_file_url(id)
                    remoteFile = File.File(url)

                    #this is a limited test for equality type comparison
                    comp = file.compare(remoteFile, True)
                    log.debug(
                        "Compared %s with %s to check if they are the same (size). Result = %s"
                        %
                        (file.get_filename(), remoteFile.get_filename(), comp))
                    if comp != conduit.datatypes.COMPARISON_EQUAL:
                        raise Exceptions.SynchronizeConflictError(
                            comp, file, remoteFile)

        return self.get(LUID).get_rid()

    def delete(self, LUID):
        """
        Simply call the delete method on the api
        """
        self.boxapi.delete(api_key=BoxDotNetTwoWay.API_KEY,
                           auth_token=self.token,
                           target='file',
                           target_id=LUID)

    def config_setup(self, config):
        def _login_finished(*args):
            folders = self._get_folders()
            folders_config.set_choices([(f, f) for f in folders])

        def _load_button_clicked(button):
            conduit.GLOBALS.syncManager.run_blocking_dataprovider_function_calls(
                self, _login_finished, self._login)

        config.add_section(_("Folder"))
        folders_config = config.add_item(
            _("Folder name"),
            "combotext",
            config_name="foldername",
            choices=[],
        )
        config.add_item(_("Load folders"),
                        "button",
                        initial_value=_load_button_clicked)

    def is_configured(self, isSource, isTwoWay):
        return len(self.foldername) > 0

    def get_UID(self):
        return "%s-%s" % (self.user_id, self.foldername)

    def get(self, LUID):
        DataProvider.TwoWay.get(self, LUID)
        url = self._get_raw_file_url(LUID)
        f = File.File(URI=url, group=self.foldername)
        try:
            #gnomevfs doesnt like unicode
            f.force_new_filename(str(self.files[LUID]))
        except KeyError:
            #occurs on put() returning get() because we have
            #not refreshed since. Not a problem because the point
            #of put returning get() is to make the rids() in the same
            #scheme, and not actually do something with the returned file.
            pass
        f.set_open_URI(url)
        f.set_UID(LUID)

        return f

    def get_all(self):
        DataProvider.TwoWay.get_all(self)
        return self.files.keys()

    def get_name(self):
        if len(self.foldername) > 0:
            return self.foldername
        else:
            return self._name_