# HG changeset patch # User Sylvain Thénault # Date 1311790665 -7200 # Node ID d313666c171e9e613beb7f71a65fe284de96817b # Parent 73cadb5d0097c26554a547e8c8d492e04e216a9f# Parent 4df02855f4b31cd77b038ca6c7c9900785b256a7 backport stable diff -r 4df02855f4b3 -r d313666c171e entity.py --- a/entity.py Wed Jul 27 20:15:44 2011 +0200 +++ b/entity.py Wed Jul 27 20:17:45 2011 +0200 @@ -96,11 +96,12 @@ If None is specified, the first non-meta attribute will be used - :type skip_copy_for: list - :cvar skip_copy_for: a list of relations that should be skipped when copying - this kind of entity. Note that some relations such - as composite relations or relations that have '?1' as object - cardinality are always skipped. + :type cw_skip_copy_for: list + :cvar cw_skip_copy_for: a list of couples (rtype, role) for each relation + that should be skipped when copying + this kind of entity. Note that some relations such + as composite relations or relations that have '?1' as object + cardinality are always skipped. """ __registry__ = 'etypes' __select__ = yes() @@ -108,7 +109,8 @@ # class attributes that must be set in class definition rest_attr = None fetch_attrs = None - skip_copy_for = ('in_state',) # XXX turn into a set + skip_copy_for = () # bw compat (< 3.14), use cw_skip_copy_for instead + cw_skip_copy_for = [('in_state', 'subject')] # class attributes set automatically at registration time e_schema = None @@ -542,13 +544,22 @@ """ assert self.has_eid() execute = self._cw.execute + skip_copy_for = {'subject': set(), 'object': set()} + for rtype in self.skip_copy_for: + skip_copy_for['subject'].add(rtype) + warn('[3.14] skip_copy_for on entity classes (%s) is deprecated, ' + 'use cw_skip_for instead with list of couples (rtype, role)' % self.__regid__, + DeprecationWarning) + for rtype, role in self.cw_skip_copy_for: + assert role in ('subject', 'object'), role + skip_copy_for[role].add(rtype) for rschema in self.e_schema.subject_relations(): if rschema.final or rschema.meta: continue # skip already defined relations if getattr(self, rschema.type): continue - if rschema.type in self.skip_copy_for: + if rschema.type in skip_copy_for['subject']: continue # skip composite relation rdef = self.e_schema.rdef(rschema) @@ -568,6 +579,8 @@ # skip already defined relations if self.related(rschema.type, 'object'): continue + if rschema.type in skip_copy_for['object']: + continue rdef = self.e_schema.rdef(rschema, 'object') # skip composite relation if rdef.composite: diff -r 4df02855f4b3 -r d313666c171e web/test/unittest_views_basecontrollers.py --- a/web/test/unittest_views_basecontrollers.py Wed Jul 27 20:15:44 2011 +0200 +++ b/web/test/unittest_views_basecontrollers.py Wed Jul 27 20:17:45 2011 +0200 @@ -365,6 +365,43 @@ self.assertEqual(path, 'view') self.assertIn('_cwmsgid', params) + def test_simple_copy(self): + req = self.request() + blog = req.create_entity('Blog', title=u'my-blog') + blogentry = req.create_entity('BlogEntry', title=u'entry1', + content=u'content1', entry_of=blog) + req = self.request() + req.form = {'__maineid' : 'X', 'eid': 'X', + '__cloned_eid:X': blogentry.eid, '__type:X': 'BlogEntry', + '_cw_entity_fields:X': 'title-subject,content-subject', + 'title-subject:X': u'entry1-copy', + 'content-subject:X': u'content1', + } + self.expect_redirect_publish(req, 'edit') + blogentry2 = req.find_one_entity('BlogEntry', title=u'entry1-copy') + self.assertEqual(blogentry2.entry_of[0].eid, blog.eid) + + def test_skip_copy_for(self): + req = self.request() + blog = req.create_entity('Blog', title=u'my-blog') + blogentry = req.create_entity('BlogEntry', title=u'entry1', + content=u'content1', entry_of=blog) + blogentry.__class__.cw_skip_copy_for = [('entry_of', 'subject')] + try: + req = self.request() + req.form = {'__maineid' : 'X', 'eid': 'X', + '__cloned_eid:X': blogentry.eid, '__type:X': 'BlogEntry', + '_cw_entity_fields:X': 'title-subject,content-subject', + 'title-subject:X': u'entry1-copy', + 'content-subject:X': u'content1', + } + self.expect_redirect_publish(req, 'edit') + blogentry2 = req.find_one_entity('BlogEntry', title=u'entry1-copy') + # entry_of should not be copied + self.assertEqual(len(blogentry2.entry_of), 0) + finally: + blogentry.__class__.cw_skip_copy_for = [] + def test_nonregr_eetype_etype_editing(self): """non-regression test checking that a manager user can edit a CWEType entity """