__init__.py
author Rémi Cardona <remi.cardona@logilab.fr>
Mon, 14 Sep 2015 12:19:48 +0200
changeset 10602 4845012cfc8e
parent 10272 3231fd2fa7a5
child 10616 f454404733c1
permissions -rw-r--r--
[py3k] import 'pickle' using six.moves
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8486
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8383
diff changeset
     1
# copyright 2003-2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5081
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5081
diff changeset
     3
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5081
diff changeset
     4
# This file is part of CubicWeb.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5081
diff changeset
     5
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5081
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5081
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5081
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5081
diff changeset
     9
# any later version.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5081
diff changeset
    10
#
5424
8ecbcbff9777 replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5421
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5081
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5081
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5081
diff changeset
    14
# details.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5081
diff changeset
    15
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5081
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5081
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    18
"""CubicWeb is a generic framework to quickly build applications which describes
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    19
relations between entitites.
5881
57387070f612 [selectors] use before-registry-reset event to init is_instance cache: cleaner code and avoid reloading bug (making hooks test fail for instance)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5451
diff changeset
    20
"""
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    21
__docformat__ = "restructuredtext en"
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    22
5451
7b2e9f774028 ignore annoying warnings about pygments already being imported and stuff being added to python path
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 5424
diff changeset
    23
# ignore the pygments UserWarnings
7b2e9f774028 ignore annoying warnings about pygments already being imported and stuff being added to python path
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 5424
diff changeset
    24
import warnings
9299
c5eed908117d [schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents: 8748
diff changeset
    25
import zlib
5451
7b2e9f774028 ignore annoying warnings about pygments already being imported and stuff being added to python path
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 5424
diff changeset
    26
warnings.filterwarnings('ignore', category=UserWarning,
7b2e9f774028 ignore annoying warnings about pygments already being imported and stuff being added to python path
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 5424
diff changeset
    27
                        message='.*was already imported',
7b2e9f774028 ignore annoying warnings about pygments already being imported and stuff being added to python path
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 5424
diff changeset
    28
                        module='.*pygments')
7b2e9f774028 ignore annoying warnings about pygments already being imported and stuff being added to python path
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 5424
diff changeset
    29
7b2e9f774028 ignore annoying warnings about pygments already being imported and stuff being added to python path
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 5424
diff changeset
    30
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    31
import __builtin__
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    32
# '_' is available in builtins to mark internationalized string but should
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    33
# not be used to do the actual translation
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    34
if not hasattr(__builtin__, '_'):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    35
    __builtin__._ = unicode
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    36
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    37
CW_SOFTWARE_ROOT = __path__[0]
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    38
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    39
import sys, os, logging
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    40
from StringIO import StringIO
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    41
10602
4845012cfc8e [py3k] import 'pickle' using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10272
diff changeset
    42
from six.moves import cPickle as pickle
4845012cfc8e [py3k] import 'pickle' using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10272
diff changeset
    43
8748
f5027f8d2478 drop typed_eid() in favour of int() (closes #2742462)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8696
diff changeset
    44
from logilab.common.deprecation import deprecated
1741
fe5266f0f88c use lgc implementation
sylvain.thenault@logilab.fr
parents: 1498
diff changeset
    45
from logilab.common.logging_ext import set_log_methods
10045
0a49d61c8cca Add custom checker for Password values
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
    46
from yams.constraints import BASE_CONVERTERS, BASE_CHECKERS
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    47
9891
3386fd89c914 remove references to global environment variable APYCOT_ROOT
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9402
diff changeset
    48
# pre python 2.7.2 safety
3386fd89c914 remove references to global environment variable APYCOT_ROOT
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9402
diff changeset
    49
logging.basicConfig()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    50
2792
135580d15d42 rename and move cw.RequestSessionMixIn to cw.req.RequestSessionBase; move some appobjects methods where they actually belong to
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2790
diff changeset
    51
from cubicweb.__pkginfo__ import version as __version__
135580d15d42 rename and move cw.RequestSessionMixIn to cw.req.RequestSessionBase; move some appobjects methods where they actually belong to
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2790
diff changeset
    52
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    53
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    54
set_log_methods(sys.modules[__name__], logging.getLogger('cubicweb'))
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    55
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    56
# make all exceptions accessible from the package
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    57
from cubicweb._exceptions import *
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8180
diff changeset
    58
from logilab.common.registry import ObjectNotFound, NoSelectableObject, RegistryNotFound
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    59
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    60
# convert eid to the right type, raise ValueError if it's not a valid eid
8748
f5027f8d2478 drop typed_eid() in favour of int() (closes #2742462)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8696
diff changeset
    61
@deprecated('[3.17] typed_eid() was removed. replace it with int() when needed.')
f5027f8d2478 drop typed_eid() in favour of int() (closes #2742462)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8696
diff changeset
    62
def typed_eid(eid):
f5027f8d2478 drop typed_eid() in favour of int() (closes #2742462)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8696
diff changeset
    63
    return int(eid)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    64
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    65
#def log_thread(f, w, a):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    66
#    print f.f_code.co_filename, f.f_code.co_name
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    67
#import threading
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    68
#threading.settrace(log_thread)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    69
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    70
class Binary(StringIO):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    71
    """customize StringIO to make sure we don't use unicode"""
1954
9b20f3504af8 cleanup
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1741
diff changeset
    72
    def __init__(self, buf=''):
10266
813e30041a93 Binary initializer should accept bytearrays (closes #5084075)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9984
diff changeset
    73
        assert isinstance(buf, (str, buffer, bytearray)), \
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    74
               "Binary objects must use raw strings, not %s" % buf.__class__
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    75
        StringIO.__init__(self, buf)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    76
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    77
    def write(self, data):
10266
813e30041a93 Binary initializer should accept bytearrays (closes #5084075)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9984
diff changeset
    78
        assert isinstance(data, (str, buffer, bytearray)), \
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    79
               "Binary objects must use raw strings, not %s" % data.__class__
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    80
        StringIO.write(self, data)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    81
8180
1f6ba9afb925 [storage] BFSS now create read only file (closes #2151672)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8132
diff changeset
    82
    def to_file(self, fobj):
8131
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
    83
        """write a binary to disk
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
    84
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
    85
        the writing is performed in a safe way for files stored on
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
    86
        Windows SMB shares
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
    87
        """
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
    88
        pos = self.tell()
8180
1f6ba9afb925 [storage] BFSS now create read only file (closes #2151672)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8132
diff changeset
    89
        self.seek(0)
1f6ba9afb925 [storage] BFSS now create read only file (closes #2151672)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8132
diff changeset
    90
        if sys.platform == 'win32':
1f6ba9afb925 [storage] BFSS now create read only file (closes #2151672)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8132
diff changeset
    91
            while True:
1f6ba9afb925 [storage] BFSS now create read only file (closes #2151672)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8132
diff changeset
    92
                # the 16kB chunksize comes from the shutil module
1f6ba9afb925 [storage] BFSS now create read only file (closes #2151672)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8132
diff changeset
    93
                # in stdlib
1f6ba9afb925 [storage] BFSS now create read only file (closes #2151672)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8132
diff changeset
    94
                chunk = self.read(16*1024)
1f6ba9afb925 [storage] BFSS now create read only file (closes #2151672)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8132
diff changeset
    95
                if not chunk:
1f6ba9afb925 [storage] BFSS now create read only file (closes #2151672)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8132
diff changeset
    96
                    break
1f6ba9afb925 [storage] BFSS now create read only file (closes #2151672)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8132
diff changeset
    97
                fobj.write(chunk)
1f6ba9afb925 [storage] BFSS now create read only file (closes #2151672)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8132
diff changeset
    98
        else:
1f6ba9afb925 [storage] BFSS now create read only file (closes #2151672)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8132
diff changeset
    99
            fobj.write(self.read())
8131
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   100
        self.seek(pos)
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   101
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   102
    @staticmethod
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   103
    def from_file(filename):
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   104
        """read a file and returns its contents in a Binary
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   105
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   106
        the reading is performed in a safe way for files stored on
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   107
        Windows SMB shares
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   108
        """
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   109
        binary = Binary()
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   110
        with open(filename, 'rb') as fobj:
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   111
            if sys.platform == 'win32':
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   112
                while True:
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   113
                    # the 16kB chunksize comes from the shutil module
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   114
                    # in stdlib
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   115
                    chunk = fobj.read(16*1024)
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   116
                    if not chunk:
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   117
                        break
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   118
                    binary.write(chunk)
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   119
            else:
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   120
                binary.write(fobj.read())
8234
83fd9ff90a9d [binary] use seek(0) in `from_file` Binary creation method (closes #2189183)
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 8132
diff changeset
   121
        binary.seek(0)
8131
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   122
        return binary
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   123
9299
c5eed908117d [schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents: 8748
diff changeset
   124
    def __eq__(self, other):
c5eed908117d [schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents: 8748
diff changeset
   125
        if not isinstance(other, Binary):
c5eed908117d [schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents: 8748
diff changeset
   126
            return False
9912
a84922befb89 Fix Binary.__eq__ (closes #4172701)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9299
diff changeset
   127
        return self.getvalue() == other.getvalue()
9299
c5eed908117d [schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents: 8748
diff changeset
   128
c5eed908117d [schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents: 8748
diff changeset
   129
c5eed908117d [schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents: 8748
diff changeset
   130
    # Binary helpers to store/fetch python objects
c5eed908117d [schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents: 8748
diff changeset
   131
c5eed908117d [schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents: 8748
diff changeset
   132
    @classmethod
c5eed908117d [schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents: 8748
diff changeset
   133
    def zpickle(cls, obj):
c5eed908117d [schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents: 8748
diff changeset
   134
        """ return a Binary containing a gzipped pickle of obj """
c5eed908117d [schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents: 8748
diff changeset
   135
        retval = cls()
10602
4845012cfc8e [py3k] import 'pickle' using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10272
diff changeset
   136
        retval.write(zlib.compress(pickle.dumps(obj, protocol=2)))
9299
c5eed908117d [schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents: 8748
diff changeset
   137
        return retval
c5eed908117d [schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents: 8748
diff changeset
   138
c5eed908117d [schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents: 8748
diff changeset
   139
    def unzpickle(self):
c5eed908117d [schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents: 8748
diff changeset
   140
        """ decompress and loads the stream before returning it """
10602
4845012cfc8e [py3k] import 'pickle' using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10272
diff changeset
   141
        return pickle.loads(zlib.decompress(self.getvalue()))
9299
c5eed908117d [schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents: 8748
diff changeset
   142
c5eed908117d [schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents: 8748
diff changeset
   143
10045
0a49d61c8cca Add custom checker for Password values
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
   144
def check_password(eschema, value):
0a49d61c8cca Add custom checker for Password values
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
   145
    return isinstance(value, (str, Binary))
0a49d61c8cca Add custom checker for Password values
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
   146
BASE_CHECKERS['Password'] = check_password
0a49d61c8cca Add custom checker for Password values
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
   147
8383
3f34d69e0c22 [yams] Binary instance passwords should not be given to str()
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8236
diff changeset
   148
def str_or_binary(value):
3f34d69e0c22 [yams] Binary instance passwords should not be given to str()
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8236
diff changeset
   149
    if isinstance(value, Binary):
3f34d69e0c22 [yams] Binary instance passwords should not be given to str()
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8236
diff changeset
   150
        return value
3f34d69e0c22 [yams] Binary instance passwords should not be given to str()
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8236
diff changeset
   151
    return str(value)
3f34d69e0c22 [yams] Binary instance passwords should not be given to str()
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8236
diff changeset
   152
BASE_CONVERTERS['Password'] = str_or_binary
3f34d69e0c22 [yams] Binary instance passwords should not be given to str()
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8236
diff changeset
   153
3f34d69e0c22 [yams] Binary instance passwords should not be given to str()
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8236
diff changeset
   154
4475
37c413a07216 kill most pre 3.2 bw compat code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   155
# use this dictionary to rename entity types while keeping bw compat
37c413a07216 kill most pre 3.2 bw compat code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   156
ETYPE_NAME_MAP = {}
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   157
4475
37c413a07216 kill most pre 3.2 bw compat code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   158
# XXX cubic web cube migration map. See if it's worth keeping this mecanism
37c413a07216 kill most pre 3.2 bw compat code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   159
#     to help in cube renaming
37c413a07216 kill most pre 3.2 bw compat code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   160
CW_MIGRATION_MAP = {}
231
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   161
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   162
def neg_role(role):
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   163
    if role == 'subject':
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   164
        return 'object'
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   165
    return 'subject'
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   166
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   167
def role(obj):
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   168
    try:
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   169
        return obj.role
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   170
    except AttributeError:
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   171
        return neg_role(obj.target)
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   172
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   173
def target(obj):
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   174
    try:
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   175
        return obj.target
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   176
    except AttributeError:
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   177
        return neg_role(obj.role)
1498
2c6eec0b46b9 fix imports, cleanup, repair some ajax calls
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   178
2683
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   179
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   180
class CubicWebEventManager(object):
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   181
    """simple event / callback manager.
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   182
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   183
    Typical usage to register a callback::
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   184
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   185
      >>> from cubicweb import CW_EVENT_MANAGER
2705
30bcdbd92820 [events] renamed source-reload into registry-reload to avoid potential confusions with datasources
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2689
diff changeset
   186
      >>> CW_EVENT_MANAGER.bind('after-registry-reload', mycallback)
2683
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   187
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   188
    Typical usage to emit an event::
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   189
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   190
      >>> from cubicweb import CW_EVENT_MANAGER
2705
30bcdbd92820 [events] renamed source-reload into registry-reload to avoid potential confusions with datasources
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2689
diff changeset
   191
      >>> CW_EVENT_MANAGER.emit('after-registry-reload')
2683
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   192
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   193
    emit() accepts an additional context parameter that will be passed
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   194
    to the callback if specified (and only in that case)
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   195
    """
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   196
    def __init__(self):
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   197
        self.callbacks = {}
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   198
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   199
    def bind(self, event, callback, *args, **kwargs):
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   200
        self.callbacks.setdefault(event, []).append( (callback, args, kwargs) )
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   201
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   202
    def emit(self, event, context=None):
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   203
        for callback, args, kwargs in self.callbacks.get(event, ()):
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   204
            if context is None:
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   205
                callback(*args, **kwargs)
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   206
            else:
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   207
                callback(context, *args, **kwargs)
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   208
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   209
CW_EVENT_MANAGER = CubicWebEventManager()
2689
44f041222d0f [autoreload] handle uicfg reloading properly with the new event / callback mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2683
diff changeset
   210
5081
2ea98b8512dd [events manager] onevent decorator may be given extra arguments to give to em.bind
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4475
diff changeset
   211
def onevent(event, *args, **kwargs):
2689
44f041222d0f [autoreload] handle uicfg reloading properly with the new event / callback mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2683
diff changeset
   212
    """decorator to ease event / callback binding
44f041222d0f [autoreload] handle uicfg reloading properly with the new event / callback mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2683
diff changeset
   213
44f041222d0f [autoreload] handle uicfg reloading properly with the new event / callback mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2683
diff changeset
   214
    >>> from cubicweb import onevent
2705
30bcdbd92820 [events] renamed source-reload into registry-reload to avoid potential confusions with datasources
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2689
diff changeset
   215
    >>> @onevent('before-registry-reload')
2689
44f041222d0f [autoreload] handle uicfg reloading properly with the new event / callback mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2683
diff changeset
   216
    ... def mycallback():
44f041222d0f [autoreload] handle uicfg reloading properly with the new event / callback mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2683
diff changeset
   217
    ...     print 'hello'
44f041222d0f [autoreload] handle uicfg reloading properly with the new event / callback mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2683
diff changeset
   218
    ...
44f041222d0f [autoreload] handle uicfg reloading properly with the new event / callback mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2683
diff changeset
   219
    >>>
44f041222d0f [autoreload] handle uicfg reloading properly with the new event / callback mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2683
diff changeset
   220
    """
44f041222d0f [autoreload] handle uicfg reloading properly with the new event / callback mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2683
diff changeset
   221
    def _decorator(func):
5081
2ea98b8512dd [events manager] onevent decorator may be given extra arguments to give to em.bind
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4475
diff changeset
   222
        CW_EVENT_MANAGER.bind(event, func, *args, **kwargs)
2689
44f041222d0f [autoreload] handle uicfg reloading properly with the new event / callback mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2683
diff changeset
   223
        return func
44f041222d0f [autoreload] handle uicfg reloading properly with the new event / callback mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2683
diff changeset
   224
    return _decorator
8556
bbe0d6985e59 [validation error] refactor validation error handling so translation is done on the web side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8486
diff changeset
   225
bbe0d6985e59 [validation error] refactor validation error handling so translation is done on the web side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8486
diff changeset
   226
bbe0d6985e59 [validation error] refactor validation error handling so translation is done on the web side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8486
diff changeset
   227
from yams.schema import role_name as rname
bbe0d6985e59 [validation error] refactor validation error handling so translation is done on the web side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8486
diff changeset
   228
bbe0d6985e59 [validation error] refactor validation error handling so translation is done on the web side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8486
diff changeset
   229
def validation_error(entity, errors, substitutions=None, i18nvalues=None):
bbe0d6985e59 [validation error] refactor validation error handling so translation is done on the web side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8486
diff changeset
   230
    """easy way to retrieve a :class:`cubicweb.ValidationError` for an entity or eid.
bbe0d6985e59 [validation error] refactor validation error handling so translation is done on the web side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8486
diff changeset
   231
bbe0d6985e59 [validation error] refactor validation error handling so translation is done on the web side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8486
diff changeset
   232
    You may also have 2-tuple as error keys, :func:`yams.role_name` will be
bbe0d6985e59 [validation error] refactor validation error handling so translation is done on the web side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8486
diff changeset
   233
    called automatically for them.
bbe0d6985e59 [validation error] refactor validation error handling so translation is done on the web side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8486
diff changeset
   234
bbe0d6985e59 [validation error] refactor validation error handling so translation is done on the web side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8486
diff changeset
   235
    Messages in errors **should not be translated yet**, though marked for
bbe0d6985e59 [validation error] refactor validation error handling so translation is done on the web side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8486
diff changeset
   236
    internationalization. You may give an additional substition dictionary that
bbe0d6985e59 [validation error] refactor validation error handling so translation is done on the web side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8486
diff changeset
   237
    will be used for interpolation after the translation.
bbe0d6985e59 [validation error] refactor validation error handling so translation is done on the web side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8486
diff changeset
   238
    """
bbe0d6985e59 [validation error] refactor validation error handling so translation is done on the web side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8486
diff changeset
   239
    if substitutions is None:
bbe0d6985e59 [validation error] refactor validation error handling so translation is done on the web side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8486
diff changeset
   240
        # set empty dict else translation won't be done for backward
8594
001159e2e4f3 [validation api] properly use yams 0.36 validation error api and update message catalog. Follows bbe0d6985e59
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8556
diff changeset
   241
        # compatibility reason (see ValidationError.translate method)
8556
bbe0d6985e59 [validation error] refactor validation error handling so translation is done on the web side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8486
diff changeset
   242
        substitutions = {}
8696
0bb18407c053 [toward py3k] rewrite dict.keys() and dict.values() (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8694
diff changeset
   243
    for key in list(errors):
8556
bbe0d6985e59 [validation error] refactor validation error handling so translation is done on the web side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8486
diff changeset
   244
        if isinstance(key, tuple):
bbe0d6985e59 [validation error] refactor validation error handling so translation is done on the web side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8486
diff changeset
   245
            errors[rname(*key)] = errors.pop(key)
bbe0d6985e59 [validation error] refactor validation error handling so translation is done on the web side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8486
diff changeset
   246
    return ValidationError(getattr(entity, 'eid', entity), errors,
bbe0d6985e59 [validation error] refactor validation error handling so translation is done on the web side
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8486
diff changeset
   247
                           substitutions, i18nvalues)
9046
6fb3f0106301 [dbapi] move ProgrammingError into cubicweb module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8748
diff changeset
   248
6fb3f0106301 [dbapi] move ProgrammingError into cubicweb module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8748
diff changeset
   249
6fb3f0106301 [dbapi] move ProgrammingError into cubicweb module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8748
diff changeset
   250
# exceptions ##################################################################
6fb3f0106301 [dbapi] move ProgrammingError into cubicweb module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8748
diff changeset
   251
6fb3f0106301 [dbapi] move ProgrammingError into cubicweb module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8748
diff changeset
   252
class ProgrammingError(Exception): #DatabaseError):
6fb3f0106301 [dbapi] move ProgrammingError into cubicweb module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8748
diff changeset
   253
    """Exception raised for errors that are related to the database's operation
6fb3f0106301 [dbapi] move ProgrammingError into cubicweb module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8748
diff changeset
   254
    and not necessarily under the control of the programmer, e.g. an unexpected
6fb3f0106301 [dbapi] move ProgrammingError into cubicweb module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8748
diff changeset
   255
    disconnect occurs, the data source name is not found, a transaction could
6fb3f0106301 [dbapi] move ProgrammingError into cubicweb module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8748
diff changeset
   256
    not be processed, a memory allocation error occurred during processing,
6fb3f0106301 [dbapi] move ProgrammingError into cubicweb module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8748
diff changeset
   257
    etc.
6fb3f0106301 [dbapi] move ProgrammingError into cubicweb module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8748
diff changeset
   258
    """
6fb3f0106301 [dbapi] move ProgrammingError into cubicweb module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8748
diff changeset
   259