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.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)
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.