예제 #1
0
    def conv_List(self, model, field, kwargs):
        if field.field is None:
            raise ValueError(
                'ListField "%s" must have field specified for model %s' %
                (field.name, model))

        if isinstance(field.field, ReferenceField):
            loader = getattr(self.view, '_form_ajax_refs', {}).get(field.name)
            if loader:
                return AjaxSelectMultipleField(loader, **kwargs)

            kwargs['widget'] = form.Select2Widget(multiple=True)

            # TODO: Support AJAX multi-select
            doc_type = field.field.document_type
            return mongo_fields.ModelSelectMultipleField(model=doc_type,
                                                         **kwargs)

        # Create converter
        view = self._get_subdocument_config(field.name)
        converter = self.clone_converter(view)

        if field.field.choices:
            kwargs['multiple'] = True
            return converter.convert(model, field.field, kwargs)

        unbound_field = converter.convert(model, field.field, {})
        return InlineFieldList(unbound_field, min_entries=0, **kwargs)
예제 #2
0
    def _model_select_field(self, prop, multiple, remote_model, **kwargs):
        loader = getattr(self.view, '_form_ajax_refs', {}).get(prop.key)

        if loader:
            if multiple:
                return AjaxSelectMultipleField(loader, **kwargs)
            else:
                return AjaxSelectField(loader, **kwargs)

        if 'query_factory' not in kwargs:
            kwargs['query_factory'] = lambda: self.session.query(remote_model)

        if 'widget' not in kwargs:
            if multiple:
                kwargs['widget'] = form.Select2Widget(multiple=True)
            else:
                kwargs['widget'] = form.Select2Widget()

        if multiple:
            return QuerySelectMultipleField(**kwargs)
        else:
            return QuerySelectField(**kwargs)
예제 #3
0
    def conv_xlist(self, model, field, kwargs):
        if field.field is None:
            raise ValueError(
                'ListField "%s" must have field specified for model %s' %
                (field.name, model))

        if isinstance(field.field, ReferenceField):
            loader = getattr(self.view, '_form_ajax_refs', {}).get(field.name)
            if loader:
                return AjaxSelectMultipleField(loader, **kwargs)

            kwargs['widget'] = form.Select2Widget(multiple=True)

            doc_type = field.field.document_type
            return ModelSelectMultipleField(model=doc_type, **kwargs)

        field.field.name = '%s__field' % field.name
        if field.field.choices:
            kwargs['multiple'] = True
            return self.convert(model, field.field, kwargs)

        unbound_field = self.convert(model, field.field, {})
        return ListField(unbound_field, min_entries=0, **kwargs)
예제 #4
0
    def _model_select_field(self, prop, multiple, remote_model, **kwargs):
        loader = self.view._form_ajax_refs.get(prop.key)

        if loader:
            if multiple:
                return AjaxSelectMultipleField(loader, **kwargs)
            else:
                return AjaxSelectField(loader, **kwargs)

        if 'query_factory' not in kwargs:
            kwargs['query_factory'] = lambda: self.session.query(remote_model)

        if 'widget' not in kwargs:
            if prop.direction.name == 'MANYTOONE':
                kwargs['widget'] = form.Select2Widget()
            elif prop.direction.name == 'ONETOMANY':
                kwargs['widget'] = form.Select2Widget(multiple=True)
            elif prop.direction.name == 'MANYTOMANY':
                kwargs['widget'] = form.Select2Widget(multiple=True)

        if multiple:
            return QuerySelectMultipleField(**kwargs)
        else:
            return QuerySelectField(**kwargs)
예제 #5
0
class TestForm(Form):

    single_user = AjaxSelectField(loader=get_loader_by_name('user'))

    multiple_users = AjaxSelectMultipleField(loader=get_loader_by_name('user'))