[doc/book] refresh a bit the edit controller section
# -*- coding: utf-8 -*-# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr## This file is part of CubicWeb.## CubicWeb is free software: you can redistribute it and/or modify it under the# terms of the GNU Lesser General Public License as published by the Free# Software Foundation, either version 2.1 of the License, or (at your option)# any later version.## CubicWeb is distributed in the hope that it will be useful, but WITHOUT# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more# details.## You should have received a copy of the GNU Lesser General Public License along# with CubicWeb. If not, see <http://www.gnu.org/licenses/>."""XXX rename, split, reorganize this"""fromlogilab.common.testlibimportunittest_mainfromcubicweb.devtools.testlibimportCubicWebTCfromcubicwebimportCW_SOFTWARE_ROOTasBASE,Binary,UnknownPropertyfromcubicweb.selectorsimport(match_user_groups,implements,specified_etype_implements,rql_condition,traced_selection)fromcubicweb.webimportNoSelectableObjectfromcubicweb.web.actionimportActionfromcubicweb.web.viewsimport(primary,baseviews,tableview,editforms,calendar,management,embedding,actions,startup,cwuser,schema,xbel,vcard,owl,treeview,idownloadable,wdoc,debug,cwproperties,workflow,xmlrss,csvexport)fromcubes.folderimportviewsasfolderviewsUSERACTIONS=[actions.UserPreferencesAction,actions.UserInfoAction,actions.LogoutAction]SITEACTIONS=[actions.SiteConfigurationAction,actions.ManageAction,schema.ViewSchemaAction,actions.SiteInfoAction]FOOTERACTIONS=[wdoc.HelpAction,wdoc.ChangeLogAction,wdoc.AboutAction,actions.PoweredByAction]classViewSelectorTC(CubicWebTC):defsetup_database(self):req=self.request()req.create_entity('BlogEntry',title=u"une news !",content=u"cubicweb c'est beau")req.create_entity('Bookmark',title=u"un signet !",path=u"view?vid=index")req.create_entity('EmailAddress',address=u"devel@logilab.fr",alias=u'devel')req.create_entity('Tag',name=u'x')classVRegistryTC(ViewSelectorTC):"""test the view selector"""def_test_registered(self,registry,content):try:expected=getattr(self,'all_%s'%registry)exceptAttributeError:returnifregistry=='hooks':self.assertEquals(len(content),expected,content)returntry:self.assertSetEqual(content.keys(),expected)except:printregistry,sorted(expected),sorted(content.keys())print'no more',[vforvinexpectedifnotvincontent.keys()]print'missing',[vforvincontent.keys()ifnotvinexpected]raisedefsetUp(self):super(VRegistryTC,self).setUp()assertself.vreg['views']['propertiesform']deftest_possible_views_none_rset(self):req=self.request()self.assertListEqual(self.pviews(req,None),[('changelog',wdoc.ChangeLogView),('gc',debug.GCView),('index',startup.IndexView),('info',debug.ProcessInformationView),('manage',startup.ManageView),('owl',owl.OWLView),('propertiesform',cwproperties.CWPropertiesForm),('registry',debug.RegistryView),('schema',schema.SchemaView),('systempropertiesform',cwproperties.SystemCWPropertiesForm),('tree',folderviews.FolderTreeView),])deftest_possible_views_noresult(self):req=self.request()rset=req.execute('Any X WHERE X eid 999999')self.assertListEqual(self.pviews(req,rset),[])deftest_possible_views_one_egroup(self):req=self.request()rset=req.execute('CWGroup X WHERE X name "managers"')self.assertListEqual(self.pviews(req,rset),[('csvexport',csvexport.CSVRsetView),('ecsvexport',csvexport.CSVEntityView),('editable-table',tableview.EditableTableView),('filetree',treeview.FileTreeView),('list',baseviews.ListView),('oneline',baseviews.OneLineView),('owlabox',owl.OWLABOXView),('primary',cwuser.CWGroupPrimaryView),('rsetxml',xmlrss.XMLRsetView),('rss',xmlrss.RSSView),('sameetypelist',baseviews.SameETypeListView),('secondary',baseviews.SecondaryView),('security',management.SecurityManagementView),('table',tableview.TableView),('text',baseviews.TextView),('treeview',treeview.TreeView),('xbel',xbel.XbelView),('xml',xmlrss.XMLView),])deftest_possible_views_multiple_egroups(self):req=self.request()rset=req.execute('CWGroup X')self.assertListEqual(self.pviews(req,rset),[('csvexport',csvexport.CSVRsetView),('ecsvexport',csvexport.CSVEntityView),('editable-table',tableview.EditableTableView),('filetree',treeview.FileTreeView),('list',baseviews.ListView),('oneline',baseviews.OneLineView),('owlabox',owl.OWLABOXView),('primary',cwuser.CWGroupPrimaryView),('rsetxml',xmlrss.XMLRsetView),('rss',xmlrss.RSSView),('sameetypelist',baseviews.SameETypeListView),('secondary',baseviews.SecondaryView),('security',management.SecurityManagementView),('table',tableview.TableView),('text',baseviews.TextView),('treeview',treeview.TreeView),('xbel',xbel.XbelView),('xml',xmlrss.XMLView),])deftest_propertiesform_admin(self):assertself.vreg['views']['propertiesform']req1=self.request()req2=self.request()rset1=req1.execute('CWUser X WHERE X login "admin"')rset2=req2.execute('CWUser X WHERE X login "anon"')self.failUnless(self.vreg['views'].select('propertiesform',req1,rset=None))self.failUnless(self.vreg['views'].select('propertiesform',req1,rset=rset1))self.failUnless(self.vreg['views'].select('propertiesform',req2,rset=rset2))deftest_propertiesform_anon(self):self.login('anon')req1=self.request()req2=self.request()rset1=req1.execute('CWUser X WHERE X login "admin"')rset2=req2.execute('CWUser X WHERE X login "anon"')self.assertRaises(NoSelectableObject,self.vreg['views'].select,'propertiesform',req1,rset=None)self.assertRaises(NoSelectableObject,self.vreg['views'].select,'propertiesform',req1,rset=rset1)self.assertRaises(NoSelectableObject,self.vreg['views'].select,'propertiesform',req1,rset=rset2)deftest_propertiesform_jdoe(self):self.create_user('jdoe')self.login('jdoe')req1=self.request()req2=self.request()rset1=req1.execute('CWUser X WHERE X login "admin"')rset2=req2.execute('CWUser X WHERE X login "jdoe"')self.failUnless(self.vreg['views'].select('propertiesform',req1,rset=None))self.assertRaises(NoSelectableObject,self.vreg['views'].select,'propertiesform',req1,rset=rset1)self.failUnless(self.vreg['views'].select('propertiesform',req2,rset=rset2))deftest_possible_views_multiple_different_types(self):req=self.request()rset=req.execute('Any X')self.assertListEqual(self.pviews(req,rset),[('csvexport',csvexport.CSVRsetView),('ecsvexport',csvexport.CSVEntityView),('editable-table',tableview.EditableTableView),('filetree',treeview.FileTreeView),('list',baseviews.ListView),('oneline',baseviews.OneLineView),('owlabox',owl.OWLABOXView),('primary',primary.PrimaryView),('rsetxml',xmlrss.XMLRsetView),('rss',xmlrss.RSSView),('secondary',baseviews.SecondaryView),('security',management.SecurityManagementView),('table',tableview.TableView),('text',baseviews.TextView),('treeview',treeview.TreeView),('xbel',xbel.XbelView),('xml',xmlrss.XMLView),])deftest_possible_views_any_rset(self):req=self.request()rset=req.execute('Any N, X WHERE X in_group Y, Y name N')self.assertListEqual(self.pviews(req,rset),[('csvexport',csvexport.CSVRsetView),('editable-table',tableview.EditableTableView),('rsetxml',xmlrss.XMLRsetView),('table',tableview.TableView),])deftest_possible_views_multiple_eusers(self):req=self.request()rset=req.execute('CWUser X')self.assertListEqual(self.pviews(req,rset),[('csvexport',csvexport.CSVRsetView),('ecsvexport',csvexport.CSVEntityView),('editable-table',tableview.EditableTableView),('filetree',treeview.FileTreeView),('foaf',cwuser.FoafView),('list',baseviews.ListView),('oneline',baseviews.OneLineView),('owlabox',owl.OWLABOXView),('primary',primary.PrimaryView),('rsetxml',xmlrss.XMLRsetView),('rss',xmlrss.RSSView),('sameetypelist',baseviews.SameETypeListView),('secondary',baseviews.SecondaryView),('security',management.SecurityManagementView),('table',tableview.TableView),('text',baseviews.TextView),('treeview',treeview.TreeView),('vcard',vcard.VCardCWUserView),('xbel',xbel.XbelView),('xml',xmlrss.XMLView),])deftest_possible_actions_none_rset(self):req=self.request()self.assertDictEqual(self.pactionsdict(req,None,skipcategories=()),{'useractions':USERACTIONS,'siteactions':SITEACTIONS,'footer':FOOTERACTIONS,})deftest_possible_actions_no_entity(self):req=self.request()rset=req.execute('Any X WHERE X eid 999999')self.assertDictEqual(self.pactionsdict(req,rset,skipcategories=()),{'useractions':USERACTIONS,'siteactions':SITEACTIONS,'footer':FOOTERACTIONS,})deftest_possible_actions_same_type_entities(self):req=self.request()rset=req.execute('CWGroup X')self.assertDictEqual(self.pactionsdict(req,rset,skipcategories=()),{'useractions':USERACTIONS,'siteactions':SITEACTIONS,'footer':FOOTERACTIONS,'mainactions':[actions.MultipleEditAction],'moreactions':[actions.DeleteAction,actions.AddNewAction],})deftest_possible_actions_different_types_entities(self):req=self.request()rset=req.execute('Any X')self.assertDictEqual(self.pactionsdict(req,rset,skipcategories=()),{'useractions':USERACTIONS,'siteactions':SITEACTIONS,'footer':FOOTERACTIONS,'moreactions':[actions.DeleteAction],})deftest_possible_actions_final_entities(self):req=self.request()rset=req.execute('Any N, X WHERE X in_group Y, Y name N')self.assertDictEqual(self.pactionsdict(req,rset,skipcategories=()),{'useractions':USERACTIONS,'siteactions':SITEACTIONS,'footer':FOOTERACTIONS,})deftest_possible_actions_eetype_cwuser_entity(self):req=self.request()rset=req.execute('CWEType X WHERE X name "CWUser"')self.assertDictEqual(self.pactionsdict(req,rset,skipcategories=()),{'useractions':USERACTIONS,'siteactions':SITEACTIONS,'footer':FOOTERACTIONS,'mainactions':[actions.ModifyAction,actions.ViewSameCWEType],'moreactions':[actions.ManagePermissionsAction,actions.AddRelatedActions,actions.DeleteAction,actions.CopyAction,],})deftest_select_creation_form(self):rset=Nonereq=self.request()# creation formreq.form['etype']='CWGroup'self.assertIsInstance(self.vreg['views'].select('creation',req,rset=rset),editforms.CreationFormView)delreq.form['etype']# custom creation formclassCWUserCreationForm(editforms.CreationFormView):__select__=specified_etype_implements('CWUser')self.vreg._loadedmods[__name__]={}self.vreg.register(CWUserCreationForm)req.form['etype']='CWUser'self.assertIsInstance(self.vreg['views'].select('creation',req,rset=rset),CWUserCreationForm)deftest_select_view(self):# no entityrset=Nonereq=self.request()self.assertIsInstance(self.vreg['views'].select('index',req,rset=rset),startup.IndexView)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'primary',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'table',req,rset=rset)# no entityreq=self.request()rset=req.execute('Any X WHERE X eid 999999')self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'index',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'creation',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'primary',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'table',req,rset=rset)# one entityreq=self.request()rset=req.execute('CWGroup X WHERE X name "managers"')self.assertIsInstance(self.vreg['views'].select('primary',req,rset=rset),primary.PrimaryView)self.assertIsInstance(self.vreg['views'].select('list',req,rset=rset),baseviews.ListView)self.assertIsInstance(self.vreg['views'].select('edition',req,rset=rset),editforms.EditionFormView)self.assertIsInstance(self.vreg['views'].select('table',req,rset=rset),tableview.TableView)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'creation',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'index',req,rset=rset)# list of entities of the same typereq=self.request()rset=req.execute('CWGroup X')self.assertIsInstance(self.vreg['views'].select('primary',req,rset=rset),primary.PrimaryView)self.assertIsInstance(self.vreg['views'].select('list',req,rset=rset),baseviews.ListView)self.assertIsInstance(self.vreg['views'].select('table',req,rset=rset),tableview.TableView)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'creation',req,rset=rset)# list of entities of different typesreq=self.request()rset=req.execute('Any X')self.assertIsInstance(self.vreg['views'].select('primary',req,rset=rset),primary.PrimaryView)self.assertIsInstance(self.vreg['views'].select('list',req,rset=rset),baseviews.ListView)self.assertIsInstance(self.vreg['views'].select('table',req,rset=rset),tableview.TableView)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'creation',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'index',req,rset=rset)# whateverreq=self.request()rset=req.execute('Any N, X WHERE X in_group Y, Y name N')self.assertIsInstance(self.vreg['views'].select('table',req,rset=rset),tableview.TableView)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'index',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'creation',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'primary',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'list',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'edition',req,rset=rset)# mixed queryreq=self.request()rset=req.execute('Any U,G WHERE U is CWUser, G is CWGroup')self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'edition',req,rset=rset)self.failUnlessRaises(NoSelectableObject,self.vreg['views'].select,'creation',req,rset=rset)self.assertIsInstance(self.vreg['views'].select('table',req,rset=rset),tableview.TableView)deftest_interface_selector(self):image=self.request().create_entity('Image',data_name=u'bim.png',data=Binary('bim'))# image primary view priorityreq=self.request()rset=req.execute('Image X WHERE X data_name "bim.png"')self.assertIsInstance(self.vreg['views'].select('primary',req,rset=rset),idownloadable.IDownloadablePrimaryView)deftest_score_entity_selector(self):image=self.request().create_entity('Image',data_name=u'bim.png',data=Binary('bim'))# image primary view priorityreq=self.request()rset=req.execute('Image X WHERE X data_name "bim.png"')self.assertIsInstance(self.vreg['views'].select('image',req,rset=rset),idownloadable.ImageView)fileobj=self.request().create_entity('File',data_name=u'bim.txt',data=Binary('bim'))# image primary view priorityreq=self.request()rset=req.execute('File X WHERE X data_name "bim.txt"')self.assertRaises(NoSelectableObject,self.vreg['views'].select,'image',req,rset=rset)def_test_view(self,vid,rql,args):ifrqlisNone:rset=Nonereq=self.request()else:req=self.request()rset=req.execute(rql)try:obj=self.vreg['views'].select(vid,req,rset=rset,**args)returnobj.render(**args)except:printvid,rset,argsraisedeftest_form(self):forvid,rql,argsin(#('creation', 'Any X WHERE X eid 999999', {}),('edition','CWGroup X WHERE X name "managers"',{}),('copy','CWGroup X WHERE X name "managers"',{}),('muledit','CWGroup X',{}),#('muledit', 'Any X', {}),):self._test_view(vid,rql,args)deftest_properties(self):self.assertEquals(sorted(kforkinself.vreg['propertydefs'].keys()ifk.startswith('boxes.edit_box')),['boxes.edit_box.context','boxes.edit_box.order','boxes.edit_box.visible'])self.assertEquals([kforkinself.vreg['propertyvalues'].keys()ifnotk.startswith('system.version')],[])self.assertEquals(self.vreg.property_value('boxes.edit_box.visible'),True)self.assertEquals(self.vreg.property_value('boxes.edit_box.order'),2)self.assertEquals(self.vreg.property_value('boxes.possible_views_box.visible'),False)self.assertEquals(self.vreg.property_value('boxes.possible_views_box.order'),10)self.assertRaises(UnknownProperty,self.vreg.property_value,'boxes.actions_box')classCWETypeRQLAction(Action):__regid__='testaction'__select__=implements('CWEType')&rql_condition('X name "CWEType"')title='bla'classRQLActionTC(ViewSelectorTC):defsetUp(self):super(RQLActionTC,self).setUp()self.vreg._loadedmods[__name__]={}self.vreg.register(CWETypeRQLAction)actionsreg=self.vreg['actions']actionsreg['testaction'][0].__registered__(actionsreg)deftearDown(self):super(RQLActionTC,self).tearDown()delself.vreg['actions']['testaction']deftest(self):req=self.request()rset=req.execute('CWEType X WHERE X name "CWEType"')self.assertDictEqual(self.pactionsdict(req,rset,skipcategories=()),{'useractions':USERACTIONS,'siteactions':SITEACTIONS,'footer':FOOTERACTIONS,'mainactions':[actions.ModifyAction,actions.ViewSameCWEType],'moreactions':[actions.ManagePermissionsAction,actions.AddRelatedActions,actions.DeleteAction,actions.CopyAction,CWETypeRQLAction,],})req=self.request()rset=req.execute('CWEType X WHERE X name "CWRType"')self.assertDictEqual(self.pactionsdict(req,rset,skipcategories=()),{'useractions':USERACTIONS,'siteactions':SITEACTIONS,'footer':FOOTERACTIONS,'mainactions':[actions.ModifyAction,actions.ViewSameCWEType],'moreactions':[actions.ManagePermissionsAction,actions.AddRelatedActions,actions.DeleteAction,actions.CopyAction,]})if__name__=='__main__':unittest_main()