Source

freehg / repos / models.py

from django.db import models
from django.contrib.auth.models import User
from django.conf import settings
from django.dispatch import dispatcher
from django.utils.html import escape, linebreaks, urlize

import os.path
import shutil

from mercurial import hg, ui

class Repo(models.Model):
    # 'name' is the name used in the url and filesystem.
    name = models.CharField(max_length=30)

    long_name = models.CharField(max_length=50, blank=True)
    description = models.TextField(max_length=5000, blank=True)

    owner = models.ForeignKey(User)
    allow_push = models.ManyToManyField(User, related_name="allow_push_set",
            blank=True)

    creation_date = models.DateTimeField(auto_now_add=True)

    class Admin:
        list_display = ("name", "owner")
        search_fields = ("name", "owner__username")

    class Meta:
        unique_together = (("name", "owner"),)

    @property
    def file_path(self):
        return settings.REPO_PATH+'/'+self.owner.username+"/"+self.name

    @property
    def hgrc_filename(self):
        return self.file_path + "/.hg/hgrc"

    def get_absolute_url(self):
        return "/u/%s/%s/" % (self.owner.username, self.name)

    @property
    def manage_url(self):
        return "/repos/manage/%s/%s/" % (self.owner.username, self.name)

    def __str__(self):
        return "%s/%s" % (self.owner.username, self.name)

    def __repr__(self):
        return "<Repo %s %s>" % (self.owner.username, self.name)

    def write_hgrc(self):
        assert(os.path.exists(self.file_path+"/.hg"))
        f = open(self.hgrc_filename, 'w')
        f.write("[web]\n")
        f.write("push_ssl = false\n")
        f.write("allow_push = %s\n" % self.owner.username)
        if self.long_name:
            f.write("name = %s\n" % escape(self.get_long_name()))
        else:
            f.write("name = %s\n" % escape(self.name))
        if self.description:
            f.write("description = %s\n" %
                self.get_html_description().replace('\n','').replace('%', '%%'))
        f.write("contact = %s\n" % (self.owner.get_full_name() or self.owner.username))
        f.close()


    def get_html_description(self):
        return linebreaks(urlize(escape(self.description)))

    def get_long_name(self):
        if self.long_name:
            return self.long_name
        else:
            return self.name

    def __unicode__(self):
        return self.name

def save_repo(instance):
    repo = instance
    if not os.path.exists(repo.file_path):
        os.makedirs(repo.file_path)
        hg.repository(ui.ui(), repo.file_path, create=True)
    repo.write_hgrc()
    return True
dispatcher.connect(save_repo, signal=models.signals.post_save, sender=Repo)

def delete_repo(instance):
    repo = instance
    if os.path.exists(repo.file_path):
        shutil.rmtree(repo.file_path)
        return True
dispatcher.connect(delete_repo, signal=models.signals.post_delete, sender=Repo)