61 class CWPropertyPrimaryView(primary.PrimaryView): |
61 class CWPropertyPrimaryView(primary.PrimaryView): |
62 __select__ = implements('CWProperty') |
62 __select__ = implements('CWProperty') |
63 skip_none = False |
63 skip_none = False |
64 |
64 |
65 |
65 |
66 class SystemEPropertiesForm(FormViewMixIn, StartupView): |
66 class SystemCWPropertiesForm(FormViewMixIn, StartupView): |
67 id = 'systemepropertiesform' |
67 id = 'systempropertiesform' |
68 __select__ = none_rset() & match_user_groups('managers') |
68 __select__ = none_rset() & match_user_groups('managers') |
69 |
69 |
70 title = _('site configuration') |
70 title = _('site configuration') |
71 category = 'startupview' |
71 category = 'startupview' |
72 |
72 |
99 self.req.add_css('cubicweb.preferences.css') |
99 self.req.add_css('cubicweb.preferences.css') |
100 vreg = self.vreg |
100 vreg = self.vreg |
101 values = self.defined_keys |
101 values = self.defined_keys |
102 groupedopts = {} |
102 groupedopts = {} |
103 mainopts = {} |
103 mainopts = {} |
104 # "self.id=='systemepropertiesform'" to skip site wide properties on |
104 # "self.id=='systempropertiesform'" to skip site wide properties on |
105 # user's preference but not site's configuration |
105 # user's preference but not site's configuration |
106 for key in vreg.user_property_keys(self.id=='systemepropertiesform'): |
106 for key in vreg.user_property_keys(self.id=='systempropertiesform'): |
107 parts = key.split('.') |
107 parts = key.split('.') |
108 if parts[0] in vreg: |
108 if parts[0] in vreg: |
109 # appobject configuration |
109 # appobject configuration |
110 reg, oid, propid = parts |
110 reg, oid, propid = parts |
111 groupedopts.setdefault(reg, {}).setdefault(oid, []).append(key) |
111 groupedopts.setdefault(reg, {}).setdefault(oid, []).append(key) |
138 status = css_class(self._group_status(group)) |
138 status = css_class(self._group_status(group)) |
139 w(u'<h2 class="propertiesform">%s</h2>\n' % |
139 w(u'<h2 class="propertiesform">%s</h2>\n' % |
140 (make_togglable_link('fieldset_' + group, label.capitalize()))) |
140 (make_togglable_link('fieldset_' + group, label.capitalize()))) |
141 w(u'<div id="fieldset_%s" %s>' % (group, status)) |
141 w(u'<div id="fieldset_%s" %s>' % (group, status)) |
142 |
142 |
143 # create selection |
143 # create selection |
144 sorted_objects = sorted((self.req.__('%s_%s' % (group, o)), o, f) |
144 sorted_objects = sorted((self.req.__('%s_%s' % (group, o)), o, f) |
145 for o, f in objects.iteritems()) |
145 for o, f in objects.iteritems()) |
146 for label, oid, form in sorted_objects: |
146 for label, oid, form in sorted_objects: |
147 w(u'<div class="component">') |
147 w(u'<div class="component">') |
148 w(u'''<div class="componentLink"><a href="javascript:noop();" |
148 w(u'''<div class="componentLink"><a href="javascript:noop();" |
149 onclick="javascript:toggleVisibility('field_%(oid)s_%(group)s')" |
149 onclick="javascript:toggleVisibility('field_%(oid)s_%(group)s')" |
150 class="componentTitle">%(label)s</a>''' % {'label':label, 'oid':oid, 'group':group}) |
150 class="componentTitle">%(label)s</a>''' % {'label':label, 'oid':oid, 'group':group}) |
151 w(u''' (<div class="openlink"><a href="javascript:noop();" |
151 w(u''' (<div class="openlink"><a href="javascript:noop();" |
155 docmsgid = '%s_%s_description' % (group, oid) |
155 docmsgid = '%s_%s_description' % (group, oid) |
156 doc = _(docmsgid) |
156 doc = _(docmsgid) |
157 if doc != docmsgid: |
157 if doc != docmsgid: |
158 w(u'<div class="helper">%s</div>' % html_escape(doc).capitalize()) |
158 w(u'<div class="helper">%s</div>' % html_escape(doc).capitalize()) |
159 w(u'</div>') |
159 w(u'</div>') |
160 w(u'<fieldset id="field_%(oid)s_%(group)s" class="%(group)s preferences hidden">' |
160 w(u'<fieldset id="field_%(oid)s_%(group)s" class="%(group)s preferences hidden">' |
161 % {'oid':oid, 'group':group}) |
161 % {'oid':oid, 'group':group}) |
162 w(form) |
162 w(form) |
163 w(u'</fieldset>') |
163 w(u'</fieldset>') |
164 w(u'</div>') |
164 w(u'</div>') |
165 |
165 |
166 @property |
166 @property |
167 @cached |
167 @cached |
168 def eprops_rset(self): |
168 def cwprops_rset(self): |
169 return self.req.execute('Any P,K,V WHERE P is CWProperty, P pkey K, ' |
169 return self.req.execute('Any P,K,V WHERE P is CWProperty, P pkey K, ' |
170 'P value V, NOT P for_user U') |
170 'P value V, NOT P for_user U') |
171 |
171 |
172 @property |
172 @property |
173 def defined_keys(self): |
173 def defined_keys(self): |
174 values = {} |
174 values = {} |
175 for i, entity in enumerate(self.eprops_rset.entities()): |
175 for i, entity in enumerate(self.cwprops_rset.entities()): |
176 values[entity.pkey] = i |
176 values[entity.pkey] = i |
177 return values |
177 return values |
178 |
178 |
179 def entity_for_key(self, key): |
179 def entity_for_key(self, key): |
180 values = self.defined_keys |
180 values = self.defined_keys |
181 if key in values: |
181 if key in values: |
182 entity = self.eprops_rset.get_entity(values[key], 0) |
182 entity = self.cwprops_rset.get_entity(values[key], 0) |
183 else: |
183 else: |
184 entity = self.vreg.etype_class('CWProperty')(self.req, None, None) |
184 entity = self.vreg.etype_class('CWProperty')(self.req, None, None) |
185 entity.eid = self.req.varmaker.next() |
185 entity.eid = self.req.varmaker.next() |
186 entity['pkey'] = key |
186 entity['pkey'] = key |
187 entity['value'] = self.vreg.property_value(key) |
187 entity['value'] = self.vreg.property_value(key) |
189 |
189 |
190 def form(self, formid, keys, splitlabel=False): |
190 def form(self, formid, keys, splitlabel=False): |
191 buttons = [SubmitButton()] |
191 buttons = [SubmitButton()] |
192 form = CompositeForm(self.req, domid=formid, action=self.build_url(), |
192 form = CompositeForm(self.req, domid=formid, action=self.build_url(), |
193 form_buttons=buttons, |
193 form_buttons=buttons, |
194 onsubmit="return validatePrefsForm('%s')" % formid, |
194 onsubmit="return validatePrefsForm('%s')" % formid, |
195 submitmsg=self.req._('changes applied')) |
195 submitmsg=self.req._('changes applied')) |
196 path = self.req.relative_path() |
196 path = self.req.relative_path() |
197 if '?' in path: |
197 if '?' in path: |
198 path, params = path.split('?', 1) |
198 path, params = path.split('?', 1) |
199 form.form_add_hidden('__redirectparams', params) |
199 form.form_add_hidden('__redirectparams', params) |
200 form.form_add_hidden('__redirectpath', path) |
200 form.form_add_hidden('__redirectpath', path) |
201 for key in keys: |
201 for key in keys: |
202 self.form_row(form, key, splitlabel) |
202 self.form_row(form, key, splitlabel) |
203 renderer = EPropertiesFormRenderer() |
203 renderer = CWPropertiesFormRenderer() |
204 return form.form_render(display_progress_div=False, |
204 return form.form_render(display_progress_div=False, |
205 renderer=renderer) |
205 renderer=renderer) |
206 |
206 |
207 def form_row(self, form, key, splitlabel): |
207 def form_row(self, form, key, splitlabel): |
208 entity = self.entity_for_key(key) |
208 entity = self.entity_for_key(key) |
209 if splitlabel: |
209 if splitlabel: |
210 label = key.split('.')[-1] |
210 label = key.split('.')[-1] |
211 else: |
211 else: |
212 label = key |
212 label = key |
213 subform = EntityFieldsForm(self.req, entity=entity, set_error_url=False) |
213 subform = EntityFieldsForm(self.req, entity=entity, set_error_url=False) |
214 |
214 |
215 subform.append_field(PropertyValueField(name='value', label=label, |
215 subform.append_field(PropertyValueField(name='value', label=label, |
216 eidparam=True)) |
216 eidparam=True)) |
217 subform.vreg = self.vreg |
217 subform.vreg = self.vreg |
218 subform.form_add_hidden('pkey', key, eidparam=True) |
218 subform.form_add_hidden('pkey', key, eidparam=True) |
222 |
222 |
223 def is_user_prefs(cls, req, rset, row=None, col=0, **kwargs): |
223 def is_user_prefs(cls, req, rset, row=None, col=0, **kwargs): |
224 return req.user.eid == rset[row or 0][col] |
224 return req.user.eid == rset[row or 0][col] |
225 |
225 |
226 |
226 |
227 class EPropertiesForm(SystemEPropertiesForm): |
227 class CWPropertiesForm(SystemCWPropertiesForm): |
228 id = 'epropertiesform' |
228 id = 'propertiesform' |
229 __select__ = ( |
229 __select__ = ( |
230 # we don't want guests to be able to come here |
230 # we don't want guests to be able to come here |
231 match_user_groups('users', 'managers') & |
231 match_user_groups('users', 'managers') & |
232 (none_rset() | ((one_line_rset() & is_user_prefs) & |
232 (none_rset() | ((one_line_rset() & is_user_prefs) & |
233 (one_line_rset() & match_user_groups('managers')))) |
233 (one_line_rset() & match_user_groups('managers')))) |
241 return self.req.user |
241 return self.req.user |
242 return self.rset.get_entity(self.row or 0, self.col or 0) |
242 return self.rset.get_entity(self.row or 0, self.col or 0) |
243 |
243 |
244 @property |
244 @property |
245 @cached |
245 @cached |
246 def eprops_rset(self): |
246 def cwprops_rset(self): |
247 return self.req.execute('Any P,K,V WHERE P is CWProperty, P pkey K, P value V,' |
247 return self.req.execute('Any P,K,V WHERE P is CWProperty, P pkey K, P value V,' |
248 'P for_user U, U eid %(x)s', {'x': self.user.eid}) |
248 'P for_user U, U eid %(x)s', {'x': self.user.eid}) |
249 |
249 |
250 def form_row(self, form, key, splitlabel): |
250 def form_row(self, form, key, splitlabel): |
251 subform = super(EPropertiesForm, self).form_row(form, key, splitlabel) |
251 subform = super(CWPropertiesForm, self).form_row(form, key, splitlabel) |
252 # if user is in the managers group and the property is being created, |
252 # if user is in the managers group and the property is being created, |
253 # we have to set for_user explicitly |
253 # we have to set for_user explicitly |
254 if not subform.edited_entity.has_eid() and self.user.matching_groups('managers'): |
254 if not subform.edited_entity.has_eid() and self.user.matching_groups('managers'): |
255 subform.form_add_hidden('for_user', self.user.eid, eidparam=True) |
255 subform.form_add_hidden('for_user', self.user.eid, eidparam=True) |
256 |
256 |
257 |
257 |
258 # eproperty form objects ###################################################### |
258 # cwproperty form objects ###################################################### |
259 |
259 |
260 class PlaceHolderWidget(object): |
260 class PlaceHolderWidget(object): |
261 |
261 |
262 def render(self, form, field): |
262 def render(self, form, field): |
263 domid = form.context[field]['id'] |
263 domid = form.context[field]['id'] |
351 self.choices = [(form.req._('yes'), '1'), (form.req._('no'), '')] |
351 self.choices = [(form.req._('yes'), '1'), (form.req._('no'), '')] |
352 elif pdef['type'] in ('Float', 'Int'): |
352 elif pdef['type'] in ('Float', 'Int'): |
353 wdg.attrs.setdefault('size', 3) |
353 wdg.attrs.setdefault('size', 3) |
354 self.widget = wdg |
354 self.widget = wdg |
355 |
355 |
356 class EPropertiesFormRenderer(FormRenderer): |
356 |
357 """specific renderer for cwproperties""" |
357 uicfg.autoform_field.tag_attribute(('CWProperty', 'pkey'), PropertyKeyField) |
|
358 uicfg.autoform_field.tag_attribute(('CWProperty', 'value'), PropertyValueField) |
|
359 |
|
360 |
|
361 class CWPropertiesFormRenderer(FormRenderer): |
|
362 """specific renderer for properties""" |
358 |
363 |
359 def open_form(self, form, values): |
364 def open_form(self, form, values): |
360 err = '<div class="formsg"></div>' |
365 err = '<div class="formsg"></div>' |
361 return super(EPropertiesFormRenderer, self).open_form(form, values) + err |
366 return super(CWPropertiesFormRenderer, self).open_form(form, values) + err |
362 |
367 |
363 def _render_fields(self, fields, w, form): |
368 def _render_fields(self, fields, w, form): |
364 for field in fields: |
369 for field in fields: |
365 w(u'<div class="preffield">\n') |
370 w(u'<div class="preffield">\n') |
366 if self.display_label: |
371 if self.display_label: |
367 w(u'%s' % self.render_label(form, field)) |
372 w(u'%s' % self.render_label(form, field)) |
368 error = form.form_field_error(field) |
373 error = form.form_field_error(field) |
369 w(u'%s' % self.render_help(form, field)) |
374 w(u'%s' % self.render_help(form, field)) |
370 w(u'<div class="prefinput">') |
375 w(u'<div class="prefinput">') |
371 w(field.render(form, self)) |
376 w(field.render(form, self)) |
372 w(u'</div>') |
377 w(u'</div>') |
373 w(u'</div>') |
378 w(u'</div>') |
374 |
379 |
375 def render_buttons(self, w, form): |
380 def render_buttons(self, w, form): |
376 w(u'<div>\n') |
381 w(u'<div>\n') |
377 for button in form.form_buttons: |
382 for button in form.form_buttons: |
378 w(u'%s\n' % button.render(form)) |
383 w(u'%s\n' % button.render(form)) |
379 w(u'</div>') |
384 w(u'</div>') |
380 |
|
381 uicfg.autoform_field.tag_attribute(('CWProperty', 'pkey'), PropertyKeyField) |
|
382 uicfg.autoform_field.tag_attribute(('CWProperty', 'value'), PropertyValueField) |
|