@@ -104,6 +104,80 @@ def test_fields_parameter(self):
104
104
self .assertEqual (0 , ret ["stats" ]["created" ])
105
105
self .assertEqual (0 , ret ["stats" ]["deleted" ])
106
106
107
+ def test_skip_deletes (self ):
108
+ c1 = Company .objects .create (name = "My Company LLC" )
109
+
110
+ e1 = Employee .objects .create (name = "Scott" , age = 40 , company = c1 )
111
+ e2 = Employee .objects .create (name = "Isaac" , age = 9 , company = c1 )
112
+
113
+ # update Scott - this makes Isaac is the "stale object" that would be deleted if skip_deletes were False
114
+ new_objs = [
115
+ Employee (name = "Scott" , age = 41 , company = c1 ),
116
+ ]
117
+
118
+ # but Isaac should remain when the skip_deletes flag is True
119
+ ret = bulk_sync (new_models = new_objs , filters = None , key_fields = ("name" ,), skip_deletes = True )
120
+
121
+ self .assertEqual (["Scott" , "Isaac" ], [x .name for x in Employee .objects .all ().order_by ('id' )])
122
+
123
+ new_e1 = Employee .objects .get (id = e1 .id )
124
+ self .assertEqual (41 , new_e1 .age )
125
+
126
+ self .assertEqual (2 , Employee .objects .count ())
127
+
128
+ self .assertEqual (1 , ret ["stats" ]["updated" ])
129
+ self .assertEqual (0 , ret ["stats" ]["created" ])
130
+ self .assertEqual (0 , ret ["stats" ]["deleted" ])
131
+
132
+ def test_skip_creates (self ):
133
+ c1 = Company .objects .create (name = "My Company LLC" )
134
+
135
+ e1 = Employee .objects .create (name = "Scott" , age = 40 , company = c1 )
136
+ e2 = Employee .objects .create (name = "Isaac" , age = 9 , company = c1 )
137
+
138
+ # create a new employee that will be ignored
139
+ new_objs = [
140
+ Employee (name = "John" , age = 52 , company = c1 )
141
+ ]
142
+
143
+ ret = bulk_sync (new_models = new_objs , filters = None , key_fields = ("name" ,), skip_creates = True , skip_deletes = True )
144
+
145
+ self .assertEqual (2 , Employee .objects .count ())
146
+ self .assertEqual (["Scott" , "Isaac" ], [x .name for x in Employee .objects .all ().order_by ('id' )])
147
+
148
+ self .assertEqual (0 , ret ["stats" ]["updated" ])
149
+ self .assertEqual (0 , ret ["stats" ]["created" ])
150
+ self .assertEqual (0 , ret ["stats" ]["deleted" ])
151
+
152
+ def test_skip_updates (self ):
153
+ c1 = Company .objects .create (name = "My Company LLC" )
154
+
155
+ e1 = Employee .objects .create (name = "Scott" , age = 40 , company = c1 )
156
+ e2 = Employee .objects .create (name = "Isaac" , age = 9 , company = c1 )
157
+
158
+ # update employee that will be ignored, create a new one
159
+ new_objs = [
160
+ Employee (name = "Scott" , age = 100 , company = c1 ),
161
+ Employee (name = "Alice" , age = 36 , company = c1 )
162
+ ]
163
+
164
+ ret = bulk_sync (new_models = new_objs , filters = None , key_fields = ("name" ,), skip_updates = True )
165
+
166
+ # the age should not have been updated
167
+ new_e1 = Employee .objects .get (id = e1 .id )
168
+ self .assertEqual (40 , new_e1 .age )
169
+
170
+ # Isaac is "stale" object - was deleted, Alice was created
171
+ self .assertEqual (2 , Employee .objects .count ())
172
+ self .assertEqual (["Scott" , "Alice" ], [x .name for x in Employee .objects .all ().order_by ('id' )])
173
+
174
+
175
+ self .assertEqual (0 , ret ["stats" ]["updated" ])
176
+ self .assertEqual (1 , ret ["stats" ]["created" ])
177
+ self .assertEqual (1 , ret ["stats" ]["deleted" ])
178
+
179
+
180
+
107
181
class BulkCompareTests (TestCase ):
108
182
""" Test `bulk_compare` method """
109
183
0 commit comments