web/views/cwproperties.py
branchstable
changeset 1879 cb3466e08d81
parent 1870 015dfeaf1d89
child 1977 606923dff11b
equal deleted inserted replaced
1878:204b79e3e0ec 1879:cb3466e08d81
    21 from cubicweb.web.formfields import FIELDS, StringField
    21 from cubicweb.web.formfields import FIELDS, StringField
    22 from cubicweb.web.formwidgets import Select, Button, SubmitButton
    22 from cubicweb.web.formwidgets import Select, Button, SubmitButton
    23 from cubicweb.web.views import primary
    23 from cubicweb.web.views import primary
    24 
    24 
    25 
    25 
    26 # some string we want to be internationalizable for nicer display of eproperty
    26 # some string we want to be internationalizable for nicer display of property
    27 # groups
    27 # groups
    28 _('navigation')
    28 _('navigation')
    29 _('ui')
    29 _('ui')
    30 _('actions')
    30 _('actions')
    31 _('boxes')
    31 _('boxes')
    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)