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
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
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
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)
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)
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())
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)