def test_get_related_field_name_handles_formatted_link_segments(
            self, settings, format_links, rf):
        settings.JSON_API_FORMAT_RELATED_LINKS = format_links

        # use field name which actually gets formatted
        related_model_field_name = "related_field_model"

        class RelatedFieldNameSerializer(serializers.ModelSerializer):
            related_model_field = ResourceRelatedField(
                queryset=BasicModel.objects)

            def __init__(self, *args, **kwargs):
                self.related_model_field.field_name = related_model_field_name
                super().__init(*args, **kwargs)

            class Meta:
                model = BasicModel

        class RelatedFieldNameView(ModelViewSet):
            serializer_class = RelatedFieldNameSerializer

        url_segment = format_link_segment(related_model_field_name)

        request = rf.get(f"/basic_models/1/{url_segment}")

        view = RelatedFieldNameView()
        view.setup(request, related_field=url_segment)

        assert view.get_related_field_name() == related_model_field_name
示例#2
0
    def test_get_links(
        self,
        format_related_links,
        field,
        settings,
        model,
    ):
        settings.JSON_API_FORMAT_RELATED_LINKS = format_related_links

        link_segment = format_link_segment(field.field_name)

        expected = {
            "self": f"/basic_models/{model.pk}/relationships/{link_segment}/",
            "related": f"/basic_models/{model.pk}/{link_segment}/",
        }

        if hasattr(field, "child_relation"):
            # many case
            field = field.child_relation

        actual = field.get_links(model)
        assert expected == actual
示例#3
0
    def get_links(self, obj=None, lookup_field="pk"):
        request = self.context.get("request", None)
        view = self.context.get("view", None)
        return_data = OrderedDict()

        kwargs = {
            lookup_field:
            getattr(obj, lookup_field) if obj else view.kwargs[lookup_field]
        }

        field_name = self.field_name if self.field_name else self.parent.field_name

        self_kwargs = kwargs.copy()
        self_kwargs.update({"related_field": format_link_segment(field_name)})
        self_link = self.get_url("self", self.self_link_view_name, self_kwargs,
                                 request)

        # Assuming RelatedField will be declared in two ways:
        # 1. url(r'^authors/(?P<pk>[^/.]+)/(?P<related_field>\w+)/$',
        #         AuthorViewSet.as_view({'get': 'retrieve_related'}))
        # 2. url(r'^authors/(?P<author_pk>[^/.]+)/bio/$',
        #         AuthorBioViewSet.as_view({'get': 'retrieve'}))
        # So, if related_link_url_kwarg == 'pk' it will add 'related_field' parameter to reverse()
        if self.related_link_url_kwarg == "pk":
            related_kwargs = self_kwargs
        else:
            related_kwargs = {
                self.related_link_url_kwarg:
                kwargs[self.related_link_lookup_field]
            }

        related_link = self.get_url("related", self.related_link_view_name,
                                    related_kwargs, request)

        if self_link:
            return_data.update({"self": self_link})
        if related_link:
            return_data.update({"related": related_link})
        return return_data
示例#4
0
def test_format_link_segment_deprecates_format_type_argument():
    with pytest.deprecated_call():
        assert "first-name" == format_link_segment("first_name", "dasherize")
示例#5
0
def test_format_link_segment(settings, format_type, output):
    settings.JSON_API_FORMAT_RELATED_LINKS = format_type
    assert format_link_segment("first_Name") == output