def test_extra_kwargs_not_altered(self):
        class TestSerializer(serializers.ModelSerializer):
            non_model_field = serializers.CharField()

            class Meta:
                model = OneFieldModel
                read_only_fields = ('char_field', 'non_model_field')
                fields = read_only_fields
                extra_kwargs = {}

        class ChildSerializer(TestSerializer):
            class Meta(TestSerializer.Meta):
                read_only_fields = ()

        test_expected = dedent("""
            TestSerializer():
                char_field = CharField(read_only=True)
                non_model_field = CharField()
        """)

        child_expected = dedent("""
            ChildSerializer():
                char_field = CharField(max_length=100)
                non_model_field = CharField()
        """)
        self.assertEqual(unicode_repr(ChildSerializer()), child_expected)
        self.assertEqual(unicode_repr(TestSerializer()), test_expected)
        self.assertEqual(unicode_repr(ChildSerializer()), child_expected)
    def test_nonPK_foreignkey_model_serializer(self):
        class TestParentModel(models.Model):
            title = models.CharField(max_length=64)

        class TestChildModel(models.Model):
            parent = models.ForeignKey(TestParentModel, related_name='children', on_delete=models.CASCADE)
            value = models.CharField(primary_key=True, max_length=64)

        class TestChildModelSerializer(serializers.ModelSerializer):
            class Meta:
                model = TestChildModel
                fields = ('value', 'parent')

        class TestParentModelSerializer(serializers.ModelSerializer):
            class Meta:
                model = TestParentModel
                fields = ('id', 'title', 'children')

        parent_expected = dedent("""
            TestParentModelSerializer():
                id = IntegerField(label='ID', read_only=True)
                title = CharField(max_length=64)
                children = PrimaryKeyRelatedField(many=True, queryset=TestChildModel.objects.all())
        """)
        self.assertEqual(unicode_repr(TestParentModelSerializer()), parent_expected)

        child_expected = dedent("""
            TestChildModelSerializer():
                value = CharField(max_length=64, validators=[<UniqueValidator(queryset=TestChildModel.objects.all())>])
                parent = PrimaryKeyRelatedField(queryset=TestParentModel.objects.all())
        """)
        self.assertEqual(unicode_repr(TestChildModelSerializer()), child_expected)
    def test_fields(self):
        """Ensure `fields` is passed to embedded documents."""
        class CompoundParentSerializer(DocumentSerializer):
            class Meta:
                model = CompoundParentDocument
                fields = (
                    'embedded_list',
                    'embedded_list.child.name',
                    'embedded_map',
                    'embedded_map.child.age',
                    'list_of_embedded_documents',
                    'list_of_embedded_documents.child.name')
                depth = 1

        expected = dedent("""
            CompoundParentSerializer():
                embedded_list = EmbeddedSerializer(many=True, required=False):
                    name = CharField(required=False)
                embedded_map = DictField(child=EmbeddedSerializer(required=False), required=False):
                    age = IntegerField(required=False)
                list_of_embedded_documents = EmbeddedSerializer(many=True, required=False):
                    name = CharField(required=False)
        """)

        serializer = CompoundParentSerializer()
        unicode_repr(serializer)

        assert unicode_repr(CompoundParentSerializer()) == expected
Example #4
0
def smart_repr(value):
    if isinstance(value, QuerySet):
        return manager_repr(value)

    if isinstance(value, BaseField):
        return mongo_field_repr(value)

    if isinstance(value, BaseDocument):
        return mongo_field_repr(value)

    if isinstance(value, Field):
        return field_repr(value)

    value = unicode_repr(value)

    # Representations like u'help text'
    # should simply be presented as 'help text'
    value = uni_lit_re.sub("'\\1'", value)

    # Representations like
    # <django.core.validators.RegexValidator object at 0x1047af050>
    # Should be presented as
    # <django.core.validators.RegexValidator object>
    value = re.sub(' at 0x[0-9a-f]{4,32}>', '>', value)

    return value
    def test_field_options(self):
        class TestSerializer(DocumentSerializer):
            class Meta:
                model = FieldOptionsModel
                fields = "__all__"

        expected = dedent(
            """
            TestSerializer():
                id = ObjectIdField(read_only=True)
                required_field = IntegerField(required=True)
                int_null_field = IntegerField(allow_null=True, required=False)
                string_null_field = CharField(allow_blank=True, allow_null=True, required=False)
                required_list_field = ListField(allow_empty=False, child=IntegerField(required=False), required=True)
                non_required_list_field = ListField(child=IntegerField(required=False), required=False)
                required_dict_field = DictField(allow_empty=False, required=True)
                choices_field = ChoiceField(choices=(('red', 'Red'), ('blue', 'Blue'), ('green', 'Green')), required=False)
                length_limit_field = CharField(max_length=12, min_length=3, required=False)
                value_limit_field = IntegerField(max_value=12, min_value=3, required=False)
                decimal_field = DecimalField(decimal_places=4, max_digits=8, max_value=9999, required=False)
        """
        )
        # if six.PY2:
        #     # This particular case is too awkward to resolve fully across
        #     # both py2 and py3.
        #     expected = expected.replace(
        #         "('red', 'Red'), ('blue', 'Blue'), ('green', 'Green')",
        #         "(u'red', u'Red'), (u'blue', u'Blue'), (u'green', u'Green')"
        #     )
        assert unicode_repr(TestSerializer()) == expected
    def test_meta_exclude(self):
        """
        Serializer should respect Meta.exclude
        """
        class TestSerializer(DocumentSerializer):
            class Meta:
                model = RegularModel
                exclude = ('decimal_field', 'custom_field')

        # in pythons 2 and 3 regex reprs are different
        if six.PY2:
            regex_repr = "<_sre.SRE_Pattern object>"
        else:
            regex_repr = "re.compile('^valid_regex')"

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                str_field = CharField(required=False)
                str_regex_field = RegexField(regex=%s, required=False)
                url_field = URLField(required=False)
                email_field = EmailField(required=False)
                int_field = IntegerField(required=False)
                long_field = IntegerField(required=False)
                float_field = FloatField(required=False)
                boolean_field = BooleanField(required=False)
                nullboolean_field = NullBooleanField(required=False)
                date_field = DateTimeField(required=False)
                complexdate_field = DateTimeField(required=False)
                uuid_field = UUIDField(required=False)
                id_field = ObjectIdField(required=False)
        """ % regex_repr)

        assert unicode_repr(TestSerializer()) == expected
    def test_nested_relations(self):
        class TestSerializer(serializers.ModelSerializer):
            class Meta:
                model = RelationalModel
                depth = 1
                fields = "__all__"

        expected = dedent(
            """
            TestSerializer():
                id = IntegerField(label='ID', read_only=True)
                foreign_key = NestedSerializer(read_only=True):
                    id = IntegerField(label='ID', read_only=True)
                    name = CharField(max_length=100)
                one_to_one = NestedSerializer(read_only=True):
                    id = IntegerField(label='ID', read_only=True)
                    name = CharField(max_length=100)
                many_to_many = NestedSerializer(many=True, read_only=True):
                    id = IntegerField(label='ID', read_only=True)
                    name = CharField(max_length=100)
                through = NestedSerializer(many=True, read_only=True):
                    id = IntegerField(label='ID', read_only=True)
                    name = CharField(max_length=100)
        """
        )
        self.assertEqual(unicode_repr(TestSerializer()), expected)
    def test_meta_exclude(self):
        """
        Serializer should respect Meta.exclude
        """
        class TestSerializer(DocumentSerializer):
            class Meta:
                model = RegularModel
                exclude = ('decimal_field', 'custom_field')
        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                str_field = CharField(required=False)
                url_field = URLField(required=False)
                email_field = EmailField(required=False)
                int_field = IntegerField(required=False)
                long_field = IntegerField(required=False)
                float_field = FloatField(required=False)
                boolean_field = BooleanField(required=False)
                nullboolean_field = NullBooleanField(required=False)
                date_field = DateTimeField(required=False)
                complexdate_field = DateTimeField(required=False)
                uuid_field = UUIDField(required=False)
                id_field = ObjectIdField(required=False)
        """)

        self.assertEqual(unicode_repr(TestSerializer()), expected)
    def test_regular_fields(self):
        """
        Model fields should map to their equivelent serializer fields.
        """
        class TestSerializer(DocumentSerializer):
            class Meta:
                model = RegularModel

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                str_field = CharField(required=False)
                url_field = URLField(required=False)
                email_field = EmailField(required=False)
                int_field = IntegerField(required=False)
                long_field = IntegerField(required=False)
                float_field = FloatField(required=False)
                boolean_field = BooleanField(required=False)
                nullboolean_field = NullBooleanField(required=False)
                date_field = DateTimeField(required=False)
                complexdate_field = DateTimeField(required=False)
                uuid_field = UUIDField(required=False)
                id_field = ObjectIdField(required=False)
                decimal_field = DecimalField(decimal_places=2, max_digits=65536, required=False)
                custom_field = DocumentField(model_field=<tests.test_1basic.CustomField: custom_field>, required=False)
        """)

        self.assertEqual(unicode_repr(TestSerializer()), expected)
    def test_extra_field_kwargs(self):
        class CompoundParentSerializer(DocumentSerializer):
            class Meta:
                model = CompoundParentDocument
                fields = ('__all__')
                depth = 1
                extra_kwargs = {
                    'foo': {'default': 'bar'},
                    'embedded_list.child.name': {'default': 'Johnny'},
                    'list_of_embedded_documents.child.name': {'default': 'B'},
                    'embedded_map.child.name': {'default': 'Good'}
                }

        expected = dedent("""
            CompoundParentSerializer():
                id = ObjectIdField(read_only=True)
                foo = CharField(default='bar')
                embedded_list = EmbeddedSerializer(many=True, required=False):
                    name = CharField(default='Johnny')
                    age = IntegerField(required=False)
                list_of_embedded_documents = EmbeddedSerializer(many=True, required=False):
                    name = CharField(default='B')
                    age = IntegerField(required=False)
                embedded_map = DictField(child=EmbeddedSerializer(required=False), required=False):
                    name = CharField(default='Good')
                    age = IntegerField(required=False)
        """)

        assert unicode_repr(CompoundParentSerializer()) == expected
    def test_nested_hyperlinked_relations_starred_source(self):
        class TestSerializer(serializers.HyperlinkedModelSerializer):
            class Meta:
                model = RelationalModel
                depth = 1
                fields = '__all__'

                extra_kwargs = {
                    'url': {
                        'source': '*',
                    }}

        expected = dedent("""
            TestSerializer():
                url = HyperlinkedIdentityField(source='*', view_name='relationalmodel-detail')
                foreign_key = NestedSerializer(read_only=True):
                    url = HyperlinkedIdentityField(view_name='foreignkeytargetmodel-detail')
                    name = CharField(max_length=100)
                one_to_one = NestedSerializer(read_only=True):
                    url = HyperlinkedIdentityField(view_name='onetoonetargetmodel-detail')
                    name = CharField(max_length=100)
                many_to_many = NestedSerializer(many=True, read_only=True):
                    url = HyperlinkedIdentityField(view_name='manytomanytargetmodel-detail')
                    name = CharField(max_length=100)
                through = NestedSerializer(many=True, read_only=True):
                    url = HyperlinkedIdentityField(view_name='throughtargetmodel-detail')
                    name = CharField(max_length=100)
        """)
        self.maxDiff = None
        self.assertEqual(unicode_repr(TestSerializer()), expected)
    def test_nested_hyperlinked_relations(self):
        class TestSerializer(serializers.HyperlinkedModelSerializer):
            class Meta:
                model = RelationalModel
                depth = 1

        expected = dedent(
            """
            TestSerializer():
                url = HyperlinkedIdentityField(view_name='relationalmodel-detail')
                foreign_key = NestedSerializer(read_only=True):
                    url = HyperlinkedIdentityField(view_name='foreignkeytargetmodel-detail')
                    name = CharField(max_length=100)
                one_to_one = NestedSerializer(read_only=True):
                    url = HyperlinkedIdentityField(view_name='onetoonetargetmodel-detail')
                    name = CharField(max_length=100)
                many_to_many = NestedSerializer(many=True, read_only=True):
                    url = HyperlinkedIdentityField(view_name='manytomanytargetmodel-detail')
                    name = CharField(max_length=100)
                through = NestedSerializer(many=True, read_only=True):
                    url = HyperlinkedIdentityField(view_name='throughtargetmodel-detail')
                    name = CharField(max_length=100)
        """
        )
        self.assertEqual(unicode_repr(TestSerializer()), expected)
    def test_read_only(self):
        """Ensure `read_only` are passed to embedded documents."""
        class CompoundParentSerializer(DocumentSerializer):
            class Meta:
                model = CompoundParentDocument
                fields = ('__all__')
                read_only_fields = (
                    'foo',
                    'embedded_list.child.name',
                    'list_of_embedded_documents.child.name',
                    'embedded_map.child.name'
                )

        expected = dedent("""
            CompoundParentSerializer():
                id = ObjectIdField(read_only=True)
                foo = CharField(read_only=True)
                embedded_list = EmbeddedSerializer(many=True, required=False):
                    name = CharField(read_only=True)
                    age = IntegerField(required=False)
                list_of_embedded_documents = EmbeddedSerializer(many=True, required=False):
                    name = CharField(read_only=True)
                    age = IntegerField(required=False)
                embedded_map = DictField(child=EmbeddedSerializer(required=False), required=False):
                    name = CharField(read_only=True)
                    age = IntegerField(required=False)
        """)

        assert unicode_repr(CompoundParentSerializer()) == expected
    def test_extra_field_kwargs(self):
        """Ensure `extra_kwargs` are passed to embedded documents."""
        class ParentSerializer(DocumentSerializer):
            class Meta:
                model = ParentDocument
                fields = ('__all__')
                depth = 1
                extra_kwargs = {
                    'foo': {'default': 'bar'},
                    'embedded.name': {'default': 'Johnny B. Good'}
                }

        expected = dedent("""
            ParentSerializer():
                id = ObjectIdField(read_only=True)
                foo = CharField(default='bar')
                nested_reference = NestedSerializer(read_only=True):
                    id = ObjectIdField(read_only=True)
                    foo = CharField(required=False)
                    bar = CharField(required=False)
                embedded = EmbeddedSerializer(required=False):
                    name = CharField(default='Johnny B. Good')
                    age = IntegerField(required=False)
        """)

        assert unicode_repr(ParentSerializer()) == expected
    def test_regular_fields(self):
        """
        Model fields should map to their equivelent serializer fields.
        """
        class TestSerializer(serializers.ModelSerializer):
            class Meta:
                model = RegularFieldsModel
                fields = '__all__'

        expected = dedent("""
            TestSerializer():
                auto_field = IntegerField(read_only=True)
                big_integer_field = IntegerField()
                boolean_field = BooleanField(required=False)
                char_field = CharField(max_length=100)
                comma_separated_integer_field = CharField(max_length=100, validators=[<django.core.validators.RegexValidator object>])
                date_field = DateField()
                datetime_field = DateTimeField()
                decimal_field = DecimalField(decimal_places=1, max_digits=3)
                email_field = EmailField(max_length=100)
                float_field = FloatField()
                integer_field = IntegerField()
                null_boolean_field = NullBooleanField(required=False)
                positive_integer_field = IntegerField()
                positive_small_integer_field = IntegerField()
                slug_field = SlugField(max_length=100)
                small_integer_field = IntegerField()
                text_field = CharField(max_length=100, style={'base_template': 'textarea.html'})
                time_field = TimeField()
                url_field = URLField(max_length=100)
                custom_field = ModelField(model_field=<tests.test_model_serializer.CustomField: custom_field>)
                file_path_field = FilePathField(path='/tmp/')
        """)

        self.assertEqual(unicode_repr(TestSerializer()), expected)
    def test_field_options(self):
        class TestSerializer(serializers.ModelSerializer):
            class Meta:
                model = FieldOptionsModel
                fields = '__all__'

        expected = dedent("""
            TestSerializer():
                id = IntegerField(label='ID', read_only=True)
                value_limit_field = IntegerField(max_value=10, min_value=1)
                length_limit_field = CharField(max_length=12, min_length=3)
                blank_field = CharField(allow_blank=True, max_length=10, required=False)
                null_field = IntegerField(allow_null=True, required=False)
                default_field = IntegerField(required=False)
                descriptive_field = IntegerField(help_text='Some help text', label='A label')
                choices_field = ChoiceField(choices=(('red', 'Red'), ('blue', 'Blue'), ('green', 'Green')))
        """)
        if six.PY2:
            # This particular case is too awkward to resolve fully across
            # both py2 and py3.
            expected = expected.replace(
                "('red', 'Red'), ('blue', 'Blue'), ('green', 'Green')",
                "(u'red', u'Red'), (u'blue', u'Blue'), (u'green', u'Green')"
            )
        self.assertEqual(unicode_repr(TestSerializer()), expected)
    def test_nested_unique_together_relations(self):
        class TestSerializer(serializers.HyperlinkedModelSerializer):
            class Meta:
                model = UniqueTogetherModel
                depth = 1
                fields = '__all__'

        expected = dedent("""
            TestSerializer():
                url = HyperlinkedIdentityField(view_name='uniquetogethermodel-detail')
                foreign_key = NestedSerializer(read_only=True):
                    url = HyperlinkedIdentityField(view_name='foreignkeytargetmodel-detail')
                    name = CharField(max_length=100)
                one_to_one = NestedSerializer(read_only=True):
                    url = HyperlinkedIdentityField(view_name='onetoonetargetmodel-detail')
                    name = CharField(max_length=100)
        """)
        if six.PY2:
            # This case is also too awkward to resolve fully across both py2
            # and py3.  (See above)
            expected = expected.replace(
                "('foreign_key', 'one_to_one')",
                "(u'foreign_key', u'one_to_one')"
            )
        self.assertEqual(unicode_repr(TestSerializer()), expected)
    def test_mapping(self):
        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                fil = FileField(required=False)
        """)

        self.assertEqual(unicode_repr(TestSerializer()), expected)
 def test_embbedded(self):
     class EmbeddingSerializer(EmbeddedDocumentSerializer):
         class Meta:
             model = DumbEmbedded
     expected = dedent("""
         EmbeddingSerializer():
             name = CharField(required=False)
             foo = IntegerField(required=False)
     """)
     assert unicode_repr(EmbeddingSerializer()) == expected
 def test_embedded_serializer(self):
     class TestSerializer(EmbeddedDocumentSerializer):
         class Meta:
             model = EmbeddedModel
     expected = dedent("""
         TestSerializer():
             foo = CharField(required=False)
             bar = CharField(required=False)
     """)
     self.assertEqual(unicode_repr(TestSerializer()), expected)
    def test_embedding_generic(self):
        class EmbeddingSerializer(DocumentSerializer):
            class Meta:
                model = GenericEmbeddingDoc

        expected = dedent("""
            EmbeddingSerializer():
                id = ObjectIdField(read_only=True)
                embedded = GenericEmbeddedDocumentField(model_field=<mongoengine.fields.GenericEmbeddedDocumentField: embedded>, required=False)
        """)
        assert unicode_repr(EmbeddingSerializer()) == expected
 def test_shallow(self):
     class TestSerializer(DocumentSerializer):
         class Meta:
             model = EmbeddingModel
             depth = 0
     expected = dedent("""
         TestSerializer():
             id = ObjectIdField(read_only=True)
             embedded = HiddenField(default=None)
     """)
     assert unicode_repr(TestSerializer()) == expected
    def test_suboptions(self):
        class TestSerializer(DocumentSerializer):
            class Meta:
                model = OptionsCompoundFieldsModel

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                int_list_field = ListField(child=IntegerField(max_value=7, min_value=3, required=False), required=False)
        """)
        self.assertEqual(unicode_repr(TestSerializer()), expected)
 def test_embbedded_order(self):
     class EmbeddingSerializer(EmbeddedDocumentSerializer):
         class Meta:
             model = OrderedEmbedded
     expected = dedent("""
         EmbeddingSerializer():
             f2 = IntegerField(required=False)
             f0 = IntegerField(required=False)
             f1 = IntegerField(required=False)
     """)
     assert unicode_repr(EmbeddingSerializer()) == expected
 def test_mapping_nodepth(self):
     class TestSerializer(DocumentSerializer):
         class Meta:
             model = EmbeddingModel
             depth = 0
     expected = dedent("""
         TestSerializer():
             id = ObjectIdField(read_only=True)
             embedded = DocumentField(depth=0, model_field=<mongoengine.fields.EmbeddedDocumentField: embedded>, read_only=True)
     """)
     self.assertEqual(unicode_repr(TestSerializer()), expected)
    def test_declared(self):
        class TestSerializer(DynamicDocumentSerializer):
            class Meta:
                model = DynamicModel

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                foo = IntegerField(required=False)
        """)
        self.assertEqual(unicode_repr(TestSerializer()), expected)
    def test_mapping(self):
        class TestSerializer(DocumentSerializer):
            class Meta:
                model = MockModel

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                foo = CharField(required=False)
        """)

        self.assertEqual(unicode_repr(TestSerializer()), expected)
 def test_embedding_required(self):
     class EmbeddingSerializer(DocumentSerializer):
         class Meta:
             model = RequiredEmbeddingDoc
     expected = dedent("""
         EmbeddingSerializer():
             id = ObjectIdField(read_only=True)
             embedded = EmbeddedSerializer(required=True):
                 name = CharField(required=False)
                 foo = IntegerField(required=False)
     """)
     assert unicode_repr(EmbeddingSerializer()) == expected
    def test_shallow(self):
        class TestSerializer(DocumentSerializer):
            class Meta:
                model = ReferencingDoc
                depth = 0

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                ref = ReferenceField(queryset=ReferencedDoc.objects, required=False)
        """)
        assert unicode_repr(TestSerializer()) == expected
    def test_declared(self):
        class TestSerializer(DynamicDocumentSerializer):
            class Meta:
                model = DumbDynamic

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                name = CharField(required=False)
                foo = IntegerField(required=False)
        """)
        assert unicode_repr(TestSerializer()) == expected
Example #31
0
    def test_nullable_boolean_field(self):
        class NullableBooleanModel(models.Model):
            field = models.BooleanField(null=True, default=False)

        class NullableBooleanSerializer(serializers.ModelSerializer):
            class Meta:
                model = NullableBooleanModel
                fields = ['field']

        expected = dedent("""
            NullableBooleanSerializer():
                field = BooleanField(allow_null=True, required=False)
        """)

        self.assertEqual(unicode_repr(NullableBooleanSerializer()), expected)
Example #32
0
    def test_array_field(self):
        class ArrayFieldModel(models.Model):
            array_field = postgres_fields.ArrayField(
                base_field=models.CharField())

        class TestSerializer(serializers.ModelSerializer):
            class Meta:
                model = ArrayFieldModel
                fields = ['array_field']

        expected = dedent("""
            TestSerializer():
                array_field = ListField(child=CharField(label='Array field', validators=[<django.core.validators.MaxLengthValidator object>]))
        """)
        self.assertEqual(unicode_repr(TestSerializer()), expected)
Example #33
0
    def test_hyperlinked_relations(self):
        class TestSerializer(serializers.HyperlinkedModelSerializer):
            class Meta:
                model = RelationalModel
                fields = '__all__'

        expected = dedent("""
            TestSerializer():
                url = HyperlinkedIdentityField(view_name='relationalmodel-detail')
                foreign_key = HyperlinkedRelatedField(queryset=ForeignKeyTargetModel.objects.all(), view_name='foreignkeytargetmodel-detail')
                one_to_one = HyperlinkedRelatedField(queryset=OneToOneTargetModel.objects.all(), validators=[<UniqueValidator(queryset=RelationalModel.objects.all())>], view_name='onetoonetargetmodel-detail')
                many_to_many = HyperlinkedRelatedField(allow_empty=False, many=True, queryset=ManyToManyTargetModel.objects.all(), view_name='manytomanytargetmodel-detail')
                through = HyperlinkedRelatedField(many=True, read_only=True, view_name='throughtargetmodel-detail')
        """)
        self.assertEqual(unicode_repr(TestSerializer()), expected)
Example #34
0
    def test_nonPK_foreignkey_model_serializer(self):
        class TestParentModel(models.Model):
            title = models.CharField(max_length=64)

        class TestChildModel(models.Model):
            parent = models.ForeignKey(TestParentModel,
                                       related_name='children',
                                       on_delete=models.CASCADE)
            value = models.CharField(primary_key=True, max_length=64)

        class TestChildModelSerializer(serializers.ModelSerializer):
            class Meta:
                model = TestChildModel
                fields = ('value', 'parent')

        class TestParentModelSerializer(serializers.ModelSerializer):
            class Meta:
                model = TestParentModel
                fields = ('id', 'title', 'children')

        parent_expected = dedent("""
            TestParentModelSerializer():
                id = IntegerField(label='ID', read_only=True)
                title = CharField(max_length=64)
                children = PrimaryKeyRelatedField(many=True, queryset=TestChildModel.objects.all())
        """)
        self.assertEqual(unicode_repr(TestParentModelSerializer()),
                         parent_expected)

        child_expected = dedent("""
            TestChildModelSerializer():
                value = CharField(max_length=64, validators=[<UniqueValidator(queryset=TestChildModel.objects.all())>])
                parent = PrimaryKeyRelatedField(queryset=TestParentModel.objects.all())
        """)
        self.assertEqual(unicode_repr(TestChildModelSerializer()),
                         child_expected)
    def test_deep(self):
        class TestSerializer(DocumentSerializer):
            class Meta:
                model = ReferencingDoc
                fields = '__all__'
                depth = 1

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                ref = NestedSerializer(read_only=True):
                    id = ObjectIdField(read_only=True)
                    name = CharField(required=False)
        """)
        assert unicode_repr(TestSerializer()) == expected
Example #36
0
    def test_pk_fields(self):
        """
        Both `pk` and the actual primary key name are valid in `Meta.fields`.
        """
        class TestSerializer(DocumentSerializer):
            class Meta:
                model = AutoFieldModel
                fields = ('pk', 'auto_field')

        expected = dedent("""
            TestSerializer():
                pk = IntegerField(read_only=True)
                auto_field = IntegerField(read_only=True)
        """)
        assert unicode_repr(TestSerializer()) == expected
Example #37
0
    def test_pk_relations(self):
        class TestSerializer(serializers.ModelSerializer):
            class Meta:
                model = RelationalModel
                fields = '__all__'

        expected = dedent("""
            TestSerializer():
                id = IntegerField(label='ID', read_only=True)
                foreign_key = PrimaryKeyRelatedField(queryset=ForeignKeyTargetModel.objects.all())
                one_to_one = PrimaryKeyRelatedField(queryset=OneToOneTargetModel.objects.all(), validators=[<UniqueValidator(queryset=RelationalModel.objects.all())>])
                many_to_many = PrimaryKeyRelatedField(allow_empty=False, many=True, queryset=ManyToManyTargetModel.objects.all())
                through = PrimaryKeyRelatedField(many=True, read_only=True)
        """)
        self.assertEqual(unicode_repr(TestSerializer()), expected)
Example #38
0
    def test_extended(self):
        class TestSerializer(DynamicDocumentSerializer):
            bar = drf_fields.CharField(required=False)

            class Meta:
                model = DumbDynamic

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                bar = CharField(required=False)
                name = CharField(required=False)
                foo = IntegerField(required=False)
        """)
        assert unicode_repr(TestSerializer()) == expected
Example #39
0
    def test_extra_field_kwargs(self):
        """
        Ensure `extra_kwargs` are passed to generated fields.
        """
        class TestSerializer(DocumentSerializer):
            class Meta:
                model = RegularModel
                fields = ('id', 'str_field')
                extra_kwargs = {'str_field': {'default': 'extra'}}

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                str_field = CharField(default='extra')
        """)
        assert unicode_repr(TestSerializer()) == expected
    def test_embedding_nested(self):
        class TestSerializer(DocumentSerializer):
            class Meta:
                model = NestedEmbeddingDoc
                fields = '__all__'

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                embedded = EmbeddedSerializer(required=False):
                    name = CharField(required=False)
                    embedded = EmbeddedSerializer(required=False):
                        name = CharField(required=False)
                        foo = IntegerField(required=False)
        """)
        assert unicode_repr(TestSerializer()) == expected
Example #41
0
    def test_method_field(self):
        """
        Properties and methods on the model should be allowed as `Meta.fields`
        values, and should map to `ReadOnlyField`.
        """
        class TestSerializer(DocumentSerializer):
            class Meta:
                model = RegularModel
                fields = ('id', 'method')

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                method = ReadOnlyField()
        """)
        assert unicode_repr(TestSerializer()) == expected
Example #42
0
    def test_references(self):
        class TestSerializer(DocumentSerializer):
            class Meta:
                model = RefFieldsDoc

        # order is broken
        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                ref_list = ListField(child=ReferenceField(queryset=ReferencedDoc.objects, required=False), required=False)
                ref = ReferenceField(queryset=ReferencedDoc.objects, required=False)
                dbref = ReferenceField(queryset=ReferencedDoc.objects, required=False)
                cached = ReferenceField(queryset=ReferencedDoc.objects, required=False)
                generic = GenericReferenceField(required=False)
        """)
        assert unicode_repr(TestSerializer()) == expected
Example #43
0
    def test_embedding_custom_generic(self):
        class CustomEmbedding(DocumentField):
            pass

        class TestSerializer(DocumentSerializer):
            serializer_embedded_generic = CustomEmbedding

            class Meta:
                model = GenericEmbeddingDoc

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                embedded = CustomEmbedding(model_field=<mongoengine.fields.GenericEmbeddedDocumentField: embedded>, required=False)
        """)
        assert unicode_repr(TestSerializer()) == expected
    def test_embedding_nodepth(self):
        class EmbeddingSerializer(DocumentSerializer):
            class Meta:
                model = NestedEmbeddingDoc
                depth = 0

        expected = dedent("""
            EmbeddingSerializer():
                id = ObjectIdField(read_only=True)
                embedded = EmbeddedSerializer(required=False):
                    name = CharField(required=False)
                    embedded = EmbeddedSerializer(required=False):
                        name = CharField(required=False)
                        foo = IntegerField(required=False)
        """)
        assert unicode_repr(EmbeddingSerializer()) == expected
    def test_basic(self):
        class TestSerializer(DocumentSerializer):
            class Meta:
                model = BasicCompoundDoc
                fields = '__all__'

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                list_field = ListField(required=False)
                int_list_field = ListField(child=IntegerField(required=False), required=False)
                dict_field = DictField(required=False)
                int_dict_field = DictField(child=IntegerField(required=False), required=False)
                int_map_field = DictField(child=IntegerField(required=False), required=False)
        """)
        assert unicode_repr(TestSerializer()) == expected
Example #46
0
    def test_meta_fields(self):
        """
        Serializer should respect Meta.fields
        """
        class TestSerializer(DocumentSerializer):
            class Meta:
                model = RegularModel
                fields = ('id', 'str_field')

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                str_field = CharField(required=False)
        """)

        assert unicode_repr(TestSerializer()) == expected
Example #47
0
    def test_embedding_custom_bottom(self):
        class CustomEmbedding(Field):
            bla = drf_fields.CharField()

        class TestSerializer(DocumentSerializer):
            serializer_embedded_bottom = CustomEmbedding

            class Meta:
                model = NestedEmbeddingDoc
                depth_embedding = 0

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                embedded = CustomEmbedding(default=None, required=False)
        """)
        assert unicode_repr(TestSerializer()) == expected
    def test_duration_field(self):
        class DurationFieldModel(models.Model):
            """
            A model that defines DurationField.
            """
            duration_field = ModelDurationField()

        class TestSerializer(serializers.ModelSerializer):
            class Meta:
                model = DurationFieldModel

        expected = dedent("""
            TestSerializer():
                id = IntegerField(label='ID', read_only=True)
                duration_field = DurationField()
        """)
        self.assertEqual(unicode_repr(TestSerializer()), expected)
Example #49
0
    def test_mapping(self):
        class FileDoc(Document):
            f = fields.FileField(collection_name='files')
            i = fields.ImageField(collection_name='images')

        class TestSerializer(DocumentSerializer):
            class Meta:
                model = FileDoc

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                f = FileField(required=False)
                i = ImageField(required=False)
        """)

        assert unicode_repr(TestSerializer()) == expected
Example #50
0
    def test_custom_field(self):
        class CustomReferencing(ReferenceField):
            pass

        class TestSerializer(DocumentSerializer):
            serializer_reference_field = CustomReferencing

            class Meta:
                model = ReferencingDoc
                depth = 0

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                ref = CustomReferencing(queryset=ReferencedDoc.objects, required=False)
        """)
        assert unicode_repr(TestSerializer()) == expected
Example #51
0
    def test_embedding_custom_nested(self):
        class CustomTestSerializer(Serializer):
            bla = drf_fields.CharField()

        class TestSerializer(DocumentSerializer):
            serializer_embedded_nested = CustomTestSerializer

            class Meta:
                model = NestedEmbeddingDoc

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                embedded = EmbeddedSerializer(required=False):
                    bla = CharField()
        """)
        assert unicode_repr(TestSerializer()) == expected
Example #52
0
    def test_custom_generic(self):
        class CustomReferencing(GenericReferenceField):
            pass

        class TestSerializer(DocumentSerializer):
            serializer_reference_generic = CustomReferencing

            class Meta:
                model = GenericReferencingDoc
                depth = 0

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                ref = CustomReferencing(required=False)
        """)
        assert unicode_repr(TestSerializer()) == expected
Example #53
0
    def test_mapping(self):
        class TestSerializer(DocumentSerializer):
            class Meta:
                model = GeoDoc

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                geo_point_field = GeoPointField(required=False)
                point_field = GeoJSONField(geo_type='Point', required=False)
                line_field = GeoJSONField(geo_type='LineString', required=False)
                poly_field = GeoJSONField(geo_type='Polygon', required=False)
                multi_point_field = GeoJSONField(geo_type='MultiPoint', required=False)
                multi_line_field = GeoJSONField(geo_type='MultiLineString', required=False)
                multi_poly_field = GeoJSONField(geo_type='MultiPolygon', required=False)
        """)
        assert unicode_repr(TestSerializer()) == expected
Example #54
0
    def test_recursive(self):
        class TestSerializer(DocumentSerializer):
            class Meta:
                model = RecursiveReferencingDoc
                depth = 3

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                ref = NestedSerializer(read_only=True):
                    id = ObjectIdField(read_only=True)
                    ref = NestedSerializer(read_only=True):
                        id = ObjectIdField(read_only=True)
                        ref = NestedSerializer(read_only=True):
                            id = ObjectIdField(read_only=True)
                            ref = ReferenceField(queryset=RecursiveReferencingDoc.objects, required=False)
        """)
        assert unicode_repr(TestSerializer()) == expected
Example #55
0
    def test_custom_nested(self):
        class CustomReferencing(Serializer):
            foo = IntegerField()

        class TestSerializer(DocumentSerializer):
            serializer_reference_nested = CustomReferencing

            class Meta:
                model = ReferencingDoc
                depth = 1

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                ref = NestedSerializer(read_only=True):
                    foo = IntegerField()
        """)
        assert unicode_repr(TestSerializer()) == expected
Example #56
0
    def test_mapping_recursive(self):
        class TestSerializer(DocumentSerializer):
            class Meta:
                model = RecursiveEmbeddingModel
                depth = 3

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                embedded = NestedEmbSerializer():
                    foo = CharField(required=False)
                    embedded = NestedEmbSerializer():
                        foo = CharField(required=False)
                        embedded = NestedEmbSerializer():
                            foo = CharField(required=False)
                            embedded = DocumentField(depth=0, model_field=<mongoengine.fields.EmbeddedDocumentField: embedded>, read_only=True)
        """)
        self.assertEqual(unicode_repr(TestSerializer()), expected)
Example #57
0
    def test_embedding_recursive_restricted(self):
        class TestSerializer(DocumentSerializer):
            class Meta:
                model = RecursiveEmbeddingDoc
                depth_embedding = 2

        expected = dedent("""
            TestSerializer():
                id = ObjectIdField(read_only=True)
                embedded = EmbeddedSerializer(required=False):
                    name = CharField(required=False)
                    embedded = EmbeddedSerializer(required=False):
                        name = CharField(required=False)
                        embedded = HiddenField(default=None, required=False)
        """)

        serializer = TestSerializer()
        assert unicode_repr(serializer) == expected
Example #58
0
    def test_named_field_source(self):
        class TestSerializer(serializers.ModelSerializer):

            class Meta:
                model = RegularFieldsModel
                fields = ('number_field',)
                extra_kwargs = {
                    'number_field': {
                        'source': 'integer_field'
                    }
                }

        expected = dedent("""
            TestSerializer():
                number_field = IntegerField(source='integer_field')
        """)
        self.maxDiff = None
        self.assertEqual(unicode_repr(TestSerializer()), expected)
    def test_duration_field_with_validators(self):
        class ValidatedDurationFieldModel(models.Model):
            """
            A model that defines DurationField with validators.
            """
            duration_field = models.DurationField(
                validators=[MinValueValidator(datetime.timedelta(days=1)), MaxValueValidator(datetime.timedelta(days=3))]
            )

        class TestSerializer(serializers.ModelSerializer):
            class Meta:
                model = ValidatedDurationFieldModel
                fields = '__all__'

        expected = dedent("""
            TestSerializer():
                id = IntegerField(label='ID', read_only=True)
                duration_field = DurationField(max_value=datetime.timedelta(3), min_value=datetime.timedelta(1))
        """)
        self.assertEqual(unicode_repr(TestSerializer()), expected)
Example #60
0
def smart_repr(value):
    if isinstance(value, models.Manager):
        return manager_repr(value)

    if isinstance(value, Promise) and value._delegate_text:
        value = force_text(value)

    value = unicode_repr(value)

    # Representations like u'help text'
    # should simply be presented as 'help text'
    if value.startswith("u'") and value.endswith("'"):
        return value[1:]

    # Representations like
    # <django.core.validators.RegexValidator object at 0x1047af050>
    # Should be presented as
    # <django.core.validators.RegexValidator object>
    value = re.sub(' at 0x[0-9A-Fa-f]{4,32}>', '>', value)

    return value