__init__.py
author Rémi Cardona <remi.cardona@logilab.fr>
Fri, 18 Sep 2015 12:03:12 +0200
changeset 10708 d5e3fffa9c07
parent 10680 1b4df4b3cd9a
child 10907 9ae707db5265
permissions -rw-r--r--
[py3k] unicode → six.text_type
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
10665
79ff784cd8af [py3k] introduce cubicweb._ (related to #7589459)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10616
diff changeset
    31
from six import PY2, binary_type, text_type
79ff784cd8af [py3k] introduce cubicweb._ (related to #7589459)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10616
diff changeset
    32
from six.moves import builtins
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    33
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    34
CW_SOFTWARE_ROOT = __path__[0]
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    35
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    36
import sys, os, logging
10616
f454404733c1 Port cw.Binary to io.BytesIO
Rémi Cardona <remi.cardona@free.fr>
parents: 10602
diff changeset
    37
from io import BytesIO
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    38
10602
4845012cfc8e [py3k] import 'pickle' using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10272
diff changeset
    39
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
    40
8748
f5027f8d2478 drop typed_eid() in favour of int() (closes #2742462)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8696
diff changeset
    41
from logilab.common.deprecation import deprecated
1741
fe5266f0f88c use lgc implementation
sylvain.thenault@logilab.fr
parents: 1498
diff changeset
    42
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
    43
from yams.constraints import BASE_CONVERTERS, BASE_CHECKERS
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    44
9891
3386fd89c914 remove references to global environment variable APYCOT_ROOT
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9402
diff changeset
    45
# 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
    46
logging.basicConfig()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    47
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
    48
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
    49
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    50
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    51
set_log_methods(sys.modules[__name__], logging.getLogger('cubicweb'))
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    52
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    53
# make all exceptions accessible from the package
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    54
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
    55
from logilab.common.registry import ObjectNotFound, NoSelectableObject, RegistryNotFound
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    56
10665
79ff784cd8af [py3k] introduce cubicweb._ (related to #7589459)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10616
diff changeset
    57
79ff784cd8af [py3k] introduce cubicweb._ (related to #7589459)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10616
diff changeset
    58
# '_' is available to mark internationalized string but should not be used to
79ff784cd8af [py3k] introduce cubicweb._ (related to #7589459)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10616
diff changeset
    59
# do the actual translation
79ff784cd8af [py3k] introduce cubicweb._ (related to #7589459)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10616
diff changeset
    60
_ = text_type
79ff784cd8af [py3k] introduce cubicweb._ (related to #7589459)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10616
diff changeset
    61
if not hasattr(builtins, '_'):
79ff784cd8af [py3k] introduce cubicweb._ (related to #7589459)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10616
diff changeset
    62
    builtins._ = deprecated("[3.22] Use 'from cubicweb import _'")(_)
79ff784cd8af [py3k] introduce cubicweb._ (related to #7589459)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10616
diff changeset
    63
79ff784cd8af [py3k] introduce cubicweb._ (related to #7589459)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10616
diff changeset
    64
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    65
# 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
    66
@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
    67
def typed_eid(eid):
f5027f8d2478 drop typed_eid() in favour of int() (closes #2742462)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8696
diff changeset
    68
    return int(eid)
0
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
#def log_thread(f, w, a):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    71
#    print f.f_code.co_filename, f.f_code.co_name
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    72
#import threading
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    73
#threading.settrace(log_thread)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    74
10616
f454404733c1 Port cw.Binary to io.BytesIO
Rémi Cardona <remi.cardona@free.fr>
parents: 10602
diff changeset
    75
class Binary(BytesIO):
f454404733c1 Port cw.Binary to io.BytesIO
Rémi Cardona <remi.cardona@free.fr>
parents: 10602
diff changeset
    76
    """class to hold binary data. Use BytesIO to prevent use of unicode data"""
f454404733c1 Port cw.Binary to io.BytesIO
Rémi Cardona <remi.cardona@free.fr>
parents: 10602
diff changeset
    77
    _allowed_types = (binary_type, bytearray, buffer if PY2 else memoryview)
f454404733c1 Port cw.Binary to io.BytesIO
Rémi Cardona <remi.cardona@free.fr>
parents: 10602
diff changeset
    78
f454404733c1 Port cw.Binary to io.BytesIO
Rémi Cardona <remi.cardona@free.fr>
parents: 10602
diff changeset
    79
    def __init__(self, buf=b''):
f454404733c1 Port cw.Binary to io.BytesIO
Rémi Cardona <remi.cardona@free.fr>
parents: 10602
diff changeset
    80
        assert isinstance(buf, self._allowed_types), \
f454404733c1 Port cw.Binary to io.BytesIO
Rémi Cardona <remi.cardona@free.fr>
parents: 10602
diff changeset
    81
               "Binary objects must use bytes/buffer objects, not %s" % buf.__class__
f454404733c1 Port cw.Binary to io.BytesIO
Rémi Cardona <remi.cardona@free.fr>
parents: 10602
diff changeset
    82
        super(Binary, self).__init__(buf)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    83
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    84
    def write(self, data):
10616
f454404733c1 Port cw.Binary to io.BytesIO
Rémi Cardona <remi.cardona@free.fr>
parents: 10602
diff changeset
    85
        assert isinstance(data, self._allowed_types), \
f454404733c1 Port cw.Binary to io.BytesIO
Rémi Cardona <remi.cardona@free.fr>
parents: 10602
diff changeset
    86
               "Binary objects must use bytes/buffer objects, not %s" % data.__class__
f454404733c1 Port cw.Binary to io.BytesIO
Rémi Cardona <remi.cardona@free.fr>
parents: 10602
diff changeset
    87
        super(Binary, self).write(data)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    88
8180
1f6ba9afb925 [storage] BFSS now create read only file (closes #2151672)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8132
diff changeset
    89
    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
    90
        """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
    91
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
    92
        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
    93
        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
    94
        """
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
    95
        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
    96
        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
    97
        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
    98
            while True:
1f6ba9afb925 [storage] BFSS now create read only file (closes #2151672)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8132
diff changeset
    99
                # 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
   100
                # in stdlib
1f6ba9afb925 [storage] BFSS now create read only file (closes #2151672)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8132
diff changeset
   101
                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
   102
                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
   103
                    break
1f6ba9afb925 [storage] BFSS now create read only file (closes #2151672)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8132
diff changeset
   104
                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
   105
        else:
1f6ba9afb925 [storage] BFSS now create read only file (closes #2151672)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8132
diff changeset
   106
            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
   107
        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
   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
    @staticmethod
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   110
    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
   111
        """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
   112
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 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
   114
        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
   115
        """
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   116
        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
   117
        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
   118
            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
   119
                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
   120
                    # 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
   121
                    # 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
   122
                    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
   123
                    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
   124
                        break
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   125
                    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
   126
            else:
a6654712ad50 fix potential problems when BFSS uses a Windows SMB share (closes #2131435)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7879
diff changeset
   127
                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
   128
        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
   129
        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
   130
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
   131
    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
   132
        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
   133
            return False
9912
a84922befb89 Fix Binary.__eq__ (closes #4172701)
Julien Cristau <julien.cristau@logilab.fr>
parents: 9299
diff changeset
   134
        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
   135
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
   136
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
    # 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
   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
    @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
   140
    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
   141
        """ 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
   142
        retval = cls()
10602
4845012cfc8e [py3k] import 'pickle' using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10272
diff changeset
   143
        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
   144
        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
   145
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
   146
    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
   147
        """ 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
   148
        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
   149
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
   150
10045
0a49d61c8cca Add custom checker for Password values
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
   151
def check_password(eschema, value):
10680
1b4df4b3cd9a [py3k] str → six.binary_type
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10665
diff changeset
   152
    return isinstance(value, (binary_type, Binary))
10045
0a49d61c8cca Add custom checker for Password values
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
   153
BASE_CHECKERS['Password'] = check_password
0a49d61c8cca Add custom checker for Password values
Julien Cristau <julien.cristau@logilab.fr>
parents: 9990
diff changeset
   154
8383
3f34d69e0c22 [yams] Binary instance passwords should not be given to str()
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8236
diff changeset
   155
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
   156
    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
   157
        return value
10680
1b4df4b3cd9a [py3k] str → six.binary_type
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10665
diff changeset
   158
    return binary_type(value)
8383
3f34d69e0c22 [yams] Binary instance passwords should not be given to str()
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8236
diff changeset
   159
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
   160
3f34d69e0c22 [yams] Binary instance passwords should not be given to str()
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8236
diff changeset
   161
4475
37c413a07216 kill most pre 3.2 bw compat code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   162
# 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
   163
ETYPE_NAME_MAP = {}
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   164
4475
37c413a07216 kill most pre 3.2 bw compat code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   165
# 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
   166
#     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
   167
CW_MIGRATION_MAP = {}
231
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   168
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   169
def neg_role(role):
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   170
    if role == 'subject':
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   171
        return 'object'
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   172
    return 'subject'
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   173
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   174
def role(obj):
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   175
    try:
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   176
        return obj.role
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   177
    except AttributeError:
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   178
        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
   179
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   180
def target(obj):
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   181
    try:
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   182
        return obj.target
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   183
    except AttributeError:
d740f5f55d30 some mini function to ease role (subject/object) manipulation
Sylvain Thenault <sylvain.thenault@logilab.fr>
parents: 0
diff changeset
   184
        return neg_role(obj.role)
1498
2c6eec0b46b9 fix imports, cleanup, repair some ajax calls
sylvain.thenault@logilab.fr
parents: 1398
diff changeset
   185
2683
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   186
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   187
class CubicWebEventManager(object):
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   188
    """simple event / callback manager.
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
    Typical usage to register a callback::
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   191
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   192
      >>> 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
   193
      >>> 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
   194
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   195
    Typical usage to emit an event::
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   196
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   197
      >>> 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
   198
      >>> CW_EVENT_MANAGER.emit('after-registry-reload')
2683
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   199
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   200
    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
   201
    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
   202
    """
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   203
    def __init__(self):
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   204
        self.callbacks = {}
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   205
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   206
    def bind(self, event, callback, *args, **kwargs):
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   207
        self.callbacks.setdefault(event, []).append( (callback, 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
    def emit(self, event, context=None):
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   210
        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
   211
            if context is None:
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   212
                callback(*args, **kwargs)
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   213
            else:
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   214
                callback(context, *args, **kwargs)
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   215
52b1a86c1913 introduce a new CubicwebEventManager
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2647
diff changeset
   216
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
   217
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
   218
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
   219
    """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
   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
    >>> 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
   222
    >>> @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
   223
    ... 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
   224
    ...     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
   225
    ...
44f041222d0f [autoreload] handle uicfg reloading properly with the new event / callback mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2683
diff changeset
   226
    >>>
44f041222d0f [autoreload] handle uicfg reloading properly with the new event / callback mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2683
diff changeset
   227
    """
44f041222d0f [autoreload] handle uicfg reloading properly with the new event / callback mechanism
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2683
diff changeset
   228
    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
   229
        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
   230
        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
   231
    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
   232
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
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
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
   235
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
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
   237
    """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
   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
    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
   240
    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
   241
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
    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
   243
    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
   244
    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
   245
    """
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
    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
   247
        # 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
   248
        # 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
   249
        substitutions = {}
8696
0bb18407c053 [toward py3k] rewrite dict.keys() and dict.values() (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8694
diff changeset
   250
    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
   251
        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
   252
            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
   253
    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
   254
                           substitutions, i18nvalues)
9046
6fb3f0106301 [dbapi] move ProgrammingError into cubicweb module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8748
diff changeset
   255
6fb3f0106301 [dbapi] move ProgrammingError into cubicweb module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8748
diff changeset
   256
6fb3f0106301 [dbapi] move ProgrammingError into cubicweb module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8748
diff changeset
   257
# exceptions ##################################################################
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
class ProgrammingError(Exception): #DatabaseError):
6fb3f0106301 [dbapi] move ProgrammingError into cubicweb module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8748
diff changeset
   260
    """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
   261
    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
   262
    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
   263
    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
   264
    etc.
6fb3f0106301 [dbapi] move ProgrammingError into cubicweb module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8748
diff changeset
   265
    """
6fb3f0106301 [dbapi] move ProgrammingError into cubicweb module
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8748
diff changeset
   266