Merged [2948] from bmheight@gmail.com:

Addresses issue #628, using reverse() and the newly created helper function 
reverse_lazy()  (found in ietf/utils/lazy.py) to DRY out the code a bit by 
decoupling the urls from being hardcoded.

With this commit idrfc, and ipr modules have been modified to take advantage 
of the reverse() and reverse_lazy() functions.
 - Legacy-Id: 2956
Note: SVN reference [2948] has been migrated to Git commit 9399a2e0e8bbfe5c5a16781fd784776cfa31fbac
This commit is contained in:
Henrik Levkowetz 2011-03-26 14:36:10 +00:00
parent 090be02a16
commit 0ccff982bb
7 changed files with 42 additions and 10 deletions

View file

@ -38,6 +38,8 @@ import re
from datetime import date from datetime import date
from django.utils import simplejson as json from django.utils import simplejson as json
from django.db.models import Q from django.db.models import Q
from django.db import models
from django.core.urlresolvers import reverse
import types import types
BALLOT_ACTIVE_STATES = ['In Last Call', BALLOT_ACTIVE_STATES = ['In Last Call',
@ -198,11 +200,11 @@ class IdWrapper:
def friendly_state(self): def friendly_state(self):
if self.draft_status == "RFC": if self.draft_status == "RFC":
return "<a href=\"/doc/rfc%d/\">RFC %d</a>" % (self.rfc_number, self.rfc_number) return "<a href=\"%s\">RFC %d</a>" % (reverse('doc_view', args=['rfc%d' % self.rfc_number]), self.rfc_number)
elif self.draft_status == "Replaced": elif self.draft_status == "Replaced":
rs = self.replaced_by() rs = self.replaced_by()
if rs: if rs:
return "Replaced by <a href=\"/doc/%s/\">%s</a>" % (rs[0],rs[0]) return "Replaced by <a href=\"%s\">%s</a>" % (reverse('ipr_show', args=[rs[0]]),rs[0])
else: else:
return "Replaced" return "Replaced"
elif self.draft_status == "Active": elif self.draft_status == "Active":
@ -357,8 +359,9 @@ class RfcWrapper:
# TODO: get AD name of the draft # TODO: get AD name of the draft
return None return None
@models.permalink
def get_absolute_url(self): def get_absolute_url(self):
return "/doc/rfc%d/" % (self.rfc_number,) return ('ietf.idrfc.views_doc.document_main', ['rfc%s' % (str(self.rfc_number))])
def displayname_with_link(self): def displayname_with_link(self):
return '<a href="%s">RFC %d</a>' % (self.get_absolute_url(), self.rfc_number) return '<a href="%s">RFC %d</a>' % (self.get_absolute_url(), self.rfc_number)

View file

@ -41,6 +41,7 @@ from django.template.defaultfilters import truncatewords_html
from django.utils import simplejson as json from django.utils import simplejson as json
from django.utils.decorators import decorator_from_middleware from django.utils.decorators import decorator_from_middleware
from django.middleware.gzip import GZipMiddleware from django.middleware.gzip import GZipMiddleware
from django.core.urlresolvers import reverse
from ietf import settings from ietf import settings
from ietf.idtracker.models import InternetDraft, IDInternal, BallotInfo, DocumentComment from ietf.idtracker.models import InternetDraft, IDInternal, BallotInfo, DocumentComment
@ -189,7 +190,7 @@ def _get_history(doc, versions):
results.append({'is_text':True, 'date':doc._draft.expiration_date, 'text':'Draft expired'}) results.append({'is_text':True, 'date':doc._draft.expiration_date, 'text':'Draft expired'})
if doc.is_rfc_wrapper: if doc.is_rfc_wrapper:
if doc.draft_name: if doc.draft_name:
text = 'RFC Published (see <a href="/doc/%s/">%s</a> for earlier history)' % (doc.draft_name,doc.draft_name) text = 'RFC Published (see <a href="%s">%s</a> for earlier history)' % (reverse('doc_view', args=[doc.draft_name]),doc.draft_name)
else: else:
text = 'RFC Published' text = 'RFC Published'
results.append({'is_text':True, 'date':doc.publication_date, 'text':text}) results.append({'is_text':True, 'date':doc.publication_date, 'text':text})

View file

@ -3,12 +3,13 @@
from django.contrib.syndication.feeds import Feed from django.contrib.syndication.feeds import Feed
from django.utils.feedgenerator import Atom1Feed from django.utils.feedgenerator import Atom1Feed
from ietf.ipr.models import IprDetail from ietf.ipr.models import IprDetail
from ietf.utils.lazy import reverse_lazy
from datetime import datetime, time from datetime import datetime, time
class LatestIprDisclosures(Feed): class LatestIprDisclosures(Feed):
feed_type = Atom1Feed feed_type = Atom1Feed
title = "IPR Disclosures to the IETF" title = "IPR Disclosures to the IETF"
link = "/ipr/" link = reverse_lazy('ipr_showlist')
description = "Updates on new IPR Disclosures made to the IETF." description = "Updates on new IPR Disclosures made to the IETF."
language = "en" language = "en"
feed_url = "/feed/ipr/" feed_url = "/feed/ipr/"

View file

@ -4,6 +4,7 @@ from django.db import models
#from django import newforms as forms #from django import newforms as forms
from ietf.idtracker.views import InternetDraft from ietf.idtracker.views import InternetDraft
from ietf.idtracker.models import Rfc from ietf.idtracker.models import Rfc
from ietf.utils.lazy import reverse_lazy
# ------------------------------------------------------------------------ # ------------------------------------------------------------------------
# Models # Models
@ -115,8 +116,9 @@ class IprDetail(models.Model):
return self.title return self.title
def docs(self): def docs(self):
return list(self.drafts.all()) + list(self.rfcs.all()) return list(self.drafts.all()) + list(self.rfcs.all())
@models.permalink
def get_absolute_url(self): def get_absolute_url(self):
return "/ipr/%d/" % self.ipr_id return ('ietf.ipr.views.show', [str(self.ipr_id)])
def get_submitter(self): def get_submitter(self):
try: try:
return self.contact.get(contact_type=3) return self.contact.get(contact_type=3)

View file

@ -1,15 +1,16 @@
# Copyright The IETF Trust 2007, All Rights Reserved # Copyright The IETF Trust 2007, All Rights Reserved
from django.conf.urls.defaults import patterns from django.conf.urls.defaults import patterns, url
from ietf.ipr import views, new, search from ietf.ipr import views, new, search
from ietf.utils.lazy import reverse_lazy
from django.views.generic.simple import redirect_to from django.views.generic.simple import redirect_to
urlpatterns = patterns('', urlpatterns = patterns('',
(r'^$', views.showlist), url(r'^$', views.showlist, name='ipr_showlist'),
(r'^about/$', views.default), (r'^about/$', views.default),
(r'^by-draft/$', views.list_drafts), (r'^by-draft/$', views.list_drafts),
(r'^(?P<ipr_id>\d+)/$', views.show), url(r'^(?P<ipr_id>\d+)/$', views.show, name='ipr_show'),
(r'^update/$', redirect_to, { 'url': '/ipr/' }), (r'^update/$', redirect_to, { 'url': reverse_lazy('ipr_showlist') }),
(r'^update/(?P<ipr_id>\d+)/$', new.update), (r'^update/(?P<ipr_id>\d+)/$', new.update),
(r'^new-(?P<type>specific)/$', new.new), (r'^new-(?P<type>specific)/$', new.new),
(r'^new-(?P<type>generic)/$', new.new), (r'^new-(?P<type>generic)/$', new.new),

20
ietf/utils/lazy.py Normal file
View file

@ -0,0 +1,20 @@
from django.utils.functional import lazy
from django.core.urlresolvers import reverse
"""
A lazily evaluated version of `reverse()`_.
It is useful for when you need to use a URL reversal before Django's
URL names map is loaded. Some common cases where this method is necessary are:
* in your URL configuration (such as the ``url`` argument for the
``django.views.generic.simple.redirect_to`` generic view).
* providing a reversed URL to a decorator (such as the ``login_url`` argument
for the ``django.contrib.auth.decorators.permission_required`` decorator).
Usually unicode would be preference but str is the right type instead of unicode.
This is because reverse passes through iri_to_uri which converts it to a string
"""
reverse_lazy = lazy(reverse, str)

View file

@ -215,3 +215,7 @@ def login_testing_unauthorized(tc, remote_user, url):
tc.client.login(remote_user=remote_user) tc.client.login(remote_user=remote_user)
class ReverseLazyTest(TestCase):
def test_redirect_with_lazy_reverse(self):
response = self.client.get('/ipr/update/')
self.assertRedirects(response, "/ipr/", status_code=301)