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:
parent
090be02a16
commit
0ccff982bb
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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})
|
||||||
|
|
|
@ -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/"
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
20
ietf/utils/lazy.py
Normal 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)
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue