@@ -129,6 +129,24 @@ def after_save_instance(self, instance, dry_run):
129
129
"""
130
130
pass
131
131
132
+ def delete_instance (self , instance , dry_run = False ):
133
+ self .before_delete_instance (instance , dry_run )
134
+ if not dry_run :
135
+ instance .delete ()
136
+ self .after_delete_instance (instance , dry_run )
137
+
138
+ def before_delete_instance (self , instance , dry_run ):
139
+ """
140
+ Override to add additional logic.
141
+ """
142
+ pass
143
+
144
+ def after_delete_instance (self , instance , dry_run ):
145
+ """
146
+ Override to add additional logic.
147
+ """
148
+ pass
149
+
132
150
def import_field (self , field , obj , data ):
133
151
if field .attribute and field .column_name in data :
134
152
field .save (obj , data )
@@ -154,6 +172,15 @@ def save_m2m(self, obj, data, dry_run):
154
172
continue
155
173
self .import_field (field , obj , data )
156
174
175
+ def for_delete (self , row , instance ):
176
+ """
177
+ Returns ``True`` if ``row`` importing should delete instance.
178
+
179
+ Default implementation returns ``False``.
180
+ Override this method to handle deletion.
181
+ """
182
+ return False
183
+
157
184
def get_diff (self , original , current , dry_run = False ):
158
185
"""
159
186
Get diff between original and current object when ``import_data``
@@ -165,8 +192,8 @@ def get_diff(self, original, current, dry_run=False):
165
192
data = []
166
193
dmp = diff_match_patch ()
167
194
for field in self .get_fields ():
168
- v1 = self .export_field (field , original )
169
- v2 = self .export_field (field , current )
195
+ v1 = self .export_field (field , original ) if original else ""
196
+ v2 = self .export_field (field , current ) if current else ""
170
197
diff = dmp .diff_main (unicode (v1 ), unicode (v2 ))
171
198
dmp .diff_cleanupSemantic (diff )
172
199
html = dmp .diff_prettyHtml (diff )
@@ -193,10 +220,21 @@ def import_data(self, dataset, dry_run=False, raise_errors=False):
193
220
row_result .import_type = RowResult .IMPORT_TYPE_UPDATE
194
221
row_result .new_record = new
195
222
original = deepcopy (instance )
196
- self .import_obj (instance , row )
197
- self .save_instance (instance , dry_run )
198
- self .save_m2m (instance , row , dry_run )
199
- row_result .diff = self .get_diff (original , instance , dry_run )
223
+ if self .for_delete (row , instance ):
224
+ if new :
225
+ row_result .import_type = RowResult .IMPORT_TYPE_SKIP
226
+ row_result .diff = self .get_diff (None , None , dry_run )
227
+ else :
228
+ row_result .import_type = RowResult .IMPORT_TYPE_DELETE
229
+ self .delete_instance (instance , dry_run )
230
+ row_result .diff = self .get_diff (original , None ,
231
+ dry_run )
232
+ else :
233
+ self .import_obj (instance , row )
234
+ self .save_instance (instance , dry_run )
235
+ self .save_m2m (instance , row , dry_run )
236
+ row_result .diff = self .get_diff (original , instance ,
237
+ dry_run )
200
238
except Exception , e :
201
239
tb_info = traceback .format_exc (sys .exc_info ()[2 ])
202
240
row_result .errors .append (Error (repr (e ), tb_info ))
0 commit comments