예제 #1
0
 def withWorksheetFile(webViewController, filename, server=None):
     if not server:
         server = ServerConfigurations.getDefault()
     wsc = WorksheetController(webViewController)
     wsc.server_configuration = server
     ws = wsc.notebook.import_worksheet(filename, wsc.notebook_username)
     SageProcessManager.setWorksheetProcessServer(ws, server)
     wsc.setWorksheet(ws)
     return wsc
예제 #2
0
 def cleanup(self):
     #This method is called when this WorksheetController instance is about
     #to be eligible for garbage collection.
     WorksheetController.worksheet_count -= 1
     if self._worksheet is not None:
         SageProcessManager.stopSageProcess(self._worksheet, create_new=False)
         #Now remove the worksheet.
         self._worksheet._notebook.delete_worksheet(self._worksheet.filename())
         self._worksheet = None
예제 #3
0
 def withNewWorksheet(webViewController, server=None):
     # server is a Sage server configuration that will determine the Sage process this
     # worksheet will use.
     if not server:
         server = ServerConfigurations.getDefault()
     wsc = WorksheetController(webViewController)
     wsc.server_configuration = server
     ws = guru_notebook.create_new_worksheet('Untitled', wsc.notebook_username)
     SageProcessManager.setWorksheetProcessServer(ws, server)
     wsc.setWorksheet(ws)
     return wsc
예제 #4
0
    def saveWorksheet(self, file_name):
        #Write out the worksheet to filename, overwriting if necessary.
        if os.path.exists(file_name):
            os.remove(file_name) #This may be unnecessary.


        if self.server_configuration["type"] == "local":
            self.worksheet_download(self._worksheet, file_name)

        elif self.server_configuration["type"] == "notebook server":
            SageProcessManager.saveRemoteWorksheet(self._worksheet, file_name)

        elif self.server_configuration["type"] == "cell server":
            pass


        #The worksheet is no longer dirty.
        self.isDirty = False
        self.emit(SIGNAL("dirty(bool)"), False)
예제 #5
0
    def asyncRequest(self, token):
        #This is the counterpart to sagenb.async_request() in sagenb.js.
        #The original sagenb.async_request() made an ajax request. We can
        #significantly improve UI performance by calling this python method
        #directly and bypassing the Flask server.

        # Sometimes the worksheet is deleted before the webview is GCed.
        if self._worksheet is None:
            return

        if True:
            #Handle the command ourselves.
            javascript = "Guru.requests['%s']['url'];" % token
            url = self.webFrame.evaluateJavaScript(javascript)

            javascript = "encode_response(Guru.requests['%s']['postvars']);" % token
            postvars = self.webFrame.evaluateJavaScript(javascript)
            if postvars:
                self.request_values = json.loads(postvars);

            #The url encodes the command. They look like:
            #   url = "/home/admin/0/worksheet_properties"
            print "URL: %s" % url
            command = url.split("/")[-1]

            # Check and see if the operation will make the worksheet dirty. If so, emit a "dirty" signal.
            if command in dirty_commands:
                self.isDirty = True
                self.emit(SIGNAL("dirty(bool)"), True)

            if self.server_configuration["type"] == "local":
                result = worksheet_commands[command](self, self._worksheet)

            elif self.server_configuration["type"] == "notebook server":
                try:
                    result = SageProcessManager.remoteCommand(self._worksheet, (command, self.request_values))
                except Exception as e:
                    #This signal may be emitted over and over, so the owner of this WorksheetController
                    #needs to take care of handling only the first error signal (or whatever).
                    #self.emit(SIGNAL("remoteCommandError(str)"), "Error executing remote command:\n%s"%e.message)
                    return

            elif self.server_configuration["type"] == "cell server":
                pass

            self.sendResultToPage(result, token)

        else:
            #Let the Sage Notebook Server handle the request as usual.
            javascript = "sagenb.guru_async_request_fall_through('%s');" % token
            self.webFrame.evaluateJavaScript(javascript)
예제 #6
0
    def useServerConfiguration(self, server_config):
        self.server_configuration = server_config
        new_worksheet = SageProcessManager.setWorksheetProcessServer(self._worksheet, server_config)

        #If we are switching TO a Notebook Server, we want to be able to access resources on the
        #server from the browser page.
        self.setSessionCookie()

        #There are some instances when we have to swap out worksheets, i.e., when switching FROM a
        #notebook server.
        if self._worksheet is not new_worksheet:
            self._worksheet._notebook.delete_worksheet(self._worksheet.filename())
            self._worksheet = new_worksheet
            #Open the worksheet in the webView
            self.webFrame.setUrl(self.worksheetUrl())
예제 #7
0
 def setSessionCookie(self):
     cookie_string = SageProcessManager.getSessionCookie(self.server_configuration)
     if cookie_string:
         javascript = "document.cookie='%s';" % cookie_string
         print javascript
         self.webFrame.evaluateJavaScript(javascript)