#1769: joining a document's history
[redakcja.git] / apps / dvcs / models.py
index ab5f77d..3991efc 100644 (file)
@@ -4,13 +4,13 @@ import os.path
 from django.contrib.auth.models import User
 from django.core.files.base import ContentFile
 from django.core.files.storage import FileSystemStorage
-from django.db import models
+from django.db import models, transaction
 from django.db.models.base import ModelBase
 from django.utils.translation import ugettext_lazy as _
 from mercurial import mdiff, simplemerge
 
 from django.conf import settings
-from dvcs.signals import post_commit
+from dvcs.signals import post_commit, post_publishable
 from dvcs.storage import GzipFileSystemStorage
 
 
@@ -51,7 +51,7 @@ class Tag(models.Model):
             Returns None for the last stage.
         """
         try:
-            return Tag.objects.filter(ordering__gt=self.ordering)[0]
+            return type(self).objects.filter(ordering__gt=self.ordering)[0]
         except IndexError:
             return None
 
@@ -125,7 +125,7 @@ class Change(models.Model):
         if self.revision is None:
             tree_rev = self.tree.revision()
             if tree_rev is None:
-                self.revision = 0
+                self.revision = 1
             else:
                 self.revision = tree_rev + 1
         return super(Change, self).save(*args, **kwargs)
@@ -167,7 +167,7 @@ class Change(models.Model):
     def set_publishable(self, publishable):
         self.publishable = publishable
         self.save()
-        post_publishable(sender=self, publishable=publishable).send()
+        post_publishable.send(sender=self, publishable=publishable)
 
 
 def create_tag_model(model):
@@ -324,3 +324,14 @@ class Document(models.Model):
             return changes.order_by('-created_at')[0]
         else:
             return None
+
+    @transaction.commit_on_success
+    def prepend_history(self, other):
+        """Takes over the the other document's history and prepends to own."""
+
+        assert self != other
+        other_revs = other.change_set.all().count()
+        self.change_set.all().update(revision=models.F('revision') + other_revs)
+        other.change_set.all().update(tree=self)
+        assert not other.change_set.exists()
+        other.delete()