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: |