def test_serialize_object_with_circular_references(self): """Testing WebAPIResource.serialize_object with circular references and ?expand= """ class TestObject(Model): def __init__(self, name, pk): super(TestObject, self).__init__() self.name = name self.pk = pk # Django 1.8+ requires a pk field class TestResource(WebAPIResource): fields = { 'dependency': { 'type': [TestObject], }, 'name': { 'type': six.text_type, } } try: obj1 = TestObject('obj1', 1) obj2 = TestObject('obj2', 2) obj1.dependency = obj2 obj2.dependency = obj1 request = RequestFactory().get('/api/test/?expand=dependency') resource = TestResource() register_resource_for_model(TestObject, resource) data = resource.serialize_object(obj1, request=request) self.maxDiff = 100000 self.assertEqual(data, { 'dependency': { 'links': { 'dependency': { 'href': None, 'method': 'GET', 'title': 'TestObject object', }, 'self': { 'href': 'http://testserver/api/test/?expand=dependency', 'method': 'GET', }, }, 'name': 'obj2', }, 'links': { 'self': { 'href': 'http://testserver/api/test/?expand=dependency', 'method': 'GET', }, }, 'name': 'obj1', }) finally: unregister_resource_for_model(TestObject)
def register_resource_for_model_temp(model, resource): """A context manager to temporarily register a resource for a model.""" register_resource_for_model(model, resource) try: yield finally: unregister_resource_for_model(model)
def test_get_resource_for_object_only_fields(self): """Testing get_resource_for_model when model is deferred""" class TestResource(WebAPIResource): pass resource = TestResource() register_resource_for_model(SiteConfiguration, resource) site = Site.objects.create(domain='example.com', name='example.com') SiteConfiguration.objects.create(site=site) with register_resource_for_model_temp(SiteConfiguration, resource): config = SiteConfiguration.objects.only('site').get() self.assertEqual(get_resource_for_object(config), resource)
"This is deprecated and will be removed in a " "future version.", }, } uri_object_key = 'username' uri_object_key_regex = r'[A-Za-z0-9@\._\-\'\+]+' model_object_key = 'username' autogenerate_etags = True allowed_methods = ('GET', ) def serialize_fullname_field(self, user, **kwargs): return user.get_full_name() def serialize_url_field(self, user, **kwargs): return user.get_absolute_url() def has_modify_permissions(self, request, user, *args, **kwargs): """Return whether or not the user can modify this object.""" return request.user.is_authenticated() and user.pk == request.user.pk @augment_method_from(WebAPIResource) def get_list(self, *args, **kwargs): """Retrieve the list of users on the site.""" pass user_resource = UserResource() register_resource_for_model(User, user_resource)
def register_resources(self): """Register all the resource model associations.""" register_resource_for_model(ChangeDescription, self.change) register_resource_for_model( Comment, lambda obj: (obj.review.get().is_reply() and self.review_reply_diff_comment or self.review_diff_comment)) register_resource_for_model(DefaultReviewer, self.default_reviewer) register_resource_for_model( DiffSet, lambda obj: obj.history_id and self.diff or self.draft_diff) register_resource_for_model( FileDiff, lambda obj: (obj.diffset.history_id and self.filediff or self.draft_filediff)) register_resource_for_model(Group, self.review_group) register_resource_for_model(RegisteredExtension, self.extension) register_resource_for_model(HostingServiceAccount, self.hosting_service_account) register_resource_for_model(Repository, self.repository) register_resource_for_model( Review, lambda obj: obj.is_reply() and self.review_reply or self.review) register_resource_for_model(ReviewRequest, self.review_request) register_resource_for_model(ReviewRequestDraft, self.review_request_draft) register_resource_for_model(Screenshot, self.screenshot) register_resource_for_model(FileAttachment, self.file_attachment) register_resource_for_model( FileAttachment, lambda obj: (obj.is_from_diff and self.diff_file_attachment or self.file_attachment)) register_resource_for_model( ScreenshotComment, lambda obj: (obj.review.get().is_reply() and self.review_reply_screenshot_comment or self.review_screenshot_comment)) register_resource_for_model( FileAttachmentComment, lambda obj: (obj.review.get().is_reply() and self.review_reply_file_attachment_comment or self.review_file_attachment_comment)) register_resource_for_model( GeneralComment, lambda obj: (obj.review.get().is_reply() and self.review_reply_general_comment or self.review_general_comment)) register_resource_for_model(StatusUpdate, self.status_update) register_resource_for_model(User, self.user) register_resource_for_model(WebAPIToken, self.api_token) register_resource_for_model(WebHookTarget, self.webhook)
"This is deprecated and will be removed in a " "future version.", }, } uri_object_key = 'username' uri_object_key_regex = r'[A-Za-z0-9@\._\-\'\+]+' model_object_key = 'username' autogenerate_etags = True allowed_methods = ('GET',) def serialize_fullname_field(self, user, **kwargs): return user.get_full_name() def serialize_url_field(self, user, **kwargs): return user.get_absolute_url() def has_modify_permissions(self, request, user, *args, **kwargs): """Return whether or not the user can modify this object.""" return request.user.is_authenticated() and user.pk == request.user.pk @augment_method_from(WebAPIResource) def get_list(self, *args, **kwargs): """Retrieve the list of users on the site.""" pass user_resource = UserResource() register_resource_for_model(User, user_resource)
def test_serialize_object_with_circular_references(self): """Testing WebAPIResource.serialize_object with circular references and ?expand= """ class TestObject(Model): def __init__(self, name, pk): super(TestObject, self).__init__() self.name = name self.pk = pk # Django 1.8+ requires a pk field class TestResource(WebAPIResource): fields = { 'dependency': { 'type': [TestObject], }, 'name': { 'type': StringFieldType, } } try: obj1 = TestObject('obj1', 1) obj2 = TestObject('obj2', 2) obj1.dependency = obj2 obj2.dependency = obj1 request = RequestFactory().get('/api/test/?expand=dependency') resource = TestResource() register_resource_for_model(TestObject, resource) data = resource.serialize_object(obj1, request=request) self.maxDiff = 100000 self.assertEqual( data, { 'dependency': { 'links': { 'dependency': { 'href': None, 'method': 'GET', 'title': 'TestObject object', }, 'self': { 'href': 'http://testserver/api/test/?expand=dependency', 'method': 'GET', }, }, 'name': 'obj2', }, 'links': { 'self': { 'href': 'http://testserver/api/test/?expand=dependency', 'method': 'GET', }, }, 'name': 'obj1', }) finally: unregister_resource_for_model(TestObject)
"""Built-in resource representing the Group model.""" from __future__ import unicode_literals from django.contrib.auth.models import Group from djblets.webapi.resources.base import WebAPIResource from djblets.webapi.resources.registry import register_resource_for_model class GroupResource(WebAPIResource): """A default resource for representing a Django Group model.""" model = Group fields = ('id', 'name') uri_object_key = 'group_name' uri_object_key_regex = r'[A-Za-z0-9_\-]+' model_object_key = 'name' autogenerate_etags = True allowed_methods = ('GET',) group_resource = GroupResource() register_resource_for_model(Group, group_resource)