82 self._cw.add_css('cubicweb.form.css') |
82 self._cw.add_css('cubicweb.form.css') |
83 entity = self.cw_rset.get_entity(row, col) |
83 entity = self.cw_rset.get_entity(row, col) |
84 rschema = self._cw.vreg.schema[rtype] |
84 rschema = self._cw.vreg.schema[rtype] |
85 reload = self._compute_reload(entity, rschema, role, reload) |
85 reload = self._compute_reload(entity, rschema, role, reload) |
86 default_value = self._compute_default_value(entity, rschema, role, default_value) |
86 default_value = self._compute_default_value(entity, rschema, role, default_value) |
87 # compute value, checking perms, build & display form |
|
88 divid = self._build_divid(rtype, role, entity.eid) |
87 divid = self._build_divid(rtype, role, entity.eid) |
89 if rschema.final: |
88 if rschema.final: |
90 value = entity.printable_value(rtype) |
89 self._handle_attributes(entity, rschema, role, divid, reload, default_value) |
91 form, renderer = self._build_form(entity, rtype, role, divid, 'base', |
90 else: |
92 default_value, reload) |
91 self._handle_relations(entity, rschema, role, divid, reload, default_value, formid) |
93 if not self._should_edit_attribute(entity, rschema, form): |
92 |
94 self.w(value) |
93 def _handle_attributes(self, entity, rschema, role, divid, reload, default_value): |
95 return |
94 rtype = rschema.type |
96 value = value or default_value |
95 value = entity.printable_value(rtype) |
|
96 form, renderer = self._build_form(entity, rtype, role, divid, 'base', |
|
97 default_value, reload) |
|
98 if not self._should_edit_attribute(entity, rschema, form): |
|
99 self.w(value) |
|
100 return |
|
101 value = value or default_value |
|
102 field = form.field_by_name(rtype, role, entity.e_schema) |
|
103 form.append_field(field) |
|
104 self.view_form(divid, value, form, renderer) |
|
105 |
|
106 def _handle_relations(self, entity, rschema, role, divid, reload, default_value, formid): |
|
107 rtype = rschema.type |
|
108 rvid = self._compute_best_vid(entity.e_schema, rschema, role) |
|
109 related_rset = entity.related(rtype, role) |
|
110 if related_rset: |
|
111 value = self._cw.view(rvid, related_rset) |
|
112 else: |
|
113 value = default_value |
|
114 ttypes = self._compute_ttypes(rschema, role) |
|
115 |
|
116 if not self._should_edit_relation(entity, rschema, role): |
|
117 self.w(value) |
|
118 return |
|
119 # this is for attribute-like composites (1 target type, 1 related entity at most) |
|
120 add_related = self._may_add_related(related_rset, entity, rschema, role, ttypes) |
|
121 edit_related = self._may_edit_related_entity(related_rset, entity, rschema, role, ttypes) |
|
122 delete_related = edit_related and self._may_delete_related(related_rset, entity, rschema, role) |
|
123 # compute formid |
|
124 if len(ttypes) > 1: # redundant safety belt |
|
125 formid = 'base' |
|
126 else: |
|
127 afs = uicfg.autoform_section.etype_get(entity.e_schema, rschema, role, ttypes[0]) |
|
128 # is there an afs spec that says we should edit |
|
129 # the rschema as an attribute ? |
|
130 if afs and 'main_attributes' in afs: |
|
131 formid = 'base' |
|
132 |
|
133 form, renderer = self._build_form(entity, rtype, role, divid, formid, default_value, |
|
134 reload, dict(vid=rvid), |
|
135 edit_related, add_related and ttypes[0]) |
|
136 if formid == 'base': |
97 field = form.field_by_name(rtype, role, entity.e_schema) |
137 field = form.field_by_name(rtype, role, entity.e_schema) |
98 form.append_field(field) |
138 form.append_field(field) |
99 self.view_form(divid, value, form, renderer) |
139 self.view_form(divid, value, form, renderer, edit_related, |
100 else: |
140 delete_related, add_related) |
101 rvid = self._compute_best_vid(entity.e_schema, rschema, role) |
141 |
102 related_rset = entity.related(rtype, role) |
|
103 if related_rset: |
|
104 value = self._cw.view(rvid, related_rset) |
|
105 else: |
|
106 value = default_value |
|
107 ttypes = self._compute_ttypes(rschema, role) |
|
108 |
|
109 if not self._should_edit_relation(entity, rschema, role): |
|
110 self.w(value) |
|
111 return |
|
112 # this is for attribute-like composites (1 target type, 1 related entity at most) |
|
113 add_related = self._may_add_related(related_rset, entity, rschema, role, ttypes) |
|
114 edit_related = self._may_edit_related_entity(related_rset, entity, rschema, role, ttypes) |
|
115 delete_related = edit_related and self._may_delete_related(related_rset, entity, rschema, role) |
|
116 # compute formid |
|
117 if len(ttypes) > 1: # redundant safety belt |
|
118 formid = 'base' |
|
119 else: |
|
120 afs = uicfg.autoform_section.etype_get(entity.e_schema, rschema, role, ttypes[0]) |
|
121 # is there an afs spec that says we should edit |
|
122 # the rschema as an attribute ? |
|
123 if afs and 'main_attributes' in afs: |
|
124 formid = 'base' |
|
125 |
|
126 form, renderer = self._build_form(entity, rtype, role, divid, formid, default_value, |
|
127 reload, dict(vid=rvid), |
|
128 edit_related, add_related and ttypes[0]) |
|
129 if formid == 'base': |
|
130 field = form.field_by_name(rtype, role, entity.e_schema) |
|
131 form.append_field(field) |
|
132 self.view_form(divid, value, form, renderer, edit_related, |
|
133 delete_related, add_related) |
|
134 |
142 |
135 def _compute_best_vid(self, eschema, rschema, role): |
143 def _compute_best_vid(self, eschema, rschema, role): |
136 if eschema.rdef(rschema, role).role_cardinality(role) in '+*': |
144 if eschema.rdef(rschema, role).role_cardinality(role) in '+*': |
137 return self._many_rvid |
145 return self._many_rvid |
138 return self._one_rvid |
146 return self._one_rvid |