X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/7e1849d7545fcfa73dc3d3fd29d3a1325b7c871b..d04035572b5a730f522a471b583bd2de10578024:/apps/dvcs/models.py?ds=sidebyside diff --git a/apps/dvcs/models.py b/apps/dvcs/models.py index bb796274..d7816fa7 100644 --- a/apps/dvcs/models.py +++ b/apps/dvcs/models.py @@ -4,7 +4,7 @@ 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 @@ -307,7 +307,7 @@ class Document(models.Model): return self.head def history(self): - return self.change_set.filter(revision__gt=-1) + return self.change_set.all().order_by('revision') def revision(self): rev = self.change_set.aggregate( @@ -319,8 +319,21 @@ class Document(models.Model): return self.change_set.get(revision=rev) def publishable(self): - changes = self.change_set.filter(publishable=True) + changes = self.history().filter(publishable=True) if changes.exists(): - return changes.order_by('-created_at')[0] + return changes.order_by('-revision')[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() + # workaround for a non-atomic UPDATE in SQLITE + self.change_set.all().update(revision=0-models.F('revision')) + self.change_set.all().update(revision=other_revs - models.F('revision')) + other.change_set.all().update(tree=self) + assert not other.change_set.exists() + other.delete()