def test_passwordfield(self):
        class User(Document):
            password = StringField()

        UserForm = model_form(User, field_args={'password': {'password': True}})
        form = UserForm(password='******')
        self.assertEqual(wtforms.widgets.PasswordInput, type(form.password.widget))
    def test_binaryfield(self):
        class Binary(Document):
            binary = BinaryField()

        BinaryForm = model_form(Binary)
        form = BinaryForm(MultiDict({'binary': '1'}))
        self.assertTrue(form.validate())
        form.save()
    def test_model_form_only(self):
        class BlogPost(Document):
            title = StringField(required=True, max_length=200)
            posted = DateTimeField(default=datetime.datetime.now)
            tags = ListField(StringField())

        BlogPost.drop_collection()

        BlogPostForm = model_form(BlogPost, only=['tags'])
        form = BlogPostForm()
        self.assertTrue(hasattr(form, 'tags'))
        self.assertFalse(hasattr(form, 'posted'))

        BlogPostForm = model_form(BlogPost, exclude=['posted'])
        form = BlogPostForm()
        self.assertTrue(hasattr(form, 'tags'))
        self.assertFalse(hasattr(form, 'posted'))
    def test_model_form(self):
        class BlogPost(Document):
            meta = {'allow_inheritance': True}
            title = StringField(required=True, max_length=200)
            posted = DateTimeField(default=datetime.datetime.now)
            tags = ListField(StringField())

        class TextPost(BlogPost):
            email = EmailField(required=False)
            content = StringField(required=True)

        class LinkPost(BlogPost):
            url = StringField(required=True)

        # Create a text-based post
        TextPostForm = model_form(TextPost)

        form = TextPostForm(**{
            'title': 'Using MongoEngine',
            'tags': ['mongodb', 'mongoengine']})

        self.assertFalse(form.validate())

        form = TextPostForm(**{
            'title': 'Using MongoEngine',
            'content': 'See the tutorial',
            'tags': ['mongodb', 'mongoengine']})

        self.assertTrue(form.validate())
        form.save()

        self.assertEquals(BlogPost.objects.first().title, 'Using MongoEngine')
        self.assertEquals(BlogPost.objects.count(), 1)

        form = TextPostForm(**{
            'title': 'Using Flask-MongoEngine',
            'content': 'See the tutorial',
            'tags': ['flask', 'mongodb', 'mongoengine']})

        self.assertTrue(form.validate())
        form.save()
        self.assertEquals(BlogPost.objects.count(), 2)

        post = BlogPost.objects(title="Using Flask-MongoEngine").get()

        form = TextPostForm(MultiDict({
            'title': 'Using Flask-MongoEngine',
            'content': 'See the tutorial',
            'tags-0': 'flask',
            'tags-1': 'mongodb',
            'tags-2': 'mongoengine',
            'tags-3': 'flask-mongoengine',
        }), instance=post)
        self.assertTrue(form.validate())
        form.save()
        post = post.reload()

        self.assertEqual(post.tags, ['flask', 'mongodb', 'mongoengine', 'flask-mongoengine'])
    def test_model_form_help_text(self):
        class BlogPost(Document):
            title = StringField(required=True, help_text="Some imaginative title to set the world on fire")

        post = BlogPost(title="hello world").save()

        BlogPostForm = model_form(BlogPost)
        form = BlogPostForm(instance=post)

        self.assertEqual(form.title.description, "Some imaginative title to set the world on fire")
    def test_list_choices_coerce(self):
        CHOICES = ((1, "blue"), (2, "red"))

        class MyChoices(Document):
            pill = ListField(IntField(choices=CHOICES))

        MyChoicesForm = model_form(MyChoices)
        form = MyChoicesForm(MultiDict({"pill": "1"}))
        self.assertTrue(form.validate())
        form.save()
        self.assertEqual(MyChoices.objects.first().pill[0], 1)
    def test_emailfield(self):
        class Email(Document):
            email = EmailField(required=False)

        EmailForm = model_form(Email)
        form = EmailForm(instance=Email())
        self.assertFalse("None" in "%s" % form.email)
        self.assertTrue(form.validate())

        form = EmailForm(MultiDict({"email": ""}))
        self.assertFalse("None" in "%s" % form.email)
        self.assertTrue(form.validate())

        # Ensure required works

        class Email(Document):
            email = EmailField(required=True)

        EmailForm = model_form(Email)
        form = EmailForm(MultiDict({"email": ""}))
        self.assertFalse("None" in "%s" % form.email)
        self.assertFalse(form.validate())
    def test_embedded_model_form(self):
        class Content(EmbeddedDocument):
            text = StringField()
            lang = StringField(max_length=3)

        class Post(Document):
            title = StringField(max_length=120, required=True)
            tags = ListField(StringField(max_length=30))
            content = EmbeddedDocumentField("Content")

        PostForm = model_form(Post)
        form = PostForm()
        self.assertTrue("content-text" in "%s" % form.content.text)
    def test_sub_field_args(self):
        class TestModel(Document):
            lst = ListField(StringField())

        field_args = {'lst': {'label': 'Custom Label',
                              'field_args': {'widget': wtforms.widgets.HiddenInput(),
                                             'label': "Hidden Input"}}}
        CustomForm = model_form(TestModel, field_args=field_args)

        custom_form = CustomForm(obj=TestModel(lst=["Foo"]))
        list_label = str(custom_form.lst.label)
        self.assertTrue("Custom Label" in list_label)
        self.assertTrue("Hidden Input" not in list_label)

        sub_label = str(custom_form.lst)
        self.assertTrue("Hidden Input" in sub_label)
    def test_modelselectfield(self):
        class Dog(Document):
            name = StringField()

        class DogOwner(Document):
            dog = ReferenceField(Dog)

        DogOwnerForm = model_form(DogOwner)

        dog = Dog(name="fido")
        dog.save()

        form = DogOwnerForm(dog=dog)
        self.assertTrue(form.validate())

        self.assertEqual(wtforms.widgets.Select, type(form.dog.widget))
        self.assertEqual(False, form.dog.widget.multiple)
    def test_model_form_with_custom_query_set(self):
        class Dog(Document):
            breed = StringField()

            @queryset_manager
            def large_objects(cls, queryset):
                return queryset(breed__in=['german sheppard', 'wolfhound'])

        class DogOwner(Document):
            dog = ReferenceField(Dog)

        big_dogs = [Dog(breed="german sheppard"), Dog(breed="wolfhound")]
        dogs = [Dog(breed="poodle")] + big_dogs
        for dog in dogs:
            dog.save()

        BigDogForm = model_form(DogOwner, field_args={'dog': {'queryset': Dog.large_objects}})

        form = BigDogForm(dog=big_dogs[0])
        self.assertTrue(form.validate())
        self.assertEqual(big_dogs, [d[1] for d in form.dog.iter_choices()])
    def test_modelselectfield_multiple_selected_elements_must_be_retained(self):
        class Dog(Document):
            name = StringField()

            def __unicode__(self):
                return self.name

        class DogOwner(Document):
            dogs = ListField(ReferenceField(Dog))

        DogOwnerForm = model_form(DogOwner)

        fido = Dog(name="fido").save()
        Dog(name="rex").save()

        dogOwner = DogOwner(dogs=[fido])
        form = DogOwnerForm(obj=dogOwner)
        html = form.dogs()

        m = re.search("<option selected .+?>(.*?)</option>", html)
        self.assertTrue(m is not None, "Should have one selected option")
        self.assertEqual("fido", m.group(1))
    def test_modelselectfield_multiple(self):
        class Dog(Document):
            name = StringField()

        class DogOwner(Document):
            dogs = ListField(ReferenceField(Dog))

        DogOwnerForm = model_form(DogOwner)

        dogs = [Dog(name="fido"), Dog(name="rex")]
        for dog in dogs:
            dog.save()

        form = DogOwnerForm(dogs=dogs)
        self.assertTrue(form.validate())

        self.assertEqual(wtforms.widgets.Select, type(form.dogs.widget))
        self.assertEqual(True, form.dogs.widget.multiple)

        # Validate if both dogs are selected
        choices = list(form.dogs)
        self.assertEqual(len(choices), 2)
        self.assertTrue(choices[0].checked)
        self.assertTrue(choices[1].checked)