Moving views to django generics when possible

This commit is contained in:
Benjamin Liles
2010-05-24 22:39:26 -05:00
parent a84ed81389
commit 07c5ffccc6
7 changed files with 101 additions and 25 deletions
+45 -3
View File
@@ -2,6 +2,7 @@ import os
from django.conf import settings
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.utils import simplejson as json
from django.contrib.auth.models import User
@@ -21,8 +22,10 @@ class Project(models.Model):
name = models.CharField(max_length=255, unique=True, primary_key=True)
auto_hide = models.BooleanField(default=True, blank=False)
allow_comments = models.BooleanField(default=True, blank=False)
owners = models.ManyToManyField(User, related_name="projects_owned")
maintainers = models.ManyToManyField(User, related_name="projects_maintained")
owners = models.ManyToManyField(User, blank=True,
related_name="projects_owned")
maintainers = models.ManyToManyField(User, blank=True,
related_name="projects_maintained")
class Meta:
verbose_name = _(u"project")
@@ -38,7 +41,21 @@ class Project(models.Model):
@models.permalink
def get_pypi_absolute_url(self):
return ('djangopypi-pypi_show_links', (), {'dist_name': self.name})
@property
def description(self):
latest = self.latest
if latest:
return latest.description
return u''
@property
def latest(self):
try:
return self.releases.latest()
except Release.DoesNotExist:
return None
def get_release(self, version):
"""Return the release object for version, or None"""
try:
@@ -57,6 +74,8 @@ class Release(models.Model):
verbose_name = _(u"release")
verbose_name_plural = _(u"releases")
unique_together = ("project", "version")
get_latest_by = 'created'
ordering = ['-created']
def __unicode__(self):
return self.release_name
@@ -65,6 +84,29 @@ class Release(models.Model):
def release_name(self):
return u"%s-%s" % (self.project.name, self.version)
@property
def parsed_package_info(self):
if not hasattr(self,'_parsed_package_info'):
try:
self._parsed_package_info = json.loads(self.package_info)
except Exception, e:
print str(e)
self._parsed_package_info = {}
return self._parsed_package_info
@property
def description(self):
return self.parsed_package_info.get('description',u'')
def save(self, *args, **kwargs):
if hasattr(self,'_parsed_package_info'):
try:
self.package_info = json.dumps(self._parsed_package_info)
delattr(self,'_parsed_package_info')
except Exception, e:
print str(e)
return super(Release, self).save(*args, **kwargs)
@models.permalink
def get_absolute_url(self):
return ('djangopypi-show_version', (), {'project': self.project.name,
+5 -2
View File
@@ -65,8 +65,9 @@ if not hasattr(settings,'DJANGOPYPI_PYTHON_VERSIONS'):
('3.2','3.2'),
)
if not hasattr(settings, 'DJANGOPYPI_SIMPLE_VIEW'):
settings.DJANGOPYPI_SIMPLE_VIEW = 'djangopypi.views.simple'
if not hasattr(settings, 'DJANGOPYPI_FALLBACK_VIEW'):
from djangopypi import views
settings.DJANGOPYPI_FALLBACK_VIEW = views.index
if not hasattr(settings,'DJANGOPYPI_ACTION_VIEWS'):
from djangopypi.views.dists import register_or_upload
@@ -76,5 +77,7 @@ if not hasattr(settings,'DJANGOPYPI_ACTION_VIEWS'):
"file_upload": register_or_upload, #``sdist`` command
"submit": register_or_upload, #``register`` command
"user": create_user, # registering a user
}
@@ -0,0 +1,13 @@
<html>
<head>
<title>Project List</title>
</head>
<body>
<h1>Project List</h1>
<ul>
{% for project in project_list %}
<li><a href="{{ project.get_absolute_url }}">{{ project.name }}</a>{% if project.description %}: {{ project.description }}{% endif %}</li>
{% endfor %}
</ul>
</body>
</html>
+2 -5
View File
@@ -2,9 +2,7 @@
from django.conf.urls.defaults import patterns, url, include
urlpatterns = patterns("djangopypi.views",
# Simple PyPI
url(r'^simple/$', "simple",
name="djangopypi-simple"),
url(r'^pypi/$', "index", name="djangopypi-index"),
url(r'^simple/(?P<dist_name>[\w\d_\.\-]+)/(?P<version>[\w\.\d\-_]+)/$',
"show_version",
@@ -13,8 +11,7 @@ urlpatterns = patterns("djangopypi.views",
url(r'^simple/(?P<dist_name>[\w\d_\.\-]+)/$', "show_links",
name="djangopypi-show_links"),
url(r'^$', "root", {'template_name': 'djangopypi/pypi.html'},
name="djangopypi-pypi"),
url(r'^$', "root", name="djangopypi-root"),
url(r'^(?P<dist_name>[\w\d_\.\-]+)/$', "show_links",
{'template_name': 'djangopypi/pypi_show_links.html'},
+15 -15
View File
@@ -3,6 +3,9 @@ from django.core.urlresolvers import reverse
from django.http import Http404, HttpResponseRedirect
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.views.generic import list_detail
from djangopypi.models import Project, Release
from djangopypi.http import HttpResponseNotImplemented
@@ -13,29 +16,26 @@ from djangopypi.views.search import search
def root(request, root_redirect=None, **kwargs):
if request.method != 'POST':
if root_redirect is None:
root_redirect = reverse(settings.DJANGOPYPI_SIMPLE_VIEW)
return HttpResponseRedirect(root_redirect)
parse_distutils_request(request)
def root(request, fallback_view=None, **kwargs):
""" Root view of the package index, handle incoming actions from distutils
or redirect to a more user friendly view """
if request.method != 'POST':
if fallback_view is None:
fallback_view = settings.DJANGOPYPI_FALLBACK_VIEW
return fallback_view(request, **kwargs)
parse_distutils_request(request)
print str(request.POST)
action = request.POST.get(':action','')
if not action in settings.DJANGOPYPI_ACTION_VIEWS:
print 'unknown action: %s' % (action,)
return HttpResponseNotImplemented("The action %s is not implemented" % (action,))
return settings.DJANGOPYPI_ACTION_VIEWS(request, **kwargs)
return settings.DJANGOPYPI_ACTION_VIEWS[action](request, **kwargs)
def simple(request, template_name="djangopypi/simple.html"):
context = RequestContext(request, {
"dists": Project.objects.all().order_by("name"),
"title": 'Package Index',
})
return render_to_response(template_name, context_instance=context)
def show_links(request, dist_name,
@@ -0,0 +1,21 @@
from django.conf import settings
from django.core.urlresolvers import reverse
from django.http import Http404, HttpResponseRedirect
from django.views.generic import list_detail
from django.shortcuts import get_object_or_404
from djangopypi.models import Project, Release
from djangopypi.views import release as release_views
def index(request, **kwargs):
kwargs.setdefault('template_object_name','project')
return list_detail.object_list(request, queryset=Project.objects.all(),
**kwargs)
def details(request, project, **kwargs):
kwargs.setdefault('template_object_name','project')
return list_detail.object_detail(request, queryset=Project.objects.all(),
object_id=project, **kwargs)