author | Sylvain Thénault <sylvain.thenault@logilab.fr> |
Fri, 19 Feb 2010 09:34:14 +0100 | |
branch | stable |
changeset 4643 | 921737d2e3a8 |
parent 4629 | 1eeef3cbf528 |
child 4642 | 606364845c34 |
permissions | -rw-r--r-- |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
1 |
"""The automatic entity form. |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
2 |
|
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
3 |
:organization: Logilab |
4212
ab6573088b4a
update copyright: welcome 2010
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3874
diff
changeset
|
4 |
:copyright: 2001-2010 LOGILAB S.A. (Paris, FRANCE), license is LGPL v2. |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
5 |
: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:
1969
diff
changeset
|
6 |
:license: GNU Lesser General Public License, v2.1 - http://www.gnu.org/licenses |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
7 |
""" |
4160 | 8 |
|
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
9 |
__docformat__ = "restructuredtext en" |
1702 | 10 |
_ = unicode |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
11 |
|
4387
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
12 |
from simplejson import dumps |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
13 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
14 |
from logilab.mtconverter import xml_escape |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
15 |
from logilab.common.decorators import iclassmethod, cached |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
16 |
|
4387
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
17 |
from cubicweb import typed_eid, neg_role, uilib |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
18 |
from cubicweb.schema import display_name |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
19 |
from cubicweb.view import EntityView |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
20 |
from cubicweb.selectors import ( |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
21 |
match_kwargs, match_form_params, non_final_entity, |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
22 |
specified_etype_implements) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
23 |
from cubicweb.web import stdmsgs, uicfg, eid_param, \ |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
24 |
form as f, formwidgets as fw, formfields as ff |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
25 |
from cubicweb.web.views import forms |
1528
864ae7c15ef5
other fixlets
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
1498
diff
changeset
|
26 |
|
4378
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
27 |
_AFS = uicfg.autoform_section |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
28 |
_AFFK = uicfg.autoform_field_kwargs |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
29 |
|
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
30 |
|
4387
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
31 |
# inlined form handling ######################################################## |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
32 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
33 |
class InlinedFormField(ff.Field): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
34 |
def __init__(self, view=None, **kwargs): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
35 |
kwargs.setdefault('label', None) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
36 |
super(InlinedFormField, self).__init__(name=view.rtype, role=view.role, |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
37 |
eidparam=True, **kwargs) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
38 |
self.view = view |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
39 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
40 |
def render(self, form, renderer): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
41 |
"""render this field, which is part of form, using the given form |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
42 |
renderer |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
43 |
""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
44 |
view = self.view |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
45 |
i18nctx = 'inlined:%s.%s.%s' % (form.edited_entity.e_schema, |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
46 |
view.rtype, view.role) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
47 |
return u'<div class="inline-%s-%s-slot">%s</div>' % ( |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
48 |
view.rtype, view.role, |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
49 |
view.render(i18nctx=i18nctx, row=view.cw_row, col=view.cw_col)) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
50 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
51 |
def form_init(self, form): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
52 |
"""method called before by build_context to trigger potential field |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
53 |
initialization requiring the form instance |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
54 |
""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
55 |
if self.view.form: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
56 |
self.view.form.build_context(form.formvalues) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
57 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
58 |
@property |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
59 |
def needs_multipart(self): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
60 |
if self.view.form: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
61 |
# take a look at inlined forms to check (recursively) if they need |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
62 |
# multipart handling. |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
63 |
return self.view.form.needs_multipart |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
64 |
return False |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
65 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
66 |
def has_been_modified(self, form): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
67 |
return False |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
68 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
69 |
def process_posted(self, form): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
70 |
pass # handled by the subform |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
71 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
72 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
73 |
class InlineEntityEditionFormView(f.FormViewMixIn, EntityView): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
74 |
""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
75 |
:attr peid: the parent entity's eid hosting the inline form |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
76 |
:attr rtype: the relation bridging `etype` and `peid` |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
77 |
:attr role: the role played by the `peid` in the relation |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
78 |
:attr pform: the parent form where this inlined form is being displayed |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
79 |
""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
80 |
__regid__ = 'inline-edition' |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
81 |
__select__ = non_final_entity() & match_kwargs('peid', 'rtype') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
82 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
83 |
_select_attrs = ('peid', 'rtype', 'role', 'pform', 'etype') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
84 |
removejs = "removeInlinedEntity('%s', '%s', '%s')" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
85 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
86 |
def __init__(self, *args, **kwargs): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
87 |
for attr in self._select_attrs: |
4585
912aba7e6400
[inlined formos] don't pop attributes from kwargs, so they end-up in
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4579
diff
changeset
|
88 |
# don't pop attributes from kwargs, so the end-up in |
912aba7e6400
[inlined formos] don't pop attributes from kwargs, so they end-up in
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4579
diff
changeset
|
89 |
# self.cw_extra_kwargs which is then passed to the edition form (see |
912aba7e6400
[inlined formos] don't pop attributes from kwargs, so they end-up in
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4579
diff
changeset
|
90 |
# the .form method) |
912aba7e6400
[inlined formos] don't pop attributes from kwargs, so they end-up in
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4579
diff
changeset
|
91 |
setattr(self, attr, kwargs.get(attr)) |
4387
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
92 |
super(InlineEntityEditionFormView, self).__init__(*args, **kwargs) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
93 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
94 |
def _entity(self): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
95 |
assert self.cw_row is not None, self |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
96 |
return self.cw_rset.get_entity(self.cw_row, self.cw_col) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
97 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
98 |
@property |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
99 |
@cached |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
100 |
def form(self): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
101 |
entity = self._entity() |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
102 |
form = self._cw.vreg['forms'].select('edition', self._cw, |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
103 |
entity=entity, |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
104 |
formtype='inlined', |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
105 |
form_renderer_id='inline', |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
106 |
copy_nav_params=False, |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
107 |
mainform=False, |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
108 |
parent_form=self.pform, |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
109 |
**self.cw_extra_kwargs) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
110 |
if self.pform is None: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
111 |
form.restore_previous_post(form.session_key()) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
112 |
#assert form.parent_form |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
113 |
self.add_hiddens(form, entity) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
114 |
return form |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
115 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
116 |
def cell_call(self, row, col, i18nctx, **kwargs): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
117 |
""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
118 |
:param peid: the parent entity's eid hosting the inline form |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
119 |
:param rtype: the relation bridging `etype` and `peid` |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
120 |
:param role: the role played by the `peid` in the relation |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
121 |
""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
122 |
entity = self._entity() |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
123 |
divonclick = "restoreInlinedEntity('%s', '%s', '%s')" % ( |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
124 |
self.peid, self.rtype, entity.eid) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
125 |
self.render_form(i18nctx, divonclick=divonclick, **kwargs) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
126 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
127 |
def render_form(self, i18nctx, **kwargs): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
128 |
"""fetch and render the form""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
129 |
entity = self._entity() |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
130 |
divid = '%s-%s-%s' % (self.peid, self.rtype, entity.eid) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
131 |
title = self.form_title(entity, i18nctx) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
132 |
removejs = self.removejs and self.removejs % ( |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
133 |
self.peid, self.rtype, entity.eid) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
134 |
countkey = '%s_count' % self.rtype |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
135 |
try: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
136 |
self._cw.data[countkey] += 1 |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
137 |
except KeyError: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
138 |
self._cw.data[countkey] = 1 |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
139 |
self.w(self.form.render( |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
140 |
divid=divid, title=title, removejs=removejs, i18nctx=i18nctx, |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
141 |
counter=self._cw.data[countkey] , **kwargs)) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
142 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
143 |
def form_title(self, entity, i18nctx): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
144 |
return self._cw.pgettext(i18nctx, entity.__regid__) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
145 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
146 |
def add_hiddens(self, form, entity): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
147 |
"""to ease overriding (see cubes.vcsfile.views.forms for instance)""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
148 |
iid = 'rel-%s-%s-%s' % (self.peid, self.rtype, entity.eid) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
149 |
# * str(self.rtype) in case it's a schema object |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
150 |
# * neged_role() since role is the for parent entity, we want the role |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
151 |
# of the inlined entity |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
152 |
form.add_hidden(name=str(self.rtype), value=self.peid, |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
153 |
role=neg_role(self.role), eidparam=True, id=iid) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
154 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
155 |
def keep_entity(self, form, entity): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
156 |
if not entity.has_eid(): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
157 |
return True |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
158 |
# are we regenerating form because of a validation error ? |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
159 |
if form.form_previous_values: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
160 |
cdvalues = self._cw.list_form_param(eid_param(self.rtype, self.peid), |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
161 |
form.form_previous_values) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
162 |
if unicode(entity.eid) not in cdvalues: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
163 |
return False |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
164 |
return True |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
165 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
166 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
167 |
class InlineEntityCreationFormView(InlineEntityEditionFormView): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
168 |
""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
169 |
:attr etype: the entity type being created in the inline form |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
170 |
""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
171 |
__regid__ = 'inline-creation' |
4629
1eeef3cbf528
fix 4626:c26b4df9fc90 (#703911): use can't rely on peid since it's not an actual eid when we're creating the parent entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4626
diff
changeset
|
172 |
__select__ = (match_kwargs('peid', 'petype', 'rtype') |
4387
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
173 |
& specified_etype_implements('Any')) |
4629
1eeef3cbf528
fix 4626:c26b4df9fc90 (#703911): use can't rely on peid since it's not an actual eid when we're creating the parent entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4626
diff
changeset
|
174 |
_select_attrs = InlineEntityEditionFormView._select_attrs + ('petype',) |
4387
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
175 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
176 |
@property |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
177 |
def removejs(self): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
178 |
entity = self._entity() |
4629
1eeef3cbf528
fix 4626:c26b4df9fc90 (#703911): use can't rely on peid since it's not an actual eid when we're creating the parent entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4626
diff
changeset
|
179 |
rdef = entity.e_schema.rdef(self.rtype, neg_role(self.role), self.petype) |
4626
c26b4df9fc90
[forms/inline] fix #703911: add new link disappears if inline box removed. Since we've the information, we must specify the target type else we get random cardinality on ambiguous relations
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4625
diff
changeset
|
180 |
card= rdef.role_cardinality(self.role) |
4387
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
181 |
# when one is adding an inline entity for a relation of a single card, |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
182 |
# the 'add a new xxx' link disappears. If the user then cancel the addition, |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
183 |
# we have to make this link appears back. This is done by giving add new link |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
184 |
# id to removeInlineForm. |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
185 |
if card not in '?1': |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
186 |
return "removeInlineForm('%%s', '%%s', '%s', '%%s')" % self.role |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
187 |
divid = "addNew%s%s%s:%s" % ( |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
188 |
self.etype, self.rtype, self.role, self.peid) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
189 |
return "removeInlineForm('%%s', '%%s', '%s', '%%s', '%s')" % ( |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
190 |
self.role, divid) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
191 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
192 |
@cached |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
193 |
def _entity(self): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
194 |
try: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
195 |
cls = self._cw.vreg['etypes'].etype_class(self.etype) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
196 |
except: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
197 |
self.w(self._cw._('no such entity type %s') % etype) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
198 |
return |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
199 |
entity = cls(self._cw) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
200 |
entity.eid = self._cw.varmaker.next() |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
201 |
return entity |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
202 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
203 |
def call(self, i18nctx, **kwargs): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
204 |
self.render_form(i18nctx, **kwargs) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
205 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
206 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
207 |
class InlineAddNewLinkView(InlineEntityCreationFormView): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
208 |
""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
209 |
:attr card: the cardinality of the relation according to role of `peid` |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
210 |
""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
211 |
__regid__ = 'inline-addnew-link' |
4629
1eeef3cbf528
fix 4626:c26b4df9fc90 (#703911): use can't rely on peid since it's not an actual eid when we're creating the parent entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4626
diff
changeset
|
212 |
__select__ = (match_kwargs('peid', 'petype', 'rtype') |
4387
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
213 |
& specified_etype_implements('Any')) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
214 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
215 |
_select_attrs = InlineEntityCreationFormView._select_attrs + ('card',) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
216 |
form = None # no actual form wrapped |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
217 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
218 |
def call(self, i18nctx, **kwargs): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
219 |
self._cw.set_varmaker() |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
220 |
divid = "addNew%s%s%s:%s" % (self.etype, self.rtype, self.role, self.peid) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
221 |
self.w(u'<div class="inlinedform" id="%s" cubicweb:limit="true">' |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
222 |
% divid) |
4629
1eeef3cbf528
fix 4626:c26b4df9fc90 (#703911): use can't rely on peid since it's not an actual eid when we're creating the parent entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4626
diff
changeset
|
223 |
js = "addInlineCreationForm('%s', '%s', '%s', '%s', '%s', '%s')" % ( |
1eeef3cbf528
fix 4626:c26b4df9fc90 (#703911): use can't rely on peid since it's not an actual eid when we're creating the parent entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4626
diff
changeset
|
224 |
self.peid, self.petype, self.etype, self.rtype, self.role, i18nctx) |
4387
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
225 |
if self.pform.should_hide_add_new_relation_link(self.rtype, self.card): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
226 |
js = "toggleVisibility('%s'); %s" % (divid, js) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
227 |
__ = self._cw.pgettext |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
228 |
self.w(u'<a class="addEntity" id="add%s:%slink" href="javascript: %s" >+ %s.</a>' |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
229 |
% (self.rtype, self.peid, js, __(i18nctx, 'add a %s' % self.etype))) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
230 |
self.w(u'</div>') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
231 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
232 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
233 |
# generic relations handling ################################################## |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
234 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
235 |
def relation_id(eid, rtype, role, reid): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
236 |
"""return an identifier for a relation between two entities""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
237 |
if role == 'subject': |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
238 |
return u'%s:%s:%s' % (eid, rtype, reid) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
239 |
return u'%s:%s:%s' % (reid, rtype, eid) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
240 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
241 |
def toggleable_relation_link(eid, nodeid, label='x'): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
242 |
"""return javascript snippet to delete/undelete a relation between two |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
243 |
entities |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
244 |
""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
245 |
js = u"javascript: togglePendingDelete('%s', %s);" % ( |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
246 |
nodeid, xml_escape(dumps(eid))) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
247 |
return u'[<a class="handle" href="%s" id="handle%s">%s</a>]' % ( |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
248 |
js, nodeid, label) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
249 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
250 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
251 |
def get_pending_inserts(req, eid=None): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
252 |
"""shortcut to access req's pending_insert entry |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
253 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
254 |
This is where are stored relations being added while editing |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
255 |
an entity. This used to be stored in a temporary cookie. |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
256 |
""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
257 |
pending = req.get_session_data('pending_insert') or () |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
258 |
return ['%s:%s:%s' % (subj, rel, obj) for subj, rel, obj in pending |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
259 |
if eid is None or eid in (subj, obj)] |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
260 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
261 |
def get_pending_deletes(req, eid=None): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
262 |
"""shortcut to access req's pending_delete entry |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
263 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
264 |
This is where are stored relations being removed while editing |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
265 |
an entity. This used to be stored in a temporary cookie. |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
266 |
""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
267 |
pending = req.get_session_data('pending_delete') or () |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
268 |
return ['%s:%s:%s' % (subj, rel, obj) for subj, rel, obj in pending |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
269 |
if eid is None or eid in (subj, obj)] |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
270 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
271 |
def parse_relations_descr(rdescr): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
272 |
"""parse a string describing some relations, in the form |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
273 |
subjeids:rtype:objeids |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
274 |
where subjeids and objeids are eids separeted by a underscore |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
275 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
276 |
return an iterator on (subject eid, relation type, object eid) found |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
277 |
""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
278 |
for rstr in rdescr: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
279 |
subjs, rtype, objs = rstr.split(':') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
280 |
for subj in subjs.split('_'): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
281 |
for obj in objs.split('_'): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
282 |
yield typed_eid(subj), rtype, typed_eid(obj) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
283 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
284 |
def delete_relations(req, rdefs): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
285 |
"""delete relations from the repository""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
286 |
# FIXME convert to using the syntax subject:relation:eids |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
287 |
execute = req.execute |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
288 |
for subj, rtype, obj in parse_relations_descr(rdefs): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
289 |
rql = 'DELETE X %s Y where X eid %%(x)s, Y eid %%(y)s' % rtype |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
290 |
execute(rql, {'x': subj, 'y': obj}, ('x', 'y')) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
291 |
req.set_message(req._('relations deleted')) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
292 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
293 |
def insert_relations(req, rdefs): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
294 |
"""insert relations into the repository""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
295 |
execute = req.execute |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
296 |
for subj, rtype, obj in parse_relations_descr(rdefs): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
297 |
rql = 'SET X %s Y where X eid %%(x)s, Y eid %%(y)s' % rtype |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
298 |
execute(rql, {'x': subj, 'y': obj}, ('x', 'y')) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
299 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
300 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
301 |
class GenericRelationsWidget(fw.FieldWidget): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
302 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
303 |
def render(self, form, field, renderer): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
304 |
stream = [] |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
305 |
w = stream.append |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
306 |
req = form._cw |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
307 |
_ = req._ |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
308 |
__ = _ |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
309 |
eid = form.edited_entity.eid |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
310 |
w(u'<table id="relatedEntities">') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
311 |
for rschema, role, related in field.relations_table(form): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
312 |
# already linked entities |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
313 |
if related: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
314 |
w(u'<tr><th class="labelCol">%s</th>' % rschema.display_name(req, role)) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
315 |
w(u'<td>') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
316 |
w(u'<ul>') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
317 |
for viewparams in related: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
318 |
w(u'<li class="invisible">%s<div id="span%s" class="%s">%s</div></li>' |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
319 |
% (viewparams[1], viewparams[0], viewparams[2], viewparams[3])) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
320 |
if not form.force_display and form.maxrelitems < len(related): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
321 |
link = (u'<span class="invisible">' |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
322 |
'[<a href="javascript: window.location.href+=\'&__force_display=1\'">%s</a>]' |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
323 |
'</span>' % _('view all')) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
324 |
w(u'<li class="invisible">%s</li>' % link) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
325 |
w(u'</ul>') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
326 |
w(u'</td>') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
327 |
w(u'</tr>') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
328 |
pendings = list(field.restore_pending_inserts(form)) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
329 |
if not pendings: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
330 |
w(u'<tr><th> </th><td> </td></tr>') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
331 |
else: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
332 |
for row in pendings: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
333 |
# soon to be linked to entities |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
334 |
w(u'<tr id="tr%s">' % row[1]) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
335 |
w(u'<th>%s</th>' % row[3]) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
336 |
w(u'<td>') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
337 |
w(u'<a class="handle" title="%s" href="%s">[x]</a>' % |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
338 |
(_('cancel this insert'), row[2])) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
339 |
w(u'<a id="a%s" class="editionPending" href="%s">%s</a>' |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
340 |
% (row[1], row[4], xml_escape(row[5]))) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
341 |
w(u'</td>') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
342 |
w(u'</tr>') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
343 |
w(u'<tr id="relationSelectorRow_%s" class="separator">' % eid) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
344 |
w(u'<th class="labelCol">') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
345 |
w(u'<select id="relationSelector_%s" tabindex="%s" ' |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
346 |
'onchange="javascript:showMatchingSelect(this.options[this.selectedIndex].value,%s);">' |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
347 |
% (eid, req.next_tabindex(), xml_escape(dumps(eid)))) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
348 |
w(u'<option value="">%s</option>' % _('select a relation')) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
349 |
for i18nrtype, rschema, role in field.relations: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
350 |
# more entities to link to |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
351 |
w(u'<option value="%s_%s">%s</option>' % (rschema, role, i18nrtype)) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
352 |
w(u'</select>') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
353 |
w(u'</th>') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
354 |
w(u'<td id="unrelatedDivs_%s"></td>' % eid) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
355 |
w(u'</tr>') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
356 |
w(u'</table>') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
357 |
return '\n'.join(stream) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
358 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
359 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
360 |
class GenericRelationsField(ff.Field): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
361 |
widget = GenericRelationsWidget |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
362 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
363 |
def __init__(self, relations, name='_cw_generic_field', **kwargs): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
364 |
assert relations |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
365 |
kwargs['eidparam'] = True |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
366 |
super(GenericRelationsField, self).__init__(name, **kwargs) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
367 |
self.relations = relations |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
368 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
369 |
def process_posted(self, form): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
370 |
todelete = get_pending_deletes(form._cw) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
371 |
if todelete: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
372 |
delete_relations(form._cw, todelete) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
373 |
toinsert = get_pending_inserts(form._cw) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
374 |
if toinsert: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
375 |
insert_relations(form._cw, toinsert) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
376 |
return () |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
377 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
378 |
def relations_table(self, form): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
379 |
"""yiels 3-tuples (rtype, role, related_list) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
380 |
where <related_list> itself a list of : |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
381 |
- node_id (will be the entity element's DOM id) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
382 |
- appropriate javascript's togglePendingDelete() function call |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
383 |
- status 'pendingdelete' or '' |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
384 |
- oneline view of related entity |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
385 |
""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
386 |
entity = form.edited_entity |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
387 |
pending_deletes = get_pending_deletes(form._cw, entity.eid) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
388 |
for label, rschema, role in self.relations: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
389 |
related = [] |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
390 |
if entity.has_eid(): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
391 |
rset = entity.related(rschema, role, limit=form.related_limit) |
4579
19d73051eb57
[autoform] we should consider role when checking delete permission
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4570
diff
changeset
|
392 |
if role == 'subject': |
19d73051eb57
[autoform] we should consider role when checking delete permission
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4570
diff
changeset
|
393 |
haspermkwargs = {'fromeid': entity.eid} |
19d73051eb57
[autoform] we should consider role when checking delete permission
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4570
diff
changeset
|
394 |
else: |
19d73051eb57
[autoform] we should consider role when checking delete permission
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4570
diff
changeset
|
395 |
haspermkwargs = {'toeid': entity.eid} |
19d73051eb57
[autoform] we should consider role when checking delete permission
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4570
diff
changeset
|
396 |
if rschema.has_perm(form._cw, 'delete', **haspermkwargs): |
4387
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
397 |
toggleable_rel_link_func = toggleable_relation_link |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
398 |
else: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
399 |
toggleable_rel_link_func = lambda x, y, z: u'' |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
400 |
for row in xrange(rset.rowcount): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
401 |
nodeid = relation_id(entity.eid, rschema, role, |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
402 |
rset[row][0]) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
403 |
if nodeid in pending_deletes: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
404 |
status, label = u'pendingDelete', '+' |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
405 |
else: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
406 |
status, label = u'', 'x' |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
407 |
dellink = toggleable_rel_link_func(entity.eid, nodeid, label) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
408 |
eview = form._cw.view('oneline', rset, row=row) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
409 |
related.append((nodeid, dellink, status, eview)) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
410 |
yield (rschema, role, related) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
411 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
412 |
def restore_pending_inserts(self, form): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
413 |
"""used to restore edition page as it was before clicking on |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
414 |
'search for <some entity type>' |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
415 |
""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
416 |
entity = form.edited_entity |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
417 |
pending_inserts = set(get_pending_inserts(form._cw, form.edited_entity.eid)) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
418 |
for pendingid in pending_inserts: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
419 |
eidfrom, rtype, eidto = pendingid.split(':') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
420 |
if typed_eid(eidfrom) == entity.eid: # subject |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
421 |
label = display_name(form._cw, rtype, 'subject', |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
422 |
entity.__regid__) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
423 |
reid = eidto |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
424 |
else: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
425 |
label = display_name(form._cw, rtype, 'object', |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
426 |
entity.__regid__) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
427 |
reid = eidfrom |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
428 |
jscall = "javascript: cancelPendingInsert('%s', 'tr', null, %s);" \ |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
429 |
% (pendingid, entity.eid) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
430 |
rset = form._cw.eid_rset(reid) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
431 |
eview = form._cw.view('text', rset, row=0) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
432 |
yield rtype, pendingid, jscall, label, reid, eview |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
433 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
434 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
435 |
class UnrelatedDivs(EntityView): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
436 |
__regid__ = 'unrelateddivs' |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
437 |
__select__ = match_form_params('relation') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
438 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
439 |
def cell_call(self, row, col): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
440 |
entity = self.cw_rset.get_entity(row, col) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
441 |
relname, role = self._cw.form.get('relation').rsplit('_', 1) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
442 |
rschema = self._cw.vreg.schema.rschema(relname) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
443 |
hidden = 'hidden' in self._cw.form |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
444 |
is_cell = 'is_cell' in self._cw.form |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
445 |
self.w(self.build_unrelated_select_div(entity, rschema, role, |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
446 |
is_cell=is_cell, hidden=hidden)) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
447 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
448 |
def build_unrelated_select_div(self, entity, rschema, role, |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
449 |
is_cell=False, hidden=True): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
450 |
options = [] |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
451 |
divid = 'div%s_%s_%s' % (rschema.type, role, entity.eid) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
452 |
selectid = 'select%s_%s_%s' % (rschema.type, role, entity.eid) |
4467
0e73d299730a
fix long-waiting symetric typo: should be spelled symmetric. Add auto database migration on schema deserialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4387
diff
changeset
|
453 |
if rschema.symmetric or role == 'subject': |
4387
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
454 |
targettypes = rschema.objects(entity.e_schema) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
455 |
etypes = '/'.join(sorted(etype.display_name(self._cw) for etype in targettypes)) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
456 |
else: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
457 |
targettypes = rschema.subjects(entity.e_schema) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
458 |
etypes = '/'.join(sorted(etype.display_name(self._cw) for etype in targettypes)) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
459 |
etypes = uilib.cut(etypes, self._cw.property_value('navigation.short-line-size')) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
460 |
options.append('<option>%s %s</option>' % (self._cw._('select a'), etypes)) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
461 |
options += self._get_select_options(entity, rschema, role) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
462 |
options += self._get_search_options(entity, rschema, role, targettypes) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
463 |
relname, role = self._cw.form.get('relation').rsplit('_', 1) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
464 |
return u"""\ |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
465 |
<div class="%s" id="%s"> |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
466 |
<select id="%s" onchange="javascript: addPendingInsert(this.options[this.selectedIndex], %s, %s, '%s');"> |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
467 |
%s |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
468 |
</select> |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
469 |
</div> |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
470 |
""" % (hidden and 'hidden' or '', divid, selectid, |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
471 |
xml_escape(dumps(entity.eid)), is_cell and 'true' or 'null', relname, |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
472 |
'\n'.join(options)) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
473 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
474 |
def _get_select_options(self, entity, rschema, role): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
475 |
"""add options to search among all entities of each possible type""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
476 |
options = [] |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
477 |
pending_inserts = get_pending_inserts(self._cw, entity.eid) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
478 |
rtype = rschema.type |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
479 |
form = self._cw.vreg['forms'].select('edition', self._cw, entity=entity) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
480 |
field = form.field_by_name(rschema, role, entity.e_schema) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
481 |
limit = self._cw.property_value('navigation.combobox-limit') |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
482 |
# NOTE: expect 'limit' arg on choices method of relation field |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
483 |
for eview, reid in field.vocabulary(form, limit=limit): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
484 |
if reid is None: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
485 |
if eview: # skip blank value |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
486 |
options.append('<option class="separator">-- %s --</option>' |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
487 |
% xml_escape(eview)) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
488 |
elif reid != ff.INTERNAL_FIELD_VALUE: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
489 |
optionid = relation_id(entity.eid, rtype, role, reid) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
490 |
if optionid not in pending_inserts: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
491 |
# prefix option's id with letters to make valid XHTML wise |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
492 |
options.append('<option id="id%s" value="%s">%s</option>' % |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
493 |
(optionid, reid, xml_escape(eview))) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
494 |
return options |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
495 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
496 |
def _get_search_options(self, entity, rschema, role, targettypes): |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
497 |
"""add options to search among all entities of each possible type""" |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
498 |
options = [] |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
499 |
_ = self._cw._ |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
500 |
for eschema in targettypes: |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
501 |
mode = '%s:%s:%s:%s' % (role, entity.eid, rschema.type, eschema) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
502 |
url = self._cw.build_url(entity.rest_path(), vid='search-associate', |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
503 |
__mode=mode) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
504 |
options.append((eschema.display_name(self._cw), |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
505 |
'<option value="%s">%s %s</option>' % ( |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
506 |
xml_escape(url), _('Search for'), eschema.display_name(self._cw)))) |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
507 |
return [o for l, o in sorted(options)] |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
508 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
509 |
|
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
510 |
# The automatic entity form #################################################### |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
511 |
|
2005
e8032965f37a
turn every form class into appobject. They should not be instantiated manually anymore.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1982
diff
changeset
|
512 |
class AutomaticEntityForm(forms.EntityFieldsForm): |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
513 |
"""base automatic form to edit any entity. |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
514 |
|
1560
7dd2a81b8bc8
[basecontrollers] add edit_relation next to edit_field, misc notes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
1540
diff
changeset
|
515 |
Designed to be fully generated from schema but highly configurable through: |
3476
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
516 |
|
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
517 |
* uicfg (autoform_* relation tags) |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
518 |
* various standard form parameters |
3476
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
519 |
* overriding |
2780
ad1dfc3855b0
B web/tests back to green
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
2652
diff
changeset
|
520 |
|
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
521 |
You can also easily customise it by adding/removing fields in |
3476
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
522 |
AutomaticEntityForm instances or by inheriting from it. |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
523 |
""" |
3408
c92170fca813
[api] use __regid__ instead of deprecated id
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3360
diff
changeset
|
524 |
__regid__ = 'edition' |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
525 |
|
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
526 |
cwtarget = 'eformframe' |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
527 |
cssclass = 'entityForm' |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
528 |
copy_nav_params = True |
4378
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
529 |
form_buttons = [fw.SubmitButton(), |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
530 |
fw.Button(stdmsgs.BUTTON_APPLY, cwaction='apply'), |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
531 |
fw.Button(stdmsgs.BUTTON_CANCEL, cwaction='cancel')] |
3476
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
532 |
# for attributes selection when searching in uicfg.autoform_section |
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
533 |
formtype = 'main' |
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
534 |
# set this to a list of [(relation, role)] if you want to explictily tell |
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
535 |
# which relations should be edited |
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
536 |
display_fields = None |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
537 |
|
4277
35cd057339b2
turn all the stuff used to handle 'generic relations' in forms into proper
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
538 |
@iclassmethod |
35cd057339b2
turn all the stuff used to handle 'generic relations' in forms into proper
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
539 |
def field_by_name(cls_or_self, name, role=None, eschema=None): |
35cd057339b2
turn all the stuff used to handle 'generic relations' in forms into proper
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
540 |
"""return field with the given name and role. If field is not explicitly |
35cd057339b2
turn all the stuff used to handle 'generic relations' in forms into proper
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
541 |
defined for the form but `eclass` is specified, guess_field will be |
35cd057339b2
turn all the stuff used to handle 'generic relations' in forms into proper
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
542 |
called. |
35cd057339b2
turn all the stuff used to handle 'generic relations' in forms into proper
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
543 |
""" |
35cd057339b2
turn all the stuff used to handle 'generic relations' in forms into proper
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
544 |
try: |
35cd057339b2
turn all the stuff used to handle 'generic relations' in forms into proper
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
545 |
return super(AutomaticEntityForm, cls_or_self).field_by_name(name, role, eschema) |
4387
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
546 |
except f.FieldNotFound: |
4277
35cd057339b2
turn all the stuff used to handle 'generic relations' in forms into proper
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
547 |
if name == '_cw_generic_field' and not isinstance(cls_or_self, type): |
35cd057339b2
turn all the stuff used to handle 'generic relations' in forms into proper
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
548 |
return cls_or_self._generic_relations_field() |
35cd057339b2
turn all the stuff used to handle 'generic relations' in forms into proper
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
549 |
raise |
35cd057339b2
turn all the stuff used to handle 'generic relations' in forms into proper
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4252
diff
changeset
|
550 |
|
3360
b02df886eb3e
cleanup, reorganize
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3358
diff
changeset
|
551 |
# base automatic entity form methods ####################################### |
b02df886eb3e
cleanup, reorganize
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3358
diff
changeset
|
552 |
|
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
553 |
def __init__(self, *args, **kwargs): |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
554 |
super(AutomaticEntityForm, self).__init__(*args, **kwargs) |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
555 |
entity = self.edited_entity |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
556 |
if entity.has_eid(): |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
557 |
entity.complete() |
3476
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
558 |
for rtype, role in self.editable_attributes(): |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
559 |
try: |
3476
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
560 |
self.field_by_name(str(rtype), role) |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
561 |
continue # explicitly specified |
4387
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
562 |
except f.FieldNotFound: |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
563 |
# has to be guessed |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
564 |
try: |
3476
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
565 |
field = self.field_by_name(str(rtype), role, |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
566 |
eschema=entity.e_schema) |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
567 |
self.fields.append(field) |
4387
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
568 |
except f.FieldNotFound: |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
569 |
# meta attribute such as <attr>_format |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
570 |
continue |
4378
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
571 |
if self.formtype == 'main': |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
572 |
if self.fieldsets_in_order: |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
573 |
fsio = list(self.fieldsets_in_order) |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
574 |
else: |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
575 |
fsio = [None] |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
576 |
self.fieldsets_in_order = fsio |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
577 |
# add fields for relation whose target should have an inline form |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
578 |
for formview in self.inlined_form_views(): |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
579 |
field = self._inlined_form_view_field(formview) |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
580 |
self.fields.append(field) |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
581 |
if not field.fieldset in fsio: |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
582 |
fsio.append(field.fieldset) |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
583 |
# add the generic relation field if necessary |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
584 |
if entity.has_eid() and ( |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
585 |
self.display_fields is None or |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
586 |
'_cw_generic_field' in self.display_fields): |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
587 |
try: |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
588 |
field = self.field_by_name('_cw_generic_field') |
4387
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
589 |
except f.FieldNotFound: |
4378
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
590 |
# no editable relation |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
591 |
pass |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
592 |
else: |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
593 |
self.fields.append(field) |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
594 |
if not field.fieldset in fsio: |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
595 |
fsio.append(field.fieldset) |
3418
7b49fa7e942d
[api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3408
diff
changeset
|
596 |
self.maxrelitems = self._cw.property_value('navigation.related-limit') |
7b49fa7e942d
[api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3408
diff
changeset
|
597 |
self.force_display = bool(self._cw.form.get('__force_display')) |
3874
7d0d4a6be046
[formfields] allow fields ordering with autoform_field_kwargs
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
598 |
fnum = len(self.fields) |
7d0d4a6be046
[formfields] allow fields ordering with autoform_field_kwargs
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3689
diff
changeset
|
599 |
self.fields.sort(key=lambda f: f.order is None and fnum or f.order) |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
600 |
|
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
601 |
@property |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
602 |
def related_limit(self): |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
603 |
if self.force_display: |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
604 |
return None |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
605 |
return self.maxrelitems + 1 |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
606 |
|
3360
b02df886eb3e
cleanup, reorganize
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3358
diff
changeset
|
607 |
def action(self): |
b02df886eb3e
cleanup, reorganize
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3358
diff
changeset
|
608 |
"""return the form's action attribute. Default to validateform if not |
b02df886eb3e
cleanup, reorganize
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3358
diff
changeset
|
609 |
explicitly overriden. |
b02df886eb3e
cleanup, reorganize
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3358
diff
changeset
|
610 |
""" |
b02df886eb3e
cleanup, reorganize
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3358
diff
changeset
|
611 |
try: |
b02df886eb3e
cleanup, reorganize
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3358
diff
changeset
|
612 |
return self._action |
b02df886eb3e
cleanup, reorganize
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3358
diff
changeset
|
613 |
except AttributeError: |
3457
0924d0d08d60
[api] __regid__, cw_* and friends
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3451
diff
changeset
|
614 |
return self._cw.build_url('validateform') |
3360
b02df886eb3e
cleanup, reorganize
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3358
diff
changeset
|
615 |
|
b02df886eb3e
cleanup, reorganize
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3358
diff
changeset
|
616 |
def set_action(self, value): |
b02df886eb3e
cleanup, reorganize
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3358
diff
changeset
|
617 |
"""override default action""" |
b02df886eb3e
cleanup, reorganize
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3358
diff
changeset
|
618 |
self._action = value |
b02df886eb3e
cleanup, reorganize
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3358
diff
changeset
|
619 |
|
b02df886eb3e
cleanup, reorganize
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3358
diff
changeset
|
620 |
action = property(action, set_action) |
b02df886eb3e
cleanup, reorganize
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3358
diff
changeset
|
621 |
|
4378
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
622 |
# autoform specific fields ################################################# |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
623 |
|
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
624 |
def _generic_relations_field(self): |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
625 |
try: |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
626 |
srels_by_cat = self.srelations_by_category('generic', 'add', strict=True) |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
627 |
warn('[3.6] %s: srelations_by_category is deprecated, use uicfg or ' |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
628 |
'override editable_relations instead' % classid(form), |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
629 |
DeprecationWarning) |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
630 |
except AttributeError: |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
631 |
srels_by_cat = self.editable_relations() |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
632 |
if not srels_by_cat: |
4387
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
633 |
raise f.FieldNotFound('_cw_generic_field') |
4378
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
634 |
fieldset = u'%s :' % self._cw.__('This %s' % self.edited_entity.e_schema) |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
635 |
fieldset = fieldset.capitalize() |
4387
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
636 |
return GenericRelationsField(self.editable_relations(), |
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
637 |
fieldset=fieldset, label=None) |
4378
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
638 |
|
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
639 |
def _inlined_form_view_field(self, view): |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
640 |
# XXX allow more customization |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
641 |
kwargs = _AFFK.etype_get(self.edited_entity.e_schema, view.rtype, |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
642 |
view.role, view.etype) |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
643 |
if kwargs is None: |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
644 |
kwargs = {} |
4387
4aacd6492ef4
reorganize code:
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4379
diff
changeset
|
645 |
return InlinedFormField(view=view, **kwargs) |
4378
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
646 |
|
3360
b02df886eb3e
cleanup, reorganize
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3358
diff
changeset
|
647 |
# methods mapping edited entity relations to fields in the form ############ |
b02df886eb3e
cleanup, reorganize
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3358
diff
changeset
|
648 |
|
3476
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
649 |
def _relations_by_section(self, section, permission='add', strict=False): |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
650 |
"""return a list of (relation schema, target schemas, role) matching |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
651 |
given category(ies) and permission |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
652 |
""" |
4378
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
653 |
return _AFS.relations_by_section( |
3476
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
654 |
self.edited_entity, self.formtype, section, permission, strict) |
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
655 |
|
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
656 |
def editable_attributes(self, strict=False): |
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
657 |
"""return a list of (relation schema, role) to edit for the entity""" |
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
658 |
if self.display_fields is not None: |
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
659 |
return self.display_fields |
4625
d8c3a50a8ee7
this is not the form renderer responsability to check for update permissions. Move this to autoform editable_attributes relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4587
diff
changeset
|
660 |
if self.edited_entity.has_eid() and not self.edited_entity.has_perm('update'): |
d8c3a50a8ee7
this is not the form renderer responsability to check for update permissions. Move this to autoform editable_attributes relation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4587
diff
changeset
|
661 |
return [] |
3476
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
662 |
# XXX we should simply put eid in the generated section, no? |
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
663 |
return [(rtype, role) for rtype, _, role in self._relations_by_section( |
4570
ede247bbbf62
follow yams api change: attributes permissions are now defined for
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4519
diff
changeset
|
664 |
'attributes', 'update', strict) if rtype != 'eid'] |
3476
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
665 |
|
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
666 |
def editable_relations(self): |
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
667 |
"""return a sorted list of (relation's label, relation'schema, role) for |
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
668 |
relations in the 'relations' section |
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
669 |
""" |
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
670 |
result = [] |
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
671 |
for rschema, _, role in self._relations_by_section('relations', |
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
672 |
strict=True): |
3505
c0c7a944c00d
fix dumb name error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3503
diff
changeset
|
673 |
result.append( (rschema.display_name(self.edited_entity._cw, role, |
c0c7a944c00d
fix dumb name error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3503
diff
changeset
|
674 |
self.edited_entity.__regid__), |
3476
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
675 |
rschema, role) ) |
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
676 |
return sorted(result) |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
677 |
|
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
678 |
def inlined_relations(self): |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
679 |
"""return a list of (relation schema, target schemas, role) matching |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
680 |
given category(ies) and permission |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
681 |
""" |
3476
6e927b729ae1
[uicfg, autoform] more consistent/powerful autoform_section rtags by using formtype/section; deprecates autoform_is_inlined; refactor automatci form and renderer thanks to this
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3468
diff
changeset
|
682 |
return self._relations_by_section('inlined') |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
683 |
|
4378
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
684 |
# inlined forms control #################################################### |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
685 |
|
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:
3470
diff
changeset
|
686 |
def inlined_form_views(self): |
4378
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
687 |
"""compute and return list of inlined form views (hosting the inlined |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
688 |
form object) |
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:
3470
diff
changeset
|
689 |
""" |
3593
987232bd79cd
fix inlined forms initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3586
diff
changeset
|
690 |
allformviews = [] |
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:
3470
diff
changeset
|
691 |
entity = self.edited_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:
3470
diff
changeset
|
692 |
for rschema, ttypes, role in self.inlined_relations(): |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3470
diff
changeset
|
693 |
# show inline forms only if there's one possible target type |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3470
diff
changeset
|
694 |
# for rschema |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3470
diff
changeset
|
695 |
if len(ttypes) != 1: |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3470
diff
changeset
|
696 |
self.warning('entity related by the %s relation should have ' |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3470
diff
changeset
|
697 |
'inlined form but there is multiple target types, ' |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3470
diff
changeset
|
698 |
'dunno what to do', rschema) |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3470
diff
changeset
|
699 |
continue |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3470
diff
changeset
|
700 |
ttype = ttypes[0].type |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3470
diff
changeset
|
701 |
if self.should_inline_relation_form(rschema, ttype, role): |
3593
987232bd79cd
fix inlined forms initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3586
diff
changeset
|
702 |
formviews = list(self.inline_edition_form_view(rschema, ttype, role)) |
4519
cce343c7d18a
fix bug w/ object relation used as inlined form
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4518
diff
changeset
|
703 |
card = rschema.role_rdef(entity.e_schema, ttype, role).role_cardinality(role) |
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:
3470
diff
changeset
|
704 |
# there is no related entity and we need at least one: we need to |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3470
diff
changeset
|
705 |
# display one explicit inline-creation view |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3470
diff
changeset
|
706 |
if self.should_display_inline_creation_form(rschema, formviews, 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:
3470
diff
changeset
|
707 |
formviews += self.inline_creation_form_view(rschema, ttype, role) |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3470
diff
changeset
|
708 |
# we can create more than one related entity, we thus display a 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:
3470
diff
changeset
|
709 |
# to add new related entities |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3470
diff
changeset
|
710 |
if self.should_display_add_new_relation_link(rschema, formviews, card): |
4083
3b285889b8e9
3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4082
diff
changeset
|
711 |
addnewlink = self._cw.vreg['views'].select( |
4082
c7117119e215
3.6 api update
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4015
diff
changeset
|
712 |
'inline-addnew-link', self._cw, |
4629
1eeef3cbf528
fix 4626:c26b4df9fc90 (#703911): use can't rely on peid since it's not an actual eid when we're creating the parent entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4626
diff
changeset
|
713 |
etype=ttype, rtype=rschema, role=role, card=card, |
1eeef3cbf528
fix 4626:c26b4df9fc90 (#703911): use can't rely on peid since it's not an actual eid when we're creating the parent entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4626
diff
changeset
|
714 |
peid=self.edited_entity.eid, |
1eeef3cbf528
fix 4626:c26b4df9fc90 (#703911): use can't rely on peid since it's not an actual eid when we're creating the parent entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4626
diff
changeset
|
715 |
petype=self.edited_entity.e_schema, pform=self) |
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:
3470
diff
changeset
|
716 |
formviews.append(addnewlink) |
3593
987232bd79cd
fix inlined forms initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3586
diff
changeset
|
717 |
allformviews += formviews |
987232bd79cd
fix inlined forms initialization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3586
diff
changeset
|
718 |
return allformviews |
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:
3470
diff
changeset
|
719 |
|
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
720 |
def should_inline_relation_form(self, rschema, targettype, role): |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
721 |
"""return true if the given relation with entity has role and a |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
722 |
targettype target should be inlined |
3483
feedfe5d4932
[autoform] no need to recheck inlined tag here
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3482
diff
changeset
|
723 |
|
feedfe5d4932
[autoform] no need to recheck inlined tag here
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3482
diff
changeset
|
724 |
At this point we now relation has inlined_attributes tag (eg is returned |
feedfe5d4932
[autoform] no need to recheck inlined tag here
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3482
diff
changeset
|
725 |
by `inlined_relations()`. Overrides this for more finer control. |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
726 |
""" |
3595
b61f1c5e6c55
at this point we know this is true
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3594
diff
changeset
|
727 |
return True |
3358
0cddc4d8cad8
[forms] do similar refactoring for inline edition than for inline creation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3356
diff
changeset
|
728 |
|
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
729 |
def should_display_inline_creation_form(self, rschema, existant, card): |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
730 |
"""return true if a creation form should be inlined |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
731 |
|
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
732 |
by default true if there is no related entity and we need at least one |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
733 |
""" |
3418
7b49fa7e942d
[api] use _cw, cw_row, cw_col, cw_rset etc.
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
3408
diff
changeset
|
734 |
return not existant and card in '1+' or self._cw.form.has_key('force_%s_display' % rschema) |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
735 |
|
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
736 |
def should_display_add_new_relation_link(self, rschema, existant, card): |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
737 |
"""return true if we should add a link to add a new creation form |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
738 |
(through ajax call) |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
739 |
|
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
740 |
by default true if there is no related entity or if the relation has |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
741 |
multiple cardinality |
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
742 |
""" |
4160 | 743 |
return not existant or card in '+*' # XXX add target type permisssions |
1491
742aff97dbf7
move AutomaticEntityForm and PrimaryView into their own module
sylvain.thenault@logilab.fr
parents:
diff
changeset
|
744 |
|
3332
91cff87c368f
introduced to ease overriding for fancy stuff...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3293
diff
changeset
|
745 |
def should_hide_add_new_relation_link(self, rschema, card): |
91cff87c368f
introduced to ease overriding for fancy stuff...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3293
diff
changeset
|
746 |
"""return true if once an inlined creation form is added, the 'add new' |
91cff87c368f
introduced to ease overriding for fancy stuff...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3293
diff
changeset
|
747 |
link should be hidden |
91cff87c368f
introduced to ease overriding for fancy stuff...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3293
diff
changeset
|
748 |
|
91cff87c368f
introduced to ease overriding for fancy stuff...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3293
diff
changeset
|
749 |
by default true if the relation has single cardinality |
91cff87c368f
introduced to ease overriding for fancy stuff...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3293
diff
changeset
|
750 |
""" |
91cff87c368f
introduced to ease overriding for fancy stuff...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3293
diff
changeset
|
751 |
return card in '1?' |
91cff87c368f
introduced to ease overriding for fancy stuff...
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3293
diff
changeset
|
752 |
|
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:
3470
diff
changeset
|
753 |
def inline_edition_form_view(self, rschema, ttype, role): |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3470
diff
changeset
|
754 |
"""yield inline form views for already related entities through the |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3470
diff
changeset
|
755 |
given 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:
3470
diff
changeset
|
756 |
""" |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3470
diff
changeset
|
757 |
entity = self.edited_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:
3470
diff
changeset
|
758 |
related = entity.has_eid() and entity.related(rschema, role) |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3470
diff
changeset
|
759 |
if related: |
3524 | 760 |
vvreg = self._cw.vreg['views'] |
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:
3470
diff
changeset
|
761 |
# display inline-edition view for all existing related entities |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3470
diff
changeset
|
762 |
for i, relentity in enumerate(related.entities()): |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3470
diff
changeset
|
763 |
if relentity.has_perm('update'): |
4378
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
764 |
yield vvreg.select('inline-edition', self._cw, |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
765 |
rset=related, row=i, col=0, |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
766 |
etype=ttype, rtype=rschema, role=role, |
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:
3470
diff
changeset
|
767 |
peid=entity.eid, pform=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:
3470
diff
changeset
|
768 |
|
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3470
diff
changeset
|
769 |
def inline_creation_form_view(self, rschema, ttype, role): |
11ce4682187d
[form] important refactoring of inlined forms to get proper separation of form object creation / rendering
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
3470
diff
changeset
|
770 |
"""yield inline form views to a newly related (hence created) 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:
3470
diff
changeset
|
771 |
through the given 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:
3470
diff
changeset
|
772 |
""" |
3524 | 773 |
yield self._cw.vreg['views'].select('inline-creation', self._cw, |
774 |
etype=ttype, rtype=rschema, role=role, |
|
4629
1eeef3cbf528
fix 4626:c26b4df9fc90 (#703911): use can't rely on peid since it's not an actual eid when we're creating the parent entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4626
diff
changeset
|
775 |
peid=self.edited_entity.eid, |
1eeef3cbf528
fix 4626:c26b4df9fc90 (#703911): use can't rely on peid since it's not an actual eid when we're creating the parent entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4626
diff
changeset
|
776 |
petype=self.edited_entity.e_schema, |
1eeef3cbf528
fix 4626:c26b4df9fc90 (#703911): use can't rely on peid since it's not an actual eid when we're creating the parent entity
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4626
diff
changeset
|
777 |
pform=self) |
2652
3753f3a07ca1
[refactoring] moved rtags specification in web/views
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2143
diff
changeset
|
778 |
|
3753f3a07ca1
[refactoring] moved rtags specification in web/views
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2143
diff
changeset
|
779 |
|
3753f3a07ca1
[refactoring] moved rtags specification in web/views
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2143
diff
changeset
|
780 |
## default form ui configuration ############################################## |
3753f3a07ca1
[refactoring] moved rtags specification in web/views
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2143
diff
changeset
|
781 |
|
3753f3a07ca1
[refactoring] moved rtags specification in web/views
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2143
diff
changeset
|
782 |
# use primary and not generated for eid since it has to be an hidden |
4378
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
783 |
_AFS.tag_attribute(('*', 'eid'), 'main', 'attributes') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
784 |
_AFS.tag_attribute(('*', 'eid'), 'muledit', 'attributes') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
785 |
_AFS.tag_attribute(('*', 'description'), 'main', 'attributes') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
786 |
_AFS.tag_attribute(('*', 'creation_date'), 'main', 'metadata') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
787 |
_AFS.tag_attribute(('*', 'modification_date'), 'main', 'metadata') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
788 |
_AFS.tag_attribute(('*', 'cwuri'), 'main', 'metadata') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
789 |
_AFS.tag_attribute(('*', 'has_text'), 'main', 'hidden') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
790 |
_AFS.tag_subject_of(('*', 'in_state', '*'), 'main', 'hidden') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
791 |
_AFS.tag_subject_of(('*', 'owned_by', '*'), 'main', 'metadata') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
792 |
_AFS.tag_subject_of(('*', 'created_by', '*'), 'main', 'metadata') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
793 |
_AFS.tag_subject_of(('*', 'require_permission', '*'), 'main', 'hidden') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
794 |
_AFS.tag_subject_of(('*', 'by_transition', '*'), 'main', 'attributes') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
795 |
_AFS.tag_subject_of(('*', 'by_transition', '*'), 'muledit', 'attributes') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
796 |
_AFS.tag_object_of(('*', 'by_transition', '*'), 'main', 'hidden') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
797 |
_AFS.tag_object_of(('*', 'from_state', '*'), 'main', 'hidden') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
798 |
_AFS.tag_object_of(('*', 'to_state', '*'), 'main', 'hidden') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
799 |
_AFS.tag_subject_of(('*', 'wf_info_for', '*'), 'main', 'attributes') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
800 |
_AFS.tag_subject_of(('*', 'wf_info_for', '*'), 'muledit', 'attributes') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
801 |
_AFS.tag_object_of(('*', 'wf_info_for', '*'), 'main', 'hidden') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
802 |
_AFS.tag_subject_of(('CWPermission', 'require_group', '*'), 'main', 'attributes') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
803 |
_AFS.tag_subject_of(('CWPermission', 'require_group', '*'), 'muledit', 'attributes') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
804 |
_AFS.tag_attribute(('CWEType', 'final'), 'main', 'hidden') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
805 |
_AFS.tag_attribute(('CWRType', 'final'), 'main', 'hidden') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
806 |
_AFS.tag_attribute(('CWUser', 'firstname'), 'main', 'attributes') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
807 |
_AFS.tag_attribute(('CWUser', 'surname'), 'main', 'attributes') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
808 |
_AFS.tag_attribute(('CWUser', 'last_login_time'), 'main', 'metadata') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
809 |
_AFS.tag_subject_of(('CWUser', 'in_group', '*'), 'main', 'attributes') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
810 |
_AFS.tag_subject_of(('CWUser', 'in_group', '*'), 'muledit', 'attributes') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
811 |
_AFS.tag_subject_of(('*', 'primary_email', '*'), 'main', 'relations') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
812 |
_AFS.tag_subject_of(('*', 'use_email', '*'), 'main', 'inlined') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
813 |
_AFS.tag_subject_of(('CWRelation', 'relation_type', '*'), 'main', 'inlined') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
814 |
_AFS.tag_subject_of(('CWRelation', 'from_entity', '*'), 'main', 'inlined') |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
815 |
_AFS.tag_subject_of(('CWRelation', 'to_entity', '*'), 'main', 'inlined') |
2652
3753f3a07ca1
[refactoring] moved rtags specification in web/views
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2143
diff
changeset
|
816 |
|
4378
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
817 |
_AFFK.tag_attribute(('RQLExpression', 'expression'), |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
818 |
{'widget': fw.TextInput}) |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
819 |
_AFFK.tag_subject_of(('TrInfo', 'wf_info_for', '*'), |
785c56bdacc6
[forms] the last touch: handle inlined relation forms as fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4360
diff
changeset
|
820 |
{'widget': fw.HiddenInput}) |
2652
3753f3a07ca1
[refactoring] moved rtags specification in web/views
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
2143
diff
changeset
|
821 |
|
4105
de31c3afe975
fix 3.6 bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4083
diff
changeset
|
822 |
def registration_callback(vreg): |
de31c3afe975
fix 3.6 bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4083
diff
changeset
|
823 |
global etype_relation_field |
de31c3afe975
fix 3.6 bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4083
diff
changeset
|
824 |
|
de31c3afe975
fix 3.6 bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4083
diff
changeset
|
825 |
def etype_relation_field(etype, rtype, role='subject'): |
de31c3afe975
fix 3.6 bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4083
diff
changeset
|
826 |
eschema = vreg.schema.eschema(etype) |
de31c3afe975
fix 3.6 bug
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4083
diff
changeset
|
827 |
return AutomaticEntityForm.field_by_name(rtype, role, eschema) |
4110 | 828 |
|
829 |
vreg.register_all(globals().values(), __name__) |