backport stable
authorSylvain Thénault <sylvain.thenault@logilab.fr>
Thu, 05 May 2011 15:28:24 +0200
changeset 7314 d3104c697adb
parent 7309 22403d5c3da4 (current diff)
parent 7313 02fb1dcc99a2 (diff)
child 7322 108c87e0538c
backport stable
devtools/testlib.py
entity.py
i18n/es.po
i18n/fr.po
test/unittest_entity.py
--- a/devtools/testlib.py	Thu May 05 12:50:21 2011 +0200
+++ b/devtools/testlib.py	Thu May 05 15:28:24 2011 +0200
@@ -30,6 +30,7 @@
 from math import log
 from contextlib import contextmanager
 from warnings import warn
+from types import NoneType
 
 import yams.schema
 
@@ -42,8 +43,7 @@
 from logilab.common.shellutils import getlogin
 
 from cubicweb import ValidationError, NoSelectableObject, AuthenticationError
-from cubicweb import cwconfig, devtools, web, server
-from cubicweb.dbapi import ProgrammingError, DBAPISession, repo_connect
+from cubicweb import cwconfig, dbapi, devtools, web, server
 from cubicweb.sobjects import notification
 from cubicweb.web import Redirect, application
 from cubicweb.server.session import Session, security_enabled
@@ -252,7 +252,7 @@
         # cnx is now an instance property that use a class protected attributes.
         cls.set_cnx(cnx)
         cls.vreg = cls.repo.vreg
-        cls.websession = DBAPISession(cnx, cls.admlogin)
+        cls.websession = dbapi.DBAPISession(cnx, cls.admlogin)
         cls._orig_cnx = (cnx, cls.websession)
         cls.config.repository = lambda x=None: cls.repo
 
@@ -367,9 +367,8 @@
             elif isinstance(login, tuple):
                 groups = login
             login = req
-            if req is None:
-                assert not isinstance(self, type)
-                req = self._orig_cnx[0].request()
+            assert not isinstance(self, type)
+            req = self._orig_cnx[0].request()
         if password is None:
             password = login.encode('utf8')
         user = req.create_entity('CWUser', login=unicode(login),
@@ -419,8 +418,8 @@
         autoclose = kwargs.pop('autoclose', True)
         if not kwargs:
             kwargs['password'] = str(login)
-        self.set_cnx(repo_connect(self.repo, unicode(login), **kwargs))
-        self.websession = DBAPISession(self.cnx)
+        self.set_cnx(dbapi.repo_connect(self.repo, unicode(login), **kwargs))
+        self.websession = dbapi.DBAPISession(self.cnx)
         if login == self.vreg.config.anonymous_user()[0]:
             self.cnx.anonymous_connection = True
         if autoclose:
@@ -462,7 +461,7 @@
     def rollback(self):
         try:
             self.cnx.rollback()
-        except ProgrammingError:
+        except dbapi.ProgrammingError:
             pass # connection closed
         finally:
             self.session.set_pool() # ensure pool still set after commit
@@ -722,9 +721,9 @@
 
     def assertAuthFailure(self, req, nbsessions=0):
         self.app.connect(req)
-        self.assertIsInstance(req.session, DBAPISession)
+        self.assertIsInstance(req.session, dbapi.DBAPISession)
         self.assertEqual(req.session.cnx, None)
-        self.assertEqual(req.cnx, None)
+        self.assertIsInstance(req.cnx, (dbapi._NeedAuthAccessMock, NoneType))
         self.assertEqual(len(self.open_sessions), nbsessions)
         clear_cache(req, 'get_authorization')
 
--- a/entity.py	Thu May 05 12:50:21 2011 +0200
+++ b/entity.py	Thu May 05 15:28:24 2011 +0200
@@ -958,8 +958,9 @@
         """add relations to the given object. To set a relation where this entity
         is the object of the relation, use 'reverse_'<relation> as argument name.
 
-        Values may be an entity, a list of entities, or None (meaning that all
-        relations of the given type from or to this object should be deleted).
+        Values may be an entity or eid, a list of entities or eids, or None
+        (meaning that all relations of the given type from or to this object
+        should be deleted).
         """
         # XXX update cache
         _check_cw_unsafe(kwargs)
@@ -974,9 +975,17 @@
                 continue
             if not isinstance(values, (tuple, list, set, frozenset)):
                 values = (values,)
+            eids = []
+            for val in values:
+                try:
+                    eids.append(str(val.eid))
+                except AttributeError:
+                    try:
+                        eids.append(str(typed_eid(val)))
+                    except (ValueError, TypeError):
+                        raise Exception('expected an Entity or eid, got %s' % val)
             self._cw.execute('SET %s WHERE X eid %%(x)s, Y eid IN (%s)' % (
-                restr, ','.join(str(r.eid) for r in values)),
-                             {'x': self.eid})
+                    restr, ','.join(eids)), {'x': self.eid})
 
     def cw_delete(self, **kwargs):
         assert self.has_eid(), self.eid
--- a/i18n/es.po	Thu May 05 12:50:21 2011 +0200
+++ b/i18n/es.po	Thu May 05 15:28:24 2011 +0200
@@ -4,9 +4,9 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: cubicweb 2.46.0\n"
-"PO-Revision-Date: 2010-11-27 07:59+0100\n"
-"Last-Translator: Celso Flores<celso.flores@crealibre.com>, Carlos Balderas "
-"<carlos.balderas@crealibre.com>\n"
+"POT-Creation-Date: \n"
+"PO-Revision-Date: 2011-05-03 12:53-0600\n"
+"Last-Translator: CreaLibre <info@crealibre.com>\n"
 "Language-Team: es <contact@logilab.fr>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -43,9 +43,12 @@
 #, python-format
 msgid "\"action\" must be specified in options; allowed values are %s"
 msgstr ""
+"\"action\" debe estar especificada en opciones; los valores permitidos son : "
+"%s"
 
 msgid "\"role=subject\" or \"role=object\" must be specified in options"
 msgstr ""
+"\"role=subject\" o \"role=object\" debe ser especificado en las opciones"
 
 #, python-format
 msgid "%(attr)s set to %(newvalue)s"
@@ -61,7 +64,7 @@
 
 #, python-format
 msgid "%(etype)s by %(author)s"
-msgstr ""
+msgstr "%(etype)s por %(author)s"
 
 #, python-format
 msgid "%(firstname)s %(surname)s"
@@ -133,7 +136,7 @@
 
 #, python-format
 msgid "%s could be supported"
-msgstr ""
+msgstr "%s podría ser mantenido"
 
 #, python-format
 msgid "%s error report"
@@ -145,7 +148,7 @@
 
 #, python-format
 msgid "%s relation should not be in mapped"
-msgstr ""
+msgstr "la relación %s no debería estar mapeada"
 
 #, python-format
 msgid "%s software version of the database"
@@ -157,11 +160,11 @@
 
 #, python-format
 msgid "'%s' action doesn't take any options"
-msgstr ""
+msgstr "la acción '%s'  no acepta opciones"
 
 #, python-format
 msgid "'%s' action require 'linkattr' option"
-msgstr ""
+msgstr "la acción '%s' requiere una opción 'linkattr'"
 
 msgid "(UNEXISTANT EID)"
 msgstr "(EID INEXISTENTE"
@@ -219,7 +222,7 @@
 "div>"
 
 msgid "<not specified>"
-msgstr ""
+msgstr "<no especificado>"
 
 msgid "?*"
 msgstr "0..1 0..n"
@@ -357,28 +360,28 @@
 msgstr "Relaciones"
 
 msgid "CWSource"
-msgstr ""
+msgstr "Fuente de datos"
 
 msgid "CWSourceHostConfig"
-msgstr ""
+msgstr "Configuración de Fuente"
 
 msgid "CWSourceHostConfig_plural"
-msgstr ""
+msgstr "Configuraciones de fuente"
 
 msgid "CWSourceSchemaConfig"
-msgstr ""
+msgstr "Configuraciones de Esquema de Fuente"
 
 msgid "CWSourceSchemaConfig_plural"
-msgstr ""
+msgstr "Configuraciones de Esquema de Fuente"
 
 msgid "CWSource_plural"
-msgstr ""
+msgstr "Fuentes de Datos"
 
 msgid "CWUniqueTogetherConstraint"
-msgstr ""
+msgstr "Restricción de Singularidad"
 
 msgid "CWUniqueTogetherConstraint_plural"
-msgstr ""
+msgstr "Restricciones de Singularidad"
 
 msgid "CWUser"
 msgstr "Usuario"
@@ -436,7 +439,7 @@
 
 #, python-format
 msgid "Data connection graph for %s"
-msgstr ""
+msgstr "Gráfica de conexión de datos para %s"
 
 msgid "Date"
 msgstr "Fecha"
@@ -457,7 +460,7 @@
 msgstr "Decimales"
 
 msgid "Detected problems"
-msgstr ""
+msgstr "Problemas detectados"
 
 msgid "Do you want to delete the following element(s) ?"
 msgstr "Desea eliminar el(los) elemento(s) siguiente(s)"
@@ -479,7 +482,7 @@
 msgstr "Entidades"
 
 msgid "Entity and relation supported by this source"
-msgstr ""
+msgstr "Entidades y relaciones aceptadas por esta fuente"
 
 msgid "ExternalUri"
 msgstr "Uri externo"
@@ -506,7 +509,7 @@
 msgstr "Recolector de basura en memoria"
 
 msgid "Got rhythm?"
-msgstr ""
+msgstr "Tenemos Ritmo?"
 
 msgid "Help"
 msgstr "Ayuda"
@@ -533,7 +536,7 @@
 msgstr "Clases buscadas"
 
 msgid "Manage"
-msgstr ""
+msgstr "Administración"
 
 msgid "Most referenced classes"
 msgstr "Clases más referenciadas"
@@ -575,16 +578,16 @@
 msgstr "Nueva definición de relación final"
 
 msgid "New CWSource"
-msgstr ""
+msgstr "Nueva fuente"
 
 msgid "New CWSourceHostConfig"
-msgstr ""
+msgstr "Nueva configuración de fuente"
 
 msgid "New CWSourceSchemaConfig"
-msgstr ""
+msgstr "Nueva parte de mapeo de fuente"
 
 msgid "New CWUniqueTogetherConstraint"
-msgstr ""
+msgstr "Nueva restricción de singularidad"
 
 msgid "New CWUser"
 msgstr "Agregar usuario"
@@ -685,7 +688,7 @@
 msgstr "Buscar"
 
 msgid "Site information"
-msgstr ""
+msgstr "Información del Sitio"
 
 msgid "SizeConstraint"
 msgstr "Restricción de tamaño"
@@ -695,6 +698,9 @@
 "authorized keys depending on the source's type, overriding values defined on "
 "the source."
 msgstr ""
+"Configuración de la fuente por un \"host\" específico. Una clave=valor por "
+"línea, las claves permitidas dependen del tipo de fuente. Estos valores son "
+"prioritarios a los valores definidos en la fuente."
 
 msgid "Startup views"
 msgstr "Vistas de inicio"
@@ -733,16 +739,16 @@
 msgstr "Enviar este reporte por email"
 
 msgid "TZDatetime"
-msgstr ""
+msgstr "Fecha y hora internacional"
 
 msgid "TZDatetime_plural"
-msgstr ""
+msgstr "Fechas y horas internacionales"
 
 msgid "TZTime"
-msgstr ""
+msgstr "Hora internacional"
 
 msgid "TZTime_plural"
-msgstr ""
+msgstr "Horas internacionales"
 
 #, python-format
 msgid "The view %s can not be applied to this query"
@@ -792,16 +798,16 @@
 msgstr "Esta definición de relación no final"
 
 msgid "This CWSource"
-msgstr ""
+msgstr "Esta fuente"
 
 msgid "This CWSourceHostConfig"
-msgstr ""
+msgstr "Esta configuración de fuente"
 
 msgid "This CWSourceSchemaConfig"
-msgstr ""
+msgstr "Esta parte de mapeo de fuente"
 
 msgid "This CWUniqueTogetherConstraint"
-msgstr ""
+msgstr "Esta restricción de singularidad"
 
 msgid "This CWUser"
 msgstr "Este usuario"
@@ -856,6 +862,8 @@
 
 msgid "URLs from which content will be imported. You can put one url per line"
 msgstr ""
+"URLs desde el cual el contenido sera importado. Usted puede incluir un URL "
+"por línea."
 
 msgid "UniqueConstraint"
 msgstr "Restricción de Unicidad"
@@ -1019,10 +1027,10 @@
 msgstr "Definición de relación"
 
 msgid "add CWSourceHostConfig cw_host_config_of CWSource object"
-msgstr ""
+msgstr "configuración del host"
 
 msgid "add CWUniqueTogetherConstraint constraint_of CWEType object"
-msgstr ""
+msgstr "restricción de singularidad"
 
 msgid "add CWUser in_group CWGroup object"
 msgstr "Usuario"
@@ -1065,7 +1073,7 @@
 
 #, python-format
 msgid "add a %s"
-msgstr ""
+msgstr "agregar un %s"
 
 msgctxt "inlined:CWRelation.from_entity.subject"
 msgid "add a CWEType"
@@ -1080,10 +1088,10 @@
 msgstr "Agregar un tipo de relación"
 
 msgid "add a CWSource"
-msgstr ""
+msgstr "agregar una fuente"
 
 msgid "add a CWSourceSchemaConfig"
-msgstr ""
+msgstr "agregar una parte de mapeo"
 
 msgctxt "inlined:CWUser.use_email.subject"
 msgid "add a EmailAddress"
@@ -1154,7 +1162,7 @@
 msgstr "permite definir un Workflow específico para una entidad"
 
 msgid "allowed options depends on the source type"
-msgstr ""
+msgstr "las opciones permitidas dependen del tipo de fuente"
 
 msgid "allowed transitions from this state"
 msgstr "transiciones autorizadas desde este estado"
@@ -1210,11 +1218,11 @@
 
 #, python-format
 msgid "archive for %(author)s"
-msgstr ""
+msgstr "archivo de %(author)s"
 
 #, python-format
 msgid "archive for %(month)s/%(year)s"
-msgstr ""
+msgstr "archivo del %(month)s/%(year)s"
 
 #, python-format
 msgid "at least one relation %(rtype)s is required on %(etype)s (%(eid)s)"
@@ -1227,6 +1235,8 @@
 
 msgid "attribute/relation can't be mapped, only entity and relation types"
 msgstr ""
+"los atributos y las relaciones no pueden ser mapeados, solamente los tipos "
+"de entidad y de relación"
 
 msgid "august"
 msgstr "Agosto"
@@ -1338,7 +1348,7 @@
 msgstr "no puede modificar el atributo %s"
 
 msgid "can't change this relation"
-msgstr ""
+msgstr "no puede modificar esta relación"
 
 #, python-format
 msgid "can't connect to source %s, some data may be missing"
@@ -1352,10 +1362,10 @@
 msgstr "no puede tener varias salidas en el mismo estado"
 
 msgid "can't mix dontcross and maycross options"
-msgstr ""
+msgstr "no puede mezclar las opciones dontcross y maycross"
 
 msgid "can't mix dontcross and write options"
-msgstr ""
+msgstr "no puede mezclar las opciones dontcross y write"
 
 #, python-format
 msgid "can't parse %(value)r (expected %(format)s)"
@@ -1370,7 +1380,7 @@
 "cardinalidad %(card)s"
 
 msgid "cancel"
-msgstr ""
+msgstr "anular"
 
 msgid "cancel select"
 msgstr "Cancelar la selección"
@@ -1403,7 +1413,7 @@
 msgstr "Ver la entidad creada"
 
 msgid "click here to see edited entity"
-msgstr ""
+msgstr "seleccione aquí para ver la entidad modificada"
 
 msgid "click on the box to cancel the deletion"
 msgstr "Seleccione la zona de edición para cancelar la eliminación"
@@ -1487,15 +1497,15 @@
 msgstr "condiciones"
 
 msgid "config"
-msgstr ""
+msgstr "configuración"
 
 msgctxt "CWSourceHostConfig"
 msgid "config"
-msgstr ""
+msgstr "configuración"
 
 msgctxt "CWSource"
 msgid "config"
-msgstr ""
+msgstr "configuración"
 
 msgid "config mode"
 msgstr "Modo de configuración"
@@ -1528,18 +1538,18 @@
 msgstr "Fábrica de restricciones"
 
 msgid "constraint_of"
-msgstr ""
+msgstr "restricción de"
 
 msgctxt "CWUniqueTogetherConstraint"
 msgid "constraint_of"
-msgstr ""
+msgstr "restricción de"
 
 msgctxt "CWEType"
 msgid "constraint_of_object"
-msgstr ""
+msgstr "restringida por"
 
 msgid "constraint_of_object"
-msgstr ""
+msgstr "restringida por"
 
 msgid "constraints"
 msgstr "Restricciones"
@@ -1631,15 +1641,14 @@
 msgid "creating CWRelation (CWRelation relation_type CWRType %(linkto)s)"
 msgstr "Creación de la relación %(linkto)s"
 
-msgid ""
-"creating CWSourceHostConfig (CWSourceHostConfig cw_host_config_of CWSource %"
-"(linkto)s)"
-msgstr ""
+"creating CWSourceHostConfig (CWSourceHostConfig cw_host_config_of CWSource "
+"%(linkto)s)"
+msgstr "creación de una configuración host para la fuente %(linkto)s"
 
 msgid ""
 "creating CWUniqueTogetherConstraint (CWUniqueTogetherConstraint "
 "constraint_of CWEType %(linkto)s)"
-msgstr ""
+msgstr "creación de una restricción de singularidad en  %(linkto)s"
 
 msgid "creating CWUser (CWUser in_group CWGroup %(linkto)s)"
 msgstr "Creación de un usuario para agregar al grupo %(linkto)s"
@@ -1819,7 +1828,7 @@
 msgstr "Metadatos de la Entidad"
 
 msgid "ctxcomponents_metadata_description"
-msgstr ""
+msgstr "espacio que incluye los metadatos de la entidad actual"
 
 msgid "ctxcomponents_possible_views_box"
 msgstr "Caja de Vistas Posibles"
@@ -1856,10 +1865,10 @@
 msgstr "Muestra las vistas de inicio de la aplicación"
 
 msgid "ctxcomponents_userstatus"
-msgstr ""
+msgstr "estado del usuario"
 
 msgid "ctxcomponents_userstatus_description"
-msgstr ""
+msgstr "establece el estado del usuario"
 
 msgid "ctxcomponents_wfhistory"
 msgstr "Histórico del workflow."
@@ -1879,64 +1888,64 @@
 msgstr "Workflow de"
 
 msgid "cw_for_source"
-msgstr ""
+msgstr "fuente"
 
 msgctxt "CWSourceSchemaConfig"
 msgid "cw_for_source"
-msgstr ""
+msgstr "fuente"
 
 msgctxt "CWSource"
 msgid "cw_for_source_object"
-msgstr ""
+msgstr "elemento de mapeo"
 
 msgid "cw_for_source_object"
-msgstr ""
+msgstr "elemento de mapeo"
 
 msgid "cw_host_config_of"
-msgstr ""
+msgstr "configuración del host de"
 
 msgctxt "CWSourceHostConfig"
 msgid "cw_host_config_of"
-msgstr ""
+msgstr "configuración del host de"
 
 msgctxt "CWSource"
 msgid "cw_host_config_of_object"
-msgstr ""
+msgstr "tiene la configuración del host"
 
 msgid "cw_host_config_of_object"
-msgstr ""
+msgstr "tiene la configuración del host"
 
 msgid "cw_schema"
-msgstr ""
+msgstr "esquema"
 
 msgctxt "CWSourceSchemaConfig"
 msgid "cw_schema"
-msgstr ""
+msgstr "esquema"
 
 msgctxt "CWEType"
 msgid "cw_schema_object"
-msgstr ""
+msgstr "mapeado por"
 
 msgctxt "CWAttribute"
 msgid "cw_schema_object"
-msgstr ""
+msgstr "mapeado por"
 
 msgctxt "CWRelation"
 msgid "cw_schema_object"
-msgstr ""
+msgstr "mapeado por"
 
 msgctxt "CWRType"
 msgid "cw_schema_object"
-msgstr ""
+msgstr "mapeado por"
 
 msgid "cw_schema_object"
-msgstr ""
+msgstr "mapeado por"
 
 msgid "cw_source"
-msgstr ""
+msgstr "desde la fuente de datos"
 
 msgid "cw_source_object"
-msgstr ""
+msgstr "entidades"
 
 msgid "cwetype-box"
 msgstr "Vista \"caja\""
@@ -1966,10 +1975,10 @@
 msgstr "Permisos"
 
 msgid "cwsource-main"
-msgstr ""
+msgstr "descripción"
 
 msgid "cwsource-mapping"
-msgstr ""
+msgstr "mapeo"
 
 msgid "cwuri"
 msgstr "Uri Interna"
@@ -1978,16 +1987,16 @@
 msgstr "Url del repertorio de datos"
 
 msgid "data sources"
-msgstr ""
+msgstr "fuente de datos"
 
 msgid "data sources management"
-msgstr ""
+msgstr "administración de fuentes de datos"
 
 msgid "date"
 msgstr "Fecha"
 
 msgid "day"
-msgstr ""
+msgstr "día"
 
 msgid "deactivate"
 msgstr "Desactivar"
@@ -2078,7 +2087,7 @@
 msgstr "Define como salir de un sub-Workflow"
 
 msgid "defines a sql-level multicolumn unique index"
-msgstr ""
+msgstr "define un índice SQL único a través de varias columnas"
 
 msgid ""
 "defines what's the property is applied for. You must select this first to be "
@@ -2324,6 +2333,8 @@
 
 msgid "entity and relation types can't be mapped, only attributes or relations"
 msgstr ""
+"los tipos de entidad y relación no pueden ser mapeados, solo los atributos y "
+"las relaciones"
 
 msgid "entity copied"
 msgstr "Entidad copiada"
@@ -2366,7 +2377,7 @@
 msgstr "Actualización de la Entidad"
 
 msgid "error"
-msgstr ""
+msgstr "error"
 
 msgid "error while embedding page"
 msgstr "Error durante la inclusión de la página"
@@ -2433,10 +2444,10 @@
 msgstr "Faceta creada por"
 
 msgid "facets_cw_source-facet"
-msgstr ""
+msgstr "faceta \"fuente de datos\""
 
 msgid "facets_cw_source-facet_description"
-msgstr ""
+msgstr "fuente de datos"
 
 msgid "facets_cwfinal-facet"
 msgstr "Faceta \"final\""
@@ -2589,7 +2600,7 @@
 msgstr "Texto indexado"
 
 msgid "gc"
-msgstr ""
+msgstr "fuga de memoria"
 
 msgid "generic plot"
 msgstr "Gráfica Genérica"
@@ -2652,10 +2663,10 @@
 msgstr "Contiene el texto"
 
 msgid "header-left"
-msgstr ""
+msgstr "encabezado (izquierdo)"
 
 msgid "header-right"
-msgstr ""
+msgstr "encabezado (derecho)"
 
 msgid "help"
 msgstr ""
@@ -2828,6 +2839,8 @@
 #, python-format
 msgid "inlined relation %(rtype)s of %(etype)s should be supported"
 msgstr ""
+"la relación %(rtype)s del tipo de entidad %(etype)s debe ser aceptada "
+"('inlined')"
 
 msgid "instance home"
 msgstr "Repertorio de la Instancia"
@@ -2933,17 +2946,17 @@
 msgstr "Fecha de la última modificación de una entidad "
 
 msgid "latest synchronization time"
-msgstr ""
+msgstr "fecha de la última sincronización"
 
 msgid "latest update on"
 msgstr "Actualizado el"
 
 msgid "latest_retrieval"
-msgstr ""
+msgstr "última sincronización"
 
 msgctxt "CWSource"
 msgid "latest_retrieval"
-msgstr ""
+msgstr "fecha de la última sincronización de la fuente"
 
 msgid "left"
 msgstr "izquierda"
@@ -3001,7 +3014,7 @@
 msgstr "Usuario"
 
 msgid "login / password"
-msgstr ""
+msgstr "usuario / contraseña"
 
 msgid "login or email"
 msgstr "Usuario o dirección de correo"
@@ -3020,7 +3033,7 @@
 msgstr "Informaciones Generales"
 
 msgid "main_tab"
-msgstr ""
+msgstr "descripción"
 
 msgid "mainvars"
 msgstr "Variables principales"
@@ -3051,11 +3064,11 @@
 msgstr "Marzo"
 
 msgid "match_host"
-msgstr ""
+msgstr "para el host"
 
 msgctxt "CWSourceHostConfig"
 msgid "match_host"
-msgstr ""
+msgstr "para el host"
 
 msgid "maximum number of characters in short description"
 msgstr "Máximo de caracteres en las descripciones cortas"
@@ -3083,7 +3096,7 @@
 msgstr "Parámetros faltantes a la entidad %s"
 
 msgid "modification"
-msgstr ""
+msgstr "modificación"
 
 msgid "modification_date"
 msgstr "Fecha de modificación"
@@ -3095,7 +3108,7 @@
 msgstr "Lunes"
 
 msgid "month"
-msgstr ""
+msgstr "mes"
 
 msgid "more actions"
 msgstr "Más acciones"
@@ -3142,7 +3155,7 @@
 
 msgctxt "State"
 msgid "name"
-msgstr "Nombre"
+msgstr "nombre"
 
 msgctxt "CWPermission"
 msgid "name"
@@ -3171,7 +3184,7 @@
 "selección de ser necesario (separarlas con comas)"
 
 msgid "name of the source"
-msgstr ""
+msgstr "nombre de la fuente"
 
 msgid "name or identifier of the permission"
 msgstr "Nombre o identificador del permiso"
@@ -3288,7 +3301,7 @@
 
 msgctxt "CWSourceSchemaConfig"
 msgid "options"
-msgstr ""
+msgstr "opciones"
 
 msgid "order"
 msgstr "Orden"
@@ -3329,14 +3342,16 @@
 msgstr "Página no encontrada."
 
 msgid "parser"
-msgstr ""
+msgstr "analizador (parser)"
 
 msgctxt "CWSource"
 msgid "parser"
-msgstr ""
+msgstr "analizador (parser)"
 
 msgid "parser to use to extract entities from content retrieved at given URLs."
 msgstr ""
+"analizador (parser) que sirve para extraer entidades y relaciones del "
+"contenido recuperado de las URLs."
 
 msgid "password"
 msgstr "Contraseña"
@@ -3417,7 +3432,7 @@
 msgstr "Dirección de email principal (objeto)"
 
 msgid "profile"
-msgstr ""
+msgstr "perfil"
 
 msgid "progress"
 msgstr "Progreso"
@@ -3435,7 +3450,7 @@
 msgstr "Permisos"
 
 msgid "rdf"
-msgstr ""
+msgstr "rdf"
 
 msgid "read"
 msgstr "Lectura"
@@ -3468,6 +3483,8 @@
 
 msgid "regexp matching host(s) to which this config applies"
 msgstr ""
+"expresión regular de los nombres de hosts a los cuales esta configuración "
+"aplica"
 
 msgid "registry"
 msgstr "Registro"
@@ -3490,18 +3507,24 @@
 "relation %(rtype)s with %(etype)s as %(role)s is supported but no target "
 "type supported"
 msgstr ""
+"la relación %(rtype)s con %(etype)s como %(role)s es aceptada pero ningún "
+"tipo target es aceptado"
 
 #, python-format
 msgid ""
 "relation %(type)s with %(etype)s as %(role)s and target type %(target)s is "
 "mandatory but not supported"
 msgstr ""
+"la relación %(type)s con %(etype)s como %(role)s y tipo objetivo %(target)s "
+"es obligatoria pero no mantenida"
 
 #, python-format
 msgid ""
 "relation %s is supported but none if its definitions matches supported "
 "entities"
 msgstr ""
+"la relación %s es aceptada pero ninguna de sus definiciones corresponden a "
+"los tipos de entidades aceptadas"
 
 msgid "relation add"
 msgstr "Agregar Relación"
@@ -3528,21 +3551,21 @@
 msgstr "Definición de Relaciones"
 
 msgid "relations"
-msgstr ""
+msgstr "relaciones"
 
 msgctxt "CWUniqueTogetherConstraint"
 msgid "relations"
-msgstr ""
+msgstr "relaciones"
 
 msgid "relations deleted"
 msgstr "Relaciones Eliminadas"
 
 msgctxt "CWRType"
 msgid "relations_object"
-msgstr ""
+msgstr "relaciones de"
 
 msgid "relations_object"
-msgstr ""
+msgstr "relaciones de"
 
 msgid "relative url of the bookmarked page"
 msgstr "Url relativa de la página"
@@ -3654,7 +3677,7 @@
 msgstr "Seguridad"
 
 msgid "see more"
-msgstr ""
+msgstr "ver más"
 
 msgid "see them all"
 msgstr "Ver todos"
@@ -3749,7 +3772,7 @@
 msgstr "Una propiedad específica al Sistema no puede ser propia al usuario"
 
 msgid "siteinfo"
-msgstr ""
+msgstr "información"
 
 msgid "some errors occurred:"
 msgstr "Algunos errores encontrados :"
@@ -3765,6 +3788,8 @@
 "source's configuration. One key=value per line, authorized keys depending on "
 "the source's type"
 msgstr ""
+"configuración de fuentes. Una clave=valor por línea, las claves permitidas "
+"dependen del tipo de la fuente."
 
 msgid "sparql xml"
 msgstr "XML Sparql"
@@ -3788,7 +3813,7 @@
 
 #, python-format
 msgid "specifying %s is mandatory"
-msgstr ""
+msgstr "especificar %s es obligatorio"
 
 msgid "startup views"
 msgstr "Vistas de inicio"
@@ -3920,7 +3945,7 @@
 msgstr "Simétrico"
 
 msgid "synchronization-interval must be greater than 1 minute"
-msgstr ""
+msgstr "synchronization-interval debe ser mayor a 1 minuto"
 
 msgid "table"
 msgstr "Tabla"
@@ -3954,6 +3979,7 @@
 
 msgid "the system source has its configuration stored on the file-system"
 msgstr ""
+"el sistema fuente tiene su configuración almacenada en el sistema de archivos"
 
 #, python-format
 msgid "the value \"%s\" is already used, use another one"
@@ -3966,13 +3992,13 @@
 msgstr "Esta Entidad es propiedad de"
 
 msgid "this parser doesn't use a mapping"
-msgstr ""
+msgstr "este analizador (parser) no utiliza mapeo"
 
 msgid "this resource does not exist"
 msgstr "Este recurso no existe"
 
 msgid "this source doesn't use a mapping"
-msgstr ""
+msgstr "esta fuente no utiliza mapeo"
 
 msgid "thursday"
 msgstr "Jueves"
@@ -4043,7 +4069,7 @@
 msgstr "Transición hacia este Estado"
 
 msgid "today"
-msgstr ""
+msgstr "hoy"
 
 msgid "todo_by"
 msgstr "Asignada a"
@@ -4052,11 +4078,11 @@
 msgstr "Cambiar valor"
 
 msgid "tr_count"
-msgstr ""
+msgstr "n° de transición"
 
 msgctxt "TrInfo"
 msgid "tr_count"
-msgstr ""
+msgstr "n° de transición"
 
 msgid "transaction undoed"
 msgstr "Transacciones Anuladas"
@@ -4109,6 +4135,10 @@
 msgid "type"
 msgstr "Tipo"
 
+msgctxt "CWSource"
+msgid "type"
+msgstr "tipo"
+
 msgctxt "Transition"
 msgid "type"
 msgstr "Tipo"
@@ -4125,7 +4155,7 @@
 msgstr "Escriba aquí su consulta en Sparql"
 
 msgid "type of the source"
-msgstr ""
+msgstr "tipo de la fuente"
 
 msgid "ui"
 msgstr "Interfaz Genérica"
@@ -4180,18 +4210,18 @@
 
 #, python-format
 msgid "unknown option(s): %s"
-msgstr ""
+msgstr "opcion(es) desconocida(s): %s"
 
 #, python-format
 msgid "unknown options %s"
-msgstr ""
+msgstr "opciones desconocidas: %s"
 
 #, python-format
 msgid "unknown property key %s"
 msgstr "Clave de Propiedad desconocida: %s"
 
 msgid "unknown source type"
-msgstr ""
+msgstr "tipo de fuente desconocida"
 
 msgid "unknown vocabulary:"
 msgstr "Vocabulario desconocido: "
@@ -4246,11 +4276,11 @@
 msgstr "URI"
 
 msgid "url"
-msgstr ""
+msgstr "url"
 
 msgctxt "CWSource"
 msgid "url"
-msgstr ""
+msgstr "url"
 
 msgid "use template languages"
 msgstr "Utilizar plantillas de lenguaje"
@@ -4318,10 +4348,10 @@
 msgstr "Usuarios"
 
 msgid "users and groups"
-msgstr ""
+msgstr "usuarios y grupos"
 
 msgid "users and groups management"
-msgstr ""
+msgstr "usuarios y grupos de administradores"
 
 msgid "users using this bookmark"
 msgstr "Usuarios utilizando este Favorito"
@@ -4398,13 +4428,13 @@
 
 #, python-format
 msgid "violates unique_together constraints (%s)"
-msgstr ""
+msgstr "viola el principio (o restricción) de singularidad (%s)"
 
 msgid "visible"
 msgstr "Visible"
 
 msgid "warning"
-msgstr ""
+msgstr "atención"
 
 msgid "we are not yet ready to handle this query"
 msgstr "Aún no podemos manejar este tipo de consulta Sparql"
@@ -4503,77 +4533,13 @@
 
 #, python-format
 msgid "you may want to specify something for %s"
-msgstr ""
+msgstr "usted desea quizás especificar algo para la relación %s"
 
 msgid "you should probably delete that property"
-msgstr "Debería probablamente suprimir esta propriedad"
+msgstr "probablamente debería  suprimir esta propriedad"
 
 #, python-format
 msgid "you should un-inline relation %s which is supported and may be crossed "
 msgstr ""
-
-#~ msgid "Attributes with non default permissions:"
-#~ msgstr "Atributos con permisos no estándares"
-
-#~ msgid "Entity types"
-#~ msgstr "Tipos de entidades"
-
-#~ msgid "Index"
-#~ msgstr "Índice"
-
-#~ msgid "Permissions for entity types"
-#~ msgstr "Permisos por tipos de entidad"
-
-#~ msgid "Permissions for relations"
-#~ msgstr "Permisos por las relaciones"
-
-#~ msgid "Relation types"
-#~ msgstr "Tipos de relación"
-
-#~ msgid "am/pm calendar (month)"
-#~ msgstr "calendario am/pm (mes)"
-
-#~ msgid "am/pm calendar (semester)"
-#~ msgstr "calendario am/pm (semestre)"
-
-#~ msgid "am/pm calendar (week)"
-#~ msgstr "calendario am/pm (semana)"
-
-#~ msgid "am/pm calendar (year)"
-#~ msgstr "calendario am/pm (año)"
-
-#~ msgid "application entities"
-#~ msgstr "Entidades de la aplicación"
-
-#~ msgid "calendar (month)"
-#~ msgstr "calendario (mensual)"
-
-#~ msgid "calendar (semester)"
-#~ msgstr "calendario (semestral)"
-
-#~ msgid "calendar (week)"
-#~ msgstr "calendario (semanal)"
-
-#~ msgid "calendar (year)"
-#~ msgstr "calendario (anual)"
-
-#~ msgid "create an index page"
-#~ msgstr "Crear una página de inicio"
-
-#~ msgid "edit the index page"
-#~ msgstr "Modificar la página de inicio"
-
-#~ msgid "schema entities"
-#~ msgstr "Entidades del esquema"
-
-#~ msgid "schema-security"
-#~ msgstr "Seguridad"
-
-#~ msgid "system entities"
-#~ msgstr "Entidades del sistema"
-
-#~ msgid "timestamp of the latest source synchronization."
-#~ msgstr "Fecha de la última sincronización de la fuente."
-
-#~ msgid "up"
-#~ msgstr "Arriba"
+"usted debe  quitar la puesta en línea de la relación %s que es aceptada y "
+"puede ser cruzada"
--- a/i18n/fr.po	Thu May 05 12:50:21 2011 +0200
+++ b/i18n/fr.po	Thu May 05 15:28:24 2011 +0200
@@ -1946,10 +1946,10 @@
 msgstr "mappé par"
 
 msgid "cw_source"
-msgstr "from data source"
+msgstr "source"
 
 msgid "cw_source_object"
-msgstr "entities"
+msgstr "entités"
 
 msgid "cwetype-box"
 msgstr "vue \"boîte\""
--- a/server/msplanner.py	Thu May 05 12:50:21 2011 +0200
+++ b/server/msplanner.py	Thu May 05 15:28:24 2011 +0200
@@ -483,7 +483,12 @@
             else:
                 var = vref.variable
                 for rel in var.stinfo['relations'] - var.stinfo['rhsrelations']:
-                    if rel.r_type in ('eid', 'name') and not rel.neged(strict=True):
+                    # skip neged eid relation since it's the kind of query
+                    # generated when clearing old value of '?1" relation,
+                    # cw_source included. See
+                    # unittest_ldapuser.test_copy_to_system_source
+                    if rel.r_type == 'name' or \
+                       (rel.r_type == 'eid' and not rel.neged(strict=True)):
                         if rel.r_type == 'eid':
                             slist = sourceeids
                         else:
--- a/server/repository.py	Thu May 05 12:50:21 2011 +0200
+++ b/server/repository.py	Thu May 05 15:28:24 2011 +0200
@@ -178,8 +178,8 @@
             # information (eg dump/restore/...)
             config._cubes = ()
             # only load hooks and entity classes in the registry
-            config.cube_appobject_path = set(('hooks', 'entities'))
-            config.cubicweb_appobject_path = set(('hooks', 'entities'))
+            config.__class__.cube_appobject_path = set(('hooks', 'entities'))
+            config.__class__.cubicweb_appobject_path = set(('hooks', 'entities'))
             self.set_schema(config.load_schema())
             config['connections-pool-size'] = 1
             # will be reinitialized later from cubes found in the database
--- a/server/test/unittest_msplanner.py	Thu May 05 12:50:21 2011 +0200
+++ b/server/test/unittest_msplanner.py	Thu May 05 15:28:24 2011 +0200
@@ -1991,12 +1991,12 @@
                     ])
 
     def test_source_specified_2_0(self):
-        self._test('Card X WHERE X cw_source S, NOT S eid 1',
-                   [('OneFetchStep', [('Any X WHERE X is Card',
-                                       [{'X': 'Card'}])],
-                     None, None,
-                     [self.cards],{}, [])
-                    ])
+        # self._test('Card X WHERE X cw_source S, NOT S eid 1',
+        #            [('OneFetchStep', [('Any X WHERE X is Card',
+        #                                [{'X': 'Card'}])],
+        #              None, None,
+        #              [self.cards],{}, [])
+        #             ])
         self._test('Card X WHERE NOT X cw_source S, S eid 1',
                    [('OneFetchStep', [('Any X WHERE X is Card',
                                        [{'X': 'Card'}])],
--- a/test/unittest_entity.py	Thu May 05 12:50:21 2011 +0200
+++ b/test/unittest_entity.py	Thu May 05 15:28:24 2011 +0200
@@ -564,6 +564,15 @@
         self.assertEqual(person.prenom, u'sylvain')
         self.assertEqual(person.nom, u'thénault')
 
+    def test_set_relations(self):
+        req = self.request()
+        person = req.create_entity('Personne', nom=u'chauvat', prenom=u'nicolas')
+        note = req.create_entity('Note', type=u'x')
+        note.set_relations(ecrit_par=person)
+        note = req.create_entity('Note', type=u'y')
+        note.set_relations(ecrit_par=person.eid)
+        self.assertEqual(len(person.reverse_ecrit_par), 2)
+
     def test_metainformation_and_external_absolute_url(self):
         req = self.request()
         note = req.create_entity('Note', type=u'z')
--- a/web/views/baseviews.py	Thu May 05 12:50:21 2011 +0200
+++ b/web/views/baseviews.py	Thu May 05 15:28:24 2011 +0200
@@ -204,11 +204,11 @@
             if entity.creation_date:
                 self.w(u' <span>%s</span> ' % _('by'))
             else:
-                self.w(u' <span>%s</span> ' % _('created by'))
+                self.w(u' <span>%s</span> ' % _('created_by'))
             self.w(u'<span class="value">%s</span>' % entity.creator.name())
         meta = entity.cw_metainformation()
         if meta['source']['uri'] != 'system':
-            self.w(u' (<span>%s</span>' % _('from source'))
+            self.w(u' (<span>%s</span>' % _('cw_source'))
             self.w(u' <span class="value">%s</span>)' % meta['source']['uri'])
         self.w(u'</div>')