# HG changeset patch # User sylvain.thenault@logilab.fr # Date 1236183148 -3600 # Node ID 92a0601b252353fca416544c14abd1c081d26886 # Parent 09ba3cb2a440b29ad50c25a22ab28dfc47e345cf# Parent 625e597731198ae94151195336df20daca20fa86 backport default branch diff -r 09ba3cb2a440 -r 92a0601b2523 devtools/testlib.py --- a/devtools/testlib.py Wed Mar 04 17:09:10 2009 +0100 +++ b/devtools/testlib.py Wed Mar 04 17:12:28 2009 +0100 @@ -248,11 +248,11 @@ def to_test_etypes(self): return unprotected_entities(self.schema, strict=True) - def iter_automatic_rsets(self): + def iter_automatic_rsets(self, limit=10): """generates basic resultsets for each entity type""" etypes = self.to_test_etypes() for etype in etypes: - yield self.execute('Any X WHERE X is %s' % etype) + yield self.execute('Any X LIMIT %s WHERE X is %s' % (limit, etype)) etype1 = etypes.pop() etype2 = etypes.pop() @@ -347,14 +347,14 @@ ## one each def test_one_each_config(self): self.auto_populate(1) - for rset in self.iter_automatic_rsets(): + for rset in self.iter_automatic_rsets(limit=1): for testargs in self._test_everything_for(rset): yield testargs ## ten each def test_ten_each_config(self): self.auto_populate(10) - for rset in self.iter_automatic_rsets(): + for rset in self.iter_automatic_rsets(limit=10): for testargs in self._test_everything_for(rset): yield testargs diff -r 09ba3cb2a440 -r 92a0601b2523 ext/rest.py --- a/ext/rest.py Wed Mar 04 17:09:10 2009 +0100 +++ b/ext/rest.py Wed Mar 04 17:12:28 2009 +0100 @@ -1,6 +1,16 @@ """rest publishing functions -contains some functions and setup of docutils for cubicweb +contains some functions and setup of docutils for cubicweb. Provides the +following ReST directives: + +* `eid`, create link to entity in the repository by their eid + +* `card`, create link to card entity in the repository by their wikiid + (proposing to create it when the refered card doesn't exist yet) + +* `winclude`, reference to a web documentation file (in wdoc/ directories) + +* `sourcecode` (if pygments is installed), source code colorization :organization: Logilab :copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved. @@ -156,6 +166,36 @@ 'encoding': directives.encoding} directives.register_directive('winclude', winclude_directive) +try: + from pygments import highlight + from pygments.lexers import get_lexer_by_name, LEXERS + from pygments.formatters import HtmlFormatter +except ImportError: + pass +else: + _PYGMENTS_FORMATTER = HtmlFormatter() + + def pygments_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + try: + lexer = get_lexer_by_name(arguments[0]) + except ValueError: + import traceback + traceback.print_exc() + print sorted(aliases for module_name, name, aliases, _, _ in LEXERS.itervalues()) + # no lexer found + lexer = get_lexer_by_name('text') + print 'LEXER', lexer + parsed = highlight(u'\n'.join(content), lexer, _PYGMENTS_FORMATTER) + context = state.document.settings.context + context.req.add_css('pygments.css') + return [nodes.raw('', parsed, format='html')] + + pygments_directive.arguments = (1, 0, 1) + pygments_directive.content = 1 + directives.register_directive('sourcecode', pygments_directive) + + class CubicWebReSTParser(Parser): """The (customized) reStructuredText parser.""" diff -r 09ba3cb2a440 -r 92a0601b2523 i18n/es.po --- a/i18n/es.po Wed Mar 04 17:09:10 2009 +0100 +++ b/i18n/es.po Wed Mar 04 17:12:28 2009 +0100 @@ -76,8 +76,8 @@ msgstr "%d semanas" #, python-format -msgid "%d years" -msgstr "%d años" +msgid "%d years" +msgstr "%d años" #, python-format msgid "%d days" @@ -104,10 +104,6 @@ msgstr "%d semanas" #, python-format -msgid "%d years" -msgstr "%d años" - -#, python-format msgid "%s error report" msgstr "%s reporte de errores" diff -r 09ba3cb2a440 -r 92a0601b2523 interfaces.py --- a/interfaces.py Wed Mar 04 17:09:10 2009 +0100 +++ b/interfaces.py Wed Mar 04 17:12:28 2009 +0100 @@ -238,7 +238,20 @@ def rss_feed_url(self): """return an url which layout sub-entities item """ -class ISIOC(Interface): - """interface for entities with sioc views""" +class ISiocItem(Interface): + """interface for entities (which are item + in sioc specification) with sioc views""" - + def isioc_content(self): + """return content entity""" + + def isioc_container(self): + """return container entity""" + +class ISiocContainer(Interface): + """interface for entities (which are container + in sioc specification) with sioc views""" + + def isioc_type(self): + """return container type (forum, weblog, mailinglist)""" + diff -r 09ba3cb2a440 -r 92a0601b2523 web/data/cubicweb.css --- a/web/data/cubicweb.css Wed Mar 04 17:09:10 2009 +0100 +++ b/web/data/cubicweb.css Wed Mar 04 17:12:28 2009 +0100 @@ -586,9 +586,13 @@ margin-bottom: 0px; } +div.primaryRight{ + float:right; + + } + div.sideRelated { margin-right: 1em; - float: right; padding: 12px 0px 12px 12px; min-width: 21em; max-width: 50em; diff -r 09ba3cb2a440 -r 92a0601b2523 web/data/cubicweb.edition.js --- a/web/data/cubicweb.edition.js Wed Mar 04 17:09:10 2009 +0100 +++ b/web/data/cubicweb.edition.js Wed Mar 04 17:12:28 2009 +0100 @@ -264,7 +264,8 @@ var d = async_rawremote_exec('inline_creation_form', peid, ptype, ttype, rtype, role); d.addCallback(function (response) { var linknode = getNode('add' + rtype + ':' + peid + 'link'); - var form = jQuery(getDomFromResponse(response)); + var dom = getDomFromResponse(response); + var form = jQuery(dom); form.css('display', 'none'); form.insertBefore(linknode.parentNode).slideDown('fast'); // setStyle(form, {display: 'none'}); @@ -273,6 +274,7 @@ // slideDown(form, {'duration':0.6}); reorderTabindex(); form.trigger('inlinedform-added'); + postAjaxLoad(dom); // MochiKit.Signal.signal(CubicWeb, 'inlinedform-added', form); }); d.addErrback(function (xxx) { diff -r 09ba3cb2a440 -r 92a0601b2523 web/views/baseviews.py --- a/web/views/baseviews.py Wed Mar 04 17:09:10 2009 +0100 +++ b/web/views/baseviews.py Wed Mar 04 17:12:28 2009 +0100 @@ -139,22 +139,19 @@ self.render_entity_metadata(entity) # entity's attributes and relations, excluding meta data # if the entity isn't meta itself - self.w(u'') - self.w(u'') - self.w(u'') + self.w(u'') # side boxes - self.w(u'') - self.w(u'') - self.w(u'
') + self.w(u'
') self.w(u'
') self.render_entity_attributes(entity, siderelations) self.w(u'
') self.content_navigation_components('navcontenttop') if self.main_related_section: self.render_entity_relations(entity, siderelations) - self.w(u'
') + self.w(u'
') self.render_side_related(entity, siderelations) - self.w(u'
') + self.w(u'') + self.w(u'
') self.content_navigation_components('navcontentbottom') def content_navigation_components(self, context): @@ -246,40 +243,28 @@ sideboxes = [(label, rset) for label, rset in self.get_side_boxes_defs(entity) if rset] if sideboxes: - self.w(u'') for label, rset in sideboxes: - self.w(u'') - self.w(u'
') self.w(u'
') self.wview('sidebox', rset, title=label) self.w(u'
') - self.w(u'
') elif siderelations: - self.w(u'') - self.w(u'') - self.w(u'
') self.w(u'
') for relatedinfos in siderelations: # if not relatedinfos[0].meta: # continue self._render_related_entities(entity, *relatedinfos) self.w(u'
') - self.w(u'
') boxes = list(self.vreg.possible_vobjects('boxes', self.req, self.rset, row=self.row, view=self, context='incontext')) if boxes: - self.w(u'') for box in boxes: - self.w(u'') - self.w(u'
') try: box.dispatch(w=self.w, row=self.row) except NotImplementedError: # much probably a context insensitive box, which only implements # .call() and not cell_call() - box.dispatch(w=self.w) - self.w(u'
') + box.dispatch(w=self.w) def is_side_related(self, rschema, eschema): return rschema.meta and \ diff -r 09ba3cb2a440 -r 92a0601b2523 web/views/tabs.py --- a/web/views/tabs.py Wed Mar 04 17:09:10 2009 +0100 +++ b/web/views/tabs.py Wed Mar 04 17:12:28 2009 +0100 @@ -32,15 +32,22 @@ });""" % {'event': 'load_%s' % vid, 'vid': vid, 'reloadable' : str(reloadable).lower()}) - def lazyview(self, vid, eid=None, reloadable=False, show_spinbox=True, w=None): + def lazyview(self, vid, rql=None, eid=None, rset=None, static=False, + reloadable=False, show_spinbox=True, w=None): """a lazy version of wview first version only support lazy viewing for an entity at a time """ + assert rql or eid or rset or static, \ + 'lazyview wants at least : rql, or an eid, or an rset -- or call it with static=True' w = w or self.w self.req.add_js('cubicweb.lazy.js') urlparams = {'vid' : vid, 'mode' : 'html'} - if eid: - urlparams['rql'] = uilib.rql_for_eid(eid) + if rql: + urlparams['rql'] = rql + elif eid: + urlparams['rql'] = rql_for_eid(eid) + elif rset: + urlparams['rql'] = rset.printable_rql() w(u'
' % ( vid, html_escape(self.build_url('json', **urlparams)))) if show_spinbox: @@ -64,12 +71,12 @@ return str('%s_active_tab' % self.config.appid) def active_tab(self, tabs, default): - cookie = self.req.get_cookie() + cookies = self.req.get_cookie() cookiename = self.cookie_name - activetab = cookie.get(cookiename) + activetab = cookies.get(cookiename) if activetab is None: - cookie[cookiename] = default - self.req.set_cookie(cookie, cookiename) + cookies[cookiename] = default + self.req.set_cookie(cookies, cookiename) tab = default else: tab = activetab.value @@ -89,13 +96,18 @@ self.req.add_css('ui.tabs.css') self.req.add_js(('ui.core.js', 'ui.tabs.js', 'cubicweb.ajax.js', 'cubicweb.tabs.js', 'cubicweb.lazy.js')) + # tabbed views do no support concatenation + # hence we delegate to the default tab + if self.req.form.get('vid') == 'primary': + entity.view(default) + return # prune tabs : not all are to be shown tabs = self.prune_tabs(tabs) # select a tab active_tab = self.active_tab(tabs, default) # build the html structure w = self.w - w(u'
') + w(u'
' % entity.eid) w(u'
    ') for tab in tabs: w(u'
  • ') @@ -109,15 +121,16 @@ w(u'
') for tab in tabs: w(u'
' % tab) - self.lazyview(tab, entity.eid) + self.lazyview(tab, eid=entity.eid) w(u'
') # call the set_tab() JS function *after* each tab is generated # because the callback binding needs to be done before self.req.html_headers.add_onload(u""" - jQuery('#entity-tabs > ul').tabs( { selected: %(tabindex)s }); + jQuery('#entity-tabs-%(eeid)s > ul').tabs( { selected: %(tabindex)s }); set_tab('%(vid)s', '%(cookiename)s'); """ % {'tabindex' : tabs.index(active_tab), 'vid' : active_tab, + 'eeid' : entity.eid, 'cookiename' : self.cookie_name}) diff -r 09ba3cb2a440 -r 92a0601b2523 web/views/treeview.py --- a/web/views/treeview.py Wed Mar 04 17:09:10 2009 +0100 +++ b/web/views/treeview.py Wed Mar 04 17:12:28 2009 +0100 @@ -26,21 +26,24 @@ css_classes = 'treeview widget' title = _('tree view') - def call(self, subvid=None): - if subvid is None and 'subvid' in self.req.form: - subvid = self.req.form.pop('subvid') # consume it + def call(self, subvid=None, treeid=None, initial_load=True): if subvid is None: - subvid = 'oneline' - self.req.add_css('jquery.treeview.css') - self.req.add_js(('cubicweb.ajax.js', 'jquery.treeview.js', 'cubicweb.widgets.js')) - # XXX noautoload is a quick hack to avoid treeview to be rebuilt - # after a json query and avoid double toggling bugs. - # Need to find a way to do that cleanly. - if 'noautoload' in self.req.form: - self.w(u'