--- /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