377 needs_multipart = False |
377 needs_multipart = False |
378 creation_rank = 0 |
378 creation_rank = 0 |
379 |
379 |
380 def __init__(self, name=None, id=None, label=None, |
380 def __init__(self, name=None, id=None, label=None, |
381 widget=None, required=False, initial=None, help=None, |
381 widget=None, required=False, initial=None, help=None, |
382 eidparam=True): |
382 eidparam=False): |
383 self.required = required |
383 self.required = required |
384 if widget is not None: |
384 if widget is not None: |
385 self.widget = widget |
385 self.widget = widget |
386 if isinstance(self.widget, type): |
386 if isinstance(self.widget, type): |
387 self.widget = self.widget() |
387 self.widget = self.widget() |
474 allfields.append(field) |
474 allfields.append(field) |
475 classdict['_fields_'] = allfields |
475 classdict['_fields_'] = allfields |
476 return super(metafieldsform, mcs).__new__(mcs, name, bases, classdict) |
476 return super(metafieldsform, mcs).__new__(mcs, name, bases, classdict) |
477 |
477 |
478 |
478 |
479 class FieldsForm(object): |
479 class FieldsForm(FormMixIn): |
480 __metaclass__ = metafieldsform |
480 __metaclass__ = metafieldsform |
481 |
481 |
482 def __init__(self, req, id=None, title=None, action='edit', |
482 def __init__(self, req, domid=None, title=None, action='edit', |
483 onsubmit="return freezeFormButtons('%s');", |
483 onsubmit="return freezeFormButtons('%s');", |
484 cssclass=None, cssstyle=None, cwtarget=None, buttons=None, |
484 cssclass=None, cssstyle=None, cwtarget=None, buttons=None, |
485 redirect_path=None, set_error_url=True, copy_nav_params=False): |
485 redirect_path=None, set_error_url=True, copy_nav_params=False): |
486 self.req = req |
486 self.req = req |
487 self.id = id or 'form' |
487 self.domid = domid or 'form' |
488 self.title = title |
488 self.title = title |
489 self.action = action |
489 self.action = action |
490 self.onsubmit = onsubmit |
490 self.onsubmit = onsubmit |
491 self.cssclass = cssclass |
491 self.cssclass = cssclass |
492 self.cssstyle = cssstyle |
492 self.cssstyle = cssstyle |
493 self.cwtarget = cwtarget |
493 self.cwtarget = cwtarget |
494 self.redirect_path = None |
494 self.redirect_path = redirect_path |
495 self.fields = list(self.__class__._fields_) |
495 self.fields = list(self.__class__._fields_) |
496 if set_error_url: |
496 if set_error_url: |
497 self.form_add_hidden('__errorurl', req.url()) |
497 self.form_add_hidden('__errorurl', req.url()) |
498 if copy_nav_params: |
498 if copy_nav_params: |
499 for param in NAV_FORM_PARAMETERS: |
499 for param in NAV_FORM_PARAMETERS: |
550 def form_field_id(self, field): |
550 def form_field_id(self, field): |
551 return field.id |
551 return field.id |
552 |
552 |
553 def form_field_vocabulary(self, field): |
553 def form_field_vocabulary(self, field): |
554 raise NotImplementedError |
554 raise NotImplementedError |
555 |
|
556 BUTTON_STR = u'<input class="validateButton" type="submit" name="%s" value="%s" tabindex="%s"/>' |
|
557 ACTION_SUBMIT_STR = u'<input class="validateButton" type="button" onclick="postForm(\'%s\', \'%s\', \'%s\')" value="%s" tabindex="%s"/>' |
|
558 |
|
559 def button_ok(self, label=None, tabindex=None): |
|
560 label = self.req._(label or stdmsgs.BUTTON_OK).capitalize() |
|
561 return self.BUTTON_STR % ('defaultsubmit', label, tabindex or 2) |
|
562 |
|
563 def button_apply(self, label=None, tabindex=None): |
|
564 label = self.req._(label or stdmsgs.BUTTON_APPLY).capitalize() |
|
565 return self.ACTION_SUBMIT_STR % ('__action_apply', label, self.id, label, tabindex or 3) |
|
566 |
|
567 def button_delete(self, label=None, tabindex=None): |
|
568 label = self.req._(label or stdmsgs.BUTTON_DELETE).capitalize() |
|
569 return self.ACTION_SUBMIT_STR % ('__action_delete', label, self.id, label, tabindex or 3) |
|
570 |
|
571 def button_cancel(self, label=None, tabindex=None): |
|
572 label = self.req._(label or stdmsgs.BUTTON_CANCEL).capitalize() |
|
573 return self.ACTION_SUBMIT_STR % ('__action_cancel', label, self.id, label, tabindex or 4) |
|
574 |
|
575 def button_reset(self, label=None, tabindex=None): |
|
576 label = self.req._(label or stdmsgs.BUTTON_CANCEL).capitalize() |
|
577 return u'<input class="validateButton" type="reset" value="%s" tabindex="%s"/>' % ( |
|
578 label, tabindex or 4) |
|
579 |
555 |
580 def form_buttons(self): |
556 def form_buttons(self): |
581 return self.buttons |
557 return self.buttons |
582 |
558 |
583 |
559 |
584 class EntityFieldsForm(FieldsForm): |
560 class EntityFieldsForm(FieldsForm): |
585 def __init__(self, *args, **kwargs): |
561 def __init__(self, *args, **kwargs): |
586 kwargs.setdefault('id', 'entityForm') |
562 kwargs.setdefault('domid', 'entityForm') |
587 self.entity = kwargs.pop('entity', None) |
563 self.entity = kwargs.pop('entity', None) |
588 super(EntityFieldsForm, self).__init__(*args, **kwargs) |
564 super(EntityFieldsForm, self).__init__(*args, **kwargs) |
589 self.form_add_hidden('__type') |
565 self.form_add_hidden('__type', eidparam=True) |
590 self.form_add_hidden('eid', eidparam=False) |
566 self.form_add_hidden('eid') |
591 |
567 |
592 def form_render(self, **values): |
568 def form_render(self, **values): |
593 self.form_add_entity_hiddens(self.entity.e_schema) |
569 self.form_add_entity_hiddens(self.entity.e_schema) |
594 return super(EntityFieldsForm, self).form_render(**values) |
570 return super(EntityFieldsForm, self).form_render(**values) |
595 |
571 |
597 for field in self.fields[:]: |
573 for field in self.fields[:]: |
598 fieldname = field.name |
574 fieldname = field.name |
599 if fieldname != 'eid' and ( |
575 if fieldname != 'eid' and ( |
600 (eschema.has_subject_relation(fieldname) or |
576 (eschema.has_subject_relation(fieldname) or |
601 eschema.has_object_relation(fieldname))): |
577 eschema.has_object_relation(fieldname))): |
|
578 field.eidparam = True |
602 self.fields.append(self.form_entity_hidden_field(field)) |
579 self.fields.append(self.form_entity_hidden_field(field)) |
603 |
580 |
604 def form_entity_hidden_field(self, field): |
581 def form_entity_hidden_field(self, field): |
605 """returns the hidden field which will indicate the value |
582 """returns the hidden field which will indicate the value |
606 before the modification |
583 before the modification |
609 # to describe attribute fields => role is 'subject' |
586 # to describe attribute fields => role is 'subject' |
610 if getattr(field, 'role', 'subject') == 'subject': |
587 if getattr(field, 'role', 'subject') == 'subject': |
611 name = 'edits-%s' % field.name |
588 name = 'edits-%s' % field.name |
612 else: |
589 else: |
613 name = 'edito-%s' % field.name |
590 name = 'edito-%s' % field.name |
614 return HiddenInitialValueField(field, name=name) |
591 return HiddenInitialValueField(field, name=name, eidparam=True) |
615 |
592 |
616 def form_field_value(self, field, values): |
593 def form_field_value(self, field, values): |
617 """look for field's value with the following rules: |
594 """look for field's value with the following rules: |
618 1. handle special __type and eid fields |
595 1. handle special __type and eid fields |
619 2. looks in kw args given to render_form (including previously submitted |
596 2. looks in kw args given to render_form (including previously submitted |
697 |
674 |
698 def render(self, form, values): |
675 def render(self, form, values): |
699 data = [] |
676 data = [] |
700 w = data.append |
677 w = data.append |
701 # XXX form_needs_multipart |
678 # XXX form_needs_multipart |
702 print 'render', form |
|
703 w(self.open_form(form)) |
679 w(self.open_form(form)) |
704 w(u'<div id="progress">%s</div>' % _('validating...')) |
680 w(u'<div id="progress">%s</div>' % _('validating...')) |
705 w(u'<fieldset>') |
681 w(u'<fieldset>') |
706 w(tags.input(type='hidden', name='__form_id', value=form.id)) |
682 w(tags.input(type='hidden', name='__form_id', value=form.domid)) |
707 if form.redirect_path: |
683 if form.redirect_path: |
708 w(tags.input(type='hidden', name='__redirect_path', value=form.redirect_path)) |
684 w(tags.input(type='hidden', name='__redirectpath', value=form.redirect_path)) |
709 self.render_fields(w, form, values) |
685 self.render_fields(w, form, values) |
710 self.render_buttons(w, form) |
686 self.render_buttons(w, form) |
711 w(u'</fieldset>') |
687 w(u'</fieldset>') |
712 w(u'</form>') |
688 w(u'</form>') |
713 return '\n'.join(data) |
689 return '\n'.join(data) |
715 def open_form(self, form): |
691 def open_form(self, form): |
716 if form.form_needs_multipart: |
692 if form.form_needs_multipart: |
717 enctype = 'multipart/form-data' |
693 enctype = 'multipart/form-data' |
718 else: |
694 else: |
719 enctype = 'application/x-www-form-urlencoded' |
695 enctype = 'application/x-www-form-urlencoded' |
720 tag = ('<form action="%s" method="post" id="%s" enctype="%s"' % ( |
696 tag = ('<form action="%s" methody="post" id="%s" enctype="%s"' % ( |
721 html_escape(form.req.build_url(form.action)), form.id, enctype)) |
697 html_escape(form.action or '#'), form.domid, enctype)) |
722 if form.onsubmit: |
698 if form.onsubmit: |
723 tag += ' onsubmit="%s"' % html_escape(form.onsubmit) |
699 tag += ' onsubmit="%s"' % html_escape(form.onsubmit) |
724 if form.cssstyle: |
700 if form.cssstyle: |
725 tag += ' style="%s"' % html_escape(form.cssstyle) |
701 tag += ' style="%s"' % html_escape(form.cssstyle) |
726 if form.cssclass: |
702 if form.cssclass: |