15 from cubicweb.appobject import AppRsetObject |
15 from cubicweb.appobject import AppRsetObject |
16 from cubicweb.selectors import yes, non_final_entity, match_kwargs, one_line_rset |
16 from cubicweb.selectors import yes, non_final_entity, match_kwargs, one_line_rset |
17 from cubicweb.view import NOINDEX, NOFOLLOW |
17 from cubicweb.view import NOINDEX, NOFOLLOW |
18 from cubicweb.common import tags |
18 from cubicweb.common import tags |
19 from cubicweb.web import INTERNAL_FIELD_VALUE, eid_param, stdmsgs |
19 from cubicweb.web import INTERNAL_FIELD_VALUE, eid_param, stdmsgs |
20 from cubicweb.web.httpcache import NoHTTPCacheManager |
20 from cubicweb.web import formwidgets as fwdgs, httpcache |
21 from cubicweb.web.controller import NAV_FORM_PARAMETERS |
21 from cubicweb.web.controller import NAV_FORM_PARAMETERS |
22 from cubicweb.web.formfields import (Field, StringField, RelationField, |
22 from cubicweb.web.formfields import (Field, StringField, RelationField, |
23 HiddenInitialValueField) |
23 HiddenInitialValueField) |
24 from cubicweb.web import formrenderers |
24 |
25 from cubicweb.web import formwidgets as fwdgs |
|
26 |
25 |
27 class FormViewMixIn(object): |
26 class FormViewMixIn(object): |
28 """abstract form view mix-in""" |
27 """abstract form view mix-in""" |
29 category = 'form' |
28 category = 'form' |
30 controller = 'edit' |
29 controller = 'edit' |
31 http_cache_manager = NoHTTPCacheManager |
30 http_cache_manager = httpcache.NoHTTPCacheManager |
32 add_to_breadcrumbs = False |
31 add_to_breadcrumbs = False |
33 |
32 |
34 def html_headers(self): |
33 def html_headers(self): |
35 """return a list of html headers (eg something to be inserted between |
34 """return a list of html headers (eg something to be inserted between |
36 <head> and </head> of the returned page |
35 <head> and </head> of the returned page |
89 # XXX deprecated with new form system. Should disappear |
88 # XXX deprecated with new form system. Should disappear |
90 |
89 |
91 domid = 'entityForm' |
90 domid = 'entityForm' |
92 category = 'form' |
91 category = 'form' |
93 controller = 'edit' |
92 controller = 'edit' |
94 http_cache_manager = NoHTTPCacheManager |
93 http_cache_manager = httpcache.NoHTTPCacheManager |
95 add_to_breadcrumbs = False |
94 add_to_breadcrumbs = False |
96 |
95 |
97 def html_headers(self): |
96 def html_headers(self): |
98 """return a list of html headers (eg something to be inserted between |
97 """return a list of html headers (eg something to be inserted between |
99 <head> and </head> of the returned page |
98 <head> and </head> of the returned page |
216 class FieldsForm(FormMixIn, AppRsetObject): |
215 class FieldsForm(FormMixIn, AppRsetObject): |
217 __metaclass__ = metafieldsform |
216 __metaclass__ = metafieldsform |
218 __registry__ = 'forms' |
217 __registry__ = 'forms' |
219 __select__ = yes() |
218 __select__ = yes() |
220 |
219 |
221 renderer_cls = formrenderers.FormRenderer |
|
222 is_subform = False |
220 is_subform = False |
223 |
221 |
224 # attributes overrideable through __init__ |
222 # attributes overrideable through __init__ |
225 internal_fields = ('__errorurl',) + NAV_FORM_PARAMETERS |
223 internal_fields = ('__errorurl',) + NAV_FORM_PARAMETERS |
226 needs_js = ('cubicweb.ajax.js', 'cubicweb.edition.js',) |
224 needs_js = ('cubicweb.ajax.js', 'cubicweb.edition.js',) |
234 cwtarget = None |
232 cwtarget = None |
235 redirect_path = None |
233 redirect_path = None |
236 set_error_url = True |
234 set_error_url = True |
237 copy_nav_params = False |
235 copy_nav_params = False |
238 form_buttons = None # form buttons (button widgets instances) |
236 form_buttons = None # form buttons (button widgets instances) |
|
237 form_renderer_id = 'default' |
239 |
238 |
240 def __init__(self, req, rset=None, row=None, col=None, submitmsg=None, |
239 def __init__(self, req, rset=None, row=None, col=None, submitmsg=None, |
241 **kwargs): |
240 **kwargs): |
242 super(FieldsForm, self).__init__(req, rset, row=row, col=col) |
241 super(FieldsForm, self).__init__(req, rset, row=row, col=col) |
243 self.fields = list(self.__class__._fields_) |
242 self.fields = list(self.__class__._fields_) |
332 |
331 |
333 def form_render(self, **values): |
332 def form_render(self, **values): |
334 """render this form, using the renderer given in args or the default |
333 """render this form, using the renderer given in args or the default |
335 FormRenderer() |
334 FormRenderer() |
336 """ |
335 """ |
337 renderer = values.pop('renderer', self.renderer_cls()) |
336 renderer = values.pop('renderer', None) |
|
337 if renderer is None: |
|
338 renderer = self.form_default_renderer() |
338 return renderer.render(self, values) |
339 return renderer.render(self, values) |
|
340 |
|
341 def form_default_renderer(self): |
|
342 return self.vreg.select_object('formrenderers', self.form_renderer_id, |
|
343 self.req, self.rset, |
|
344 row=self.row, col=self.col) |
339 |
345 |
340 def form_build_context(self, rendervalues=None): |
346 def form_build_context(self, rendervalues=None): |
341 """build form context values (the .context attribute which is a |
347 """build form context values (the .context attribute which is a |
342 dictionary with field instance as key associated to a dictionary |
348 dictionary with field instance as key associated to a dictionary |
343 containing field 'name' (qualified), 'id', 'value' (for display, always |
349 containing field 'name' (qualified), 'id', 'value' (for display, always |
513 value = value() |
519 value = value() |
514 else: |
520 else: |
515 value = super(EntityFieldsForm, self).form_field_value(field, |
521 value = super(EntityFieldsForm, self).form_field_value(field, |
516 load_bytes) |
522 load_bytes) |
517 return value |
523 return value |
|
524 |
|
525 def form_default_renderer(self): |
|
526 return self.vreg.select_object('formrenderers', self.form_renderer_id, |
|
527 self.req, self.rset, |
|
528 row=self.row, col=self.col, |
|
529 entity=self.edited_entity) |
518 |
530 |
519 def form_build_context(self, values=None): |
531 def form_build_context(self, values=None): |
520 """overriden to add edit[s|o] hidden fields and to ensure schema fields |
532 """overriden to add edit[s|o] hidden fields and to ensure schema fields |
521 have eidparam set to True |
533 have eidparam set to True |
522 |
534 |
694 return sorted(results) |
706 return sorted(results) |
695 |
707 |
696 |
708 |
697 class CompositeForm(FieldsForm): |
709 class CompositeForm(FieldsForm): |
698 """form composed for sub-forms""" |
710 """form composed for sub-forms""" |
|
711 form_renderer_id = 'composite' |
699 |
712 |
700 def __init__(self, *args, **kwargs): |
713 def __init__(self, *args, **kwargs): |
701 super(CompositeForm, self).__init__(*args, **kwargs) |
714 super(CompositeForm, self).__init__(*args, **kwargs) |
702 self.forms = [] |
715 self.forms = [] |
703 |
716 |