web/test/unittest_reledit.py
changeset 11057 0b59724cb3f2
parent 11052 058bb3dc685f
child 11058 23eb30449fe5
equal deleted inserted replaced
11052:058bb3dc685f 11057:0b59724cb3f2
     1 # copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
       
     2 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
       
     3 #
       
     4 # This file is part of CubicWeb.
       
     5 #
       
     6 # CubicWeb is free software: you can redistribute it and/or modify it under the
       
     7 # terms of the GNU Lesser General Public License as published by the Free
       
     8 # Software Foundation, either version 2.1 of the License, or (at your option)
       
     9 # any later version.
       
    10 #
       
    11 # CubicWeb is distributed in the hope that it will be useful, but WITHOUT
       
    12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
       
    13 # FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
       
    14 # details.
       
    15 #
       
    16 # You should have received a copy of the GNU Lesser General Public License along
       
    17 # with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
       
    18 """
       
    19 mainly regression-preventing tests for reledit views
       
    20 """
       
    21 
       
    22 from cubicweb.devtools.testlib import CubicWebTC
       
    23 from cubicweb.web.views.uicfg import reledit_ctrl
       
    24 
       
    25 class ReleditMixinTC(object):
       
    26 
       
    27     def setup_database(self):
       
    28         with self.admin_access.client_cnx() as cnx:
       
    29             self.proj = cnx.create_entity('Project', title=u'cubicweb-world-domination').eid
       
    30             self.tick = cnx.create_entity('Ticket', title=u'write the code').eid
       
    31             self.toto = cnx.create_entity('Personne', nom=u'Toto').eid
       
    32             cnx.commit()
       
    33 
       
    34 class ClickAndEditFormTC(ReleditMixinTC, CubicWebTC):
       
    35 
       
    36     def test_default_config(self):
       
    37         reledit = {'title': '''<div id="title-subject-%(eid)s-reledit" onmouseout="jQuery('#title-subject-%(eid)s').addClass('invisible')" onmouseover="jQuery('#title-subject-%(eid)s').removeClass('invisible')" class="releditField"><div id="title-subject-%(eid)s-value" class="editableFieldValue">cubicweb-world-domination</div><div id="title-subject-%(eid)s" class="editableField invisible"><div id="title-subject-%(eid)s-update" class="editableField" onclick="cw.reledit.loadInlineEditionForm(&#39;base&#39;, %(eid)s, &#39;title&#39;, &#39;subject&#39;, &#39;title-subject-%(eid)s&#39;, false, &#39;&#39;, &#39;edit_rtype&#39;);" title="click to edit this field"><img title="click to edit this field" src="http://testing.fr/cubicweb/data/pen_icon.png" alt="click to edit this field"/></div></div></div>''',
       
    38                    'long_desc': '''<div id="long_desc-subject-%(eid)s-reledit" onmouseout="jQuery('#long_desc-subject-%(eid)s').addClass('invisible')" onmouseover="jQuery('#long_desc-subject-%(eid)s').removeClass('invisible')" class="releditField"><div id="long_desc-subject-%(eid)s-value" class="editableFieldValue">&lt;not specified&gt;</div><div id="long_desc-subject-%(eid)s" class="editableField invisible"><div id="long_desc-subject-%(eid)s-add" class="editableField" onclick="cw.reledit.loadInlineEditionForm(&#39;edition&#39;, %(eid)s, &#39;long_desc&#39;, &#39;subject&#39;, &#39;long_desc-subject-%(eid)s&#39;, false, &#39;autolimited&#39;, &#39;add&#39;);" title="click to add a value"><img title="click to add a value" src="http://testing.fr/cubicweb/data/plus.png" alt="click to add a value"/></div></div></div>''',
       
    39                    'manager': '''<div id="manager-subject-%(eid)s-reledit" onmouseout="jQuery('#manager-subject-%(eid)s').addClass('invisible')" onmouseover="jQuery('#manager-subject-%(eid)s').removeClass('invisible')" class="releditField"><div id="manager-subject-%(eid)s-value" class="editableFieldValue">&lt;not specified&gt;</div><div id="manager-subject-%(eid)s" class="editableField invisible"><div id="manager-subject-%(eid)s-update" class="editableField" onclick="cw.reledit.loadInlineEditionForm(&#39;base&#39;, %(eid)s, &#39;manager&#39;, &#39;subject&#39;, &#39;manager-subject-%(eid)s&#39;, false, &#39;autolimited&#39;, &#39;edit_rtype&#39;);" title="click to edit this field"><img title="click to edit this field" src="http://testing.fr/cubicweb/data/pen_icon.png" alt="click to edit this field"/></div></div></div>''',
       
    40                    'composite_card11_2ttypes': """&lt;not specified&gt;""",
       
    41                    'concerns': """&lt;not specified&gt;"""}
       
    42 
       
    43         with self.admin_access.web_request() as req:
       
    44             proj = req.entity_from_eid(self.proj)
       
    45 
       
    46             for rschema, ttypes, role in proj.e_schema.relation_definitions(includefinal=True):
       
    47                 if rschema not in reledit:
       
    48                     continue
       
    49                 rtype = rschema.type
       
    50                 self.assertMultiLineEqual(reledit[rtype] % {'eid': self.proj},
       
    51                                           proj.view('reledit', rtype=rtype, role=role),
       
    52                                           rtype)
       
    53 
       
    54     def test_default_forms(self):
       
    55         self.skipTest('Need to check if this test should still run post reledit/doreledit merge')
       
    56         doreledit = {'title': """<div id="title-subject-%(eid)s-reledit" onmouseout="jQuery('#title-subject-%(eid)s').addClass('invisible')" onmouseover="jQuery('#title-subject-%(eid)s').removeClass('invisible')" class="releditField"><div id="title-subject-%(eid)s-value" class="editableFieldValue">cubicweb-world-domination</div><form action="http://testing.fr/cubicweb/validateform?__onsuccess=window.parent.cw.reledit.onSuccess" method="post" enctype="application/x-www-form-urlencoded" id="title-subject-%(eid)s-form" onsubmit="return freezeFormButtons(&#39;title-subject-%(eid)s-form&#39;);" class="releditForm" target="eformframe">
       
    57 <fieldset>
       
    58 <input name="__form_id" type="hidden" value="base" />
       
    59 <input name="__errorurl" type="hidden" value="http://testing.fr/cubicweb/view?rql=Blop&amp;vid=blop#title-subject-%(eid)s-form" />
       
    60 <input name="__domid" type="hidden" value="title-subject-%(eid)s-form" />
       
    61 <input name="__type:%(eid)s" type="hidden" value="Project" />
       
    62 <input name="eid" type="hidden" value="%(eid)s" />
       
    63 <input name="__maineid" type="hidden" value="%(eid)s" />
       
    64 <input name="__reledit|vid" type="hidden" value="" />
       
    65 <input name="__reledit|rtype" type="hidden" value="title" />
       
    66 <input name="__reledit|divid" type="hidden" value="title-subject-%(eid)s" />
       
    67 <input name="__reledit|formid" type="hidden" value="base" />
       
    68 <input name="__reledit|reload" type="hidden" value="false" />
       
    69 <input name="__reledit|role" type="hidden" value="subject" />
       
    70 <input name="__reledit|eid" type="hidden" value="%(eid)s" />
       
    71 <input name="_cw_entity_fields:%(eid)s" type="hidden" value="title-subject,__type" />
       
    72 <fieldset class="default">
       
    73 <table class="">
       
    74 <tr class="title_subject_row">
       
    75 <td>
       
    76 <input id="title-subject:%(eid)s" maxlength="32" name="title-subject:%(eid)s" size="32" tabindex="1" type="text" value="cubicweb-world-domination" />
       
    77 </td></tr>
       
    78 </table></fieldset>
       
    79 <table class="buttonbar">
       
    80 <tr>
       
    81 <td><button class="validateButton" tabindex="2" type="submit" value="button_ok"><img alt="OK_ICON" src="http://testing.fr/cubicweb/data/ok.png" />button_ok</button></td>
       
    82 <td><button class="validateButton" onclick="cw.reledit.cleanupAfterCancel(&#39;title-subject-%(eid)s&#39;)" tabindex="3" type="button" value="button_cancel"><img alt="CANCEL_ICON" src="http://testing.fr/cubicweb/data/cancel.png" />button_cancel</button></td>
       
    83 </tr></table>
       
    84 </fieldset>
       
    85 <iframe width="0px" height="0px" src="javascript: void(0);" name="eformframe" id="eformframe"></iframe>
       
    86 </form><div id="title-subject-%(eid)s" class="editableField invisible"><div id="title-subject-%(eid)s-update" class="editableField" onclick="cw.reledit.loadInlineEditionForm(&#39;base&#39;, %(eid)s, &#39;title&#39;, &#39;subject&#39;, &#39;title-subject-%(eid)s&#39;, false, &#39;&#39;);" title="click to edit this field"><img title="click to edit this field" src="http://testing.fr/cubicweb/data/pen_icon.png" alt="click to edit this field"/></div></div></div>""",
       
    87 
       
    88                      'long_desc': """<div id="long_desc-subject-%(eid)s-reledit" onmouseout="jQuery('#long_desc-subject-%(eid)s').addClass('invisible')" onmouseover="jQuery('#long_desc-subject-%(eid)s').removeClass('invisible')" class="releditField"><div id="long_desc-subject-%(eid)s-value" class="editableFieldValue">&lt;not specified&gt;</div><form action="http://testing.fr/cubicweb/validateform?__onsuccess=window.parent.cw.reledit.onSuccess" method="post" enctype="application/x-www-form-urlencoded" id="long_desc-subject-%(eid)s-form" onsubmit="return freezeFormButtons(&#39;long_desc-subject-%(eid)s-form&#39;);" class="releditForm" target="eformframe">
       
    89 <fieldset>
       
    90 <input name="__form_id" type="invisible" value="edition" />
       
    91 <input name="__errorurl" type="invisible" value="http://testing.fr/cubicweb/view?rql=Blop&amp;vid=blop#long_desc-subject-%(eid)s-form" />
       
    92 <input name="__domid" type="hidden" value="long_desc-subject-%(eid)s-form" />
       
    93 <input name="__type:A" type="hidden" value="Blog" />
       
    94 <input name="eid" type="hidden" value="A" />
       
    95 <input name="__maineid" type="hidden" value="A" />
       
    96 <input name="__linkto" type="hidden" value="long_desc:%(eid)s:object" />
       
    97 <input name="__message" type="hidden" value="entity linked" />
       
    98 <input name="__reledit|vid" type="hidden" value="autolimited" />
       
    99 <input name="__reledit|rtype" type="hidden" value="long_desc" />
       
   100 <input name="__reledit|divid" type="hidden" value="long_desc-subject-%(eid)s" />
       
   101 <input name="__reledit|formid" type="hidden" value="edition" />
       
   102 <input name="__reledit|reload" type="hidden" value="false" />
       
   103 <input name="__reledit|role" type="hidden" value="subject" />
       
   104 <input name="__reledit|eid" type="hidden" value="%(eid)s" />
       
   105 <input name="_cw_entity_fields:A" type="hidden" value="title-subject,rss_url-subject,__type,description-subject" />
       
   106 <fieldset class="default">
       
   107 <table class="attributeForm">
       
   108 <tr class="title_subject_row">
       
   109 <th class="labelCol"><label class="required" for="title-subject:A">title</label></th>
       
   110 <td>
       
   111 <input id="title-subject:A" maxlength="50" name="title-subject:A" size="45" tabindex="4" type="text" value="" />
       
   112 </td></tr>
       
   113 <tr class="description_subject_row">
       
   114 <th class="labelCol"><label for="description-subject:A">description</label></th>
       
   115 <td>
       
   116 <input name="description_format-subject:A" type="hidden" value="text/html" /><textarea cols="80" cubicweb:type="wysiwyg" id="description-subject:A" name="description-subject:A" onkeyup="autogrow(this)" rows="2" tabindex="5"></textarea>
       
   117 </td></tr>
       
   118 <tr class="rss_url_subject_row">
       
   119 <th class="labelCol"><label for="rss_url-subject:A">rss_url</label></th>
       
   120 <td>
       
   121 <input id="rss_url-subject:A" maxlength="128" name="rss_url-subject:A" size="45" tabindex="6" type="text" value="" />
       
   122 </td></tr>
       
   123 </table></fieldset>
       
   124 <table class="buttonbar">
       
   125 <tr>
       
   126 <td><button class="validateButton" tabindex="7" type="submit" value="button_ok"><img alt="OK_ICON" src="http://testing.fr/cubicweb/data/ok.png" />button_ok</button></td>
       
   127 <td><button class="validateButton" onclick="cw.reledit.cleanupAfterCancel(&#39;long_desc-subject-%(eid)s&#39;)" tabindex="8" type="button" value="button_cancel"><img alt="CANCEL_ICON" src="http://testing.fr/cubicweb/data/cancel.png" />button_cancel</button></td>
       
   128 </tr></table>
       
   129 </fieldset>
       
   130 <iframe width="0px" height="0px" src="javascript: void(0);" name="eformframe" id="eformframe"></iframe>
       
   131 </form><div id="long_desc-subject-%(eid)s" class="editableField invisible"><div id="long_desc-subject-%(eid)s-add" class="editableField" onclick="cw.reledit.loadInlineEditionForm(&#39;edition&#39;, %(eid)s, &#39;long_desc&#39;, &#39;subject&#39;, &#39;long_desc-subject-%(eid)s&#39;, false, &#39;autolimited&#39;);" title="click to add a value"><img title="click to add a value" src="http://testing.fr/cubicweb/data/plus.png" alt="click to add a value"/></div></div></div>""",
       
   132 
       
   133                      'manager': """<div id="manager-subject-%(eid)s-reledit" onmouseout="jQuery('#manager-subject-%(eid)s').addClass('invisible')" onmouseover="jQuery('#manager-subject-%(eid)s').removeClass('invisible')" class="releditField"><div id="manager-subject-%(eid)s-value" class="editableFieldValue">&lt;not specified&gt;</div><form action="http://testing.fr/cubicweb/validateform?__onsuccess=window.parent.cw.reledit.onSuccess" method="post" enctype="application/x-www-form-urlencoded" id="manager-subject-%(eid)s-form" onsubmit="return freezeFormButtons(&#39;manager-subject-%(eid)s-form&#39;);" class="releditForm" target="eformframe">
       
   134 <fieldset>
       
   135 <input name="__form_id" type="hidden" value="base" />
       
   136 <input name="__errorurl" type="hidden" value="http://testing.fr/cubicweb/view?rql=Blop&amp;vid=blop#manager-subject-%(eid)s-form" />
       
   137 <input name="__domid" type="hidden" value="manager-subject-%(eid)s-form" />
       
   138 <input name="__type:%(eid)s" type="hidden" value="Project" />
       
   139 <input name="eid" type="hidden" value="%(eid)s" />
       
   140 <input name="__maineid" type="hidden" value="%(eid)s" />
       
   141 <input name="__linkto" type="hidden" value="long_desc:%(eid)s:object" />
       
   142 <input name="__message" type="hidden" value="entity linked" />
       
   143 <input name="__reledit|vid" type="hidden" value="autolimited" />
       
   144 <input name="__reledit|rtype" type="hidden" value="manager" />
       
   145 <input name="__reledit|divid" type="hidden" value="manager-subject-%(eid)s" />
       
   146 <input name="__reledit|formid" type="hidden" value="base" />
       
   147 <input name="__reledit|reload" type="hidden" value="false" />
       
   148 <input name="__reledit|role" type="hidden" value="subject" />
       
   149 <input name="__reledit|eid" type="hidden" value="%(eid)s" />
       
   150 <input name="_cw_entity_fields:%(eid)s" type="hidden" value="manager-subject,__type" />
       
   151 <fieldset class="default">
       
   152 <table class="">
       
   153 <tr class="manager_subject_row">
       
   154 <td>
       
   155 <select id="manager-subject:%(eid)s" name="manager-subject:%(eid)s" size="1" tabindex="9">
       
   156 <option value="__cubicweb_internal_field__"></option>
       
   157 <option value="%(toto)s">Toto</option>
       
   158 </select>
       
   159 </td></tr>
       
   160 </table></fieldset>
       
   161 <table class="buttonbar">
       
   162 <tr>
       
   163 <td><button class="validateButton" tabindex="10" type="submit" value="button_ok"><img alt="OK_ICON" src="http://testing.fr/cubicweb/data/ok.png" />button_ok</button></td>
       
   164 <td><button class="validateButton" onclick="cw.reledit.cleanupAfterCancel(&#39;manager-subject-%(eid)s&#39;)" tabindex="11" type="button" value="button_cancel"><img alt="CANCEL_ICON" src="http://testing.fr/cubicweb/data/cancel.png" />button_cancel</button></td>
       
   165 </tr></table>
       
   166 </fieldset>
       
   167 <iframe width="0px" height="0px" src="javascript: void(0);" name="eformframe" id="eformframe"></iframe>
       
   168 </form><div id="manager-subject-%(eid)s" class="editableField invisible"><div id="manager-subject-%(eid)s-update" class="editableField" onclick="cw.reledit.loadInlineEditionForm(&#39;base&#39;, %(eid)s, &#39;manager&#39;, &#39;subject&#39;, &#39;manager-subject-%(eid)s&#39;, false, &#39;autolimited&#39;);" title="click to edit this field"><img title="click to edit this field" src="http://testing.fr/cubicweb/data/pen_icon.png" alt="click to edit this field"/></div></div></div>""",
       
   169                      'composite_card11_2ttypes': """&lt;not specified&gt;""",
       
   170                      'concerns': """&lt;not specified&gt;"""
       
   171             }
       
   172         for rschema, ttypes, role in self.proj.e_schema.relation_definitions(includefinal=True):
       
   173             if rschema not in doreledit:
       
   174                 continue
       
   175             rtype = rschema.type
       
   176             self.assertMultiLineEqual(doreledit[rtype] % {'eid': self.proj.eid, 'toto': self.toto.eid},
       
   177                                   self.proj.view('doreledit', rtype=rtype, role=role,
       
   178                                                  formid='edition' if rtype == 'long_desc' else 'base'),
       
   179                                   rtype)
       
   180 
       
   181 class ClickAndEditFormUICFGTC(ReleditMixinTC, CubicWebTC):
       
   182 
       
   183     def setup_database(self):
       
   184         super(ClickAndEditFormUICFGTC, self).setup_database()
       
   185         with self.admin_access.client_cnx() as cnx:
       
   186             cnx.execute('SET T concerns P WHERE T eid %(t)s, P eid %(p)s', {'t': self.tick, 'p': self.proj})
       
   187             cnx.execute('SET P manager T WHERE P eid %(p)s, T eid %(t)s', {'p': self.proj, 't': self.toto})
       
   188             cnx.commit()
       
   189 
       
   190     def test_with_uicfg(self):
       
   191         old_rctl = reledit_ctrl._tagdefs.copy()
       
   192         reledit_ctrl.tag_attribute(('Project', 'title'),
       
   193                                    {'novalue_label': '<title is required>', 'reload': True})
       
   194         reledit_ctrl.tag_subject_of(('Project', 'long_desc', '*'),
       
   195                                     {'reload': True, 'edit_target': 'rtype',
       
   196                                      'novalue_label': u'<long_desc is required>'})
       
   197         reledit_ctrl.tag_subject_of(('Project', 'manager', '*'),
       
   198                                    {'edit_target': 'related'})
       
   199         reledit_ctrl.tag_subject_of(('Project', 'composite_card11_2ttypes', '*'),
       
   200                                    {'edit_target': 'related'})
       
   201         reledit_ctrl.tag_object_of(('Ticket', 'concerns', 'Project'),
       
   202                                    {'edit_target': 'rtype'})
       
   203         reledit = {
       
   204             'title': """<div id="title-subject-%(eid)s-reledit" onmouseout="jQuery('#title-subject-%(eid)s').addClass('invisible')" onmouseover="jQuery('#title-subject-%(eid)s').removeClass('invisible')" class="releditField"><div id="title-subject-%(eid)s-value" class="editableFieldValue">cubicweb-world-domination</div><div id="title-subject-%(eid)s" class="editableField invisible"><div id="title-subject-%(eid)s-update" class="editableField" onclick="cw.reledit.loadInlineEditionForm(&#39;base&#39;, %(eid)s, &#39;title&#39;, &#39;subject&#39;, &#39;title-subject-%(eid)s&#39;, true, &#39;&#39;, &#39;edit_rtype&#39;);" title="click to edit this field"><img title="click to edit this field" src="http://testing.fr/cubicweb/data/pen_icon.png" alt="click to edit this field"/></div></div></div>""",
       
   205             'long_desc': """<div id="long_desc-subject-%(eid)s-reledit" onmouseout="jQuery('#long_desc-subject-%(eid)s').addClass('invisible')" onmouseover="jQuery('#long_desc-subject-%(eid)s').removeClass('invisible')" class="releditField"><div id="long_desc-subject-%(eid)s-value" class="editableFieldValue">&lt;long_desc is required&gt;</div><div id="long_desc-subject-%(eid)s" class="editableField invisible"><div id="long_desc-subject-%(eid)s-update" class="editableField" onclick="cw.reledit.loadInlineEditionForm(&#39;base&#39;, %(eid)s, &#39;long_desc&#39;, &#39;subject&#39;, &#39;long_desc-subject-%(eid)s&#39;, true, &#39;autolimited&#39;, &#39;edit_rtype&#39;);" title="click to edit this field"><img title="click to edit this field" src="http://testing.fr/cubicweb/data/pen_icon.png" alt="click to edit this field"/></div></div></div>""",
       
   206             'manager': """<div id="manager-subject-%(eid)s-reledit" onmouseout="jQuery('#manager-subject-%(eid)s').addClass('invisible')" onmouseover="jQuery('#manager-subject-%(eid)s').removeClass('invisible')" class="releditField"><div id="manager-subject-%(eid)s-value" class="editableFieldValue"><a href="http://testing.fr/cubicweb/personne/%(toto)s" title="">Toto</a></div><div id="manager-subject-%(eid)s" class="editableField invisible"><div id="manager-subject-%(eid)s-update" class="editableField" onclick="cw.reledit.loadInlineEditionForm(&#39;edition&#39;, %(eid)s, &#39;manager&#39;, &#39;subject&#39;, &#39;manager-subject-%(eid)s&#39;, false, &#39;autolimited&#39;, &#39;edit_related&#39;);" title="click to edit this field"><img title="click to edit this field" src="http://testing.fr/cubicweb/data/pen_icon.png" alt="click to edit this field"/></div><div id="manager-subject-%(eid)s-delete" class="editableField" onclick="cw.reledit.loadInlineEditionForm(&#39;deleteconf&#39;, %(eid)s, &#39;manager&#39;, &#39;subject&#39;, &#39;manager-subject-%(eid)s&#39;, false, &#39;autolimited&#39;, &#39;delete&#39;);" title="click to delete this value"><img title="click to delete this value" src="http://testing.fr/cubicweb/data/cancel.png" alt="click to delete this value"/></div></div></div>""",
       
   207             'composite_card11_2ttypes': """&lt;not specified&gt;""",
       
   208             'concerns': """<div id="concerns-object-%(eid)s-reledit" onmouseout="jQuery('#concerns-object-%(eid)s').addClass('invisible')" onmouseover="jQuery('#concerns-object-%(eid)s').removeClass('invisible')" class="releditField"><div id="concerns-object-%(eid)s-value" class="editableFieldValue"><a href="http://testing.fr/cubicweb/ticket/%(tick)s" title="">write the code</a></div><div id="concerns-object-%(eid)s" class="editableField invisible"><div id="concerns-object-%(eid)s-update" class="editableField" onclick="cw.reledit.loadInlineEditionForm(&#39;base&#39;, %(eid)s, &#39;concerns&#39;, &#39;object&#39;, &#39;concerns-object-%(eid)s&#39;, false, &#39;autolimited&#39;, &#39;edit_rtype&#39;);" title="click to edit this field"><img title="click to edit this field" src="http://testing.fr/cubicweb/data/pen_icon.png" alt="click to edit this field"/></div></div></div>"""
       
   209             }
       
   210         with self.admin_access.web_request() as req:
       
   211             proj = req.entity_from_eid(self.proj)
       
   212             for rschema, ttypes, role in proj.e_schema.relation_definitions(includefinal=True):
       
   213                 if rschema not in reledit:
       
   214                     continue
       
   215                 rtype = rschema.type
       
   216                 self.assertMultiLineEqual(reledit[rtype] % {'eid': self.proj, 'toto': self.toto, 'tick': self.tick},
       
   217                                       proj.view('reledit', rtype=rtype, role=role),
       
   218                                       rtype)
       
   219         reledit_ctrl.clear()
       
   220         reledit_ctrl._tagdefs.update(old_rctl)
       
   221 
       
   222 
       
   223 if __name__ == '__main__':
       
   224     from logilab.common.testlib import unittest_main
       
   225     unittest_main()