""" Qt WebKit Browser for local access to internal Django Views. """ import os, logging from PyQt4 import QtCore, QtGui, QtWebKit, QtNetwork from django.test import Client from folders import FolderLibrary class DebugPage(QtWebKit.QWebPage): def sayMyName(self): return 'DebugPage' class DejaWebView(QtWebKit.QWebView): ''' Optional: * folders: FolderLibrary() Instance. * page: Initialized QWebPage instance for initial page (default DebugPage()) ''' def __init__(self, *args, **kwargs): self.folders = kwargs.pop('folders', FolderLibrary()) page = kwargs.pop('page', DebugPage()) QtWebKit.QWebView.__init__(self, *args, **kwargs) #self.oldManager = self.page().networkAccessManager() self.setPage(page) self.page().setNetworkAccessManager(DejaNetworkAccessManager(self)) class DejaNetworkAccessManager(QtNetwork.QNetworkAccessManager): ''' The Deja Network Access Manager provides access to two new protocols: - page:/// tries to resolve a page internally via a django test client. - res:/// direct access to a resource. USE_NETWORK delegates to other network access manager protocols, if False, it will not allow any requests outside these two protocols (hopefully disabling network access for your internal browser) Note, if page does not find the page, a res:/// attempt is made automatically. This has to be expanded! Note2: not sure if cookies and sessions will work this way! ''' USE_NETWORK = False def __init__(self, parent=None): QtNetwork.QNetworkAccessManager.__init__(self, parent=None) if parent: self.folders = getattr(parent, 'folders', FolderLibrary()) def createRequest(self, operation, request, data): scheme = request.url().scheme() if scheme != 'page' and scheme != 'res': if self.USE_NETWORK: return QtNetwork.QNetworkAccessManager.createRequest(self, operation, request, data) elif scheme == 'page': if operation == self.GetOperation: # Handle page:// URLs separately by creating custom # QNetworkReply objects. reply = PageReply(self, request.url(), self.GetOperation) #print('here') #print reply return reply elif operation == self.PostOperation: print data.readAll() #print request reply = PageReply(self, request.url(), self.PostOperation) return reply elif scheme == 'res': if operation == self.GetOperation: return ResourceReply(self, request.url(), self.GetOperation) else: if self.USE_NETWORK: return QtNetwork.QNetworkAccessManager.createRequest(self, operation, request, data) return NoNetworkReply(self, request.url(), self.GetOperation) class BasePageReply(QtNetwork.QNetworkReply): content_type = 'text/html; charset=utf-8' def __init__(self, parent, url, operation): QtNetwork.QNetworkReply.__init__(self, parent) self.content = self.initialize_content(url, operation) self.offset = 0 self.setHeader(QtNetwork.QNetworkRequest.ContentTypeHeader, self.get_content_type()) self.setHeader(QtNetwork.QNetworkRequest.ContentLengthHeader, len(self.content)) QtCore.QTimer.singleShot(0, self, QtCore.SIGNAL('readyRead()')) QtCore.QTimer.singleShot(0, self, QtCore.SIGNAL('finished()')) self.open(self.ReadOnly | self.Unbuffered) self.setUrl(url) def get_content_type(self): return self.content_type def initialize_content(self, url, operation): return '''