from django.core.files.storage import FileSystemStorage
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.utils.translation import string_concat, ugettext_lazy as _
+from mercurial import simplemerge
from django.conf import settings
from dvcs.signals import post_commit, post_publishable
class Meta:
abstract = True
ordering = ['ordering']
- verbose_name = _("tag")
- verbose_name_plural = _("tags")
def __unicode__(self):
return self.name
def listener_changed(sender, instance, **kwargs):
sender._object_cache = {}
- def next(self):
+ def get_next(self):
"""
Returns the next tag - stage to work on.
Returns None for the last stage.
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)
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__,
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__,
tags = kwargs.get('tags', [])
if tags:
# set stage to next tag after the commited one
- self.stage = max(tags, key=lambda t: t.ordering).next()
+ self.stage = max(tags, key=lambda t: t.ordering).get_next()
change = self.change_set.create(author=author,
author_name=author_name,
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
+ @transaction.atomic
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)
+ # 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()