Skip to content

Commit

Permalink
Step 1 in removing the double 'g' from 'pluggables'.
Browse files Browse the repository at this point in the history
git-svn-id: http://svn.revyver.com/djangopluggables.com/trunk/applications@201 5c07df8f-9e68-4da1-b9d9-3219ff5d644b
  • Loading branch information
bryanveloso committed Apr 8, 2008
1 parent 110bf83 commit b24699f
Show file tree
Hide file tree
Showing 11 changed files with 289 additions and 215 deletions.
2 changes: 1 addition & 1 deletion core/models.py
Expand Up @@ -13,7 +13,7 @@ class Item(models.Model):

# Generic relation to the object.
content_type = models.ForeignKey(ContentType)
object_id = models.TextField()
object_id = models.IntegerField()
object = GenericForeignKey()

# "Standard" metadata each object provides.
Expand Down
15 changes: 14 additions & 1 deletion core/register.py
@@ -1,2 +1,15 @@
# Administration
from core import admin
from core import admin

# Core Template Tags
from django import template
template.add_to_builtins('django.contrib.markup.templatetags.markup')
template.add_to_builtins('django.contrib.humanize.templatetags.humanize')
template.add_to_builtins('django.templatetags.cache')

# 3rd Party Template Tags
template.add_to_builtins('typogrify.templatetags.typogrify')
template.add_to_builtins('template_utils.templatetags.comparison')
template.add_to_builtins('template_utils.templatetags.feeds')
template.add_to_builtins('template_utils.templatetags.generic_content')
template.add_to_builtins('template_utils.templatetags.generic_markup')
48 changes: 39 additions & 9 deletions projects/admin.py
@@ -1,33 +1,63 @@
from django.contrib import admin

from models import Project, Maintainer, CodeRepository, CodeCommit
from models import Project, Developer, CodeRepository, CodeCommit


class CommitsInline(admin.TabularInline):
model = CodeCommit
extra = 3


class RepositoryInline(admin.TabularInline):
model = CodeRepository
extra = 1


class ProjectAdmin(admin.ModelAdmin):
list_display = ('name', 'type', 'url')
fieldsets = (
('Basics', {'fields': ('name', 'tagline', 'slug')}),
('Specifics', {'fields': ('active', 'url', 'description', 'tags')}),
('People', {'fields': ('owners', 'members')}),
)
inlines = [RepositoryInline]
filter_horizontal = ('owners', 'members')
list_display = ('name', 'url', 'active')
search_fields = ('name', 'description')
prepopulated_fields = { 'slug': ('name',) }


class MaintainerAdmin(admin.ModelAdmin):
list_display = ('full_name',)
search_fields = ('last_name', 'first_name', 'bio')
class DeveloperAdmin(admin.ModelAdmin):
fieldsets = (
('Metadata', {'fields': ('first_name', 'middle_name', 'last_name', 'suffix', 'svn_name', 'slug'), 'classes': ('wide',)}),
('URLs', {'fields': ('personal_url', 'professional_url', 'django_people_url'), 'classes': ('wide',)}),
)
list_display = ('full_name', 'svn_name', 'django_people_url')
search_fields = ('last_name', 'first_name')
prepopulated_fields = { 'slug': ('first_name', 'middle_name', 'last_name', 'suffix') }


class CodeRepositoryAdmin(admin.ModelAdmin):
list_display = ('name', 'type', 'url')
fieldsets = (
('Linkage', {'fields': ('project',)}),
('Basics', {'fields': ('type', 'url')}),
('Optional', {'fields': ('public_changeset_template',), 'classes': ('collapse',)}),
)
inlines = [CommitsInline]
list_display = ('__unicode__', 'type', 'url', 'public_changeset_template')
search_fields = ('',)
prepopulated_fields = { 'slug': ('name',) }


class CodeCommitAdmin(admin.ModelAdmin):
fieldsets = (
('Linkage', {'fields': ('repository',)}),
('Basics', {'fields': ('revision', 'message', 'committed')}),
)
list_display = ('__unicode__', 'repository')
list_filter = ('repository',)
search_fields = ('message',)


admin.site.register(Project, ProjectAdmin)
admin.site.register(Maintainer, MaintainerAdmin)
admin.site.register(Developer, DeveloperAdmin)
admin.site.register(CodeRepository, CodeRepositoryAdmin)
admin.site.register(CodeCommit, CodeCommit)
admin.site.register(CodeCommit, CodeCommitAdmin)
File renamed without changes.
19 changes: 19 additions & 0 deletions projects/bin/update.py
@@ -0,0 +1,19 @@
#!/usr/bin/env python

# Setup the paths.
import sys, os
sys.path.append('/home/bryan/Projects/djangoplugables.com/trunk/applications')
sys.path.append('/home/bryan/Projects/djangoplugables.com/trunk/applications/core')
sys.path.append('/home/bryan/Projects/djangoplugables.com/trunk/applications/projects')

# Setup the enviornment.
from django.core.management import setup_environ
from applications import settings

setup_environ(settings)

# Now start the script.
from projects.providers.svn import RepositorySyncr

rs = RepositorySyncr()
rs.syncRepositories()
98 changes: 45 additions & 53 deletions projects/models.py
@@ -1,34 +1,12 @@
from django.db import models
from django.db.models import permalink
from django.utils import text

from core.models import Item
from tagging.fields import TagField


class Project(models.Model):
"""
A project is a wrapper around a code repository, connecting authors and
other descriptive information to it.
"""

name = models.CharField(max_length=100)
description = models.TextField(help_text='A short description of the project.')
repository = models.ForeignKey('CodeRepository', related_name='repository')
maintainers = models.ManyToManyField('Maintainer', related_name='maintainer')
slug = models.SlugField(unique=True)
url = models.URLField(verify_exists=True, help_text='The URL to the project, usually hosted at Google Code.')
tags = TagField()

def __unicode__(self):
return self.name

@permalink
def get_absolute_url(self):
return ('project-detail', (), {
'slug': self.slug
})


class Maintainer(models.Model):
class Developer(models.Model):
"""
A maintainer is a person with commmit rights to a given code repository.
All this model contains is simple metadata, if available.
Expand All @@ -39,22 +17,23 @@ class Maintainer(models.Model):
middle_name = models.CharField(max_length=200, blank=True)
last_name = models.CharField(max_length=200)
suffix = models.CharField(max_length=100, blank=True)
bio = models.TextField(blank=True)
svn_name = models.CharField('SVN name', max_length=100)
slug = models.SlugField(unique=True)

# URLs
personal_url = models.URLField(blank=True, verify_exists=True)
professional_url = models.URLField(blank=True, verify_exists=True)
personal_url = models.URLField('personal URL', blank=True, verify_exists=True)
professional_url = models.URLField('professional URL', blank=True, verify_exists=True)
django_people_url = models.URLField('Django People Profile', blank=True, verify_exists=True)

class Meta:
ordering = ('last_name', 'first_name')

def __unicode__(self):
return self.name
return '%s (%s)' % (self.name, self.svn_name)

@permalink
def get_absolute_url(self):
return ('maintainer-detail', (), {
return ('developer-detail', (), {
'slug': self.slug
})

Expand All @@ -67,16 +46,37 @@ def name(self):
def full_name(self):
return ' '.join(b for b in (self.first_name, self.middle_name, self.last_name, self.suffix) if b)

def get_projects(self):
"""
Returns a string of projects for use in the admin list display.
"""

class Project(models.Model):
"""
A project is a wrapper around a code repository, connecting authors and
other descriptive information to it.
"""

name = models.CharField(max_length=100)
tagline = models.CharField(max_length=250, help_text="A few words about the project.")
description = models.TextField(blank=True, help_text='A short description of the project.')
owners = models.ManyToManyField(Developer, related_name='owners', blank=True, null=True)
members = models.ManyToManyField(Developer, related_name='members', blank=True, null=True)
slug = models.SlugField(unique=True)
url = models.URLField('project URL', verify_exists=True, help_text='The URL to the project, usually hosted at Google Code.')
tags = TagField()
active = models.BooleanField(default=True)

class Meta:
ordering = ['name']

def __unicode__(self):
return self.name

@permalink
def get_absolute_url(self):
return ('project-detail', (), {
'slug': self.slug
})

maintainers = Project.objects.filter(maintainers=self)
projects = []
for maintainer in maintainers:
projects.append(str(project.name))
return ', '.join(projects)
def latest_update(self):
return ''


class CodeRepository(models.Model):
Expand All @@ -89,27 +89,19 @@ class CodeRepository(models.Model):
('svn', 'Subversion'),
)

project = models.ForeignKey(Project, related_name='repository')
type = models.CharField(max_length=3, choices=SCM_CHOICES, default='svn')
name = models.CharField(max_length=100)
slug = models.SlugField(unique=True)
username = models.CharField(max_length=100, help_text='The maintainer\'s username for this SCR.')
public_changeset_template = models.URLField(verify_exists=False, blank=True, help_text='Template for viewing a changeset publically. Use \'%s\' for the revision number')
url = models.URLField(verify_exists=True)
url = models.URLField('repository URL', verify_exists=True)

class Meta:
verbose_name_plural = 'code repositories'

def __unicode__(self):
return self.name

@permalink
def get_absolute_url(self):
return ('repository-detail', (), {
'slug': self.slug
})
return self.project.name

def updated(self):
commits = CodeCommit.objects.filter('-committed')[:0]
commits = CodeCommit.objects.filter(repository=self.id)[0]
last_commit = commits.committed
return last_commit

Expand All @@ -129,12 +121,12 @@ class Meta:

def __unicode__(self):
return "[%s] %s" % (self.revision, text.truncate_words(self.message, 10))

@property
def url(self):
if self.repository.public_changeset_template:
return self.repository.public_changeset_template % self.revision
return ""
return ''


# Initilization
Expand Down
95 changes: 52 additions & 43 deletions projects/providers/svn.py
Expand Up @@ -2,55 +2,64 @@
import logging
import datetime

from django.db import transaction
from django.utils.encoding import smart_unicode

from core.models import Item
from projects.models import Item, CodeRepository, CodeCommit
from projects.providers import utils


try:
import pysvn
except ImportError:
pysvn = None

log = logging.getLogger("jellyroll.providers.svn")
from django.db import transaction
from django.utils.encoding import smart_unicode

#
# Public API
#
def enabled():
return pysvn is not None
from core.models import Item
from projects.models import CodeRepository, CodeCommit

def update():
for repository in CodeRepository.objects.filter(type="svn"):
_update_repository(repository)

#
# Private API
#

def _update_repository(repository):
source_identifier = "%s:%s" % (__name__, repository.url)
last_update_date = Item.objects.get_last_update_of_model(CodeCommit, source=source_identifier)
log.info("Updating changes from %s since %s", repository.url, last_update_date)
rev = pysvn.Revision(pysvn.opt_revision_kind.date, time.mktime(last_update_date.timetuple()))
c = pysvn.Client()
for revision in reversed(c.log(repository.url, revision_end=rev)):
_handle_revision(repository, revision)
class RepositorySyncr:
"""
SVNUpdater syncs a set of subversion repositories. It will go through each
repository listed and create a ``CodeCommit`` object for each of the
repository's commits.
This app requires pysvn which is available at:
http://pysvn.tigris.org/
"""

log = logging.getLogger("projects.providers.svn")

def _update_repository(self, repository):
source_identifier = '%s:%s' % (__name__, repository.url)
last_update_date = Item.objects.get_last_update_of_model(CodeCommit, source=source_identifier)
self.log.info('Updating changes from %s since %s', repository.url, last_update_date)
rev = pysvn.Revision(pysvn.opt_revision_kind.date, time.mktime(last_update_date.timetuple()))
c = pysvn.Client()
for revision in reversed(c.log(repository.url, revision_end=rev)):
self._handle_revision(repository, revision)

@transaction.commit_on_success
def _handle_revision(self, repository, r):
self.log.debug("Handling [%s] from %s" % (r.revision.number, repository.url))
ci, created = CodeCommit.objects.get_or_create(
revision = r.revision.number,
repository = repository,
committed = datetime.datetime.fromtimestamp(r.date),
defaults = {"message": smart_unicode(r.message)}
)
return Item.objects.create_or_update(
instance = ci,
timestamp = datetime.datetime.fromtimestamp(r.date),
source = "%s:%s" % (__name__, repository.url),
)

def syncRepositories(self):
"""
Loops through all given repositories in ``CodeRepository`` and updates
any ``CodeCommit`` objects missing since the previous update.
"""

repositories = CodeRepository.objects.filter(type='svn')

for repository in repositories:
self._update_repository(repository)



@transaction.commit_on_success
def _handle_revision(repository, r):
log.debug("Handling [%s] from %s" % (r.revision.number, repository.url))
ci, created = CodeCommit.objects.get_or_create(
revision = r.revision.number,
repository = repository,
committed = datetime.datetime.fromtimestamp(r.date),
defaults = {"message": smart_unicode(r.message)}
)
return Item.objects.create_or_update(
instance = ci,
timestamp = datetime.datetime.fromtimestamp(r.date),
source = "%s:%s" % (__name__, repository.url),
)

0 comments on commit b24699f

Please sign in to comment.