web/form.py
branchtls-sprint
changeset 1097 611bacbbe001
parent 1082 07c21784787b
child 1101 0c067de38e46
equal deleted inserted replaced
1096:e1fe98850bf7 1097:611bacbbe001
    12 from simplejson import dumps
    12 from simplejson import dumps
    13 
    13 
    14 from logilab.common.compat import any
    14 from logilab.common.compat import any
    15 from logilab.common.decorators import iclassmethod
    15 from logilab.common.decorators import iclassmethod
    16 from logilab.mtconverter import html_escape
    16 from logilab.mtconverter import html_escape
    17 
       
    18 from yams.constraints import SizeConstraint, StaticVocabularyConstraint
       
    19 
    17 
    20 from cubicweb import typed_eid
    18 from cubicweb import typed_eid
    21 from cubicweb.appobject import AppObject
    19 from cubicweb.appobject import AppObject
    22 from cubicweb.utils import ustrftime
    20 from cubicweb.utils import ustrftime
    23 from cubicweb.selectors import yes, match_form_params, non_final_entity
    21 from cubicweb.selectors import yes, match_form_params, non_final_entity
    24 from cubicweb.view import NOINDEX, NOFOLLOW, View, EntityView, AnyRsetView
    22 from cubicweb.view import NOINDEX, NOFOLLOW, View, EntityView, AnyRsetView
    25 from cubicweb.schema import FormatConstraint
    23 from cubicweb.schema import FormatConstraint
    26 from cubicweb.common.registerers import accepts_registerer
    24 from cubicweb.common import tags
    27 from cubicweb.common.uilib import toggle_action
    25 from cubicweb.web import INTERNAL_FIELD_VALUE, eid_param, stdmsgs
    28 from cubicweb.web import stdmsgs
       
    29 from cubicweb.web.httpcache import NoHTTPCacheManager
    26 from cubicweb.web.httpcache import NoHTTPCacheManager
    30 from cubicweb.web.controller import NAV_FORM_PARAMETERS, redirect_params
    27 from cubicweb.web.controller import NAV_FORM_PARAMETERS, redirect_params
    31 from cubicweb.web import INTERNAL_FIELD_VALUE, eid_param
    28 from cubicweb.web.formfields import (Field, StringField, RelationField,
       
    29                                      HiddenInitialValueField)
       
    30 from cubicweb.web.formwidgets import HiddenInput
       
    31 
    32 
    32 
    33 
    33 
    34 def relation_id(eid, rtype, target, reid):
    34 def relation_id(eid, rtype, target, reid):
    35     if target == 'subject':
    35     if target == 'subject':
    36         return u'%s:%s:%s' % (eid, rtype, reid)
    36         return u'%s:%s:%s' % (eid, rtype, reid)
   270 class FieldsForm(FormMixIn, AppObject):
   270 class FieldsForm(FormMixIn, AppObject):
   271     __metaclass__ = metafieldsform
   271     __metaclass__ = metafieldsform
   272     __registry__ = 'forms'
   272     __registry__ = 'forms'
   273     __select__ = yes()
   273     __select__ = yes()
   274     internal_fields = ('__errorurl',) + NAV_FORM_PARAMETERS
   274     internal_fields = ('__errorurl',) + NAV_FORM_PARAMETERS
       
   275     needs_js = ('cubicweb.edition.js',)
       
   276     needs_css = ('cubicweb.form.css',)
   275     
   277     
   276     def __init__(self, req, rset=None, domid=None, title=None, action='edit',
   278     def __init__(self, req, rset=None, domid=None, title=None, action='edit',
   277                  onsubmit="return freezeFormButtons('%(domid)s');",
   279                  onsubmit="return freezeFormButtons('%(domid)s');",
   278                  cssclass=None, cssstyle=None, cwtarget=None, buttons=None,
   280                  cssclass=None, cssstyle=None, cwtarget=None, buttons=None,
   279                  redirect_path=None, set_error_url=True, copy_nav_params=False):
   281                  redirect_path=None, set_error_url=True, copy_nav_params=False):
   315         return any(field.needs_multipart for field in self.fields) 
   317         return any(field.needs_multipart for field in self.fields) 
   316 
   318 
   317     def form_add_hidden(self, name, value=None, **kwargs):
   319     def form_add_hidden(self, name, value=None, **kwargs):
   318         self.fields.append(StringField(name=name, widget=HiddenInput,
   320         self.fields.append(StringField(name=name, widget=HiddenInput,
   319                                        initial=value, **kwargs))
   321                                        initial=value, **kwargs))
       
   322 
       
   323     def add_media(self):
       
   324         """adds media (CSS & JS) required by this widget"""
       
   325         if self.needs_js:
       
   326             self.req.add_js(self.needs_js)
       
   327         if self.needs_css:
       
   328             self.req.add_css(self.needs_css)
   320 
   329 
   321     def form_render(self, **values):
   330     def form_render(self, **values):
   322         renderer = values.pop('renderer', FormRenderer())
   331         renderer = values.pop('renderer', FormRenderer())
   323         return renderer.render(self, values)
   332         return renderer.render(self, values)
   324 
   333 
   614             self.button_bar_class = button_bar_class
   623             self.button_bar_class = button_bar_class
   615             
   624             
   616     # renderer interface ######################################################
   625     # renderer interface ######################################################
   617     
   626     
   618     def render(self, form, values):
   627     def render(self, form, values):
       
   628         form.add_media()
   619         data = []
   629         data = []
   620         w = data.append
   630         w = data.append
   621         w(self.open_form(form))
   631         w(self.open_form(form))
   622         w(u'<div id="progress">%s</div>' % form.req._('validating...'))
   632         w(u'<div id="progress">%s</div>' % form.req._('validating...'))
   623         w(u'<fieldset>')
   633         w(u'<fieldset>')
   639 
   649 
   640     def render_help(self, form, field):
   650     def render_help(self, form, field):
   641         help = [ u'<br/>' ]
   651         help = [ u'<br/>' ]
   642         descr = field.help
   652         descr = field.help
   643         if descr:
   653         if descr:
   644             help.append('<span class="helper">%s</span>' % req._(descr))
   654             help.append('<span class="helper">%s</span>' % form.req._(descr))
   645         example = field.example_format(form.req)
   655         example = field.example_format(form.req)
   646         if example:
   656         if example:
   647             help.append('<span class="helper">(%s: %s)</span>'
   657             help.append('<span class="helper">(%s: %s)</span>'
   648                         % (req._('sample format'), example))
   658                         % (form.req._('sample format'), example))
   649         return u'&nbsp;'.join(help)
   659         return u'&nbsp;'.join(help)
   650 
   660 
   651     # specific methods (mostly to ease overriding) #############################
   661     # specific methods (mostly to ease overriding) #############################
   652     
   662     
   653     def open_form(self, form):
   663     def open_form(self, form):