""" 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 from django.http.request import QueryDict from urlparse import urlparse, parse_qs import cgi from io import BytesIO from django.http.multipartparser import MultiPartParser 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)) self.client = Client() #self.client.login(username='admin', password='admin') 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=parent) 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: reply = PageReply(self, request.url(), self.PostOperation, request, data) 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, request=None, data=None): QtNetwork.QNetworkReply.__init__(self, parent) self.data = data self.request = request 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 '''