merge stable
authorSylvain Thénault <sylvain.thenault@logilab.fr>
Fri, 03 Jul 2009 10:27:13 +0200
branchstable
changeset 2253 0727550c64e2
parent 2252 dd9758cb77e1 (diff)
parent 2249 dbf282082017 (current diff)
child 2254 f632b06058c4
child 2260 080167dad19e
merge
--- a/devtools/apptest.py	Thu Jul 02 17:13:52 2009 +0200
+++ b/devtools/apptest.py	Fri Jul 03 10:27:13 2009 +0200
@@ -462,14 +462,13 @@
         self.__close = repo.close
         self.cnxid = self.cnx.sessionid
         self.session = repo._sessions[self.cnxid]
-        # XXX copy schema since hooks may alter it and it may be not fully
-        #     cleaned (missing some schema synchronization support)
-        try:
-            origschema = repo.__schema
-        except AttributeError:
-            origschema = repo.schema
-            repo.__schema = origschema
         if self.copy_schema:
+            # XXX copy schema since hooks may alter it and it may be not fully
+            #     cleaned (missing some schema synchronization support)
+            try:
+                origschema = repo.__schema
+            except AttributeError:
+                repo.__schema = origschema = repo.schema
             repo.schema = deepcopy(origschema)
             repo.set_schema(repo.schema) # reset hooks
             repo.vreg.update_schema(repo.schema)
--- a/schema.py	Thu Jul 02 17:13:52 2009 +0200
+++ b/schema.py	Fri Jul 03 10:27:13 2009 +0200
@@ -356,6 +356,7 @@
         """rql expression factory"""
         return ERQLExpression(expression, mainvars, eid)
 
+
 class CubicWebRelationSchema(RelationSchema):
     RelationSchema._RPROPERTIES['eid'] = None
     _perms_checked = False
--- a/server/checkintegrity.py	Thu Jul 02 17:13:52 2009 +0200
+++ b/server/checkintegrity.py	Fri Jul 03 10:27:13 2009 +0200
@@ -71,6 +71,14 @@
                                        uniquecstrcheck_before_modification)
     from cubicweb.server.repository import FTIndexEntityOp
     repo = session.repo
+    cursor = session.pool['system']
+    if not repo.system_source.indexer.has_fti_table(cursor):
+        from indexer import get_indexer
+        print 'no text index table'
+        indexer = get_indexer(repo.system_source.dbdriver)
+        # XXX indexer.init_fti(cursor) once index 0.7 is out
+        indexer.init_extensions(cursor)
+        cursor.execute(indexer.sql_init_fti())
     repo.hm.unregister_hook(setmtime_before_update_entity,
                             'before_update_entity', '')
     repo.hm.unregister_hook(uniquecstrcheck_before_modification,
--- a/server/schemahooks.py	Thu Jul 02 17:13:52 2009 +0200
+++ b/server/schemahooks.py	Fri Jul 03 10:27:13 2009 +0200
@@ -247,8 +247,7 @@
     """actually add the entity type to the application's schema"""
     eid = None # make pylint happy
     def commit_event(self):
-        eschema = self.schema.add_entity_type(self.kobj)
-        eschema.eid = self.eid
+        self.schema.add_entity_type(self.kobj)
 
 def before_add_eetype(session, entity):
     """before adding a CWEType entity:
@@ -299,7 +298,8 @@
     # register operation to modify the schema on commit
     # this have to be done before adding other relations definitions
     # or permission settings
-    AddCWETypeOp(session, etype, eid=entity.eid)
+    etype.eid = entity.eid
+    AddCWETypeOp(session, etype)
     # add meta creation_date, modification_date and owned_by relations
     for rql, kwargs in relrqls:
         session.execute(rql, kwargs)
@@ -311,7 +311,6 @@
     def commit_event(self):
         rschema = self.schema.add_relation_type(self.kobj)
         rschema.set_default_groups()
-        rschema.eid = self.eid
 
 def before_add_ertype(session, entity):
     """before adding a CWRType entity:
@@ -331,12 +330,13 @@
       schema on commit
     We don't know yeat this point if a table is necessary
     """
-    AddCWRTypeOp(session, RelationType(name=entity['name'],
-                                      description=entity.get('description'),
-                                      meta=entity.get('meta', False),
-                                      inlined=entity.get('inlined', False),
-                                      symetric=entity.get('symetric', False)),
-                eid=entity.eid)
+    rtype = RelationType(name=entity['name'],
+                         description=entity.get('description'),
+                         meta=entity.get('meta', False),
+                         inlined=entity.get('inlined', False),
+                         symetric=entity.get('symetric', False))
+    rtype.eid = entity.eid
+    AddCWRTypeOp(session, rtype)
 
 
 class AddErdefOp(EarlySchemaOperation):
--- a/server/test/unittest_hooks.py	Thu Jul 02 17:13:52 2009 +0200
+++ b/server/test/unittest_hooks.py	Fri Jul 03 10:27:13 2009 +0200
@@ -242,7 +242,7 @@
 
 
 class SchemaModificationHooksTC(RepositoryBasedTC):
-    copy_schema = True
+    #copy_schema = True
 
     def setUp(self):
         if not hasattr(self, '_repo'):
@@ -471,6 +471,10 @@
         self.commit()
         # should not be able anymore to add personne without prenom
         self.assertRaises(ValidationError, self.execute, 'INSERT Personne X: X nom "toto"')
+        self.execute('SET DEF cardinality "?1" '
+                     'WHERE DEF relation_type RT, DEF from_entity E,'
+                     'RT name "prenom", E name "Personne"')
+        self.commit()
 
 
 class WorkflowHooksTC(RepositoryBasedTC):
--- a/server/test/unittest_migractions.py	Thu Jul 02 17:13:52 2009 +0200
+++ b/server/test/unittest_migractions.py	Fri Jul 03 10:27:13 2009 +0200
@@ -23,7 +23,7 @@
 
 
 class MigrationCommandsTC(RepositoryBasedTC):
-    copy_schema = True
+    copy_schema = False
 
     def setUp(self):
         if not hasattr(self, '_repo'):
@@ -146,7 +146,7 @@
         for cstr in eschema.constraints('name'):
             self.failUnless(hasattr(cstr, 'eid'))
 
-    def test_drop_entity_type(self):
+    def test_add_drop_entity_type(self):
         self.mh.cmd_add_entity_type('Folder2')
         todoeid = self.mh.cmd_add_state(u'todo', 'Folder2', initial=True)
         doneeid = self.mh.cmd_add_state(u'done', 'Folder2')
@@ -161,7 +161,7 @@
         self.failIf(self.execute('State X WHERE NOT X state_of ET'))
         self.failIf(self.execute('Transition X WHERE NOT X transition_of ET'))
 
-    def test_add_relation_type(self):
+    def test_add_drop_relation_type(self):
         self.mh.cmd_add_entity_type('Folder2', auto=False)
         self.mh.cmd_add_relation_type('filed_under2')
         self.failUnless('filed_under2' in self.schema)
@@ -169,52 +169,40 @@
                           ['Affaire', 'Card', 'Division', 'Email', 'EmailThread', 'File',
                            'Folder2', 'Image', 'Note', 'Personne', 'Societe', 'SubDivision'])
         self.assertEquals(self.schema['filed_under2'].objects(), ('Folder2',))
-
-
-    def test_drop_relation_type(self):
-        self.mh.cmd_add_entity_type('Folder2', auto=False)
-        self.mh.cmd_add_relation_type('filed_under2')
-        self.failUnless('filed_under2' in self.schema)
         self.mh.cmd_drop_relation_type('filed_under2')
         self.failIf('filed_under2' in self.schema)
 
-    def test_add_relation_definition(self):
-        self.mh.cmd_add_relation_definition('Societe', 'in_state', 'State')
-        self.assertEquals(sorted(str(x) for x in self.schema['in_state'].subjects()),
-                          ['Affaire', 'CWUser', 'Division', 'Note', 'Societe', 'SubDivision'])
-        self.assertEquals(self.schema['in_state'].objects(), ('State',))
-
     def test_add_relation_definition_nortype(self):
         self.mh.cmd_add_relation_definition('Personne', 'concerne2', 'Affaire')
         self.assertEquals(self.schema['concerne2'].subjects(),
                           ('Personne',))
         self.assertEquals(self.schema['concerne2'].objects(), ('Affaire',))
+        self.mh.cmd_drop_relation_definition('Personne', 'concerne2', 'Affaire')
+        self.failIf('concerne2' in self.schema)
 
-    def test_drop_relation_definition1(self):
-        self.failUnless('concerne' in self.schema)
+    def test_drop_relation_definition_existant_rtype(self):
         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].subjects()), ['Affaire', 'Personne'])
         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].objects()), ['Affaire', 'Division', 'Note', 'Societe', 'SubDivision'])
         self.mh.cmd_drop_relation_definition('Personne', 'concerne', 'Affaire')
         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].subjects()), ['Affaire'])
         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].objects()), ['Division', 'Note', 'Societe', 'SubDivision'])
+        self.mh.cmd_add_relation_definition('Personne', 'concerne', 'Affaire')
+        self.assertEquals(sorted(str(e) for e in self.schema['concerne'].subjects()), ['Affaire', 'Personne'])
+        self.assertEquals(sorted(str(e) for e in self.schema['concerne'].objects()), ['Affaire', 'Division', 'Note', 'Societe', 'SubDivision'])
+        # trick: overwrite self.maxeid to avoid deletion of just reintroduced types
+        self.maxeid = self.execute('Any MAX(X)')[0][0]
 
     def test_drop_relation_definition_with_specialization(self):
-        self.failUnless('concerne' in self.schema)
         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].subjects()), ['Affaire', 'Personne'])
         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].objects()), ['Affaire', 'Division', 'Note', 'Societe', 'SubDivision'])
         self.mh.cmd_drop_relation_definition('Affaire', 'concerne', 'Societe')
-        self.mh.cmd_drop_relation_definition('None', 'concerne', 'Societe')
         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].subjects()), ['Affaire', 'Personne'])
         self.assertEquals(sorted(str(e) for e in self.schema['concerne'].objects()), ['Affaire', 'Note'])
-
-    def test_drop_relation_definition2(self):
-        self.failUnless('evaluee' in self.schema)
-        self.mh.cmd_drop_relation_definition('Personne', 'evaluee', 'Note')
-        self.failUnless('evaluee' in self.schema)
-        self.assertEquals(sorted(self.schema['evaluee'].subjects()),
-                          ['CWUser', 'Division', 'Societe', 'SubDivision'])
-        self.assertEquals(sorted(self.schema['evaluee'].objects()),
-                          ['Note'])
+        self.mh.cmd_add_relation_definition('Affaire', 'concerne', 'Societe')
+        self.assertEquals(sorted(str(e) for e in self.schema['concerne'].subjects()), ['Affaire', 'Personne'])
+        self.assertEquals(sorted(str(e) for e in self.schema['concerne'].objects()), ['Affaire', 'Division', 'Note', 'Societe', 'SubDivision'])
+        # trick: overwrite self.maxeid to avoid deletion of just reintroduced types
+        self.maxeid = self.execute('Any MAX(X)')[0][0]
 
     def test_rename_relation(self):
         self.skip('implement me')
@@ -455,7 +443,6 @@
         ex = self.assertRaises(ConfigurationError, self.mh.cmd_remove_cube, 'file')
         self.assertEquals(str(ex), "can't remove cube file, used as a dependency")
 
-
     def test_set_state(self):
         user = self.session.user
         self.mh.set_state(user.eid, 'deactivated')
--- a/web/data/cubicweb.edition.js	Thu Jul 02 17:13:52 2009 +0200
+++ b/web/data/cubicweb.edition.js	Fri Jul 03 10:27:13 2009 +0200
@@ -305,8 +305,9 @@
 }
 
 function _clearPreviousErrors(formid) {
+    jQuery('#' + formid + 'ErrorMessage').remove();
     jQuery('#' + formid + ' span.error').remove();
-    jQuery('div.errorMessage').remove();
+    jQuery('#' + formid + ' .error').removeClass('error');
 }
 
 function _displayValidationerrors(formid, eid, errors) {
@@ -335,7 +336,7 @@
 	    var innernode = UL(null, map(LI, globalerrors));
 	}
 	// insert DIV and innernode before the form
-	var div = DIV({'class' : "errorMessage"});
+	var div = DIV({'class' : "errorMessage", 'id': formid + 'ErrorMessage'});
 	div.appendChild(innernode);
 	jQuery('#' + formid).before(div);
     }
--- a/web/views/editforms.py	Thu Jul 02 17:13:52 2009 +0200
+++ b/web/views/editforms.py	Fri Jul 03 10:27:13 2009 +0200
@@ -368,8 +368,13 @@
         divid = '%s-%s-%s' % (peid, rtype, entity.eid)
         title = self.schema.rschema(rtype).display_name(self.req, role)
         removejs = self.removejs % (peid, rtype,entity.eid)
+        countkey = '%s_count' % rtype
+        try:
+            self.req.data[countkey] += 1
+        except:
+            self.req.data[countkey] = 1
         self.w(form.form_render(divid=divid, title=title, removejs=removejs,
-                                **kwargs))
+                                counter=self.req.data[countkey], **kwargs))
 
     def add_hiddens(self, form, entity, peid, rtype, role):
         # to ease overriding (see cubes.vcsfile.views.forms for instance)
--- a/web/views/formrenderers.py	Thu Jul 02 17:13:52 2009 +0200
+++ b/web/views/formrenderers.py	Fri Jul 03 10:27:13 2009 +0200
@@ -500,7 +500,7 @@
         w(u'<div class="iformBody">')
         values['removemsg'] = self.req.__('remove this %s' % form.edited_entity.e_schema)
         w(u'<div class="iformTitle"><span>%(title)s</span> '
-          '#<span class="icounter">1</span> '
+          '#<span class="icounter">%(counter)s</span> '
           '[<a href="javascript: %(removejs)s;noop();">%(removemsg)s</a>]</div>'
           % values)
         # cleanup values