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
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
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
def test_format_link_segment_deprecates_format_type_argument(): with pytest.deprecated_call(): assert "first-name" == format_link_segment("first_name", "dasherize")
def test_format_link_segment(settings, format_type, output): settings.JSON_API_FORMAT_RELATED_LINKS = format_type assert format_link_segment("first_Name") == output