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
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
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):
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(
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()