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' '.join(help) |
659 return u' '.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): |