Helpviewer/CookieJar/CookieExceptionsModel.py

changeset 0
de9c2efb9d02
child 7
c679fb30c8f3
diff -r 000000000000 -r de9c2efb9d02 Helpviewer/CookieJar/CookieExceptionsModel.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Helpviewer/CookieJar/CookieExceptionsModel.py	Mon Dec 28 16:03:33 2009 +0000
@@ -0,0 +1,222 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2009 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the cookie exceptions model.
+"""
+
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+from CookieJar import CookieJar
+
+class CookieExceptionsModel(QAbstractTableModel):
+    """
+    Class implementing the cookie exceptions model.
+    """
+    def __init__(self, cookieJar, parent = None):
+        """
+        Constructor
+        
+        @param cookieJar reference to the cookie jar (CookieJar)
+        @param parent reference to the parent object (QObject)
+        """
+        QAbstractTableModel.__init__(self, parent)
+        
+        self.__cookieJar = cookieJar
+        self.__allowedCookies = self.__cookieJar.allowedCookies()
+        self.__blockedCookies = self.__cookieJar.blockedCookies()
+        self.__sessionCookies = self.__cookieJar.allowForSessionCookies()
+        
+        self.__headers = [
+            self.trUtf8("Website"), 
+            self.trUtf8("Status"), 
+        ]
+    
+    def headerData(self, section, orientation, role):
+        """
+        Public method to get header data from the model.
+        
+        @param section section number (integer)
+        @param orientation orientation (Qt.Orientation)
+        @param role role of the data to retrieve (integer)
+        @return requested data
+        """
+        if role == Qt.SizeHintRole:
+            fm = QFontMetrics(QFont())
+            height = fm.height() + fm.height() / 3
+            width = \
+                fm.width(self.headerData(section, orientation, Qt.DisplayRole).toString())
+            return QVariant(QSize(width, height))
+        
+        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
+            try:
+                return QVariant(self.__headers[section])
+            except IndexError:
+                return QVariant()
+        
+        return QAbstractTableModel.headerData(self, section, orientation, role)
+    
+    def data(self, index, role):
+        """
+        Public method to get data from the model.
+        
+        @param index index to get data for (QModelIndex)
+        @param role role of the data to retrieve (integer)
+        @return requested data
+        """
+        if index.row() < 0 or index.row() >= self.rowCount():
+            return QVariant()
+        
+        if role in (Qt.DisplayRole, Qt.EditRole):
+            row = index.row()
+            if row < len(self.__allowedCookies):
+                if index.column() == 0:
+                    return QVariant(self.__allowedCookies[row])
+                elif index.column() == 1:
+                    return QVariant(self.trUtf8("Allow"))
+                else:
+                    return QVariant()
+            
+            row -= len(self.__allowedCookies)
+            if row < len(self.__blockedCookies):
+                if index.column() == 0:
+                    return QVariant(self.__blockedCookies[row])
+                elif index.column() == 1:
+                    return QVariant(self.trUtf8("Block"))
+                else:
+                    return QVariant()
+            
+            row -= len(self.__blockedCookies)
+            if row < len(self.__sessionCookies):
+                if index.column() == 0:
+                    return QVariant(self.__sessionCookies[row])
+                elif index.column() == 1:
+                    return QVariant(self.trUtf8("Allow For Session"))
+                else:
+                    return QVariant()
+            
+            return QVariant()
+        
+        return QVariant()
+    
+    def columnCount(self, parent = QModelIndex()):
+        """
+        Public method to get the number of columns of the model.
+        
+        @param parent parent index (QModelIndex)
+        @return number of columns (integer)
+        """
+        if parent.isValid():
+            return 0
+        else:
+            return len(self.__headers)
+    
+    def rowCount(self, parent = QModelIndex()):
+        """
+        Public method to get the number of rows of the model.
+        
+        @param parent parent index (QModelIndex)
+        @return number of columns (integer)
+        """
+        if parent.isValid() or self.__cookieJar is None:
+            return 0
+        else:
+            return len(self.__allowedCookies) + \
+                   len(self.__blockedCookies) + \
+                   len(self.__sessionCookies)
+    
+    def removeRows(self, row, count, parent = QModelIndex()):
+        """
+        Public method to remove entries from the model.
+        
+        @param row start row (integer)
+        @param count number of rows to remove (integer)
+        @param parent parent index (QModelIndex)
+        @return flag indicating success (boolean)
+        """
+        if parent.isValid() or self.__cookieJar is None:
+            return False
+        
+        lastRow = row + count - 1
+        self.beginRemoveRows(parent, row, lastRow)
+        for i in range(lastRow, row - 1, -1):
+            rowToRemove = i
+            
+            if rowToRemove < len(self.__allowedCookies):
+                del self.__allowedCookies[rowToRemove]
+                continue
+            
+            rowToRemove -= len(self.__allowedCookies)
+            if rowToRemove < len(self.__blockedCookies):
+                del self.__blockedCookies[rowToRemove]
+                continue
+            
+            rowToRemove -= len(self.__blockedCookies)
+            if rowToRemove < len(self.__sessionCookies):
+                del self.__sessionCookies[rowToRemove]
+                continue
+        
+        self.__cookieJar.setAllowedCookies(self.__allowedCookies)
+        self.__cookieJar.setBlockedCookies(self.__blockedCookies)
+        self.__cookieJar.setAllowForSessionCookies(self.__sessionCookies)
+        self.endRemoveRows()
+        
+        return True
+    
+    def addRule(self, host, rule):
+        """
+        Public method to add an exception rule.
+        
+        @param host name of the host to add a rule for (string)
+        @param rule type of rule to add (CookieJar.Allow, CookieJar.Block or
+            CookieJar.AllowForSession)
+        """
+        if not host:
+            return
+        
+        if rule == CookieJar.Allow:
+            self.__addHost(host, 
+                self.__allowedCookies, self.__blockedCookies, self.__sessionCookies)
+            return
+        elif rule == CookieJar.Block:
+            self.__addHost(host, 
+                self.__blockedCookies, self.__allowedCookies, self.__sessionCookies)
+            return
+        elif rule == CookieJar.AllowForSession:
+            self.__addHost(host, 
+                self.__sessionCookies, self.__allowedCookies, self.__blockedCookies)
+            return
+    
+    def __addHost(self, host, addList, removeList1, removeList2):
+        """
+        Private method to add a host to an exception list.
+        
+        @param host name of the host to add (string)
+        @param addList reference to the list to add it to (list of strings)
+        @param removeList1 reference to first list to remove it from (list of strings)
+        @param removeList2 reference to second list to remove it from (list of strings)
+        """
+        if host not in addList:
+            addList.append(host)
+            if host in removeList1:
+                removeList1.remove(host)
+            if host in removeList2:
+                removeList2.remove(host)
+        
+        # Avoid to have similar rules (with or without leading dot)
+        # e.g. python-projects.org and .python-projects.org
+        if host.startswith("."):
+            otherRule = host[1:]
+        else:
+            otherRule = '.' + host
+        if otherRule in addList:
+            addList.removeOne(otherRule)
+        if otherRule in removeList1:
+            removeList1.remove(otherRule)
+        if otherRule in removeList2:
+            removeList2.remove(otherRule)
+        
+        self.reset()

eric ide

mercurial