cubicweb/_exceptions.py
changeset 11057 0b59724cb3f2
parent 10907 9ae707db5265
child 11129 97095348b3ee
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cubicweb/_exceptions.py	Sat Jan 16 13:48:51 2016 +0100
@@ -0,0 +1,209 @@
+# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
+#
+# This file is part of CubicWeb.
+#
+# CubicWeb is free software: you can redistribute it and/or modify it under the
+# terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation, either version 2.1 of the License, or (at your option)
+# any later version.
+#
+# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License along
+# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
+"""Exceptions shared by different cubicweb packages."""
+
+__docformat__ = "restructuredtext en"
+
+from warnings import warn
+
+from six import PY3, text_type
+
+from logilab.common.decorators import cachedproperty
+
+from yams import ValidationError
+
+# abstract exceptions #########################################################
+
+class CubicWebException(Exception):
+    """base class for cubicweb server exception"""
+    msg = ""
+    def __unicode__(self):
+        if self.msg:
+            if self.args:
+                return self.msg % tuple(self.args)
+            else:
+                return self.msg
+        else:
+            return u' '.join(text_type(arg) for arg in self.args)
+    __str__ = __unicode__ if PY3 else lambda self: self.__unicode__().encode('utf-8')
+
+class ConfigurationError(CubicWebException):
+    """a misconfiguration error"""
+
+class InternalError(CubicWebException):
+    """base class for exceptions which should not occur"""
+
+class SecurityError(CubicWebException):
+    """base class for cubicweb server security exceptions"""
+
+class RepositoryError(CubicWebException):
+    """base class for repository exceptions"""
+
+class SourceException(CubicWebException):
+    """base class for source exceptions"""
+
+class CubicWebRuntimeError(CubicWebException):
+    """base class for runtime exceptions"""
+
+# repository exceptions #######################################################
+
+class ConnectionError(RepositoryError):
+    """raised when a bad connection id is given or when an attempt to establish
+    a connection failed
+    """
+
+class AuthenticationError(ConnectionError):
+    """raised when an attempt to establish a connection failed due to wrong
+    connection information (login / password or other authentication token)
+    """
+
+class BadConnectionId(ConnectionError):
+    """raised when a bad connection id is given"""
+
+class UnknownEid(RepositoryError):
+    """the eid is not defined in the system tables"""
+    msg = 'No entity with eid %s in the repository'
+
+class UniqueTogetherError(RepositoryError):
+    """raised when a unique_together constraint caused an IntegrityError"""
+    def __init__(self, session, **kwargs):
+        self.session = session
+        assert 'rtypes' in kwargs or 'cstrname' in kwargs
+        self.kwargs = kwargs
+        # fill cache while the session is open
+        self.rtypes
+
+    @cachedproperty
+    def rtypes(self):
+        if 'rtypes' in self.kwargs:
+            return self.kwargs['rtypes']
+        cstrname = unicode(self.kwargs['cstrname'])
+        cstr = self.session.find('CWUniqueTogetherConstraint', name=cstrname).one()
+        return sorted(rtype.name for rtype in cstr.relations)
+
+    @cachedproperty
+    def args(self):
+        warn('[3.18] UniqueTogetherError.args is deprecated, just use '
+             'the .rtypes accessor.',
+             DeprecationWarning)
+        # the first argument, etype, is never used and was never garanteed anyway
+        return None, self.rtypes
+
+
+class ViolatedConstraint(RepositoryError):
+    def __init__(self, cnx, cstrname):
+        self.cnx = cnx
+        self.cstrname = cstrname
+
+
+# security exceptions #########################################################
+
+class Unauthorized(SecurityError):
+    """raised when a user tries to perform an action without sufficient
+    credentials
+    """
+    msg = 'You are not allowed to perform this operation'
+    msg1 = 'You are not allowed to perform %s operation on %s'
+    var = None
+
+    def __str__(self):
+        try:
+            if self.args and len(self.args) == 2:
+                return self.msg1 % self.args
+            if self.args:
+                return ' '.join(self.args)
+            return self.msg
+        except Exception as ex:
+            return str(ex)
+
+class Forbidden(SecurityError):
+    """raised when a user tries to perform a forbidden action
+    """
+
+# source exceptions ###########################################################
+
+class EidNotInSource(SourceException):
+    """trying to access an object with a particular eid from a particular
+    source has failed
+    """
+    msg = 'No entity with eid %s in %s'
+
+
+# registry exceptions #########################################################
+
+# pre 3.15 bw compat
+from logilab.common.registry import RegistryException, ObjectNotFound, NoSelectableObject
+
+class UnknownProperty(RegistryException):
+    """property found in database but unknown in registry"""
+
+# query exception #############################################################
+
+class QueryError(CubicWebRuntimeError):
+    """a query try to do something it shouldn't"""
+
+class NotAnEntity(CubicWebRuntimeError):
+    """raised when get_entity is called for a column which doesn't contain
+    a non final entity
+    """
+
+class MultipleResultsError(CubicWebRuntimeError):
+    """raised when ResultSet.one() is called on a resultset with multiple rows
+    of multiple columns.
+    """
+
+class NoResultError(CubicWebRuntimeError):
+    """raised when no result is found but at least one is expected.
+    """
+
+class UndoTransactionException(QueryError):
+    """Raised when undoing a transaction could not be performed completely.
+
+    Note that :
+      1) the partial undo operation might be acceptable
+         depending upon the final application
+
+      2) the undo operation can also fail with a `ValidationError` in
+         cases where the undoing breaks integrity constraints checked
+         immediately.
+
+      3) It might be that neither of those exception is raised but a
+         subsequent `commit` might raise a `ValidationError` in cases
+         where the undoing breaks integrity constraints checked at
+         commit time.
+
+    :type txuuix: int
+    :param txuuid: Unique identifier of the partially undone transaction
+
+    :type errors: list
+    :param errors: List of errors occurred during undoing
+    """
+    msg = u"The following error(s) occurred while undoing transaction #%d : %s"
+
+    def __init__(self, txuuid, errors):
+        super(UndoTransactionException, self).__init__(txuuid, errors)
+        self.txuuid = txuuid
+        self.errors = errors
+
+# tools exceptions ############################################################
+
+class ExecutionError(Exception):
+    """server execution control error (already started, not running...)"""
+
+# pylint: disable=W0611
+from logilab.common.clcommands import BadCommandUsage