web/form.py
branchtls-sprint
changeset 901 0dcf01eb97a0
parent 900 8f95ebbe2fd8
child 902 e4de959c76af
equal deleted inserted replaced
900:8f95ebbe2fd8 901:0dcf01eb97a0
   315 #    pass
   315 #    pass
   316 
   316 
   317 class Select(FieldWidget):
   317 class Select(FieldWidget):
   318     def __init__(self, attrs=None, vocabulary=()):
   318     def __init__(self, attrs=None, vocabulary=()):
   319         super(Select, self).__init__(attrs)
   319         super(Select, self).__init__(attrs)
   320         self.vocabulary = ()
   320         self.multiple = multiple
   321         
   321         
   322     def render(self, form, field):
   322     def render(self, form, field):
   323         name, value, attrs = self._render_attrs(form, field)
   323         name, value, attrs = self._render_attrs(form, field)
   324         if self.vocabulary:
   324         if self.vocabulary:
   325             # static vocabulary defined in form definition
   325             # static vocabulary defined in form definition
   329         options = []
   329         options = []
   330         for label, value in vocab:
   330         for label, value in vocab:
   331             options.append(tags.option(label, value=value))
   331             options.append(tags.option(label, value=value))
   332         if attrs is None:
   332         if attrs is None:
   333             return tags.select(name=name, options=options)
   333             return tags.select(name=name, options=options)
   334         return tags.select(name=name, options=options, **attrs)
   334         return tags.select(name=name, multiple=self.multiple,
       
   335                            options=options, **attrs)
   335 
   336 
   336 
   337 
   337 class CheckBox(FieldWidget):
   338 class CheckBox(FieldWidget):
   338 
   339 
   339     def _render_attrs(self, form, field):
   340     def _render_attrs(self, form, field):
   395     widget = TextInput
   396     widget = TextInput
   396     needs_multipart = False
   397     needs_multipart = False
   397     creation_rank = 0
   398     creation_rank = 0
   398     
   399     
   399     def __init__(self, name=None, id=None, label=None,
   400     def __init__(self, name=None, id=None, label=None,
   400                  widget=None, required=False, initial=None, help=None,
   401                  widget=None, required=False, initial=None,
   401                  eidparam=False):
   402                  choices=None, help=None, eidparam=False):
   402         self.required = required
   403         self.required = required
   403         if widget is not None:
   404         if widget is not None:
   404             self.widget = widget
   405             self.widget = widget
   405         if isinstance(self.widget, type):
   406         if isinstance(self.widget, type):
   406             self.widget = self.widget()
   407             self.widget = self.widget()
   407         self.name = name
   408         self.name = name
   408         self.label = label or name
   409         self.label = label or name
   409         self.id = id or name
   410         self.id = id or name
   410         self.initial = initial
   411         self.initial = initial
       
   412         self.choices = choices or ()
   411         self.help = help
   413         self.help = help
   412         self.eidparam = eidparam
   414         self.eidparam = eidparam
       
   415         self.role = 'subject'
   413         # global fields ordering in forms
   416         # global fields ordering in forms
   414         Field.creation_rank += 1
   417         Field.creation_rank += 1
   415 
   418 
   416     def set_name(self, name):
   419     def set_name(self, name):
   417         assert name
   420         assert name
   443 
   446 
   444     def render(self, form):
   447     def render(self, form):
   445         return self.get_widget(form.req).render(form, self)
   448         return self.get_widget(form.req).render(form, self)
   446 
   449 
   447 
   450 
       
   451     def vocabulary(self, form):
       
   452         return self.choices
       
   453     
   448 class StringField(Field):
   454 class StringField(Field):
   449     def __init__(self, max_length=None, **kwargs):
   455     def __init__(self, max_length=None, **kwargs):
   450         super(StringField, self).__init__(**kwargs)
   456         super(StringField, self).__init__(**kwargs)
   451         self.max_length = max_length
   457         self.max_length = max_length
   452 
   458 
   550     @staticmethod
   556     @staticmethod
   551     def fromcardinality(card, role, **kwargs):
   557     def fromcardinality(card, role, **kwargs):
   552         return RelationField(widget=Select(multiple=card in '*+'),
   558         return RelationField(widget=Select(multiple=card in '*+'),
   553                              **kwargs)
   559                              **kwargs)
   554         
   560         
       
   561     def vocabulary(self, form):
       
   562         entity = form.entity
       
   563         req = entity.req
       
   564         # first see if its specified by __linkto form parameters
       
   565         linkedto = entity.linked_to(self.name, self.role)
       
   566         if linkedto:
       
   567             entities = (req.eid_rset(eid).get_entity(0, 0) for eid in linkedto)
       
   568             return [(entity.view('combobox'), entity.eid) for entity in entities]
       
   569         # it isn't, check if the entity provides a method to get correct values
       
   570         res = []
       
   571         if not self.required:
       
   572             res.append(('', INTERNAL_FIELD_VALUE))
       
   573         # vocabulary doesn't include current values, add them
       
   574         if entity.has_eid():
       
   575             rset = entity.related(self.name, self.role)
       
   576             relatedvocab = [(e.view('combobox'), e.eid) for e in rset.entities()]
       
   577         else:
       
   578             relatedvocab = []
       
   579         return res + form.form_field_vocabulary(self) + relatedvocab
       
   580     
       
   581     def format_single_value(self, req, value):
       
   582         return value
       
   583     
   555 # forms ############
   584 # forms ############
   556 class metafieldsform(type):
   585 class metafieldsform(type):
   557     def __new__(mcs, name, bases, classdict):
   586     def __new__(mcs, name, bases, classdict):
   558         allfields = []
   587         allfields = []
   559         for base in bases:
   588         for base in bases: