web/views/cwproperties.py
changeset 7829 58f696c0f5b3
parent 7805 7111bb64b58f
child 7868 39a54b88906d
equal deleted inserted replaced
7828:749e1a67987f 7829:58f696c0f5b3
     1 # copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
     1 # copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
     2 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
     2 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
     3 #
     3 #
     4 # This file is part of CubicWeb.
     4 # This file is part of CubicWeb.
     5 #
     5 #
     6 # CubicWeb is free software: you can redistribute it and/or modify it under the
     6 # CubicWeb is free software: you can redistribute it and/or modify it under the
   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