111 |
111 |
112 def call(self, **kwargs): |
112 def call(self, **kwargs): |
113 self._cw.add_js(('cubicweb.preferences.js', |
113 self._cw.add_js(('cubicweb.preferences.js', |
114 'cubicweb.edition.js', 'cubicweb.ajax.js')) |
114 'cubicweb.edition.js', 'cubicweb.ajax.js')) |
115 self._cw.add_css('cubicweb.preferences.css') |
115 self._cw.add_css('cubicweb.preferences.css') |
|
116 values = self.defined_keys |
|
117 mainopts, groupedopts = self.group_properties() |
|
118 # precompute all forms first to consume error message |
|
119 mainforms, groupedforms = self.build_forms(mainopts, groupedopts) |
|
120 _ = self._cw._ |
|
121 self.w(u'<h1>%s</h1>\n' % _(self.title)) |
|
122 for label, group, form in sorted((_(g), g, f) |
|
123 for g, f in mainforms.iteritems()): |
|
124 self.wrap_main_form(group, label, form) |
|
125 for label, group, objects in sorted((_(g), g, o) |
|
126 for g, o in groupedforms.iteritems()): |
|
127 self.wrap_grouped_form(group, label, objects) |
|
128 |
|
129 @property |
|
130 @cached |
|
131 def cwprops_rset(self): |
|
132 return self._cw.execute('Any P,K,V WHERE P is CWProperty, P pkey K, ' |
|
133 'P value V, NOT P for_user U') |
|
134 |
|
135 @property |
|
136 def defined_keys(self): |
|
137 values = {} |
|
138 for i, entity in enumerate(self.cwprops_rset.entities()): |
|
139 values[entity.pkey] = i |
|
140 return values |
|
141 |
|
142 def group_properties(self): |
|
143 mainopts, groupedopts = {}, {} |
116 vreg = self._cw.vreg |
144 vreg = self._cw.vreg |
117 values = self.defined_keys |
145 # "self._regid__=='systempropertiesform'" to skip site wide properties on |
118 groupedopts = {} |
|
119 mainopts = {} |
|
120 # "self.id=='systempropertiesform'" to skip site wide properties on |
|
121 # user's preference but not site's configuration |
146 # user's preference but not site's configuration |
122 for key in vreg.user_property_keys(self.__regid__=='systempropertiesform'): |
147 for key in vreg.user_property_keys(self.__regid__=='systempropertiesform'): |
123 parts = key.split('.') |
148 parts = key.split('.') |
124 if parts[0] in vreg and len(parts) >= 3: |
149 if parts[0] in vreg and len(parts) >= 3: |
125 # appobject configuration |
150 # appobject configuration |
127 propid = parts[-1] |
152 propid = parts[-1] |
128 oid = '.'.join(parts[1:-1]) |
153 oid = '.'.join(parts[1:-1]) |
129 groupedopts.setdefault(reg, {}).setdefault(oid, []).append(key) |
154 groupedopts.setdefault(reg, {}).setdefault(oid, []).append(key) |
130 else: |
155 else: |
131 mainopts.setdefault(parts[0], []).append(key) |
156 mainopts.setdefault(parts[0], []).append(key) |
132 # precompute form to consume error message |
157 return mainopts, groupedopts |
|
158 |
|
159 def build_forms(self, mainopts, groupedopts): |
|
160 mainforms, groupedforms = {}, {} |
133 for group, keys in mainopts.items(): |
161 for group, keys in mainopts.items(): |
134 mainopts[group] = self.form(group, keys, False) |
162 mainforms[group] = self.form(group, keys, False) |
135 |
|
136 for group, objects in groupedopts.items(): |
163 for group, objects in groupedopts.items(): |
|
164 groupedforms[group] = {} |
137 for oid, keys in objects.items(): |
165 for oid, keys in objects.items(): |
138 groupedopts[group][oid] = self.form(group + '_' + oid, keys, True) |
166 groupedforms[group][oid] = self.form(group + '_' + oid, keys, True) |
139 |
167 return mainforms, groupedforms |
140 w = self.w |
|
141 req = self._cw |
|
142 _ = req._ |
|
143 w(u'<h1>%s</h1>\n' % _(self.title)) |
|
144 for label, group, form in sorted((_(g), g, f) |
|
145 for g, f in mainopts.iteritems()): |
|
146 status = css_class(self._group_status(group)) |
|
147 w(u'<div class="propertiesform">%s</div>\n' % |
|
148 (make_togglable_link('fieldset_' + group, label.capitalize()))) |
|
149 w(u'<div id="fieldset_%s" %s>' % (group, status)) |
|
150 w(u'<fieldset class="preferences">') |
|
151 w(form) |
|
152 w(u'</fieldset></div>') |
|
153 |
|
154 for label, group, objects in sorted((_(g), g, o) |
|
155 for g, o in groupedopts.iteritems()): |
|
156 status = css_class(self._group_status(group)) |
|
157 w(u'<div class="propertiesform">%s</div>\n' % |
|
158 (make_togglable_link('fieldset_' + group, label.capitalize()))) |
|
159 w(u'<div id="fieldset_%s" %s>' % (group, status)) |
|
160 # create selection |
|
161 sorted_objects = sorted((self._cw.__('%s_%s' % (group, o)), o, f) |
|
162 for o, f in objects.iteritems()) |
|
163 for label, oid, form in sorted_objects: |
|
164 w(u'<div class="component">') |
|
165 w(u'''<div class="componentLink"><a href="javascript:$.noop();" |
|
166 onclick="javascript:toggleVisibility('field_%(oid)s_%(group)s')" |
|
167 class="componentTitle">%(label)s</a>''' % {'label':label, 'oid':oid, 'group':group}) |
|
168 w(u''' (<div class="openlink"><a href="javascript:$.noop();" |
|
169 onclick="javascript:openFieldset('fieldset_%(group)s')">%(label)s</a></div>)''' |
|
170 % {'label':_('open all'), 'group':group}) |
|
171 w(u'</div>') |
|
172 docmsgid = '%s_%s_description' % (group, oid) |
|
173 doc = _(docmsgid) |
|
174 if doc != docmsgid: |
|
175 w(u'<div class="helper">%s</div>' % xml_escape(doc).capitalize()) |
|
176 w(u'</div>') |
|
177 w(u'<fieldset id="field_%(oid)s_%(group)s" class="%(group)s preferences hidden">' |
|
178 % {'oid':oid, 'group':group}) |
|
179 w(form) |
|
180 w(u'</fieldset>') |
|
181 w(u'</div>') |
|
182 |
|
183 @property |
|
184 @cached |
|
185 def cwprops_rset(self): |
|
186 return self._cw.execute('Any P,K,V WHERE P is CWProperty, P pkey K, ' |
|
187 'P value V, NOT P for_user U') |
|
188 |
|
189 @property |
|
190 def defined_keys(self): |
|
191 values = {} |
|
192 for i, entity in enumerate(self.cwprops_rset.entities()): |
|
193 values[entity.pkey] = i |
|
194 return values |
|
195 |
168 |
196 def entity_for_key(self, key): |
169 def entity_for_key(self, key): |
197 values = self.defined_keys |
170 values = self.defined_keys |
198 if key in values: |
171 if key in values: |
199 entity = self.cwprops_rset.get_entity(values[key], 0) |
172 entity = self.cwprops_rset.get_entity(values[key], 0) |
231 label = key |
204 label = key |
232 subform = self._cw.vreg['forms'].select('base', self._cw, entity=entity, |
205 subform = self._cw.vreg['forms'].select('base', self._cw, entity=entity, |
233 mainform=False) |
206 mainform=False) |
234 subform.append_field(PropertyValueField(name='value', label=label, role='subject', |
207 subform.append_field(PropertyValueField(name='value', label=label, role='subject', |
235 eidparam=True)) |
208 eidparam=True)) |
236 #subform.vreg = self._cw.vreg |
|
237 subform.add_hidden('pkey', key, eidparam=True, role='subject') |
209 subform.add_hidden('pkey', key, eidparam=True, role='subject') |
238 form.add_subform(subform) |
210 form.add_subform(subform) |
239 return subform |
211 return subform |
|
212 |
|
213 def wrap_main_form(self, group, label, form): |
|
214 status = css_class(self._group_status(group)) |
|
215 self.w(u'<div class="propertiesform">%s</div>\n' % |
|
216 (make_togglable_link('fieldset_' + group, label))) |
|
217 self.w(u'<div id="fieldset_%s" %s>' % (group, status)) |
|
218 self.w(u'<fieldset class="preferences">') |
|
219 self.w(form) |
|
220 self.w(u'</fieldset></div>') |
|
221 |
|
222 def wrap_grouped_form(self, group, label, objects): |
|
223 status = css_class(self._group_status(group)) |
|
224 self.w(u'<div class="propertiesform">%s</div>\n' % |
|
225 (make_togglable_link('fieldset_' + group, label))) |
|
226 self.w(u'<div id="fieldset_%s" %s>' % (group, status)) |
|
227 sorted_objects = sorted((self._cw.__('%s_%s' % (group, o)), o, f) |
|
228 for o, f in objects.iteritems()) |
|
229 for label, oid, form in sorted_objects: |
|
230 self.wrap_object_form(group, oid, label, form) |
|
231 self.w(u'</div>') |
|
232 |
|
233 def wrap_object_form(self, group, oid, label, form): |
|
234 w = self.w |
|
235 w(u'<div class="component">') |
|
236 w(u'''<div class="componentLink"><a href="javascript:$.noop();" |
|
237 onclick="javascript:toggleVisibility('field_%(oid)s_%(group)s')" |
|
238 class="componentTitle">%(label)s</a>''' % {'label':label, 'oid':oid, 'group':group}) |
|
239 w(u''' (<div class="openlink"><a href="javascript:$.noop();" |
|
240 onclick="javascript:openFieldset('fieldset_%(group)s')">%(label)s</a></div>)''' |
|
241 % {'label':self._cw._('open all'), 'group':group}) |
|
242 w(u'</div>') |
|
243 docmsgid = '%s_%s_description' % (group, oid) |
|
244 doc = self._cw._(docmsgid) |
|
245 if doc != docmsgid: |
|
246 w(u'<div class="helper">%s</div>' % xml_escape(doc).capitalize()) |
|
247 w(u'</div>') |
|
248 w(u'<fieldset id="field_%(oid)s_%(group)s" class="%(group)s preferences hidden">' |
|
249 % {'oid':oid, 'group':group}) |
|
250 w(form) |
|
251 w(u'</fieldset>') |
240 |
252 |
241 |
253 |
242 class CWPropertiesForm(SystemCWPropertiesForm): |
254 class CWPropertiesForm(SystemCWPropertiesForm): |
243 """user's preferences properties edition form""" |
255 """user's preferences properties edition form""" |
244 __regid__ = 'propertiesform' |
256 __regid__ = 'propertiesform' |
266 subform = super(CWPropertiesForm, self).form_row(form, key, splitlabel) |
278 subform = super(CWPropertiesForm, self).form_row(form, key, splitlabel) |
267 # if user is in the managers group and the property is being created, |
279 # if user is in the managers group and the property is being created, |
268 # we have to set for_user explicitly |
280 # we have to set for_user explicitly |
269 if not subform.edited_entity.has_eid() and self.user.matching_groups('managers'): |
281 if not subform.edited_entity.has_eid() and self.user.matching_groups('managers'): |
270 subform.add_hidden('for_user', self.user.eid, eidparam=True, role='subject') |
282 subform.add_hidden('for_user', self.user.eid, eidparam=True, role='subject') |
271 |
283 return subform |
272 |
284 |
273 # cwproperty form objects ###################################################### |
285 # cwproperty form objects ###################################################### |
274 |
286 |
275 class PlaceHolderWidget(FieldWidget): |
287 class PlaceHolderWidget(FieldWidget): |
276 |
288 |