|
1 # copyright 2003-2010 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/doreledit views |
|
20 """ |
|
21 |
|
22 from cubicweb.devtools.testlib import CubicWebTC |
|
23 from cubicweb.web.uicfg import reledit_ctrl |
|
24 |
|
25 class ReleditMixinTC(object): |
|
26 |
|
27 def setup_database(self): |
|
28 self.req = self.request() |
|
29 self.proj = self.req.create_entity('Project', title=u'cubicweb-world-domination') |
|
30 self.tick = self.req.create_entity('Ticket', title=u'write the code') |
|
31 self.toto = self.req.create_entity('Personne', nom=u'Toto') |
|
32 |
|
33 class ClickAndEditFormTC(ReleditMixinTC, CubicWebTC): |
|
34 |
|
35 def test_default_config(self): |
|
36 reledit = {'title': """<div id="title-subject-917-reledit" onmouseout="jQuery('#title-subject-917').addClass('hidden')" onmouseover="jQuery('#title-subject-917').removeClass('hidden')" class="releditField"><div id="title-subject-917-value" class="editableFieldValue">cubicweb-world-domination</div><div id="title-subject-917" class="editableField hidden"><div id="title-subject-917-update" class="editableField" onclick="cw.reledit.loadInlineEditionForm('base', 917, 'title', 'subject', 'title-subject-917', false, '', '&lt;title not specified&gt;');" title="click to edit this field"><img title="click to edit this field" src="data/pen_icon.png" alt="click to edit this field"/></div></div></div>""", |
|
37 'long_desc': """<div id="long_desc-subject-917-reledit" onmouseout="jQuery('#long_desc-subject-917').addClass('hidden')" onmouseover="jQuery('#long_desc-subject-917').removeClass('hidden')" class="releditField"><div id="long_desc-subject-917-value" class="editableFieldValue"><long_desc not specified></div><div id="long_desc-subject-917" class="editableField hidden"><div id="long_desc-subject-917-add" class="editableField" onclick="cw.reledit.loadInlineEditionForm('edition', 917, 'long_desc', 'subject', 'long_desc-subject-917', false, 'incontext', '&lt;long_desc not specified&gt;');" title="click to add a value"><img title="click to add a value" src="data/plus.png" alt="click to add a value"/></div></div></div>""", |
|
38 'manager': """<div id="manager-subject-917-reledit" onmouseout="jQuery('#manager-subject-917').addClass('hidden')" onmouseover="jQuery('#manager-subject-917').removeClass('hidden')" class="releditField"><div id="manager-subject-917-value" class="editableFieldValue"><manager not specified></div><div id="manager-subject-917" class="editableField hidden"><div id="manager-subject-917-update" class="editableField" onclick="cw.reledit.loadInlineEditionForm('base', 917, 'manager', 'subject', 'manager-subject-917', false, 'incontext', '&lt;manager not specified&gt;');" title="click to edit this field"><img title="click to edit this field" src="data/pen_icon.png" alt="click to edit this field"/></div></div></div>""", |
|
39 'composite_card11_2ttypes': """<composite_card11_2ttypes not specified>""", |
|
40 'concerns': """<concerns_object not specified>"""} |
|
41 |
|
42 for rschema, ttypes, role in self.proj.e_schema.relation_definitions(includefinal=True): |
|
43 if rschema not in reledit: |
|
44 continue |
|
45 rtype = rschema.type |
|
46 self.assertTextEquals(reledit[rtype], self.proj.view('reledit', rtype=rtype, role=role), rtype) |
|
47 |
|
48 def test_default_forms(self): |
|
49 doreledit = {'title': """<div id="title-subject-917-reledit" onmouseout="jQuery('#title-subject-917').addClass('hidden')" onmouseover="jQuery('#title-subject-917').removeClass('hidden')" class="releditField"><div id="title-subject-917-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-917-form" onsubmit="return freezeFormButtons('title-subject-917-form');" class="releditForm" cubicweb:target="eformframe"> |
|
50 <fieldset> |
|
51 <input name="__form_id" type="hidden" value="base" /> |
|
52 <input name="__errorurl" type="hidden" value="http://testing.fr/cubicweb/view?rql=Blop&vid=blop#title-subject-917-form" /> |
|
53 <input name="__domid" type="hidden" value="title-subject-917-form" /> |
|
54 <input name="__type:917" type="hidden" value="Project" /> |
|
55 <input name="eid" type="hidden" value="917" /> |
|
56 <input name="__maineid" type="hidden" value="917" /> |
|
57 <input name="__reledit|default_value" type="hidden" value="&lt;title not specified&gt;" /> |
|
58 <input name="__reledit|vid" type="hidden" value="" /> |
|
59 <input name="__reledit|rtype" type="hidden" value="title" /> |
|
60 <input name="__reledit|divid" type="hidden" value="title-subject-917" /> |
|
61 <input name="__reledit|formid" type="hidden" value="base" /> |
|
62 <input name="__reledit|reload" type="hidden" value="false" /> |
|
63 <input name="__reledit|role" type="hidden" value="subject" /> |
|
64 <input name="__reledit|eid" type="hidden" value="917" /> |
|
65 <input name="_cw_edited_fields:917" type="hidden" value="title-subject,__type" /> |
|
66 <fieldset class="default"> |
|
67 <table class=""> |
|
68 <tr class="title_subject_row"> |
|
69 <td |
|
70 > |
|
71 <input id="title-subject:917" maxlength="32" name="title-subject:917" size="32" tabindex="1" type="text" value="cubicweb-world-domination" /> |
|
72 </td></tr> |
|
73 </table></fieldset> |
|
74 <table class="buttonbar"> |
|
75 <tr> |
|
76 |
|
77 <td><button class="validateButton" tabindex="2" type="submit" value="button_ok"><img alt="OK_ICON" src="http://crater:8080/data/ok.png" />button_ok</button></td> |
|
78 |
|
79 <td><button class="validateButton" onclick="cw.reledit.cleanupAfterCancel('title-subject-917')" tabindex="3" type="button" value="button_cancel"><img alt="CANCEL_ICON" src="http://crater:8080/data/cancel.png" />button_cancel</button></td> |
|
80 |
|
81 </tr></table> |
|
82 </fieldset> |
|
83 </form><div id="title-subject-917" class="editableField hidden"><div id="title-subject-917-update" class="editableField" onclick="cw.reledit.loadInlineEditionForm('base', 917, 'title', 'subject', 'title-subject-917', false, '', '&lt;title not specified&gt;');" title="click to edit this field"><img title="click to edit this field" src="data/pen_icon.png" alt="click to edit this field"/></div></div></div>""", |
|
84 |
|
85 'long_desc': """<div id="long_desc-subject-917-reledit" onmouseout="jQuery('#long_desc-subject-917').addClass('hidden')" onmouseover="jQuery('#long_desc-subject-917').removeClass('hidden')" class="releditField"><div id="long_desc-subject-917-value" class="editableFieldValue"><long_desc 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-917-form" onsubmit="return freezeFormButtons('long_desc-subject-917-form');" class="releditForm" cubicweb:target="eformframe"> |
|
86 <fieldset> |
|
87 <input name="__form_id" type="hidden" value="edition" /> |
|
88 <input name="__errorurl" type="hidden" value="http://testing.fr/cubicweb/view?rql=Blop&vid=blop#long_desc-subject-917-form" /> |
|
89 <input name="__domid" type="hidden" value="long_desc-subject-917-form" /> |
|
90 <input name="__type:A" type="hidden" value="Blog" /> |
|
91 <input name="eid" type="hidden" value="A" /> |
|
92 <input name="__maineid" type="hidden" value="A" /> |
|
93 <input name="__linkto" type="hidden" value="long_desc:917:object" /> |
|
94 <input name="__message" type="hidden" value="entity linked" /> |
|
95 <input name="__reledit|default_value" type="hidden" value="&lt;long_desc not specified&gt;" /> |
|
96 <input name="__reledit|vid" type="hidden" value="incontext" /> |
|
97 <input name="__reledit|rtype" type="hidden" value="long_desc" /> |
|
98 <input name="__reledit|divid" type="hidden" value="long_desc-subject-917" /> |
|
99 <input name="__reledit|formid" type="hidden" value="edition" /> |
|
100 <input name="__reledit|reload" type="hidden" value="false" /> |
|
101 <input name="__reledit|role" type="hidden" value="subject" /> |
|
102 <input name="__reledit|eid" type="hidden" value="917" /> |
|
103 <input name="_cw_edited_fields:A" type="hidden" value="title-subject,rss_url-subject,__type,description-subject" /> |
|
104 <fieldset class="default"> |
|
105 <table class="attributeForm"> |
|
106 <tr class="title_subject_row"> |
|
107 <th class="labelCol"><label class="required" for="title-subject:A">title</label></th> |
|
108 <td |
|
109 > |
|
110 <input id="title-subject:A" maxlength="50" name="title-subject:A" size="45" tabindex="4" type="text" value="" /> |
|
111 </td></tr> |
|
112 <tr class="description_subject_row"> |
|
113 <th class="labelCol"><label for="description-subject:A">description</label></th> |
|
114 <td |
|
115 > |
|
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 > |
|
122 <input id="rss_url-subject:A" maxlength="128" name="rss_url-subject:A" size="45" tabindex="6" type="text" value="" /> |
|
123 </td></tr> |
|
124 </table></fieldset> |
|
125 <table class="buttonbar"> |
|
126 <tr> |
|
127 |
|
128 <td><button class="validateButton" tabindex="7" type="submit" value="button_ok"><img alt="OK_ICON" src="http://crater:8080/data/ok.png" />button_ok</button></td> |
|
129 |
|
130 <td><button class="validateButton" onclick="cw.reledit.cleanupAfterCancel('long_desc-subject-917')" tabindex="8" type="button" value="button_cancel"><img alt="CANCEL_ICON" src="http://crater:8080/data/cancel.png" />button_cancel</button></td> |
|
131 |
|
132 </tr></table> |
|
133 </fieldset> |
|
134 </form><div id="long_desc-subject-917" class="editableField hidden"><div id="long_desc-subject-917-add" class="editableField" onclick="cw.reledit.loadInlineEditionForm('edition', 917, 'long_desc', 'subject', 'long_desc-subject-917', false, 'incontext', '&lt;long_desc not specified&gt;');" title="click to add a value"><img title="click to add a value" src="data/plus.png" alt="click to add a value"/></div></div></div>""", |
|
135 |
|
136 'manager': """<div id="manager-subject-917-reledit" onmouseout="jQuery('#manager-subject-917').addClass('hidden')" onmouseover="jQuery('#manager-subject-917').removeClass('hidden')" class="releditField"><div id="manager-subject-917-value" class="editableFieldValue"><manager 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-917-form" onsubmit="return freezeFormButtons('manager-subject-917-form');" class="releditForm" cubicweb:target="eformframe"> |
|
137 <fieldset> |
|
138 <input name="__form_id" type="hidden" value="base" /> |
|
139 <input name="__errorurl" type="hidden" value="http://testing.fr/cubicweb/view?rql=Blop&vid=blop#manager-subject-917-form" /> |
|
140 <input name="__domid" type="hidden" value="manager-subject-917-form" /> |
|
141 <input name="__type:917" type="hidden" value="Project" /> |
|
142 <input name="eid" type="hidden" value="917" /> |
|
143 <input name="__maineid" type="hidden" value="917" /> |
|
144 <input name="__linkto" type="hidden" value="long_desc:917:object" /> |
|
145 <input name="__message" type="hidden" value="entity linked" /> |
|
146 <input name="__reledit|default_value" type="hidden" value="&lt;manager not specified&gt;" /> |
|
147 <input name="__reledit|vid" type="hidden" value="incontext" /> |
|
148 <input name="__reledit|rtype" type="hidden" value="manager" /> |
|
149 <input name="__reledit|divid" type="hidden" value="manager-subject-917" /> |
|
150 <input name="__reledit|formid" type="hidden" value="base" /> |
|
151 <input name="__reledit|reload" type="hidden" value="false" /> |
|
152 <input name="__reledit|role" type="hidden" value="subject" /> |
|
153 <input name="__reledit|eid" type="hidden" value="917" /> |
|
154 <input name="_cw_edited_fields:917" type="hidden" value="manager-subject,__type" /> |
|
155 <fieldset class="default"> |
|
156 <table class=""> |
|
157 <tr class="manager_subject_row"> |
|
158 <td |
|
159 > |
|
160 <select id="manager-subject:917" name="manager-subject:917" size="1" tabindex="9"> |
|
161 <option value="__cubicweb_internal_field__"></option> |
|
162 <option value="919">Toto</option> |
|
163 </select> |
|
164 </td></tr> |
|
165 </table></fieldset> |
|
166 <table class="buttonbar"> |
|
167 <tr> |
|
168 |
|
169 <td><button class="validateButton" tabindex="10" type="submit" value="button_ok"><img alt="OK_ICON" src="http://crater:8080/data/ok.png" />button_ok</button></td> |
|
170 |
|
171 <td><button class="validateButton" onclick="cw.reledit.cleanupAfterCancel('manager-subject-917')" tabindex="11" type="button" value="button_cancel"><img alt="CANCEL_ICON" src="http://crater:8080/data/cancel.png" />button_cancel</button></td> |
|
172 |
|
173 </tr></table> |
|
174 </fieldset> |
|
175 </form><div id="manager-subject-917" class="editableField hidden"><div id="manager-subject-917-update" class="editableField" onclick="cw.reledit.loadInlineEditionForm('base', 917, 'manager', 'subject', 'manager-subject-917', false, 'incontext', '&lt;manager not specified&gt;');" title="click to edit this field"><img title="click to edit this field" src="data/pen_icon.png" alt="click to edit this field"/></div></div></div>""", |
|
176 'composite_card11_2ttypes': """<composite_card11_2ttypes not specified>""", |
|
177 'concerns': """<concerns_object not specified>""" |
|
178 } |
|
179 for rschema, ttypes, role in self.proj.e_schema.relation_definitions(includefinal=True): |
|
180 if rschema not in doreledit: |
|
181 continue |
|
182 rtype = rschema.type |
|
183 self.assertTextEquals(doreledit[rtype], |
|
184 self.proj.view('doreledit', rtype=rtype, role=role, |
|
185 formid='edition' if rtype == 'long_desc' else 'base'), |
|
186 rtype) |
|
187 |
|
188 class ClickAndEditFormUICFGTC(ReleditMixinTC, CubicWebTC): |
|
189 |
|
190 def setup_database(self): |
|
191 super(ClickAndEditFormUICFGTC, self).setup_database() |
|
192 self.tick.set_relations(concerns=self.proj) |
|
193 self.proj.set_relations(manager=self.toto) |
|
194 |
|
195 def test_with_uicfg(self): |
|
196 old_rctl = reledit_ctrl._tagdefs.copy() |
|
197 reledit_ctrl.tag_attribute(('Project', 'title'), |
|
198 {'default_value': '<title is required>', 'reload': True}) |
|
199 reledit_ctrl.tag_subject_of(('Project', 'long_desc', '*'), |
|
200 {'reload': True, 'edit_target': 'rtype', |
|
201 'default_value': u'<long_desc is required>'}) |
|
202 reledit_ctrl.tag_subject_of(('Project', 'manager', '*'), |
|
203 {'edit_target': 'related'}) |
|
204 reledit_ctrl.tag_subject_of(('Project', 'composite_card11_2ttypes', '*'), |
|
205 {'edit_target': 'related'}) |
|
206 reledit_ctrl.tag_object_of(('Ticket', 'concerns', 'Project'), |
|
207 {'edit_target': 'rtype'}) |
|
208 reledit = { |
|
209 'title': """<div id="title-subject-917-reledit" onmouseout="jQuery('#title-subject-917').addClass('hidden')" onmouseover="jQuery('#title-subject-917').removeClass('hidden')" class="releditField"><div id="title-subject-917-value" class="editableFieldValue">cubicweb-world-domination</div><div id="title-subject-917" class="editableField hidden"><div id="title-subject-917-update" class="editableField" onclick="cw.reledit.loadInlineEditionForm('base', 917, 'title', 'subject', 'title-subject-917', true, '', '<title is required>');" title="click to edit this field"><img title="click to edit this field" src="data/pen_icon.png" alt="click to edit this field"/></div></div></div>""", |
|
210 'long_desc': """<div id="long_desc-subject-917-reledit" onmouseout="jQuery('#long_desc-subject-917').addClass('hidden')" onmouseover="jQuery('#long_desc-subject-917').removeClass('hidden')" class="releditField"><div id="long_desc-subject-917-value" class="editableFieldValue"><long_desc is required></div><div id="long_desc-subject-917" class="editableField hidden"><div id="long_desc-subject-917-update" class="editableField" onclick="cw.reledit.loadInlineEditionForm('base', 917, 'long_desc', 'subject', 'long_desc-subject-917', true, 'incontext', '<long_desc is required>');" title="click to edit this field"><img title="click to edit this field" src="data/pen_icon.png" alt="click to edit this field"/></div></div></div>""", |
|
211 'manager': """<div id="manager-subject-917-reledit" onmouseout="jQuery('#manager-subject-917').addClass('hidden')" onmouseover="jQuery('#manager-subject-917').removeClass('hidden')" class="releditField"><div id="manager-subject-917-value" class="editableFieldValue"><a href="http://testing.fr/cubicweb/personne/919" title="">Toto</a></div><div id="manager-subject-917" class="editableField hidden"><div id="manager-subject-917-update" class="editableField" onclick="cw.reledit.loadInlineEditionForm('edition', 917, 'manager', 'subject', 'manager-subject-917', false, 'incontext', '&lt;manager not specified&gt;');" title="click to edit this field"><img title="click to edit this field" src="data/pen_icon.png" alt="click to edit this field"/></div><div id="manager-subject-917-delete" class="editableField" onclick="cw.reledit.loadInlineEditionForm('deleteconf', 917, 'manager', 'subject', 'manager-subject-917', false, 'incontext', '&lt;manager not specified&gt;');" title="click to delete this value"><img title="click to delete this value" src="data/cancel.png" alt="click to delete this value"/></div></div></div>""", |
|
212 'composite_card11_2ttypes': """<composite_card11_2ttypes not specified>""", |
|
213 'concerns': """<div id="concerns-object-917-reledit" onmouseout="jQuery('#concerns-object-917').addClass('hidden')" onmouseover="jQuery('#concerns-object-917').removeClass('hidden')" class="releditField"><div id="concerns-object-917-value" class="editableFieldValue"><a href="http://testing.fr/cubicweb/ticket/918" title="">write the code</a></div><div id="concerns-object-917" class="editableField hidden"><div id="concerns-object-917-update" class="editableField" onclick="cw.reledit.loadInlineEditionForm('base', 917, 'concerns', 'object', 'concerns-object-917', false, 'csv', '&lt;concerns_object not specified&gt;');" title="click to edit this field"><img title="click to edit this field" src="data/pen_icon.png" alt="click to edit this field"/></div></div></div>""" |
|
214 } |
|
215 for rschema, ttypes, role in self.proj.e_schema.relation_definitions(includefinal=True): |
|
216 if rschema not in reledit: |
|
217 continue |
|
218 rtype = rschema.type |
|
219 self.assertTextEquals(reledit[rtype], |
|
220 self.proj.view('reledit', rtype=rtype, role=role), |
|
221 rtype) |
|
222 reledit_ctrl.clear() |
|
223 reledit_ctrl._tagdefs.update(old_rctl) |