Exemple #1
0
    def test_no_save_m2m_related(self):
        """
        When saving an object with a M2M field, don't save that related object's related objects.
        """
        cg1 = ContactGroup.objects.create(name='The Inebriati')
        cg2 = ContactGroup.objects.create(name='The Stone Cutters')

        c1 = Contact.objects.create(name='foo')
        c2 = Contact.objects.create(name='bar')
        c2.groups.add(cg1, cg2)
        c3 = Contact.objects.create(name='baz')
        c3.groups.add(cg1)

        self.assertEqual(list(c1.groups.all()), [])
        self.assertEqual(list(c2.groups.all()), [cg1, cg2])
        self.assertEqual(list(c3.groups.all()), [cg1])

        data = {
            'name': c1.name,
            'groups': [reverse('api_dispatch_detail', kwargs={'api_name': 'v1', 'resource_name': 'contactgroup', 'pk': cg1.pk})],
        }

        resource = api.canonical_resource_for('contact')
        request = MockRequest()
        request.GET = {'format': 'json'}
        request.method = 'PUT'
        request._load_post_and_files = lambda *args, **kwargs: None
        request.set_body(json.dumps(data))

        num_queries = 9 if old_saving_algorithm else 8

        with self.assertNumQueries(num_queries):
            response = resource.wrap_view('dispatch_detail')(request, pk=c1.pk)

        self.assertEqual(response.status_code, 204, response.content)

        new_contacts = Contact.objects.all()
        new_c1 = new_contacts[0]
        new_c2 = new_contacts[1]
        new_c3 = new_contacts[2]

        self.assertEqual(new_c1.name, c1.name)

        self.assertEqual(new_c1.id, c1.id)
        self.assertEqual(list(new_c1.groups.all()), [cg1])
        self.assertEqual(new_c2.id, c2.id)
        self.assertEqual(list(new_c2.groups.all()), [cg1, cg2])
        self.assertEqual(new_c3.id, c3.id)
        self.assertEqual(list(new_c3.groups.all()), [cg1])

        new_cg1 = ContactGroup.objects.get(id=cg1.id)
        new_cg2 = ContactGroup.objects.get(id=cg2.id)

        self.assertEqual(list(new_cg1.members.all()), [new_c1, new_c2, new_c3])
        self.assertEqual(list(new_cg2.members.all()), [new_c2])
Exemple #2
0
    def test_no_save_m2m_related(self):
        """
        When saving an object with a M2M field, don't save that related object's related objects.
        """
        cg1 = ContactGroup.objects.create(name='The Inebriati')
        cg2 = ContactGroup.objects.create(name='The Stone Cutters')

        c1 = Contact.objects.create(name='foo')
        c2 = Contact.objects.create(name='bar')
        c2.groups.add(cg1, cg2)
        c3 = Contact.objects.create(name='baz')
        c3.groups.add(cg1)

        self.assertEqual(list(c1.groups.all()), [])
        self.assertEqual(list(c2.groups.all()), [cg1, cg2])
        self.assertEqual(list(c3.groups.all()), [cg1])

        data = {
            'name': c1.name,
            'groups': [reverse('api_dispatch_detail', kwargs={'api_name': 'v1', 'resource_name': 'contactgroup', 'pk': cg1.pk})],
        }

        resource = api.canonical_resource_for('contact')
        request = MockRequest()
        request.GET = {'format': 'json'}
        request.method = 'PUT'
        request._load_post_and_files = lambda *args, **kwargs: None
        request.set_body(json.dumps(data))

        with self.withAssertNumQueriesLessThan(9):
            response = resource.wrap_view('dispatch_detail')(request, pk=c1.pk)

        self.assertEqual(response.status_code, 204, response.content)

        new_contacts = Contact.objects.all()
        new_c1 = new_contacts[0]
        new_c2 = new_contacts[1]
        new_c3 = new_contacts[2]

        self.assertEqual(new_c1.name, c1.name)

        self.assertEqual(new_c1.id, c1.id)
        self.assertEqual(list(new_c1.groups.all()), [cg1])
        self.assertEqual(new_c2.id, c2.id)
        self.assertEqual(list(new_c2.groups.all()), [cg1, cg2])
        self.assertEqual(new_c3.id, c3.id)
        self.assertEqual(list(new_c3.groups.all()), [cg1])

        new_cg1 = ContactGroup.objects.get(id=cg1.id)
        new_cg2 = ContactGroup.objects.get(id=cg2.id)

        self.assertEqual(list(new_cg1.members.all()), [new_c1, new_c2, new_c3])
        self.assertEqual(list(new_cg2.members.all()), [new_c2])
Exemple #3
0
    def test_no_save_m2m_unchanged_existing_data_persists(self):
        """
        Data should persist when posting an updated detail object with
        unchanged reverse related objects.
        """
        person = Person.objects.create(name='Ryan')
        dog = Dog.objects.create(name='Wilfred', owner=person)
        bone1 = Bone.objects.create(color='White', dog=dog)
        bone2 = Bone.objects.create(color='Grey', dog=dog)

        self.assertEqual(dog.bones.count(), 2)

        resource = api.canonical_resource_for('dog')
        request = MockRequest()
        request.GET = {'format': 'json'}
        request.method = 'PUT'
        request._load_post_and_files = lambda *args, **kwargs: None
        body_dict = {
            'id':
            dog.id,
            'name':
            'Wilfred',
            'bones': [{
                'id': bone1.id,
                'color': bone1.color
            }, {
                'id': bone2.id,
                'color': bone2.color
            }]
        }

        request.set_body(json.dumps(body_dict))

        with self.assertNumQueries(13 if django.VERSION >= (1, 9) else 14):
            resp = resource.wrap_view('dispatch_detail')(request, pk=dog.pk)

        self.assertEqual(resp.status_code, 204)

        dog = Dog.objects.all()[0]

        dog_bones = dog.bones.all()

        self.assertEqual(len(dog_bones), 2)

        self.assertEqual(dog_bones[0], bone1)
        self.assertEqual(dog_bones[1], bone2)
Exemple #4
0
    def test_no_save_m2m_unchanged_existing_data_persists(self):
        """
        Data should persist when posting an updated detail object with
        unchanged reverse realated objects.
        """

        person = Person.objects.create(name='Ryan')
        dog = Dog.objects.create(name='Wilfred', owner=person)
        bone1 = Bone.objects.create(color='White', dog=dog)
        bone2 = Bone.objects.create(color='Grey', dog=dog)
        
        self.assertEqual(dog.bones.count(), 2)
        
        resource = api.canonical_resource_for('dog')
        request = MockRequest()
        request.GET = {'format': 'json'}
        request.method = 'PUT'
        request._load_post_and_files = lambda *args, **kwargs: None
        body_dict = {
            'id': dog.id,
            'name': 'Wilfred',
            'bones': [
                {'id': bone1.id, 'color':  bone1.color},
                {'id': bone2.id, 'color':  bone2.color}
            ]
        }
        
        request.set_body(json.dumps(body_dict))
        
        resp = resource.wrap_view('dispatch_detail')(request, pk=dog.pk)
        
        self.assertEqual(resp.status_code, 204)

        dog = Dog.objects.all()[0]
        
        dog_bones = dog.bones.all()
        
        self.assertEqual(len(dog_bones), 2)
        
        self.assertEqual(dog_bones[0], bone1)
        self.assertEqual(dog_bones[1], bone2)
    def test_no_save_m2m_unchanged_existing_data_persists(self):
        """
        Data should persist when posting an updated detail object with
        unchanged reverse realated objects.
        """

        person = Person.objects.create(name="Ryan")
        dog = Dog.objects.create(name="Wilfred", owner=person)
        bone1 = Bone.objects.create(color="White", dog=dog)
        bone2 = Bone.objects.create(color="Grey", dog=dog)

        self.assertEqual(dog.bones.count(), 2)

        resource = api.canonical_resource_for("dog")
        request = MockRequest()
        request.GET = {"format": "json"}
        request.method = "PUT"
        request._load_post_and_files = lambda *args, **kwargs: None
        body_dict = {
            "id": dog.id,
            "name": "Wilfred",
            "bones": [{"id": bone1.id, "color": bone1.color}, {"id": bone2.id, "color": bone2.color}],
        }

        request.set_body(json.dumps(body_dict))

        resp = resource.wrap_view("dispatch_detail")(request, pk=dog.pk)

        self.assertEqual(resp.status_code, 204)

        dog = Dog.objects.all()[0]

        dog_bones = dog.bones.all()

        self.assertEqual(len(dog_bones), 2)

        self.assertEqual(dog_bones[0], bone1)
        self.assertEqual(dog_bones[1], bone2)