merge stable
authorAlexandre Fayolle <alexandre.fayolle@logilab.fr>
Mon, 01 Feb 2010 17:49:59 +0100
branchstable
changeset 4417 8cd447d11aed
parent 4411 d0bde029f625 (diff)
parent 4416 94a3a2dec8fc (current diff)
child 4418 4755ef8253cd
merge
--- 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)