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('base', %(eid)s, 'title', 'subject', 'title-subject-%(eid)s', false, '', 'edit_rtype');" 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"><not specified></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('edition', %(eid)s, 'long_desc', 'subject', 'long_desc-subject-%(eid)s', false, 'autolimited', 'add');" 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"><not specified></div><div id="manager-subject-%(eid)s" class="editableField invisible"><div id="manager-subject-%(eid)s-update" class="editableField" onclick="cw.reledit.loadInlineEditionForm('base', %(eid)s, 'manager', 'subject', 'manager-subject-%(eid)s', false, 'autolimited', 'edit_rtype');" 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': """<not specified>""", |
|
41 'concerns': """<not specified>"""} |
|
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('title-subject-%(eid)s-form');" 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&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('title-subject-%(eid)s')" 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('base', %(eid)s, 'title', 'subject', 'title-subject-%(eid)s', false, '');" 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"><not specified></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('long_desc-subject-%(eid)s-form');" 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&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('long_desc-subject-%(eid)s')" 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('edition', %(eid)s, 'long_desc', 'subject', 'long_desc-subject-%(eid)s', false, 'autolimited');" 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"><not specified></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('manager-subject-%(eid)s-form');" 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&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('manager-subject-%(eid)s')" 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('base', %(eid)s, 'manager', 'subject', 'manager-subject-%(eid)s', false, 'autolimited');" 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': """<not specified>""", |
|
170 'concerns': """<not specified>""" |
|
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('base', %(eid)s, 'title', 'subject', 'title-subject-%(eid)s', true, '', 'edit_rtype');" 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"><long_desc is required></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('base', %(eid)s, 'long_desc', 'subject', 'long_desc-subject-%(eid)s', true, 'autolimited', 'edit_rtype');" 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('edition', %(eid)s, 'manager', 'subject', 'manager-subject-%(eid)s', false, 'autolimited', 'edit_related');" 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('deleteconf', %(eid)s, 'manager', 'subject', 'manager-subject-%(eid)s', false, 'autolimited', 'delete');" 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': """<not specified>""", |
|
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('base', %(eid)s, 'concerns', 'object', 'concerns-object-%(eid)s', false, 'autolimited', 'edit_rtype');" 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() |
|