--- a/devtools/__init__.py Wed Jan 27 16:08:51 2010 +0100
+++ b/devtools/__init__.py Mon Feb 01 17:49:59 2010 +0100
@@ -321,13 +321,13 @@
from cubicweb.server import init_repository
init_repository(config, interactive=False, drop=True, vreg=vreg)
-def cleanup_sqlite(dbfile, removecube=False):
+def cleanup_sqlite(dbfile, removetemplate=False):
try:
os.remove(dbfile)
os.remove('%s-journal' % dbfile)
except OSError:
pass
- if removecube:
+ if removetemplate:
try:
os.remove('%s-template' % dbfile)
except OSError:
--- a/entities/authobjs.py Wed Jan 27 16:08:51 2010 +0100
+++ b/entities/authobjs.py Mon Feb 01 17:49:59 2010 +0100
@@ -82,7 +82,7 @@
def is_in_group(self, group):
"""convience / shortcut method to test if the user belongs to `group`
"""
- return group in self._groups
+ return group in self.groups
def is_anonymous(self):
""" checks if user is an anonymous user"""
--- a/entities/wfobjs.py Wed Jan 27 16:08:51 2010 +0100
+++ b/entities/wfobjs.py Mon Feb 01 17:49:59 2010 +0100
@@ -489,7 +489,7 @@
stateeid = statename.eid
else:
if not isinstance(statename, basestring):
- warn('give a state name')
+ warn('[3.5] give a state name', DeprecationWarning)
state = self.current_workflow.state_by_eid(statename)
else:
state = self.current_workflow.state_by_name(statename)
--- a/entity.py Wed Jan 27 16:08:51 2010 +0100
+++ b/entity.py Mon Feb 01 17:49:59 2010 +0100
@@ -377,9 +377,9 @@
def has_perm(self, action):
return self.e_schema.has_perm(self.req, action, self.eid)
- def view(self, vid, __registry='views', **kwargs):
+ def view(self, __vid, __registry='views', **kwargs):
"""shortcut to apply a view on this entity"""
- return self.vreg[__registry].render(vid, self.req, rset=self.rset,
+ return self.vreg[__registry].render(__vid, self.req, rset=self.rset,
row=self.row, col=self.col, **kwargs)
def absolute_url(self, *args, **kwargs):
@@ -573,6 +573,7 @@
continue
yield attr
+ _cw_completed = False
def complete(self, attributes=None, skip_bytes=True):
"""complete this entity by adding missing attributes (i.e. query the
repository to fill the entity)
@@ -582,6 +583,10 @@
if true, attribute of type Bytes won't be considered
"""
assert self.has_eid()
+ if self._cw_completed:
+ return
+ if attributes is None:
+ self._cw_completed = True
varmaker = rqlvar_maker()
V = varmaker.next()
rql = ['WHERE %s eid %%(x)s' % V]
@@ -864,14 +869,23 @@
self._related_cache.pop('%s_%s' % (rtype, role), None)
def clear_all_caches(self):
+ """flush all caches on this entity. Further attributes/relations access
+ will triggers new database queries to get back values.
+
+ If you use custom caches on your entity class (take care to @cached!),
+ you should override this method to clear them as well.
+ """
+ # clear attributes cache
haseid = 'eid' in self
+ self._cw_completed = False
self.clear()
- for rschema, _, role in self.e_schema.relation_definitions():
- self.clear_related_cache(rschema.type, role)
# set eid if it was in, else we may get nasty error while editing this
# entity if it's bound to a repo session
if haseid:
self['eid'] = self.eid
+ # clear relations cache
+ for rschema, _, role in self.e_schema.relation_definitions():
+ self.clear_related_cache(rschema.type, role)
# raw edition utilities ###################################################
--- a/etwist/server.py Wed Jan 27 16:08:51 2010 +0100
+++ b/etwist/server.py Mon Feb 01 17:49:59 2010 +0100
@@ -10,6 +10,7 @@
import sys
import os
import select
+import errno
import hotshot
from time import mktime
from datetime import date, timedelta
--- a/i18n/fr.po Wed Jan 27 16:08:51 2010 +0100
+++ b/i18n/fr.po Mon Feb 01 17:49:59 2010 +0100
@@ -752,7 +752,11 @@
"a RQL expression which should return some results, else the transition won't "
"be available. This query may use X and U variables that will respectivly "
"represents the current entity and the current user"
-msgstr "une expression RQL devant retourner des résultats pour que la transition puisse être passée. Cette expression peut utiliser les variables X et U qui représentent respectivement l'entité à laquelle on veut appliquer la transition et l'utilisateur courant."
+msgstr ""
+"une expression RQL devant retourner des résultats pour que la transition "
+"puisse être passée. Cette expression peut utiliser les variables X et U qui "
+"représentent respectivement l'entité à laquelle on veut appliquer la "
+"transition et l'utilisateur courant."
msgid "a URI representing an object in external data store"
msgstr "une Uri désignant un objet dans un entrepôt de données externe"
@@ -1262,7 +1266,8 @@
msgstr "boîte d'actions"
msgid "boxes_edit_box_description"
-msgstr "boîte affichant les différentes actions possibles sur les données affichées"
+msgstr ""
+"boîte affichant les différentes actions possibles sur les données affichées"
msgid "boxes_filter_box"
msgstr "filtrer"
--- a/web/views/treeview.py Wed Jan 27 16:08:51 2010 +0100
+++ b/web/views/treeview.py Mon Feb 01 17:49:59 2010 +0100
@@ -59,9 +59,13 @@
self._init_headers(treeid, toplevel_thru_ajax)
ulid = ' id="tree-%s"' % treeid
self.w(u'<ul%s class="%s">' % (ulid, self.css_classes))
- for rowidx in xrange(len(self.rset)):
- self.wview(self.itemvid, self.rset, row=rowidx, col=0,
- vid=subvid, parentvid=self.id, treeid=treeid, **morekwargs)
+ for i, entity in enumerate(sorted(self.rset.entities(), key=lambda x: x.dc_title())):
+ if i+1 < len(self.rset):
+ morekwargs['is_last'] = False
+ else:
+ morekwargs['is_last'] = True
+ entity.view(self.itemvid, vid=subvid, parentvid=self.id,
+ treeid=treeid, w=self.w, **morekwargs)
self.w(u'</ul>')
def cell_call(self, *args, **allargs):
@@ -71,6 +75,7 @@
allargs.pop('col')
self.call(*args, **allargs)
+
class FileTreeView(TreeView):
"""specific version of the treeview to display file trees
"""
@@ -103,7 +108,7 @@
"""default treeitem view for entities which don't implement ITree"""
id = 'treeitemview'
- def cell_call(self, row, col, vid='oneline', parentvid='treeview', treeid=None):
+ def cell_call(self, row, col, vid='oneline', treeid=None, **morekwargs):
assert treeid is not None
entity = self.entity(row, col)
itemview = self.view(vid, self.rset, row=row, col=col)
@@ -129,11 +134,11 @@
return str(eeid) in treestate.value.split(';')
return self.default_branch_state_is_open
- def cell_call(self, row, col, treeid, vid='oneline', parentvid='treeview', **morekwargs):
+ def cell_call(self, row, col, treeid, vid='oneline', parentvid='treeview',
+ is_last=False, **morekwargs):
w = self.w
entity = self.entity(row, col)
liclasses = []
- is_last = row == len(self.rset) - 1
is_open = self.open_state(entity.eid, treeid)
is_leaf = not hasattr(entity, 'is_leaf') or entity.is_leaf()
if is_leaf:
--- a/web/views/urlrewrite.py Wed Jan 27 16:08:51 2010 +0100
+++ b/web/views/urlrewrite.py Mon Feb 01 17:49:59 2010 +0100
@@ -83,7 +83,9 @@
('/notfound', dict(vid='404')),
('/error', dict(vid='error')),
('/sparql', dict(vid='sparql')),
- (rgx('/schema/([^/]+?)/?'), dict(vid='eschema', rql=r'Any X WHERE X is CWEType, X name "\1"')),
+ # XXX should be case insensitive as 'create', but I would like to find another way than
+ # relying on the etype_selector
+ (rgx('/schema/([^/]+?)/?'), dict(vid='primary', rql=r'Any X WHERE X is CWEType, X name "\1"')),
(rgx('/add/([^/]+?)/?'), dict(vid='creation', etype=r'\1')),
(rgx('/doc/images/(.+?)/?'), dict(vid='wdocimages', fid=r'\1')),
(rgx('/doc/?'), dict(vid='wdoc', fid=r'main')),
--- a/web/views/workflow.py Wed Jan 27 16:08:51 2010 +0100
+++ b/web/views/workflow.py Mon Feb 01 17:49:59 2010 +0100
@@ -49,7 +49,7 @@
self.w(form.error_message())
self.w(u'<h4>%s %s</h4>\n' % (self.req._(transition.name),
entity.view('oneline')))
- msg = _('status will change from %(st1)s to %(st2)s') % {
+ msg = self.req._('status will change from %(st1)s to %(st2)s') % {
'st1': entity.printable_state,
'st2': self.req._(transition.destination().name)}
self.w(u'<p>%s</p>\n' % msg)