When last_version is deleted, do not delete text and previous versions in cascade, but really delete text only when there is no previous version, otherwise update text.last_version with previous version.
authorgibus
Fri, 13 Apr 2012 11:53:42 +0200
changeset 407 2d14a80716e2
parent 406 87adb908e649
child 408 962f4c60c692
When last_version is deleted, do not delete text and previous versions in cascade, but really delete text only when there is no previous version, otherwise update text.last_version with previous version.
src/cm/denorm_engine.py
src/cm/models.py
--- a/src/cm/denorm_engine.py	Fri Apr 06 12:35:57 2012 +0200
+++ b/src/cm/denorm_engine.py	Fri Apr 13 11:53:42 2012 +0200
@@ -21,11 +21,19 @@
         pass
         #logging.warning('No text found for text_version: %i' %text_version.id)
         
+# GIB when deleting last revision, do not delete related text
+def delete_last_version (sender, instance, signal, *args, **kwargs):
+  if instance.id == instance.text.last_text_version_id:
+    previous = instance.get_previous_version()
+    if previous:
+      instance.text.last_text_version_id = previous.id
+      instance.text.save()
         
 def connect_all():
     # text updated by text_version
+    signals.pre_delete.connect(delete_last_version, sender=TextVersion)
     signals.post_save.connect(update_text_from_last_version, sender=TextVersion)
     signals.post_delete.connect(update_text_from_last_version, sender=TextVersion)
 
 
-connect_all()
\ No newline at end of file
+connect_all()
--- a/src/cm/models.py	Fri Apr 06 12:35:57 2012 +0200
+++ b/src/cm/models.py	Fri Apr 13 11:53:42 2012 +0200
@@ -44,7 +44,7 @@
     private_feed_key = models.CharField(max_length=20, db_index=True, unique=True, blank=True, null=True, default=None)
 
     # denormalized fields
-    last_text_version = models.ForeignKey("TextVersion", related_name='related_text', null=True, blank=True)
+    last_text_version = models.ForeignKey("TextVersion", related_name='related_text', null=True, blank=True, on_delete=models.SET_NULL)
     title = models.TextField()
 
     objects = TextManager()
@@ -84,6 +84,9 @@
         if modif:
             self.save()
 
+        # GIB: there is no more version for this text => delete it
+        if real_last_text_version == None and last_text_version == None:
+          self.real_delete()
                 
     def get_title(self):
         return self.get_latest_version().title