# HG changeset patch # User Sylvain Thénault # Date 1248354445 -7200 # Node ID 16261e66e421b8f64baca801466cada664c7c356 # Parent b6b98198ca5233b54c8e71fa320b8a06b3f7571a# Parent b83fcc2311af50f8a1e0301cae78d8b44bf2d92b merge diff -r b6b98198ca52 -r 16261e66e421 common/migration.py --- a/common/migration.py Thu Jul 23 15:07:12 2009 +0200 +++ b/common/migration.py Thu Jul 23 15:07:25 2009 +0200 @@ -11,7 +11,7 @@ import sys import os import logging -from tempfile import mktemp +import tempfile from os.path import exists, join, basename, splitext from logilab.common.decorators import cached @@ -337,7 +337,7 @@ configfile = self.config.main_config_file() if self._option_changes: read_old_config(self.config, self._option_changes, configfile) - newconfig = mktemp() + newconfig = mkstemp() for optdescr in self._option_changes: if optdescr[0] == 'added': optdict = self.config.get_option_def(optdescr[1]) diff -r b6b98198ca52 -r 16261e66e421 cwconfig.py --- a/cwconfig.py Thu Jul 23 15:07:12 2009 +0200 +++ b/cwconfig.py Thu Jul 23 15:07:25 2009 +0200 @@ -581,24 +581,24 @@ @classmethod def runtime_dir(cls): """run time directory for pid file...""" - return env_path('CW_RUNTIME', cls.RUNTIME_DIR, 'run time') + return env_path('CW_RUNTIME_DIR', cls.RUNTIME_DIR, 'run time') @classmethod def registry_dir(cls): """return the control directory""" - return env_path('CW_REGISTRY', cls.REGISTRY_DIR, 'registry') + return env_path('CW_INSTANCES_DIR', cls.REGISTRY_DIR, 'registry') @classmethod def instance_data_dir(cls): """return the instance data directory""" - return env_path('CW_INSTANCE_DATA', + return env_path('CW_INSTANCES_DATA_DIR', cls.INSTANCE_DATA_DIR or cls.REGISTRY_DIR, 'additional data') @classmethod def migration_scripts_dir(cls): """cubicweb migration scripts directory""" - return env_path('CW_MIGRATION', cls.MIGRATION_DIR, 'migration') + return env_path('CW_MIGRATION_DIR', cls.MIGRATION_DIR, 'migration') @classmethod def config_for(cls, appid, config=None): diff -r b6b98198ca52 -r 16261e66e421 devtools/devctl.py --- a/devtools/devctl.py Thu Jul 23 15:07:12 2009 +0200 +++ b/devtools/devctl.py Thu Jul 23 15:07:25 2009 +0200 @@ -254,13 +254,12 @@ if args: raise BadCommandUsage('Too much arguments') import shutil - from tempfile import mktemp + import tempfile import yams from logilab.common.fileutils import ensure_fs_mode from logilab.common.shellutils import globfind, find, rm from cubicweb.common.i18n import extract_from_tal, execute - tempdir = mktemp() - mkdir(tempdir) + tempdir = tempdir.mkdtemp() potfiles = [join(I18NDIR, 'entities.pot')] print '******** extract schema messages' schemapot = join(tempdir, 'schema.pot') @@ -348,14 +347,13 @@ def update_cube_catalogs(cubedir): import shutil - from tempfile import mktemp + import tempfile from logilab.common.fileutils import ensure_fs_mode from logilab.common.shellutils import find, rm from cubicweb.common.i18n import extract_from_tal, execute toedit = [] cube = basename(normpath(cubedir)) - tempdir = mktemp() - mkdir(tempdir) + tempdir = tempfile.mkdtemp() print '*' * 72 print 'updating %s cube...' % cube chdir(cubedir) diff -r b6b98198ca52 -r 16261e66e421 doc/book/en/admin/instance-config.rst --- a/doc/book/en/admin/instance-config.rst Thu Jul 23 15:07:12 2009 +0200 +++ b/doc/book/en/admin/instance-config.rst Thu Jul 23 15:07:25 2009 +0200 @@ -6,7 +6,7 @@ While creating an instance, a configuration file is generated in:: - $ (CW_REGISTRY) / / .conf + $ (CW_INSTANCES_DIR) / / .conf For example:: diff -r b6b98198ca52 -r 16261e66e421 doc/book/en/admin/setup.rst --- a/doc/book/en/admin/setup.rst Thu Jul 23 15:07:12 2009 +0200 +++ b/doc/book/en/admin/setup.rst Thu Jul 23 15:07:25 2009 +0200 @@ -116,9 +116,9 @@ following environment variables as follows:: export CW_CUBES_PATH=~/lib/cubes - export CW_REGISTRY=~/etc/cubicweb.d/ - export CW_INSTANCE_DATA=$CW_REGISTRY - export CW_RUNTIME=/tmp + export CW_INSTANCES_DIR=~/etc/cubicweb.d/ + export CW_INSTANCES_DATA_DIR=$CW_INSTANCES_DIR + export CW_RUNTIME_DIR=/tmp .. note:: The values given above are our suggestions but of course diff -r b6b98198ca52 -r 16261e66e421 doc/book/en/intro/concepts/index.rst --- a/doc/book/en/intro/concepts/index.rst Thu Jul 23 15:07:12 2009 +0200 +++ b/doc/book/en/intro/concepts/index.rst Thu Jul 23 15:07:25 2009 +0200 @@ -64,7 +64,7 @@ On a Unix system, the instances are usually stored in the directory :file:`/etc/cubicweb.d/`. During development, the :file:`~/etc/cubicweb.d/` -directory is looked up, as well as the paths in :envvar:`CW_REGISTRY` +directory is looked up, as well as the paths in :envvar:`CW_INSTANCES_DIR` environment variable. The term application can refer to an instance or to a cube, depending on the diff -r b6b98198ca52 -r 16261e66e421 schemas/base.py --- a/schemas/base.py Thu Jul 23 15:07:12 2009 +0200 +++ b/schemas/base.py Thu Jul 23 15:07:25 2009 +0200 @@ -102,7 +102,7 @@ # 0..n cardinality for entities created by internal session (no attached user) # and to support later deletion of a user which has created some entities cardinality = '**' - subject = '**' + subject = '*' object = 'CWUser' class created_by(RelationType): @@ -115,20 +115,20 @@ # 0..1 cardinality for entities created by internal session (no attached user) # and to support later deletion of a user which has created some entities cardinality = '?*' - subject = '**' + subject = '*' object = 'CWUser' class creation_date(RelationType): """creation time of an entity""" cardinality = '11' - subject = '**' + subject = '*' object = 'Datetime' class modification_date(RelationType): """latest modification time of an entity""" cardinality = '11' - subject = '**' + subject = '*' object = 'Datetime' diff -r b6b98198ca52 -r 16261e66e421 schemas/bootstrap.py --- a/schemas/bootstrap.py Thu Jul 23 15:07:12 2009 +0200 +++ b/schemas/bootstrap.py Thu Jul 23 15:07:25 2009 +0200 @@ -233,7 +233,7 @@ 'delete': (), } cardinality = '1*' - subject = '**' + subject = '*' object = 'CWEType' class is_instance_of(RelationType): @@ -248,7 +248,7 @@ 'delete': (), } cardinality = '+*' - subject = '**' + subject = '*' object = 'CWEType' class specializes(RelationType): diff -r b6b98198ca52 -r 16261e66e421 server/serverctl.py --- a/server/serverctl.py Thu Jul 23 15:07:12 2009 +0200 +++ b/server/serverctl.py Thu Jul 23 15:07:25 2009 +0200 @@ -649,7 +649,7 @@ import tempfile srcappid = pop_arg(args, 1, msg="No source application specified !") destappid = pop_arg(args, msg="No destination application specified !") - output = tempfile.mktemp() + output = tempfile.mkstemp() if ':' in srcappid: host, srcappid = srcappid.split(':') _remote_dump(host, srcappid, output, self.config.sudo) diff -r b6b98198ca52 -r 16261e66e421 server/test/unittest_schemaserial.py --- a/server/test/unittest_schemaserial.py Thu Jul 23 15:07:12 2009 +0200 +++ b/server/test/unittest_schemaserial.py Thu Jul 23 15:07:25 2009 +0200 @@ -23,15 +23,15 @@ def test_eschema2rql1(self): self.assertListEquals(list(eschema2rql(schema.eschema('CWAttribute'))), [ - ('INSERT CWEType X: X description %(description)s,X final %(final)s,X meta %(meta)s,X name %(name)s', + ('INSERT CWEType X: X description %(description)s,X final %(final)s,X name %(name)s', {'description': u'define a final relation: link a final relation type from a non final entity to a final entity type. used to build the application schema', - 'meta': True, 'name': u'CWAttribute', 'final': False}) + 'name': u'CWAttribute', 'final': False}) ]) def test_eschema2rql2(self): self.assertListEquals(list(eschema2rql(schema.eschema('String'))), [ - ('INSERT CWEType X: X description %(description)s,X final %(final)s,X meta %(meta)s,X name %(name)s', - {'description': u'', 'final': True, 'meta': True, 'name': u'String'})]) + ('INSERT CWEType X: X description %(description)s,X final %(final)s,X name %(name)s', + {'description': u'', 'final': True, 'name': u'String'})]) def test_eschema2rql_specialization(self): self.assertListEquals(list(specialize2rql(schema)), @@ -44,8 +44,8 @@ def test_rschema2rql1(self): self.assertListEquals(list(rschema2rql(schema.rschema('relation_type'))), [ - ('INSERT CWRType X: X description %(description)s,X final %(final)s,X fulltext_container %(fulltext_container)s,X inlined %(inlined)s,X meta %(meta)s,X name %(name)s,X symetric %(symetric)s', - {'description': u'link a relation definition to its relation type', 'meta': True, 'symetric': False, 'name': u'relation_type', 'final' : False, 'fulltext_container': None, 'inlined': True}), + ('INSERT CWRType X: X description %(description)s,X final %(final)s,X fulltext_container %(fulltext_container)s,X inlined %(inlined)s,X name %(name)s,X symetric %(symetric)s', + {'description': u'link a relation definition to its relation type', 'symetric': False, 'name': u'relation_type', 'final' : False, 'fulltext_container': None, 'inlined': True}), ('INSERT CWRelation X: X cardinality %(cardinality)s,X composite %(composite)s,X description %(description)s,X ordernum %(ordernum)s,X relation_type ER,X from_entity SE,X to_entity OE WHERE SE name %(se)s,ER name %(rt)s,OE name %(oe)s', {'rt': 'relation_type', 'description': u'', 'composite': u'object', 'oe': 'CWRType', @@ -63,7 +63,7 @@ def test_rschema2rql2(self): self.assertListEquals(list(rschema2rql(schema.rschema('add_permission'))), [ - ('INSERT CWRType X: X description %(description)s,X final %(final)s,X fulltext_container %(fulltext_container)s,X inlined %(inlined)s,X meta %(meta)s,X name %(name)s,X symetric %(symetric)s', {'description': u'core relation giving to a group the permission to add an entity or relation type', 'meta': True, 'symetric': False, 'name': u'add_permission', 'final': False, 'fulltext_container': None, 'inlined': False}), + ('INSERT CWRType X: X description %(description)s,X final %(final)s,X fulltext_container %(fulltext_container)s,X inlined %(inlined)s,X name %(name)s,X symetric %(symetric)s', {'description': u'core relation giving to a group the permission to add an entity or relation type', 'symetric': False, 'name': u'add_permission', 'final': False, 'fulltext_container': None, 'inlined': False}), ('INSERT CWRelation X: X cardinality %(cardinality)s,X composite %(composite)s,X description %(description)s,X ordernum %(ordernum)s,X relation_type ER,X from_entity SE,X to_entity OE WHERE SE name %(se)s,ER name %(rt)s,OE name %(oe)s', {'rt': 'add_permission', 'description': u'groups allowed to add entities/relations of this type', 'composite': None, 'oe': 'CWGroup', 'ordernum': 3, 'cardinality': u'**', 'se': 'CWEType'}), @@ -79,8 +79,8 @@ def test_rschema2rql3(self): self.assertListEquals(list(rschema2rql(schema.rschema('cardinality'))), [ - ('INSERT CWRType X: X description %(description)s,X final %(final)s,X fulltext_container %(fulltext_container)s,X inlined %(inlined)s,X meta %(meta)s,X name %(name)s,X symetric %(symetric)s', - {'description': u'', 'meta': False, 'symetric': False, 'name': u'cardinality', 'final': True, 'fulltext_container': None, 'inlined': False}), + ('INSERT CWRType X: X description %(description)s,X final %(final)s,X fulltext_container %(fulltext_container)s,X inlined %(inlined)s,X name %(name)s,X symetric %(symetric)s', + {'description': u'', 'symetric': False, 'name': u'cardinality', 'final': True, 'fulltext_container': None, 'inlined': False}), ('INSERT CWAttribute X: X cardinality %(cardinality)s,X defaultval %(defaultval)s,X description %(description)s,X fulltextindexed %(fulltextindexed)s,X indexed %(indexed)s,X internationalizable %(internationalizable)s,X ordernum %(ordernum)s,X relation_type ER,X from_entity SE,X to_entity OE WHERE SE name %(se)s,ER name %(rt)s,OE name %(oe)s', {'rt': 'cardinality', 'description': u'subject/object cardinality', 'internationalizable': True, 'fulltextindexed': False, 'ordernum': 5, 'defaultval': None, 'indexed': False, 'cardinality': u'?1', 'oe': 'String', 'se': 'CWRelation'}), @@ -100,31 +100,31 @@ def test_updateeschema2rql1(self): self.assertListEquals(list(updateeschema2rql(schema.eschema('CWAttribute'))), - [('SET X description %(description)s,X final %(final)s,X meta %(meta)s,X name %(name)s WHERE X is CWEType, X name %(et)s', - {'description': u'define a final relation: link a final relation type from a non final entity to a final entity type. used to build the application schema', 'meta': True, 'et': 'CWAttribute', 'final': False, 'name': u'CWAttribute'}), + [('SET X description %(description)s,X final %(final)s,X name %(name)s WHERE X is CWEType, X name %(et)s', + {'description': u'define a final relation: link a final relation type from a non final entity to a final entity type. used to build the application schema', 'et': 'CWAttribute', 'final': False, 'name': u'CWAttribute'}), ]) def test_updateeschema2rql2(self): self.assertListEquals(list(updateeschema2rql(schema.eschema('String'))), - [('SET X description %(description)s,X final %(final)s,X meta %(meta)s,X name %(name)s WHERE X is CWEType, X name %(et)s', - {'description': u'', 'meta': True, 'et': 'String', 'final': True, 'name': u'String'}) + [('SET X description %(description)s,X final %(final)s,X name %(name)s WHERE X is CWEType, X name %(et)s', + {'description': u'', 'et': 'String', 'final': True, 'name': u'String'}) ]) def test_updaterschema2rql1(self): self.assertListEquals(list(updaterschema2rql(schema.rschema('relation_type'))), [ - ('SET X description %(description)s,X final %(final)s,X fulltext_container %(fulltext_container)s,X inlined %(inlined)s,X meta %(meta)s,X name %(name)s,X symetric %(symetric)s WHERE X is CWRType, X name %(rt)s', + ('SET X description %(description)s,X final %(final)s,X fulltext_container %(fulltext_container)s,X inlined %(inlined)s,X name %(name)s,X symetric %(symetric)s WHERE X is CWRType, X name %(rt)s', {'rt': 'relation_type', 'symetric': False, 'description': u'link a relation definition to its relation type', - 'meta': True, 'final': False, 'fulltext_container': None, 'inlined': True, 'name': u'relation_type'}) + 'final': False, 'fulltext_container': None, 'inlined': True, 'name': u'relation_type'}) ]) def test_updaterschema2rql2(self): expected = [ - ('SET X description %(description)s,X final %(final)s,X fulltext_container %(fulltext_container)s,X inlined %(inlined)s,X meta %(meta)s,X name %(name)s,X symetric %(symetric)s WHERE X is CWRType, X name %(rt)s', + ('SET X description %(description)s,X final %(final)s,X fulltext_container %(fulltext_container)s,X inlined %(inlined)s,X name %(name)s,X symetric %(symetric)s WHERE X is CWRType, X name %(rt)s', {'rt': 'add_permission', 'symetric': False, 'description': u'core relation giving to a group the permission to add an entity or relation type', - 'meta': True, 'final': False, 'fulltext_container': None, 'inlined': False, 'name': u'add_permission'}) + 'final': False, 'fulltext_container': None, 'inlined': False, 'name': u'add_permission'}) ] for i, (rql, args) in enumerate(updaterschema2rql(schema.rschema('add_permission'))): yield self.assertEquals, (rql, args), expected[i] diff -r b6b98198ca52 -r 16261e66e421 test/unittest_cwconfig.py --- a/test/unittest_cwconfig.py Thu Jul 23 15:07:12 2009 +0200 +++ b/test/unittest_cwconfig.py Thu Jul 23 15:07:25 2009 +0200 @@ -8,7 +8,6 @@ import sys import os from os.path import dirname, join, abspath -from tempfile import mktemp from logilab.common.testlib import TestCase, unittest_main from logilab.common.changelog import Version diff -r b6b98198ca52 -r 16261e66e421 test/unittest_cwctl.py --- a/test/unittest_cwctl.py Thu Jul 23 15:07:12 2009 +0200 +++ b/test/unittest_cwctl.py Thu Jul 23 15:07:25 2009 +0200 @@ -13,9 +13,9 @@ if os.environ.get('APYCOT_ROOT'): root = os.environ['APYCOT_ROOT'] CUBES_DIR = '%s/local/share/cubicweb/cubes/' % root - os.environ['CW_CUBES'] = CUBES_DIR + os.environ['CW_CUBES_PATH'] = CUBES_DIR REGISTRY_DIR = '%s/etc/cubicweb.d/' % root - os.environ['CW_REGISTRY_DIR'] = REGISTRY_DIR + os.environ['CW_INSTANCES_DIR'] = REGISTRY_DIR from cubicweb.cwconfig import CubicWebConfiguration CubicWebConfiguration.load_cwctl_plugins() diff -r b6b98198ca52 -r 16261e66e421 web/data/external_resources --- a/web/data/external_resources Thu Jul 23 15:07:12 2009 +0200 +++ b/web/data/external_resources Thu Jul 23 15:07:25 2009 +0200 @@ -18,7 +18,7 @@ #IE_STYLESHEETS = DATADIR/cubicweb.ie.css # Javascripts files to include in HTML headers -#JAVASCRIPTS = DATADIR/jqyery.js, DATADIR/cubicweb.python.js, DATADIR/jquery.json.js, DATADIR/cubicweb.compat.js, DATADIR/cubicweb.htmlhelpers.js +#JAVASCRIPTS = DATADIR/jquery.js, DATADIR/cubicweb.python.js, DATADIR/jquery.json.js, DATADIR/cubicweb.compat.js, DATADIR/cubicweb.htmlhelpers.js # path to favicon (relative to the application main script, seen as a # directory, hence .. when you are not using an absolute path) diff -r b6b98198ca52 -r 16261e66e421 web/test/data/schema/__init__.py diff -r b6b98198ca52 -r 16261e66e421 web/test/data/schema/testschema.py --- a/web/test/data/schema/testschema.py Thu Jul 23 15:07:12 2009 +0200 +++ b/web/test/data/schema/testschema.py Thu Jul 23 15:07:25 2009 +0200 @@ -5,6 +5,11 @@ :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr :license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses """ + +from yams.buildobjs import (EntityType, RelationDefinition, RelationType, String, + Int, SubjectRelation) +from yams.constraints import IntervalBoundConstraint + class Salesterm(EntityType): described_by_test = SubjectRelation('File', cardinality='1*', composite='subject') amount = Int(constraints=[IntervalBoundConstraint(0, 100)]) diff -r b6b98198ca52 -r 16261e66e421 web/test/unittest_form.py --- a/web/test/unittest_form.py Thu Jul 23 15:07:12 2009 +0200 +++ b/web/test/unittest_form.py Thu Jul 23 15:07:25 2009 +0200 @@ -161,7 +161,7 @@ def test_richtextfield_2(self): self.req.use_fckeditor = lambda: True - self._test_richtextfield('') + self._test_richtextfield('') def test_filefield(self): @@ -172,14 +172,14 @@ data=Binary('new widgets system')) form = FFForm(self.req, redirect_path='perdu.com', entity=file) self.assertTextEquals(self._render_entity_field('data', form), - ''' + ''' show advanced fields
- + detach attached file ''' % {'eid': file.eid}) @@ -196,14 +196,14 @@ data=Binary('new widgets system')) form = EFFForm(self.req, redirect_path='perdu.com', entity=file) self.assertTextEquals(self._render_entity_field('data', form), - ''' + ''' show advanced fields
- + detach attached file

You can either submit a new file using the browse button above, or choose to remove already uploaded file by checking the "detach attached file" check-box, or edit file content online with the widget below.

''' % {'eid': file.eid}) @@ -214,9 +214,9 @@ upassword = StringField(widget=PasswordInput) form = PFForm(self.req, redirect_path='perdu.com', entity=self.entity) self.assertTextEquals(self._render_entity_field('upassword', form), - ''' + '''
- +   confirm password''' % {'eid': self.entity.eid}) diff -r b6b98198ca52 -r 16261e66e421 web/test/unittest_urlrewrite.py --- a/web/test/unittest_urlrewrite.py Thu Jul 23 15:07:12 2009 +0200 +++ b/web/test/unittest_urlrewrite.py Thu Jul 23 15:07:25 2009 +0200 @@ -29,12 +29,14 @@ self.assertListEquals(rules, [ ('foo' , dict(rql='Foo F')), ('/index' , dict(vid='index2')), - ('/schema', {'vid': 'schema'}), + ('/schema', dict(vid='schema')), ('/myprefs', dict(vid='propertiesform')), ('/siteconfig', dict(vid='systempropertiesform')), + ('/siteinfo', dict(vid='info')), ('/manage', dict(vid='manage')), - ('/notfound', {'vid': '404'}), - ('/error', {'vid': 'error'}), + ('/notfound', dict(vid='404')), + ('/error', dict(vid='error')), + ('/sparql', dict(vid='sparql')), ('/schema/([^/]+?)/?$', {'rql': r'Any X WHERE X is CWEType, X name "\1"', 'vid': 'eschema'}), ('/add/([^/]+?)/?$' , dict(vid='creation', etype=r'\1')), ('/doc/images/(.+?)/?$', dict(fid='\\1', vid='wdocimages')), diff -r b6b98198ca52 -r 16261e66e421 web/test/unittest_viewselector.py --- a/web/test/unittest_viewselector.py Thu Jul 23 15:07:12 2009 +0200 +++ b/web/test/unittest_viewselector.py Thu Jul 23 15:07:25 2009 +0200 @@ -22,8 +22,9 @@ ('logout', actions.LogoutAction)] SITEACTIONS = [('siteconfig', actions.SiteConfigurationAction), ('manage', actions.ManageAction), - ('schema', schema.ViewSchemaAction)] - + ('schema', schema.ViewSchemaAction), + ('siteinfo', actions.SiteInfoAction), + ] class ViewSelectorTC(EnvBasedTC): @@ -173,6 +174,7 @@ ('text', baseviews.TextView), ('treeview', treeview.TreeView), ('vcard', vcard.VCardCWUserView), + ('wfhistory', workflow.WFHistoryView), ('xbel', xbel.XbelView), ('xml', xmlrss.XMLView), ]) diff -r b6b98198ca52 -r 16261e66e421 web/views/__init__.py --- a/web/views/__init__.py Thu Jul 23 15:07:12 2009 +0200 +++ b/web/views/__init__.py Thu Jul 23 15:07:25 2009 +0200 @@ -8,7 +8,7 @@ __docformat__ = "restructuredtext en" import os -from tempfile import mktemp +import tempfile from rql import nodes @@ -109,7 +109,7 @@ def cell_call(self, row=0, col=0): self.row, self.col = row, col # in case one need it - tmpfile = mktemp('.png') + tmpfile = tempfile.mkstemp('.png') try: self._generate(tmpfile) self.w(open(tmpfile).read()) diff -r b6b98198ca52 -r 16261e66e421 web/views/actions.py --- a/web/views/actions.py Thu Jul 23 15:07:12 2009 +0200 +++ b/web/views/actions.py Thu Jul 23 15:07:25 2009 +0200 @@ -286,7 +286,7 @@ title = _('manage') order = 20 -class ManageAction(ManagersAction): +class SiteInfoAction(ManagersAction): id = 'siteinfo' title = _('info') order = 30 diff -r b6b98198ca52 -r 16261e66e421 web/views/boxes.py --- a/web/views/boxes.py Thu Jul 23 15:07:12 2009 +0200 +++ b/web/views/boxes.py Thu Jul 23 15:07:25 2009 +0200 @@ -144,20 +144,16 @@ if 'in_state' in entity.e_schema.subject_relations() and entity.in_state: _ = self.req._ state = entity.in_state[0] - transitions = list(state.transitions(entity)) - if transitions: - menu_title = u'%s: %s' % (_('state'), state.view('text')) - menu_items = [] - for tr in transitions: - url = entity.absolute_url(vid='statuschange', treid=tr.eid) - menu_items.append(self.mk_action(_(tr.name), url)) - box.append(BoxMenu(menu_title, menu_items)) - # when there are no possible transition, put state if the menu if - # there are some other actions - elif not box.is_empty(): - menu_title = u'%s: %s' % ( - _('no possible transition'), _('state'), state.view('text')) - box.append(RawBoxItem(menu_title, 'boxMainactions')) + menu_title = u'%s: %s' % (_('state'), state.view('text')) + menu_items = [] + for tr in state.transitions(entity): + url = entity.absolute_url(vid='statuschange', treid=tr.eid) + menu_items.append(self.mk_action(_(tr.name), url)) + wfurl = self.build_url('cwetype/%s'%entity.e_schema, vid='workflow') + menu_items.append(self.mk_action(_('view workflow'), wfurl)) + wfurl = entity.absolute_url(vid='wfhistory') + menu_items.append(self.mk_action(_('view history'), wfurl)) + box.append(BoxMenu(menu_title, menu_items)) return None def linkto_url(self, entity, rtype, etype, target): diff -r b6b98198ca52 -r 16261e66e421 web/views/sparql.py --- a/web/views/sparql.py Thu Jul 23 15:07:12 2009 +0200 +++ b/web/views/sparql.py Thu Jul 23 15:07:25 2009 +0200 @@ -21,7 +21,7 @@ class SparqlForm(forms.FieldsForm): id = 'sparql' - sparql = formfields.StringField(help=_('type here a sparql qyery')) + sparql = formfields.StringField(help=_('type here a sparql query')) resultvid = formfields.StringField(choices=((_('table'), 'table'), (_('sparql xml'), 'sparqlxml')), widget=fwdgs.Radio, diff -r b6b98198ca52 -r 16261e66e421 web/views/workflow.py --- a/web/views/workflow.py Thu Jul 23 15:07:12 2009 +0200 +++ b/web/views/workflow.py Thu Jul 23 15:07:25 2009 +0200 @@ -18,6 +18,7 @@ from cubicweb.selectors import (implements, has_related_entities, relation_possible, match_form_params) from cubicweb.interfaces import IWorkflowable +from cubicweb.view import EntityView from cubicweb.web import stdmsgs, action, component, form from cubicweb.web.form import FormViewMixIn from cubicweb.web.formfields import StringField, RichTextField @@ -66,13 +67,9 @@ def redirectpath(self, entity): return entity.rest_path() - -class WFHistoryVComponent(component.EntityVComponent): - """display the workflow history for entities supporting it""" +class WFHistoryView(EntityView): id = 'wfhistory' - __select__ = (component.EntityVComponent.__select__ - & relation_possible('wf_info_for', role='object')) - context = 'navcontentbottom' + __select__ = relation_possible('wf_info_for', role='object') title = _('Workflow history') def cell_call(self, row, col, view=None): @@ -101,6 +98,15 @@ self.wview('table', rset, title=_(self.title), displayactions=False, displaycols=displaycols, headers=headers) +class WFHistoryVComponent(component.EntityVComponent): + """display the workflow history for entities supporting it""" + id = 'wfhistory' + __select__ = WFHistoryView.__select__ & component.EntityVComponent.__select__ + context = 'navcontentbottom' + title = _('Workflow history') + + def cell_call(self, row, col, view=None): + self.wview('wfhistory', self.rset, row=row, col=col, view=view) # workflow entity types views #################################################