merge with 3.21.3
The change in unittest_serverctl.py is needed because of daef7ce08fea
(from 3.20.11) and 3914388b2d0f (from the 3.22 branch). Due to both
changes, CubicWebTC.config.repository no longer creates a new repository
(and thus, a new connection). Since both DBDumpCommand and
CubicWebTC.tearDown try to shutdown the repo, tearDown breaks apart.
The solution is to temporarily disable ServerConfiguration's config
cache. By forcing DBDumpCommand to get a new configuration object, it
then gets its own Repo object, allowing tearDown and DBDumpCommand to
work independently.
# 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