librarian bump
[redakcja.git] / apps / dvcs / models.py
index 6cfda91..2526028 100644 (file)
@@ -4,9 +4,9 @@ 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 django.utils.translation import string_concat, ugettext_lazy as _
 from mercurial import mdiff, simplemerge
 
 from django.conf import settings
@@ -26,8 +26,6 @@ class Tag(models.Model):
     class Meta:
         abstract = True
         ordering = ['ordering']
-        verbose_name = _("tag")
-        verbose_name_plural = _("tags")
 
     def __unicode__(self):
         return self.name
@@ -51,7 +49,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
 
@@ -99,8 +97,6 @@ class Change(models.Model):
         abstract = True
         ordering = ('created_at',)
         unique_together = ['tree', 'revision']
-        verbose_name = _("change")
-        verbose_name_plural = _("changes")
 
     def __unicode__(self):
         return u"Id: %r, Tree %r, Parent %r, Data: %s" % (self.id, self.tree_id, self.parent_id, self.data)
@@ -170,11 +166,17 @@ class Change(models.Model):
         post_publishable.send(sender=self, publishable=publishable)
 
 
+
+
 def create_tag_model(model):
     name = model.__name__ + 'Tag'
 
     class Meta(Tag.Meta):
         app_label = model._meta.app_label
+        verbose_name = string_concat(_("tag"), " ", _("for:"), " ", 
+                model._meta.verbose_name)
+        verbose_name_plural = string_concat(_("tags"), " ", _("for:"), " ",
+                model._meta.verbose_name)
 
     attrs = {
         '__module__': model.__module__,
@@ -189,6 +191,10 @@ def create_change_model(model):
 
     class Meta(Change.Meta):
         app_label = model._meta.app_label
+        verbose_name = string_concat(_("change"), " ", _("for:"), " ",
+                model._meta.verbose_name)
+        verbose_name_plural = string_concat(_("changes"), " ", _("for:"), " ",
+                model._meta.verbose_name)
 
     attrs = {
         '__module__': model.__module__,
@@ -307,7 +313,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 +325,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()