114 if not self._should_edit_relation(entity, rschema, role): |
114 if not self._should_edit_relation(entity, rschema, role): |
115 return None, value |
115 return None, value |
116 return formid, value |
116 return formid, value |
117 |
117 |
118 def _handle_relation(self, entity, rschema, role, divid, reload, formid): |
118 def _handle_relation(self, entity, rschema, role, divid, reload, formid): |
119 rvid = self._compute_best_vid(entity.e_schema, rschema, role) |
119 rvid = self._rules.get('rvid', 'autolimited') |
120 formid, value = self._compute_formid_value(entity, rschema, role, rvid, formid) |
120 formid, value = self._compute_formid_value(entity, rschema, role, rvid, formid) |
121 if formid is None: |
121 if formid is None: |
122 return self.w(value) |
122 return self.w(value) |
123 rtype = rschema.type |
123 rtype = rschema.type |
124 display_label, related_entity = self._prepare_form(entity, rtype, role) |
124 display_label, related_entity = self._prepare_form(entity, rtype, role) |
131 ttypes = self._compute_ttypes(rschema, role) |
131 ttypes = self._compute_ttypes(rschema, role) |
132 related_rset = entity.related(rschema.type, role) |
132 related_rset = entity.related(rschema.type, role) |
133 add_related = self._may_add_related(related_rset, entity, rschema, role, ttypes) |
133 add_related = self._may_add_related(related_rset, entity, rschema, role, ttypes) |
134 edit_related = self._may_edit_related_entity(related_rset, entity, rschema, role, ttypes) |
134 edit_related = self._may_edit_related_entity(related_rset, entity, rschema, role, ttypes) |
135 delete_related = edit_related and self._may_delete_related(related_rset, entity, rschema, role) |
135 delete_related = edit_related and self._may_delete_related(related_rset, entity, rschema, role) |
136 |
136 rvid = self._rules.get('rvid', 'autolimited') |
137 rvid = self._compute_best_vid(entity.e_schema, rschema, role) |
|
138 formid, value = self._compute_formid_value(entity, rschema, role, rvid, formid) |
137 formid, value = self._compute_formid_value(entity, rschema, role, rvid, formid) |
139 if formid is None or not (edit_related or add_related): |
138 if formid is None or not (edit_related or add_related): |
140 # till we learn to handle cases where not (edit_related or add_related) |
139 # till we learn to handle cases where not (edit_related or add_related) |
141 self.w(value) |
140 self.w(value) |
142 return |
141 return |
143 |
|
144 rtype = rschema.type |
142 rtype = rschema.type |
145 ttype = ttypes[0] |
143 ttype = ttypes[0] |
146 _fdata = self._prepare_composite_form(entity, rtype, role, edit_related, add_related and ttype) |
144 _fdata = self._prepare_composite_form(entity, rtype, role, edit_related, |
|
145 add_related and ttype) |
147 display_label, related_entity = _fdata |
146 display_label, related_entity = _fdata |
148 form, renderer = self._build_form(entity, rtype, role, divid, formid, reload, |
147 form, renderer = self._build_form(entity, rtype, role, divid, formid, reload, |
149 display_label, related_entity, dict(vid=rvid)) |
148 display_label, related_entity, dict(vid=rvid)) |
150 self.view_form(divid, value, form, renderer, |
149 self.view_form(divid, value, form, renderer, |
151 edit_related, add_related, delete_related) |
150 edit_related, add_related, delete_related) |
152 |
|
153 def _compute_best_vid(self, eschema, rschema, role): |
|
154 vid = self._rules.get('rvid', None) |
|
155 if vid is None: |
|
156 vid = 'autolimited' |
|
157 return vid |
|
158 |
151 |
159 def _compute_ttypes(self, rschema, role): |
152 def _compute_ttypes(self, rschema, role): |
160 dual_role = neg_role(role) |
153 dual_role = neg_role(role) |
161 return getattr(rschema, '%ss' % dual_role)() |
154 return getattr(rschema, '%ss' % dual_role)() |
162 |
155 |