diff -r 058bb3dc685f -r 0b59724cb3f2 cubicweb/_exceptions.py --- /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 . +"""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