author | Sylvain Thénault <sylvain.thenault@logilab.fr> |
Tue, 24 Nov 2009 17:27:10 +0100 | |
branch | stable |
changeset 3916 | 6e7af0e8e524 |
parent 3880 | 88fc53eb5b5f |
child 3890 | d7a270f50f54 |
child 3927 | b2a6c25b8429 |
permissions | -rw-r--r-- |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
1 |
"""Set of HTML automatic forms to create, delete, copy or edit a single entity |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
2 |
or a list of entities of the same type |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
3 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
4 |
:organization: Logilab |
1977
606923dff11b
big bunch of copyright / docstring update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1965
diff
changeset
|
5 |
:copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2. |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
6 |
:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr |
1977
606923dff11b
big bunch of copyright / docstring update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1965
diff
changeset
|
7 |
:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
8 |
""" |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
9 |
__docformat__ = "restructuredtext en" |
1965 | 10 |
_ = unicode |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
11 |
|
1147 | 12 |
from copy import copy |
13 |
||
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
14 |
from simplejson import dumps |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
15 |
|
2312
af4d8f75c5db
use xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2247
diff
changeset
|
16 |
from logilab.mtconverter import xml_escape |
3518
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
17 |
from logilab.common.decorators import cached |
1147 | 18 |
|
3532
df045bc51d00
[inlined forms] nicer add_hiddens implementation relying on standard entity forms handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3518
diff
changeset
|
19 |
from cubicweb import neg_role |
1147 | 20 |
from cubicweb.selectors import (match_kwargs, one_line_rset, non_final_entity, |
21 |
specified_etype_implements, yes) |
|
1132 | 22 |
from cubicweb.view import EntityView |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
23 |
from cubicweb.common import tags |
3744
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
24 |
from cubicweb.web import stdmsgs, eid_param |
3078
186ccbe0ba3f
missing import
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3077
diff
changeset
|
25 |
from cubicweb.web import uicfg |
2672
c66f52d44394
[reledit] don't try to use rel-edit on attributes without assicated fields (e.g _format field)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2576
diff
changeset
|
26 |
from cubicweb.web.form import FormViewMixIn, FieldNotFound |
2328
206735882b8e
[reledit] use guess_field, thus fixing select widget lacking a multiple attr. in case of * cardinality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2327
diff
changeset
|
27 |
from cubicweb.web.formfields import guess_field |
206735882b8e
[reledit] use guess_field, thus fixing select widget lacking a multiple attr. in case of * cardinality
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2327
diff
changeset
|
28 |
from cubicweb.web.formwidgets import Button, SubmitButton, ResetButton |
2005
e8032965f37a
turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1995
diff
changeset
|
29 |
from cubicweb.web.views import forms |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
1459
diff
changeset
|
30 |
|
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
31 |
|
1147 | 32 |
def relation_id(eid, rtype, role, reid): |
33 |
"""return an identifier for a relation between two entities""" |
|
34 |
if role == 'subject': |
|
35 |
return u'%s:%s:%s' % (eid, rtype, reid) |
|
36 |
return u'%s:%s:%s' % (reid, rtype, eid) |
|
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
37 |
|
1528
864ae7c15ef5
other fixlets
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
1498
diff
changeset
|
38 |
def toggleable_relation_link(eid, nodeid, label='x'): |
1147 | 39 |
"""return javascript snippet to delete/undelete a relation between two |
40 |
entities |
|
41 |
""" |
|
1320 | 42 |
js = u"javascript: togglePendingDelete('%s', %s);" % ( |
2312
af4d8f75c5db
use xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2247
diff
changeset
|
43 |
nodeid, xml_escape(dumps(eid))) |
1320 | 44 |
return u'[<a class="handle" href="%s" id="handle%s">%s</a>]' % ( |
45 |
js, nodeid, label) |
|
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
46 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
47 |
|
2572
58556f9317c9
[notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2538
diff
changeset
|
48 |
class DeleteConfForm(forms.CompositeForm): |
58556f9317c9
[notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2538
diff
changeset
|
49 |
id = 'deleteconf' |
58556f9317c9
[notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2538
diff
changeset
|
50 |
__select__ = non_final_entity() |
58556f9317c9
[notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2538
diff
changeset
|
51 |
|
58556f9317c9
[notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2538
diff
changeset
|
52 |
domid = 'deleteconf' |
58556f9317c9
[notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2538
diff
changeset
|
53 |
copy_nav_params = True |
3803
414bb8439002
[web ui] decorate form buttons with icons (at last)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3800
diff
changeset
|
54 |
form_buttons = [Button(stdmsgs.BUTTON_DELETE, cwaction='delete'), |
414bb8439002
[web ui] decorate form buttons with icons (at last)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3800
diff
changeset
|
55 |
Button(stdmsgs.BUTTON_CANCEL, cwaction='cancel')] |
2572
58556f9317c9
[notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2538
diff
changeset
|
56 |
@property |
58556f9317c9
[notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2538
diff
changeset
|
57 |
def action(self): |
58556f9317c9
[notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2538
diff
changeset
|
58 |
return self.build_url('edit') |
58556f9317c9
[notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2538
diff
changeset
|
59 |
|
58556f9317c9
[notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2538
diff
changeset
|
60 |
def __init__(self, *args, **kwargs): |
58556f9317c9
[notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2538
diff
changeset
|
61 |
super(DeleteConfForm, self).__init__(*args, **kwargs) |
58556f9317c9
[notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2538
diff
changeset
|
62 |
done = set() |
58556f9317c9
[notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2538
diff
changeset
|
63 |
for entity in self.rset.entities(): |
58556f9317c9
[notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2538
diff
changeset
|
64 |
if entity.eid in done: |
58556f9317c9
[notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2538
diff
changeset
|
65 |
continue |
58556f9317c9
[notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2538
diff
changeset
|
66 |
done.add(entity.eid) |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2576
diff
changeset
|
67 |
subform = self.vreg['forms'].select('base', self.req, entity=entity, |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2576
diff
changeset
|
68 |
mainform=False) |
3513
c002f6488631
[form] replace is_subform by parent_form, carrying more information at the same cost
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3355
diff
changeset
|
69 |
self.add_subform(subform) |
2572
58556f9317c9
[notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2538
diff
changeset
|
70 |
|
58556f9317c9
[notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2538
diff
changeset
|
71 |
|
58556f9317c9
[notification view] consider row/col
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2538
diff
changeset
|
72 |
class DeleteConfFormView(FormViewMixIn, EntityView): |
1147 | 73 |
"""form used to confirm deletion of some entities""" |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
74 |
id = 'deleteconf' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
75 |
title = _('delete') |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
76 |
# don't use navigation, all entities asked to be deleted should be displayed |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
77 |
# else we will only delete the displayed page |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
78 |
need_navigation = False |
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
79 |
|
1852
f04da596da6c
give back onsubmit customizability (oops)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
1847
diff
changeset
|
80 |
def call(self, onsubmit=None): |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
81 |
"""ask for confirmation before real deletion""" |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
82 |
req, w = self.req, self.w |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
83 |
_ = req._ |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
84 |
w(u'<script type="text/javascript">updateMessage(\'%s\');</script>\n' |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
85 |
% _('this action is not reversible!')) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
86 |
# XXX above message should have style of a warning |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
87 |
w(u'<h4>%s</h4>\n' % _('Do you want to delete the following element(s) ?')) |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2576
diff
changeset
|
88 |
form = self.vreg['forms'].select(self.id, req, rset=self.rset, |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2576
diff
changeset
|
89 |
onsubmit=onsubmit) |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
90 |
w(u'<ul>\n') |
1147 | 91 |
for entity in self.rset.entities(): |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
92 |
# don't use outofcontext view or any other that may contain inline edition form |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
93 |
w(u'<li>%s</li>' % tags.a(entity.view('textoutofcontext'), |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
94 |
href=entity.absolute_url())) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
95 |
w(u'</ul>\n') |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
96 |
w(form.form_render()) |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
97 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
98 |
|
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1313
diff
changeset
|
99 |
class ClickAndEditFormView(FormViewMixIn, EntityView): |
2686 | 100 |
"""form used to permit ajax edition of a relation or attribute of an entity |
101 |
in a view, if logged user have the permission to edit it. |
|
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
102 |
|
2686 | 103 |
(double-click on the field to see an appropriate edition widget). |
1147 | 104 |
""" |
2679
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
105 |
id = 'doreledit' |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
106 |
__select__ = non_final_entity() & match_kwargs('rtype') |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
107 |
# FIXME editableField class could be toggleable from userprefs |
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
108 |
|
2504
f28b1ffc3c91
some reledit fixes: actually needs metadata in form's attrcategories, check autoform_section for attributes (XXX need check for relation), no <not specified> visible when attribute isn't editable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2484
diff
changeset
|
109 |
# add metadata to allow edition of metadata attributes (not considered by |
f28b1ffc3c91
some reledit fixes: actually needs metadata in form's attrcategories, check autoform_section for attributes (XXX need check for relation), no <not specified> visible when attribute isn't editable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2484
diff
changeset
|
110 |
# edition form by default) |
f28b1ffc3c91
some reledit fixes: actually needs metadata in form's attrcategories, check autoform_section for attributes (XXX need check for relation), no <not specified> visible when attribute isn't editable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2484
diff
changeset
|
111 |
attrcategories = ('primary', 'secondary', 'metadata') |
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
112 |
|
2365
9f5e911eab07
[reledit] allow composite edition if the composite is object
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2361
diff
changeset
|
113 |
_onclick = u"showInlineEditionForm(%(eid)s, '%(rtype)s', '%(divid)s')" |
3742
20f429eb5f46
kill separate attribute client-side handling #473636
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3689
diff
changeset
|
114 |
_onsubmit = ("return inlineValidateRelationForm('%(rtype)s', '%(role)s', '%(eid)s', " |
20f429eb5f46
kill separate attribute client-side handling #473636
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3689
diff
changeset
|
115 |
"'%(divid)s', %(reload)s, '%(vid)s', '%(default)s', '%(lzone)s');") |
20f429eb5f46
kill separate attribute client-side handling #473636
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3689
diff
changeset
|
116 |
_cancelclick = "hideInlineEdit(%s,\'%s\',\'%s\')" |
3800
2d951200f898
[web ui] fix the editable fields: better look and behaviour.
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3793
diff
changeset
|
117 |
_defaultlandingzone = (u'<img title="%(msg)s" src="data/pen_icon.png" ' |
2484
7e9283731db8
[reledit] a nicer icon
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2483
diff
changeset
|
118 |
'alt="%(msg)s"/>') |
2335
b78249be8a4b
[reledit] fix reload type (was a string), use simple clicks instead of doubles
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2334
diff
changeset
|
119 |
_landingzonemsg = _('click to edit this field') |
2332
b04d80f19075
[reledit] try to be smart at getting a good default vid for relations, factor computing cardinality from reledit and formfields
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2331
diff
changeset
|
120 |
# default relation vids according to cardinality |
b04d80f19075
[reledit] try to be smart at getting a good default vid for relations, factor computing cardinality from reledit and formfields
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2331
diff
changeset
|
121 |
_one_rvid = 'incontext' |
b04d80f19075
[reledit] try to be smart at getting a good default vid for relations, factor computing cardinality from reledit and formfields
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2331
diff
changeset
|
122 |
_many_rvid = 'csv' |
b04d80f19075
[reledit] try to be smart at getting a good default vid for relations, factor computing cardinality from reledit and formfields
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2331
diff
changeset
|
123 |
|
2679
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
124 |
|
2329
8b5a1af6dc35
[reledit] small cleanup and add escape param to control xml_escapability of the value, also rename vid arg which clashes with entity.view(...) args
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2328
diff
changeset
|
125 |
def cell_call(self, row, col, rtype=None, role='subject', |
2336
a15d3f54f0f2
[reledit] left in by accident
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2335
diff
changeset
|
126 |
reload=False, # controls reloading the whole page after change |
2679
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
127 |
rvid=None, # vid to be applied to other side of rtype (non final relations only) |
2332
b04d80f19075
[reledit] try to be smart at getting a good default vid for relations, factor computing cardinality from reledit and formfields
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2331
diff
changeset
|
128 |
default=None, # default value |
b04d80f19075
[reledit] try to be smart at getting a good default vid for relations, factor computing cardinality from reledit and formfields
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2331
diff
changeset
|
129 |
landing_zone=None # prepend value with a separate html element to click onto |
b04d80f19075
[reledit] try to be smart at getting a good default vid for relations, factor computing cardinality from reledit and formfields
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2331
diff
changeset
|
130 |
# (esp. needed when values are links) |
2329
8b5a1af6dc35
[reledit] small cleanup and add escape param to control xml_escapability of the value, also rename vid arg which clashes with entity.view(...) args
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2328
diff
changeset
|
131 |
): |
2371
76bf522c27be
[reledit] simplify, fixing #344545
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2365
diff
changeset
|
132 |
"""display field to edit entity's `rtype` relation on click""" |
2329
8b5a1af6dc35
[reledit] small cleanup and add escape param to control xml_escapability of the value, also rename vid arg which clashes with entity.view(...) args
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2328
diff
changeset
|
133 |
assert rtype |
3742
20f429eb5f46
kill separate attribute client-side handling #473636
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3689
diff
changeset
|
134 |
assert role in ('subject', 'object'), '%s is not an acceptable role value' % role |
3744
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
135 |
self.req.add_js('cubicweb.edition.js') |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
136 |
self.req.add_css('cubicweb.form.css') |
2371
76bf522c27be
[reledit] simplify, fixing #344545
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2365
diff
changeset
|
137 |
if default is None: |
76bf522c27be
[reledit] simplify, fixing #344545
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2365
diff
changeset
|
138 |
default = xml_escape(self.req._('<no value>')) |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
139 |
entity = self.entity(row, col) |
2332
b04d80f19075
[reledit] try to be smart at getting a good default vid for relations, factor computing cardinality from reledit and formfields
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2331
diff
changeset
|
140 |
rschema = entity.schema.rschema(rtype) |
2482
dead2d56f711
[reledit] attributes : have a laning zone after all (less intrusive), fix likely bug of relation edition
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2392
diff
changeset
|
141 |
lzone = self._build_landing_zone(landing_zone) |
2333
1de22d3e985b
[reledit] landing zone useful only for relations; cleanup
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2332
diff
changeset
|
142 |
# compute value, checking perms, build form |
3689
deb13e88e037
follow yams 0.25 api changes to improve performance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3643
diff
changeset
|
143 |
if rschema.final: |
3744
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
144 |
form = self._build_form(entity, rtype, role, 'edition', default, reload, lzone, |
3742
20f429eb5f46
kill separate attribute client-side handling #473636
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3689
diff
changeset
|
145 |
attrcategories=self.attrcategories) |
2679
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
146 |
if not self.should_edit_attribute(entity, rschema, role, form): |
3643 | 147 |
self.w(entity.printable_value(rtype)) |
2224
52041b014949
fix #344046 and #344322: check relation permission, set to default when edition allowed and no value (for final *and* non final relations)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2049
diff
changeset
|
148 |
return |
2679
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
149 |
value = entity.printable_value(rtype) or default |
3742
20f429eb5f46
kill separate attribute client-side handling #473636
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3689
diff
changeset
|
150 |
self.relation_form(lzone, value, form, |
20f429eb5f46
kill separate attribute client-side handling #473636
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3689
diff
changeset
|
151 |
self._build_renderer(entity, rtype, role)) |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
152 |
else: |
2679
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
153 |
if rvid is None: |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
154 |
rvid = self._compute_best_vid(entity.e_schema, rschema, role) |
1579 | 155 |
rset = entity.related(rtype, role) |
2504
f28b1ffc3c91
some reledit fixes: actually needs metadata in form's attrcategories, check autoform_section for attributes (XXX need check for relation), no <not specified> visible when attribute isn't editable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2484
diff
changeset
|
156 |
if rset: |
f28b1ffc3c91
some reledit fixes: actually needs metadata in form's attrcategories, check autoform_section for attributes (XXX need check for relation), no <not specified> visible when attribute isn't editable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2484
diff
changeset
|
157 |
value = self.view(rvid, rset) |
f28b1ffc3c91
some reledit fixes: actually needs metadata in form's attrcategories, check autoform_section for attributes (XXX need check for relation), no <not specified> visible when attribute isn't editable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2484
diff
changeset
|
158 |
else: |
f28b1ffc3c91
some reledit fixes: actually needs metadata in form's attrcategories, check autoform_section for attributes (XXX need check for relation), no <not specified> visible when attribute isn't editable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2484
diff
changeset
|
159 |
value = default |
3636
9b16e7b6ba35
[reledit] display value anyway when should not edit attribute/relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3627
diff
changeset
|
160 |
if not self.should_edit_relation(entity, rschema, role, rvid): |
9b16e7b6ba35
[reledit] display value anyway when should not edit attribute/relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3627
diff
changeset
|
161 |
if rset: |
9b16e7b6ba35
[reledit] display value anyway when should not edit attribute/relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3627
diff
changeset
|
162 |
self.w(value) |
9b16e7b6ba35
[reledit] display value anyway when should not edit attribute/relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3627
diff
changeset
|
163 |
return |
3744
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
164 |
form = self._build_form(entity, rtype, role, 'base', default, reload, lzone, |
3742
20f429eb5f46
kill separate attribute client-side handling #473636
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3689
diff
changeset
|
165 |
dict(vid=rvid, lzone=lzone)) |
2679
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
166 |
field = guess_field(entity.e_schema, entity.schema.rschema(rtype), role) |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
167 |
form.append_field(field) |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
168 |
self.relation_form(lzone, value, form, |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
169 |
self._build_renderer(entity, rtype, role)) |
2365
9f5e911eab07
[reledit] allow composite edition if the composite is object
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2361
diff
changeset
|
170 |
|
2679
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
171 |
def should_edit_attribute(self, entity, rschema, role, form): |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
172 |
rtype = str(rschema) |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
173 |
ttype = rschema.targets(entity.id, role)[0] |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
174 |
afs = uicfg.autoform_section.etype_get(entity.id, rtype, role, ttype) |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
175 |
if not (afs in self.attrcategories and entity.has_perm('update')): |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
176 |
return False |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
177 |
try: |
3744
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
178 |
form.field_by_name(rtype, role) |
2679
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
179 |
except FieldNotFound: |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
180 |
return False |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
181 |
return True |
1759
61d026ced19f
preliminary support for inline edition of relations
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
1750
diff
changeset
|
182 |
|
2679
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
183 |
def should_edit_relation(self, entity, rschema, role, rvid): |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
184 |
if ((role == 'subject' and not rschema.has_perm(self.req, 'add', |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
185 |
fromeid=entity.eid)) |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
186 |
or |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
187 |
(role == 'object' and not rschema.has_perm(self.req, 'add', |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
188 |
toeid=entity.eid))): |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
189 |
return False |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
190 |
return True |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
191 |
|
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
192 |
def relation_form(self, lzone, value, form, renderer): |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
193 |
"""xxx-reledit div (class=field) |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
194 |
+-xxx div (class="editableField") |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
195 |
| +-landing zone |
3767
03924de0014d
reledit: stuff the value into its own div and properly hide it when necessary (but dont lump it with the landingzone div for it switches the form on when one clicks on a value to traverse it)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3761
diff
changeset
|
196 |
+-xxx-value div |
03924de0014d
reledit: stuff the value into its own div and properly hide it when necessary (but dont lump it with the landingzone div for it switches the form on when one clicks on a value to traverse it)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3761
diff
changeset
|
197 |
+-xxx-form div |
2679
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
198 |
""" |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
199 |
w = self.w |
3767
03924de0014d
reledit: stuff the value into its own div and properly hide it when necessary (but dont lump it with the landingzone div for it switches the form on when one clicks on a value to traverse it)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3761
diff
changeset
|
200 |
divid = form.event_args['divid'] |
3800
2d951200f898
[web ui] fix the editable fields: better look and behaviour.
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3793
diff
changeset
|
201 |
w(u'<div id="%s-reledit" class="field" ' |
2d951200f898
[web ui] fix the editable fields: better look and behaviour.
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3793
diff
changeset
|
202 |
u'onmouseout="addElementClass(jQuery(\'#%s\'), \'hidden\')" ' |
2d951200f898
[web ui] fix the editable fields: better look and behaviour.
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3793
diff
changeset
|
203 |
u'onmouseover="removeElementClass(jQuery(\'#%s\'), \'hidden\')">' |
2d951200f898
[web ui] fix the editable fields: better look and behaviour.
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3793
diff
changeset
|
204 |
% (divid, divid, divid)) |
2d951200f898
[web ui] fix the editable fields: better look and behaviour.
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3793
diff
changeset
|
205 |
w(u'<div id="%s-value" class="editableFieldValue">%s</div>' % (divid, value)) |
2d951200f898
[web ui] fix the editable fields: better look and behaviour.
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3793
diff
changeset
|
206 |
w(form.form_render(renderer=renderer)) |
2d951200f898
[web ui] fix the editable fields: better look and behaviour.
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
3793
diff
changeset
|
207 |
w(u'<div id="%s" class="editableField hidden" onclick="%s" title="%s">' % ( |
3767
03924de0014d
reledit: stuff the value into its own div and properly hide it when necessary (but dont lump it with the landingzone div for it switches the form on when one clicks on a value to traverse it)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3761
diff
changeset
|
208 |
divid, xml_escape(self._onclick % form.event_args), |
3761
2c3b72faf05d
small cleanup & revert to less intrusive icon
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3760
diff
changeset
|
209 |
self.req._(self._landingzonemsg))) |
2c3b72faf05d
small cleanup & revert to less intrusive icon
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3760
diff
changeset
|
210 |
w(lzone) |
3760
9d93faa0e6dc
actually hide the value when editing, cleanup spurious arg
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3756
diff
changeset
|
211 |
w(u'</div>') |
2482
dead2d56f711
[reledit] attributes : have a laning zone after all (less intrusive), fix likely bug of relation edition
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
2392
diff
changeset
|
212 |
w(u'</div>') |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
213 |
|
3745
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
214 |
def _compute_best_vid(self, eschema, rschema, role): |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
215 |
if eschema.cardinality(rschema, role) in '+*': |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
216 |
return self._many_rvid |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
217 |
return self._one_rvid |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
218 |
|
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
219 |
def _build_landing_zone(self, lzone): |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
220 |
return lzone or self._defaultlandingzone % {'msg' : xml_escape(self.req._(self._landingzonemsg))} |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
221 |
|
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
222 |
def _build_renderer(self, entity, rtype, role): |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
223 |
return self.vreg['formrenderers'].select( |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
224 |
'base', self.req, entity=entity, display_label=False, |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
225 |
display_help=False, display_fields=[(rtype, role)], table_class='', |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
226 |
button_bar_class='buttonbar', display_progress_div=False) |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
227 |
|
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
228 |
def _build_args(self, entity, rtype, role, formid, default, reload, lzone, |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
229 |
extradata=None): |
3748
7143198dd8a4
node ids shall not begin with a number
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3745
diff
changeset
|
230 |
divid = '%s-%s-%s' % (rtype, role, entity.eid) |
3745
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
231 |
event_args = {'divid' : divid, 'eid' : entity.eid, 'rtype' : rtype, |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
232 |
'reload' : dumps(reload), 'default' : default, 'role' : role, 'vid' : u'', |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
233 |
'lzone' : lzone} |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
234 |
if extradata: |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
235 |
event_args.update(extradata) |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
236 |
return divid, event_args |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
237 |
|
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
238 |
def _build_form(self, entity, rtype, role, formid, default, reload, lzone, |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
239 |
extradata=None, **formargs): |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
240 |
divid, event_args = self._build_args(entity, rtype, role, formid, default, |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
241 |
reload, lzone, extradata) |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
242 |
onsubmit = self._onsubmit % event_args |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
243 |
cancelclick = self._cancelclick % (entity.eid, rtype, divid) |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
244 |
form = self.vreg['forms'].select( |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
245 |
formid, self.req, entity=entity, domid='%s-form' % divid, |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
246 |
cssstyle='display: none', onsubmit=onsubmit, action='#', |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
247 |
form_buttons=[SubmitButton(), Button(stdmsgs.BUTTON_CANCEL, |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
248 |
onclick=cancelclick)], |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
249 |
**formargs) |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
250 |
form.event_args = event_args |
006c81b94ec5
move these definitions below cell_call
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3744
diff
changeset
|
251 |
return form |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
252 |
|
3744
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
253 |
class DummyForm(object): |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
254 |
__slots__ = ('event_args',) |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
255 |
def form_render(self, **_args): |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
256 |
return u'' |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
257 |
def append_field(self, *args): |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
258 |
pass |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
259 |
|
2679
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
260 |
class AutoClickAndEditFormView(ClickAndEditFormView): |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
261 |
"""same as ClickAndEditFormView but checking if the view *should* be applied |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
262 |
by checking uicfg configuration and composite relation property. |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
263 |
""" |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
264 |
id = 'reledit' |
3760
9d93faa0e6dc
actually hide the value when editing, cleanup spurious arg
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3756
diff
changeset
|
265 |
_onclick = (u"loadInlineEditionForm(%(eid)s, '%(rtype)s', '%(role)s', " |
3744
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
266 |
"'%(divid)s', %(reload)s, '%(vid)s', '%(default)s', '%(lzone)s');") |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
267 |
|
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
268 |
def should_edit_attribute(self, entity, rschema, role, _form): |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
269 |
rtype = str(rschema) |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
270 |
ttype = rschema.targets(entity.id, role)[0] |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
271 |
afs = uicfg.autoform_section.etype_get(entity.id, rtype, role, ttype) |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
272 |
if not (afs in self.attrcategories and entity.has_perm('update')): |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
273 |
return False |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
274 |
return True |
2679
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
275 |
|
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
276 |
def should_edit_relation(self, entity, rschema, role, rvid): |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
277 |
eschema = entity.e_schema |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
278 |
rtype = str(rschema) |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
279 |
# XXX check autoform_section. what if 'generic'? |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
280 |
dispctrl = uicfg.primaryview_display_ctrl.etype_get(eschema, rtype, role) |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
281 |
vid = dispctrl.get('vid', 'reledit') |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
282 |
if vid != 'reledit': # reledit explicitly disabled |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
283 |
return False |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
284 |
if eschema.role_rproperty(role, rschema, 'composite') == role: |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
285 |
return False |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
286 |
return super(AutoClickAndEditFormView, self).should_edit_relation( |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
287 |
entity, rschema, role, rvid) |
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
288 |
|
3744
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
289 |
def _build_form(self, entity, rtype, role, formid, default, reload, lzone, |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
290 |
extradata=None, **formargs): |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
291 |
_divid, event_args = self._build_args(entity, rtype, role, formid, default, |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
292 |
reload, lzone, extradata) |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
293 |
form = DummyForm() |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
294 |
form.event_args = event_args |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
295 |
return form |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
296 |
|
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
297 |
def _build_renderer(self, entity, rtype, role): |
767b5d0cd3cc
reledit: load actual edition form on demand #471799
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
3742
diff
changeset
|
298 |
pass |
2679
3fa8c0cec760
[reledit] refactor, split into reledit/doreledit where the former try to tell if edition *should* be done, and the later tell if edition *can* be done
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2678
diff
changeset
|
299 |
|
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1313
diff
changeset
|
300 |
class EditionFormView(FormViewMixIn, EntityView): |
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
301 |
"""display primary entity edition form""" |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
302 |
id = 'edition' |
1147 | 303 |
# add yes() so it takes precedence over deprecated views in baseforms, |
304 |
# though not baseforms based customized view |
|
305 |
__select__ = one_line_rset() & non_final_entity() & yes() |
|
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
306 |
|
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
307 |
title = _('edition') |
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
308 |
|
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
309 |
def cell_call(self, row, col, **kwargs): |
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
310 |
entity = self.complete_entity(row, col) |
1147 | 311 |
self.render_form(entity) |
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
312 |
|
1147 | 313 |
def render_form(self, entity): |
314 |
"""fetch and render the form""" |
|
315 |
self.form_title(entity) |
|
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2576
diff
changeset
|
316 |
form = self.vreg['forms'].select('edition', self.req, rset=entity.rset, |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2576
diff
changeset
|
317 |
row=entity.row, col=entity.col, entity=entity, |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2576
diff
changeset
|
318 |
submitmsg=self.submited_message()) |
1147 | 319 |
self.init_form(form, entity) |
1995
ec95eaa2b711
turn renderers into appobjects
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
320 |
self.w(form.form_render(formvid=u'edition')) |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
321 |
|
1147 | 322 |
def init_form(self, form, entity): |
323 |
"""customize your form before rendering here""" |
|
2049
b9baedffeb8b
set __maineid in EntityFieldsForm
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2048
diff
changeset
|
324 |
pass |
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
325 |
|
1147 | 326 |
def form_title(self, entity): |
327 |
"""the form view title""" |
|
328 |
ptitle = self.req._(self.title) |
|
329 |
self.w(u'<div class="formTitle"><span>%s %s</span></div>' % ( |
|
330 |
entity.dc_type(), ptitle and '(%s)' % ptitle)) |
|
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
331 |
|
1147 | 332 |
def submited_message(self): |
333 |
"""return the message that will be displayed on successful edition""" |
|
334 |
return self.req._('entity edited') |
|
335 |
||
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
336 |
|
1147 | 337 |
class CreationFormView(EditionFormView): |
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
338 |
"""display primary entity creation form""" |
1147 | 339 |
id = 'creation' |
340 |
__select__ = specified_etype_implements('Any') & yes() |
|
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
341 |
|
1147 | 342 |
title = _('creation') |
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
343 |
|
1147 | 344 |
def call(self, **kwargs): |
345 |
"""creation view for an entity""" |
|
3346
b1fd9d4ef579
fix case insensitive selector for entity creation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3331
diff
changeset
|
346 |
# at this point we know etype is a valid entity type, thanks to our |
b1fd9d4ef579
fix case insensitive selector for entity creation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3331
diff
changeset
|
347 |
# selector |
1147 | 348 |
etype = kwargs.pop('etype', self.req.form.get('etype')) |
3077
6c92323667a6
case insensitive add/XXX url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3062
diff
changeset
|
349 |
entity = self.vreg['etypes'].etype_class(etype)(self.req) |
6c92323667a6
case insensitive add/XXX url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3062
diff
changeset
|
350 |
self.initialize_varmaker() |
6c92323667a6
case insensitive add/XXX url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3062
diff
changeset
|
351 |
entity.eid = self.varmaker.next() |
6c92323667a6
case insensitive add/XXX url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3062
diff
changeset
|
352 |
self.render_form(entity) |
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
353 |
|
1147 | 354 |
def form_title(self, entity): |
355 |
"""the form view title""" |
|
356 |
if '__linkto' in self.req.form: |
|
357 |
if isinstance(self.req.form['__linkto'], list): |
|
358 |
# XXX which one should be considered (case: add a ticket to a |
|
359 |
# version in jpl) |
|
360 |
rtype, linkto_eid, role = self.req.form['__linkto'][0].split(':') |
|
361 |
else: |
|
362 |
rtype, linkto_eid, role = self.req.form['__linkto'].split(':') |
|
363 |
linkto_rset = self.req.eid_rset(linkto_eid) |
|
364 |
linkto_type = linkto_rset.description[0][0] |
|
365 |
if role == 'subject': |
|
366 |
title = self.req.__('creating %s (%s %s %s %%(linkto)s)' % ( |
|
367 |
entity.e_schema, entity.e_schema, rtype, linkto_type)) |
|
368 |
else: |
|
369 |
title = self.req.__('creating %s (%s %%(linkto)s %s %s)' % ( |
|
370 |
entity.e_schema, linkto_type, rtype, entity.e_schema)) |
|
371 |
msg = title % {'linkto' : self.view('incontext', linkto_rset)} |
|
372 |
self.w(u'<div class="formTitle notransform"><span>%s</span></div>' % msg) |
|
373 |
else: |
|
374 |
super(CreationFormView, self).form_title(entity) |
|
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
375 |
|
1147 | 376 |
def url(self): |
377 |
"""return the url associated with this view""" |
|
378 |
return self.create_url(self.req.form.get('etype')) |
|
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
379 |
|
1147 | 380 |
def submited_message(self): |
381 |
"""return the message that will be displayed on successful edition""" |
|
382 |
return self.req._('entity created') |
|
383 |
||
384 |
||
385 |
class CopyFormView(EditionFormView): |
|
386 |
"""display primary entity creation form initialized with values from another |
|
387 |
entity |
|
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
388 |
""" |
1147 | 389 |
id = 'copy' |
3627
70dbba754c11
fix title of CopyFormView
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
3586
diff
changeset
|
390 |
title = _('copy') |
3062
a8e901fc4457
ease overriding of copy warning
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2686
diff
changeset
|
391 |
warning_message = _('Please note that this is only a shallow copy') |
a8e901fc4457
ease overriding of copy warning
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2686
diff
changeset
|
392 |
|
1147 | 393 |
def render_form(self, entity): |
394 |
"""fetch and render the form""" |
|
395 |
# make a copy of entity to avoid altering the entity in the |
|
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
396 |
# request's cache. |
1685
3c59ae0e6548
fix copy edition view
Graziella Toutoungis <graziella.toutoungis@logilab.fr>
parents:
1629
diff
changeset
|
397 |
entity.complete() |
1147 | 398 |
self.newentity = copy(entity) |
1703
a2b5dfdb4b62
should prefill cached values for relation in the primary or secondary category
sylvain.thenault@logilab.fr
parents:
1692
diff
changeset
|
399 |
self.copying = entity |
1685
3c59ae0e6548
fix copy edition view
Graziella Toutoungis <graziella.toutoungis@logilab.fr>
parents:
1629
diff
changeset
|
400 |
self.initialize_varmaker() |
3c59ae0e6548
fix copy edition view
Graziella Toutoungis <graziella.toutoungis@logilab.fr>
parents:
1629
diff
changeset
|
401 |
self.newentity.eid = self.varmaker.next() |
1147 | 402 |
self.w(u'<script type="text/javascript">updateMessage("%s");</script>\n' |
3062
a8e901fc4457
ease overriding of copy warning
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2686
diff
changeset
|
403 |
% self.req._(self.warning_message)) |
1685
3c59ae0e6548
fix copy edition view
Graziella Toutoungis <graziella.toutoungis@logilab.fr>
parents:
1629
diff
changeset
|
404 |
super(CopyFormView, self).render_form(self.newentity) |
1147 | 405 |
del self.newentity |
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
406 |
|
1147 | 407 |
def init_form(self, form, entity): |
408 |
"""customize your form before rendering here""" |
|
409 |
super(CopyFormView, self).init_form(form, entity) |
|
410 |
if entity.eid == self.newentity.eid: |
|
1703
a2b5dfdb4b62
should prefill cached values for relation in the primary or secondary category
sylvain.thenault@logilab.fr
parents:
1692
diff
changeset
|
411 |
form.form_add_hidden(eid_param('__cloned_eid', entity.eid), |
a2b5dfdb4b62
should prefill cached values for relation in the primary or secondary category
sylvain.thenault@logilab.fr
parents:
1692
diff
changeset
|
412 |
self.copying.eid) |
a2b5dfdb4b62
should prefill cached values for relation in the primary or secondary category
sylvain.thenault@logilab.fr
parents:
1692
diff
changeset
|
413 |
for rschema, _, role in form.relations_by_category(form.attrcategories, |
a2b5dfdb4b62
should prefill cached values for relation in the primary or secondary category
sylvain.thenault@logilab.fr
parents:
1692
diff
changeset
|
414 |
'add'): |
3689
deb13e88e037
follow yams 0.25 api changes to improve performance
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3643
diff
changeset
|
415 |
if not rschema.final: |
1703
a2b5dfdb4b62
should prefill cached values for relation in the primary or secondary category
sylvain.thenault@logilab.fr
parents:
1692
diff
changeset
|
416 |
# ensure relation cache is filed |
a2b5dfdb4b62
should prefill cached values for relation in the primary or secondary category
sylvain.thenault@logilab.fr
parents:
1692
diff
changeset
|
417 |
rset = self.copying.related(rschema, role) |
a2b5dfdb4b62
should prefill cached values for relation in the primary or secondary category
sylvain.thenault@logilab.fr
parents:
1692
diff
changeset
|
418 |
self.newentity.set_related_cache(rschema, role, rset) |
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
419 |
|
1147 | 420 |
def submited_message(self): |
421 |
"""return the message that will be displayed on successful edition""" |
|
422 |
return self.req._('entity copied') |
|
423 |
||
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
424 |
|
2005
e8032965f37a
turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1995
diff
changeset
|
425 |
class TableEditForm(forms.CompositeForm): |
1147 | 426 |
id = 'muledit' |
1692 | 427 |
domid = 'entityForm' |
428 |
onsubmit = "return validateForm('%s', null);" % domid |
|
1304 | 429 |
form_buttons = [SubmitButton(_('validate modifications on selected items')), |
430 |
ResetButton(_('revert changes'))] |
|
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
431 |
|
1692 | 432 |
def __init__(self, req, rset, **kwargs): |
433 |
kwargs.setdefault('__redirectrql', rset.printable_rql()) |
|
434 |
super(TableEditForm, self).__init__(req, rset, **kwargs) |
|
1147 | 435 |
for row in xrange(len(self.rset)): |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2576
diff
changeset
|
436 |
form = self.vreg['forms'].select('edition', self.req, |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2576
diff
changeset
|
437 |
rset=self.rset, row=row, |
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2576
diff
changeset
|
438 |
attrcategories=('primary',), |
3880
88fc53eb5b5f
[forms] muledit mainform should copy nav params, its subforms shouldn't
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3806
diff
changeset
|
439 |
copy_nav_params=False, |
2650
18aec79ec3a3
R [vreg] important refactoring of the vregistry, moving behaviour to end dictionnary (and so leaving room for more flexibility ; keep bw compat ; update api usage in cw
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2576
diff
changeset
|
440 |
mainform=False) |
1324 | 441 |
# XXX rely on the EntityCompositeFormRenderer to put the eid input |
1147 | 442 |
form.remove_field(form.field_by_name('eid')) |
3513
c002f6488631
[form] replace is_subform by parent_form, carrying more information at the same cost
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3355
diff
changeset
|
443 |
self.add_subform(form) |
1091
b5e253c0dd13
a bit of reorganisation inside web/views:
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
444 |
|
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
445 |
|
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1313
diff
changeset
|
446 |
class TableEditFormView(FormViewMixIn, EntityView): |
1147 | 447 |
id = 'muledit' |
448 |
__select__ = EntityView.__select__ & yes() |
|
449 |
title = _('multiple edit') |
|
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
450 |
|
1147 | 451 |
def call(self, **kwargs): |
452 |
"""a view to edit multiple entities of the same type the first column |
|
453 |
should be the eid |
|
454 |
""" |
|
455 |
#self.form_title(entity) |
|
3880
88fc53eb5b5f
[forms] muledit mainform should copy nav params, its subforms shouldn't
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3806
diff
changeset
|
456 |
form = self.vreg['forms'].select(self.id, self.req, rset=self.rset, |
88fc53eb5b5f
[forms] muledit mainform should copy nav params, its subforms shouldn't
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3806
diff
changeset
|
457 |
copy_nav_params=True) |
1995
ec95eaa2b711
turn renderers into appobjects
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1977
diff
changeset
|
458 |
self.w(form.form_render()) |
1147 | 459 |
|
460 |
||
1318
50e1a778c5ee
new FormViewMixIn class, cleanup FormMixIn (to remove once cubes doesn't use it anymore)
sylvain.thenault@logilab.fr
parents:
1313
diff
changeset
|
461 |
class InlineEntityEditionFormView(FormViewMixIn, EntityView): |
3518
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
462 |
""" |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
463 |
:attr peid: the parent entity's eid hosting the inline form |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
464 |
:attr rtype: the relation bridging `etype` and `peid` |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
465 |
:attr role: the role played by the `peid` in the relation |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
466 |
:attr pform: the parent form where this inlined form is being displayed |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
467 |
""" |
1147 | 468 |
id = 'inline-edition' |
469 |
__select__ = non_final_entity() & match_kwargs('peid', 'rtype') |
|
3518
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
470 |
|
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
471 |
_select_attrs = ('peid', 'rtype', 'role', 'pform') |
1147 | 472 |
removejs = "removeInlinedEntity('%s', '%s', '%s')" |
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
473 |
|
3518
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
474 |
def __init__(self, *args, **kwargs): |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
475 |
for attr in self._select_attrs: |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
476 |
setattr(self, attr, kwargs.pop(attr, None)) |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
477 |
super(InlineEntityEditionFormView, self).__init__(*args, **kwargs) |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
478 |
|
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
479 |
def _entity(self): |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
480 |
assert self.row is not None, self |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
481 |
return self.rset.get_entity(self.row, self.col) |
1147 | 482 |
|
3518
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
483 |
@property |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
484 |
@cached |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
485 |
def form(self): |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
486 |
entity = self._entity() |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
487 |
form = self.vreg['forms'].select('edition', self.req, |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
488 |
entity=entity, |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
489 |
form_renderer_id='inline', |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
490 |
mainform=False, copy_nav_params=False, |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
491 |
**self.extra_kwargs) |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
492 |
form.parent_form = self.pform |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
493 |
self.add_hiddens(form, entity) |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
494 |
return form |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
495 |
|
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
496 |
def cell_call(self, row, col, i18nctx, **kwargs): |
1147 | 497 |
""" |
498 |
:param peid: the parent entity's eid hosting the inline form |
|
499 |
:param rtype: the relation bridging `etype` and `peid` |
|
500 |
:param role: the role played by the `peid` in the relation |
|
501 |
""" |
|
3518
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
502 |
entity = self._entity() |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
503 |
divonclick = "restoreInlinedEntity('%s', '%s', '%s')" % ( |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
504 |
self.peid, self.rtype, entity.eid) |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
505 |
self.render_form(i18nctx, divonclick=divonclick, **kwargs) |
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
506 |
|
3518
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
507 |
def render_form(self, i18nctx, **kwargs): |
1147 | 508 |
"""fetch and render the form""" |
3518
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
509 |
entity = self._entity() |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
510 |
divid = '%s-%s-%s' % (self.peid, self.rtype, entity.eid) |
3327
44efba78afac
fix/enhance i18n context usage for inlined forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3078
diff
changeset
|
511 |
title = self.req.pgettext(i18nctx, 'This %s' % entity.e_schema) |
3518
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
512 |
removejs = self.removejs % (self.peid, self.rtype, entity.eid) |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
513 |
countkey = '%s_count' % self.rtype |
2247
9dbbe6a4c9b0
use a counter of displayed inlined forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2224
diff
changeset
|
514 |
try: |
9dbbe6a4c9b0
use a counter of displayed inlined forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2224
diff
changeset
|
515 |
self.req.data[countkey] += 1 |
3518
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
516 |
except KeyError: |
2247
9dbbe6a4c9b0
use a counter of displayed inlined forms
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2224
diff
changeset
|
517 |
self.req.data[countkey] = 1 |
3518
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
518 |
self.w(self.form.form_render( |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
519 |
divid=divid, title=title, removejs=removejs, i18nctx=i18nctx, |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
520 |
counter=self.req.data[countkey], **kwargs)) |
1396 | 521 |
|
3518
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
522 |
def add_hiddens(self, form, entity): |
3532
df045bc51d00
[inlined forms] nicer add_hiddens implementation relying on standard entity forms handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3518
diff
changeset
|
523 |
"""to ease overriding (see cubes.vcsfile.views.forms for instance)""" |
df045bc51d00
[inlined forms] nicer add_hiddens implementation relying on standard entity forms handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3518
diff
changeset
|
524 |
iid = 'rel-%s-%s-%s' % (self.peid, self.rtype, entity.eid) |
3586 | 525 |
# * str(self.rtype) in case it's a schema object |
3534
81cfec545e1b
ensure str is given as field's name
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3532
diff
changeset
|
526 |
# * neged_role() since role is the for parent entity, we want the role |
81cfec545e1b
ensure str is given as field's name
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3532
diff
changeset
|
527 |
# of the inlined entity |
81cfec545e1b
ensure str is given as field's name
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3532
diff
changeset
|
528 |
form.form_add_hidden(name=str(self.rtype), value=self.peid, |
3532
df045bc51d00
[inlined forms] nicer add_hiddens implementation relying on standard entity forms handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3518
diff
changeset
|
529 |
role=neg_role(self.role), eidparam=True, id=iid) |
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
530 |
|
3518
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
531 |
def keep_entity(self, form, entity): |
1147 | 532 |
if not entity.has_eid(): |
533 |
return True |
|
534 |
# are we regenerating form because of a validation error ? |
|
1750 | 535 |
if form.form_previous_values: |
3518
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
536 |
cdvalues = self.req.list_form_param(eid_param(self.rtype, self.peid), |
1710
8c717cc0b353
refactor error handling: get validation error information from a form attribute instead of req.data to avoid pb when multiple forms are displayed
sylvain.thenault@logilab.fr
parents:
1703
diff
changeset
|
537 |
form.form_previous_values) |
1147 | 538 |
if unicode(entity.eid) not in cdvalues: |
539 |
return False |
|
540 |
return True |
|
541 |
||
542 |
||
543 |
class InlineEntityCreationFormView(InlineEntityEditionFormView): |
|
3518
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
544 |
""" |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
545 |
:attr etype: the entity type being created in the inline form |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
546 |
""" |
1147 | 547 |
id = 'inline-creation' |
548 |
__select__ = (match_kwargs('peid', 'rtype') |
|
549 |
& specified_etype_implements('Any')) |
|
3518
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
550 |
_select_attrs = InlineEntityEditionFormView._select_attrs + ('etype',) |
1423
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
551 |
removejs = "removeInlineForm('%s', '%s', '%s')" |
39320a58faac
missing overriding of removejs in inline-creation form view
sylvain.thenault@logilab.fr
parents:
1396
diff
changeset
|
552 |
|
3518
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
553 |
@cached |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
554 |
def _entity(self): |
1147 | 555 |
try: |
3518
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
556 |
cls = self.vreg['etypes'].etype_class(self.etype) |
1147 | 557 |
except: |
558 |
self.w(self.req._('no such entity type %s') % etype) |
|
559 |
return |
|
560 |
self.initialize_varmaker() |
|
3331
8e63b72287b1
cleaner code
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3327
diff
changeset
|
561 |
entity = cls(self.req) |
1147 | 562 |
entity.eid = self.varmaker.next() |
3518
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
563 |
return entity |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
564 |
|
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
565 |
def call(self, i18nctx, **kwargs): |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
566 |
self.render_form(i18nctx, **kwargs) |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
567 |
|
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
568 |
|
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
569 |
class InlineAddNewLinkView(InlineEntityCreationFormView): |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
570 |
""" |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
571 |
:attr card: the cardinality of the relation according to role of `peid` |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
572 |
""" |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
573 |
id = 'inline-addnew-link' |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
574 |
__select__ = (match_kwargs('peid', 'rtype') |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
575 |
& specified_etype_implements('Any')) |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
576 |
|
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
577 |
_select_attrs = InlineEntityCreationFormView._select_attrs + ('card',) |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
578 |
form = None # no actual form wrapped |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
579 |
|
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
580 |
def call(self, i18nctx, **kwargs): |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
581 |
divid = "addNew%s%s%s:%s" % (self.etype, self.rtype, self.role, self.peid) |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
582 |
self.w(u'<div class="inlinedform" id="%s" cubicweb:limit="true">' |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
583 |
% divid) |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
584 |
js = "addInlineCreationForm('%s', '%s', '%s', '%s', '%s')" % ( |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
585 |
self.peid, self.etype, self.rtype, self.role, i18nctx) |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
586 |
if self.pform.should_hide_add_new_relation_link(self.rtype, self.card): |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
587 |
js = "toggleVisibility('%s'); %s" % (divid, js) |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
588 |
__ = self.req.pgettext |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
589 |
self.w(u'<a class="addEntity" id="add%s:%slink" href="javascript: %s" >+ %s.</a>' |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
590 |
% (self.rtype, self.peid, js, __(i18nctx, 'add a %s' % self.etype))) |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3513
diff
changeset
|
591 |
self.w(u'</div>') |