def test_unknown_resource(self): """Test case where polymorhpic relation pulls in an object for which there is no known canonical serializer. """ zork = Zebra.objects.create( name='Zork', origin='San Francisco Zoo' ) user = self.fixture.users[0] user.favorite_pet = zork user.save() self.assertIsNone(DynamicRouter.get_canonical_serializer(Zebra)) url = '/users/%s/?include[]=favorite_pet' % user.pk response = self.client.get(url) self.assertEqual(200, response.status_code) content = json.loads(response.content.decode('utf-8')) self.assertTrue('user' in content) self.assertFalse('zebras' in content) # Not sideloaded user_obj = content['user'] self.assertTrue('favorite_pet' in user_obj) self.assertEqual('Zebra', user_obj['favorite_pet']['type']) self.assertEqual(zork.pk, user_obj['favorite_pet']['id'])
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_serializer_by_instance(self): dog = Dog.objects.create( name='Snoopy', fur_color='black and white', origin='' ) self.assertEqual( DogSerializer, DynamicRouter.get_canonical_serializer(None, instance=dog) )
def to_internal_value(self, data): model_name = data.get('type', None) model_id = data.get('id', None) if model_name and model_id: serializer_class = DynamicRouter.get_canonical_serializer( resource_key=None, resource_name=model_name) if serializer_class: model = serializer_class.get_model() return model.objects.get(id=model_id) if model else None return None
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 get_serializer_class_for_instance(self, instance): return DynamicRouter.get_canonical_serializer(resource_key=None, instance=instance)
def test_get_canonical_serializer_by_model(self): self.assertEqual( DogSerializer, DynamicRouter.get_canonical_serializer(None, model=Dog) )
def test_get_canonical_serializer(self): rsrc_key = get_model_table(Dog) self.assertEqual( DogSerializer, DynamicRouter.get_canonical_serializer(rsrc_key) )
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(self): rsrc_key = DogSerializer().get_resource_key() self.assertEqual( '/dogs', DynamicRouter.get_canonical_path(rsrc_key) )
from django.conf.urls import include, url from xtrm_drest.routers import DynamicRouter from tests import viewsets router = DynamicRouter() router.register_resource(viewsets.UserViewSet) router.register_resource(viewsets.GroupViewSet) router.register_resource(viewsets.ProfileViewSet) router.register_resource(viewsets.LocationViewSet) router.register(r'cars', viewsets.CarViewSet) router.register(r'cats', viewsets.CatViewSet) router.register_resource(viewsets.DogViewSet) router.register_resource(viewsets.HorseViewSet) router.register_resource(viewsets.PermissionViewSet) router.register(r'zebras', viewsets.ZebraViewSet) # not canonical router.register(r'user_locations', viewsets.UserLocationViewSet) router.register(r'alternate_locations', viewsets.AlternateLocationViewSet) router.register(r'carsv2', viewsets.CarWritableViewSet) # the above routes are duplicated to test versioned prefixes router.register_resource(viewsets.CatViewSet, namespace='v2') # canonical router.register(r'v1/user_locations', viewsets.UserLocationViewSet) urlpatterns = [url(r'^', include(router.urls))]