Example #1
0
 def get_url(self, pk=None):
     # if associated with a registered viewset, use its URL
     url = getattr(self, '_url', None)
     if url:
         # use URL key to get endpoint
         url = reverse(url)
     if not url:
         # otherwise, return canonical URL for this model
         from dynamic_rest.routers import DynamicRouter
         url = DynamicRouter.get_canonical_path(self.get_resource_key())
     if pk:
         return '%s/%s/' % (url, pk)
     return url
Example #2
0
def merge_link_object(serializer, data, instance):
    """Add a 'links' attribute to the data that maps field names to URLs.

    NOTE: This is the format that Ember Data supports, but alternative
          implementations are possible to support other formats.
    """

    link_object = {}

    if not getattr(instance, 'pk', None):
        # If instance doesn't have a `pk` field, we'll assume it doesn't
        # have a canonical resource URL to hang a link off of.
        # This generally only affectes Ephemeral Objects.
        return data

    link_fields = serializer.get_link_fields()
    for name, field in six.iteritems(link_fields):
        # For included fields, omit link if there's no data.
        if name in data and not data[name]:
            continue

        link = getattr(field, 'link', None)
        if link is None:
            base_url = ''
            if settings.ENABLE_HOST_RELATIVE_LINKS:
                # if the resource isn't registered, this will default back to
                # using resource-relative urls for links.
                base_url = DynamicRouter.get_canonical_path(
                    serializer.get_resource_key(),
                    instance.pk
                ) or ''
            link = '%s%s/' % (base_url, name)
        # Default to DREST-generated relation endpoints.
        elif callable(link):
            link = link(name, field, data, instance)

        link_object[name] = link

    if link_object:
        data['links'] = link_object
    return data
 def test_get_canonical_path_with_keyspace(self):
     rsrc_key = CatSerializer().get_resource_key()
     self.assertEqual('/v2/cats',
                      DynamicRouter.get_canonical_path(rsrc_key))
 def test_get_canonical_path_with_pk(self):
     rsrc_key = DogSerializer().get_resource_key()
     self.assertEqual('/dogs/1/',
                      DynamicRouter.get_canonical_path(rsrc_key, pk='1'))
 def test_get_canonical_path_with_prefix(self):
     set_script_prefix('/v2/')
     rsrc_key = DogSerializer().get_resource_key()
     self.assertEqual('/v2/dogs',
                      DynamicRouter.get_canonical_path(rsrc_key))
     clear_script_prefix()
 def test_get_canonical_path(self):
     rsrc_key = DogSerializer().get_resource_key()
     self.assertEqual('/dogs', DynamicRouter.get_canonical_path(rsrc_key))
Example #7
0
 def test_get_canonical_path_with_keyspace(self):
     rsrc_key = CatSerializer().get_resource_key()
     self.assertEqual(
         '/v2/cats',
         DynamicRouter.get_canonical_path(rsrc_key)
     )
Example #8
0
 def test_get_canonical_path_with_pk(self):
     rsrc_key = DogSerializer().get_resource_key()
     self.assertEqual(
         '/dogs/1/',
         DynamicRouter.get_canonical_path(rsrc_key, pk='1')
     )
Example #9
0
 def test_get_canonical_path(self):
     rsrc_key = DogSerializer().get_resource_key()
     self.assertEqual(
         '/dogs',
         DynamicRouter.get_canonical_path(rsrc_key)
     )