Updated all urlpatterns to use ietf.utils.urls.url() instead of django's,

in order to autogenerate dotted path url pattern names.  Updated a number
of url reverses to use dotted path, and removed explicit url pattern names
as needed.

Changed some imports to prevent import of ietf.urls before django
initialization was complete.


Changed 3 cases of form classes being curried to functions; django 1.10
didn't accept that.

Started converting old-style middleware classes to new-style middleware
functions (incomplete).

Tweaked a nomcom decorator to preserve function names and attributes, like
a good decorator should.

Replaced the removed django templatetag 'removetags' with our own version
which uses bleach, and does sanitizing in addition to removing explicitly
mentionied html tags.

Rewrote the filename argument handling in a management command which had
broken with the upgrade.
 - Legacy-Id: 12818
This commit is contained in:
Henrik Levkowetz 2017-02-11 14:43:01 +00:00
parent 19d585255a
commit aa5e61d958
90 changed files with 267 additions and 207 deletions

View file

@ -28,7 +28,7 @@ class CommunityList(models.Model):
if self.user:
return urlreverse(ietf.community.views.view_list, kwargs={ 'username': self.user.username })
elif self.group:
return urlreverse("group_docs", kwargs={ 'acronym': self.group.acronym })
return urlreverse("ietf.group.views.group_documents", kwargs={ 'acronym': self.group.acronym })
return ""

View file

@ -1,7 +1,7 @@
from django.conf.urls import url
from ietf.community import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^personal/(?P<username>[^/]+)/$', views.view_list),

View file

@ -1,7 +1,7 @@
# Copyright The IETF Trust 2010, All Rights Reserved
from django.conf.urls import url
from ietf.cookies import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', views.preferences),

View file

@ -1,7 +1,7 @@
from django.conf.urls import url
from ietf.dbtemplate import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^(?P<acronym>[-a-z0-9]+)/$', views.template_list, name='template_list'),

View file

@ -1,11 +1,11 @@
# Copyright The IETF Trust 2007, All Rights Reserved
from django.conf.urls import url
from django.views.generic import RedirectView
from django.http import HttpResponsePermanentRedirect
from django.shortcuts import get_object_or_404
from ietf.group.models import Group
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', RedirectView.as_view(url='/doc/', permanent=True)),

View file

@ -1,6 +1,7 @@
from django.conf.urls import url
from django.views.generic import RedirectView
from ietf.utils.urls import url
urlpatterns = [
url(r'^help/(?:sub)?state/(?:\d+/)?$', RedirectView.as_view(url='/doc/help/state/draft-iesg/', permanent=True)),
url(r'^help/evaluation/$', RedirectView.as_view(url='https://www.ietf.org/iesg/voting-procedures.html', permanent=True)),

View file

@ -559,7 +559,7 @@ class EditCharterTests(TestCase):
self.assertTrue("approved" in outbox[0]['Subject'].lower())
self.assertTrue("iesg-secretary" in outbox[0]['To'])
body = outbox[0].get_payload()
for word in ["WG", "/wg/ames/charter/",
for word in ["WG", "/wg/ames/about/",
"Charter", "/doc/charter-ietf-ames/", ]:
self.assertIn(word, body)
#

View file

@ -77,7 +77,7 @@ class StatusChangeTests(TestCase):
def test_change_state(self):
doc = Document.objects.get(name='status-change-imaginary-mid-review')
url = urlreverse('status_change_change_state',kwargs=dict(name=doc.name))
url = urlreverse('ietf.doc.views_status_change.change_state',kwargs=dict(name=doc.name))
login_testing_unauthorized(self, "ad", url)
@ -432,7 +432,7 @@ class StatusChangeSubmitTests(TestCase):
f.write('This is the old proposal.')
f.close()
# Put the old proposal into IESG review (exercises ballot tab when looking at an older revision below)
state_change_url = urlreverse('status_change_change_state',kwargs=dict(name=doc.name))
state_change_url = urlreverse('ietf.doc.views_status_change.change_state',kwargs=dict(name=doc.name))
iesgeval_pk = str(State.objects.get(slug='iesgeval',type__slug='statchg').pk)
r = self.client.post(state_change_url,dict(new_state=iesgeval_pk))
self.assertEqual(r.status_code, 302)

View file

@ -30,11 +30,12 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from django.conf.urls import url, include
from django.conf.urls import include
from django.views.generic import RedirectView
from django.conf import settings
from ietf.doc import views_search, views_draft, views_ballot, views_status_change, views_doc, views_stats, views_help
from ietf.utils.urls import url
session_patterns = [
url(r'^add$', views_doc.add_sessionpresentation),
@ -67,19 +68,19 @@ urlpatterns = [
url(r'^%(name)s/(?:%(rev)s/)?bibtex/$' % settings.URL_REGEXPS, views_doc.document_bibtex),
url(r'^%(name)s/history/$' % settings.URL_REGEXPS, views_doc.document_history, name="doc_history"),
url(r'^%(name)s/writeup/$' % settings.URL_REGEXPS, views_doc.document_writeup, name="doc_writeup"),
url(r'^%(name)s/email/$' % settings.URL_REGEXPS, views_doc.document_email, name="doc_email"),
url(r'^%(name)s/email/$' % settings.URL_REGEXPS, views_doc.document_email, name="ietf.doc.views_doc.document_email"),
url(r'^%(name)s/shepherdwriteup/$' % settings.URL_REGEXPS, views_doc.document_shepherd_writeup, name="doc_shepherd_writeup"),
url(r'^%(name)s/references/$' % settings.URL_REGEXPS, views_doc.document_references, name="doc_references"),
url(r'^%(name)s/referencedby/$' % settings.URL_REGEXPS, views_doc.document_referenced_by, name="doc_referenced_by"),
url(r'^%(name)s/ballot/$' % settings.URL_REGEXPS, views_doc.document_ballot, name="doc_ballot"),
url(r'^%(name)s/ballot/(?P<ballot_id>[0-9]+)/$' % settings.URL_REGEXPS, views_doc.document_ballot, name="doc_ballot"),
url(r'^%(name)s/ballot/$' % settings.URL_REGEXPS, views_doc.document_ballot),
url(r'^%(name)s/ballot/(?P<ballot_id>[0-9]+)/$' % settings.URL_REGEXPS, views_doc.document_ballot),
url(r'^%(name)s/ballot/(?P<ballot_id>[0-9]+)/position/$' % settings.URL_REGEXPS, views_ballot.edit_position),
url(r'^%(name)s/ballot/(?P<ballot_id>[0-9]+)/emailposition/$' % settings.URL_REGEXPS, views_ballot.send_ballot_comment, name='doc_send_ballot_comment'),
url(r'^%(name)s/(?:%(rev)s/)?doc.json$' % settings.URL_REGEXPS, views_doc.document_json),
url(r'^%(name)s/ballotpopup/(?P<ballot_id>[0-9]+)/$' % settings.URL_REGEXPS, views_doc.ballot_popup),
url(r'^(?P<name>[A-Za-z0-9._+-]+)/reviewrequest/', include("ietf.doc.urls_review")),
url(r'^%(name)s/email-aliases/$' % settings.URL_REGEXPS, RedirectView.as_view(pattern_name='doc_email', permanent=False),name='doc_specific_email_aliases'),
url(r'^%(name)s/email-aliases/$' % settings.URL_REGEXPS, RedirectView.as_view(pattern_name='ietf.doc.views_doc.document_email', permanent=False),name='doc_specific_email_aliases'),
url(r'^%(name)s/edit/state/$' % settings.URL_REGEXPS, views_draft.change_state, name='doc_change_state'), # IESG state
url(r'^%(name)s/edit/state/(?P<state_type>iana-action|iana-review)/$' % settings.URL_REGEXPS, views_draft.change_iana_state, name='doc_change_iana_state'),

View file

@ -1,9 +1,9 @@
# Copyright The IETF Trust 2011, All Rights Reserved
from django.conf.urls import url
from django.conf import settings
from ietf.doc import views_charter, views_doc
from ietf.utils.urls import url
urlpatterns = [
url(r'^state/$', views_charter.change_state, name='charter_change_state'),

View file

@ -1,6 +1,6 @@
from django.conf.urls import url
from ietf.doc import views_conflict_review, views_doc
from ietf.utils.urls import url
urlpatterns = [
url(r'^state/$', views_conflict_review.change_state, name='conflict_review_change_state'),

View file

@ -1,6 +1,6 @@
from django.conf.urls import url
from ietf.doc import views_material
from ietf.utils.urls import url
urlpatterns = [
url(r'^(?P<action>state|title|abstract|revise)/$', views_material.edit_material, name="material_edit"),

View file

@ -1,5 +1,5 @@
from django.conf.urls import url
from ietf.doc import views_review
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', views_review.request_review),

View file

@ -1,9 +1,9 @@
from django.conf.urls import url
from ietf.doc import views_status_change, views_doc
from ietf.utils.urls import url
urlpatterns = [
url(r'^state/$', views_status_change.change_state, name='status_change_change_state'),
url(r'^state/$', views_status_change.change_state),
url(r'^submit/$', views_status_change.submit, name='status_change_submit'),
url(r'^ad/$', views_status_change.edit_ad, name='status_change_ad'),
url(r'^title/$', views_status_change.edit_title, name='status_change_title'),

View file

@ -116,7 +116,7 @@ def edit_position(request, name, ballot_id):
if 'ballot_edit_return_point' in request.session:
return_to_url = request.session['ballot_edit_return_point']
else:
return_to_url = urlreverse("doc_ballot", kwargs=dict(name=doc.name, ballot_id=ballot_id))
return_to_url = urlreverse("ietf.doc.views_doc.document_ballot", kwargs=dict(name=doc.name, ballot_id=ballot_id))
# if we're in the Secretariat, we can select an AD to act as stand-in for
if has_role(request.user, "Secretariat"):
@ -245,12 +245,12 @@ def send_ballot_comment(request, name, ballot_id):
if 'ballot_edit_return_point' in request.session:
return_to_url = request.session['ballot_edit_return_point']
else:
return_to_url = urlreverse("doc_ballot", kwargs=dict(name=doc.name, ballot_id=ballot_id))
return_to_url = urlreverse("ietf.doc.views_doc.document_ballot", kwargs=dict(name=doc.name, ballot_id=ballot_id))
if 'HTTP_REFERER' in request.META:
back_url = request.META['HTTP_REFERER']
else:
back_url = urlreverse("doc_ballot", kwargs=dict(name=doc.name, ballot_id=ballot_id))
back_url = urlreverse("ietf.doc.views_doc.document_ballot", kwargs=dict(name=doc.name, ballot_id=ballot_id))
# if we're in the Secretariat, we can select an AD to act as stand-in for
if not has_role(request.user, "Area Director"):

View file

@ -73,14 +73,14 @@ def render_document_top(request, doc, tab, name):
ballot = doc.latest_event(BallotDocEvent, type="created_ballot")
if doc.type_id in ("draft","conflrev", "statchg"):
tabs.append(("IESG Evaluation Record", "ballot", urlreverse("doc_ballot", kwargs=dict(name=name)), ballot, None if ballot else "IESG Evaluation Ballot has not been created yet"))
tabs.append(("IESG Evaluation Record", "ballot", urlreverse("ietf.doc.views_doc.document_ballot", kwargs=dict(name=name)), ballot, None if ballot else "IESG Evaluation Ballot has not been created yet"))
elif doc.type_id == "charter" and doc.group.type_id == "wg":
tabs.append(("IESG Review", "ballot", urlreverse("doc_ballot", kwargs=dict(name=name)), ballot, None if ballot else "IESG Review Ballot has not been created yet"))
tabs.append(("IESG Review", "ballot", urlreverse("ietf.doc.views_doc.document_ballot", kwargs=dict(name=name)), ballot, None if ballot else "IESG Review Ballot has not been created yet"))
if doc.type_id == "draft" or (doc.type_id == "charter" and doc.group.type_id == "wg"):
tabs.append(("IESG Writeups", "writeup", urlreverse("doc_writeup", kwargs=dict(name=name)), True, None))
tabs.append(("Email expansions","email",urlreverse("doc_email", kwargs=dict(name=name)), True, None))
tabs.append(("Email expansions","email",urlreverse("ietf.doc.views_doc.document_email", kwargs=dict(name=name)), True, None))
tabs.append(("History", "history", urlreverse("doc_history", kwargs=dict(name=name)), True, None))
if name.startswith("rfc"):
@ -260,7 +260,7 @@ def document_main(request, name, rev=None):
elif group.type_id in ("rg", "wg"):
submission = "%s %s" % (group.acronym, group.type)
if group.type_id == "wg":
submission = "<a href=\"%s\">%s</a>" % (urlreverse("group_home", kwargs=dict(group_type=group.type_id, acronym=group.acronym)), submission)
submission = "<a href=\"%s\">%s</a>" % (urlreverse("ietf.group.views.group_home", kwargs=dict(group_type=group.type_id, acronym=group.acronym)), submission)
if doc.stream_id and doc.get_state_slug("draft-stream-%s" % doc.stream_id) == "c-adopt":
submission = "candidate for %s" % submission

View file

@ -41,7 +41,7 @@ class GroupAdmin(admin.ModelAdmin):
# SDO reminder
def get_urls(self):
from django.conf.urls import url
from ietf.utils.urls import url
def wrap(view):
def wrapper(*args, **kwargs):

View file

@ -10,7 +10,7 @@ class GroupFeatures(object):
has_reviews = False
has_default_jabber = False
customize_workflow = False
about_page = "group_about"
about_page = "ietf.group.views.group_about"
default_tab = about_page
material_types = ["slides"]
admin_roles = ["chair"]
@ -23,10 +23,10 @@ class GroupFeatures(object):
self.customize_workflow = True
self.has_default_jabber = True
self.has_dependencies = True
self.default_tab = "group_docs"
self.default_tab = "ietf.group.views.group_documents"
elif group.type_id in ("team",):
self.has_materials = True
self.default_tab = "group_about"
self.default_tab = "ietf.group.views.group_about"
elif group.type_id in ("program",):
self.has_documents = True
self.has_milestones = True
@ -35,7 +35,7 @@ class GroupFeatures(object):
self.admin_roles = ["chair", "secr"]
if self.has_chartering_process:
self.about_page = "group_charter"
self.about_page = "ietf.group.views.group_about"
from ietf.review.utils import active_review_teams
if group in active_review_teams():

View file

@ -342,7 +342,7 @@ class GroupPagesTests(TestCase):
self.assertTrue(doc.title in unicontent(r))
self.assertTrue(doc.name in unicontent(r))
url = urlreverse("group_materials", kwargs={ 'acronym': group.acronym })
url = urlreverse("ietf.group.views.materials", kwargs={ 'acronym': group.acronym })
# try deleting the document and check it's gone
doc.set_state(State.objects.get(type="slides", slug="deleted"))
@ -429,7 +429,7 @@ class GroupEditTests(TestCase):
def test_create(self):
make_test_data()
url = urlreverse('group_create', kwargs=dict(group_type="wg"))
url = urlreverse('ietf.group.views_edit.edit', kwargs=dict(group_type="wg", action="charter"))
login_testing_unauthorized(self, "secretary", url)
num_wgs = len(Group.objects.filter(type="wg"))
@ -488,7 +488,7 @@ class GroupEditTests(TestCase):
make_test_data()
url = urlreverse('group_create', kwargs=dict(group_type="rg"))
url = urlreverse('ietf.group.views_edit.edit', kwargs=dict(group_type="rg", action="charter"))
login_testing_unauthorized(self, "secretary", url)
irtf = Group.objects.get(acronym='irtf')
@ -513,7 +513,7 @@ class GroupEditTests(TestCase):
def test_create_based_on_existing_bof(self):
make_test_data()
url = urlreverse('group_create', kwargs=dict(group_type="wg"))
url = urlreverse('ietf.group.views_edit.edit', kwargs=dict(group_type="wg", action="charter"))
login_testing_unauthorized(self, "secretary", url)
group = Group.objects.get(acronym="mars")
@ -548,7 +548,7 @@ class GroupEditTests(TestCase):
make_test_data()
group = Group.objects.get(acronym="mars")
url = urlreverse('group_edit', kwargs=dict(group_type=group.type_id, acronym=group.acronym))
url = urlreverse('ietf.group.views_edit.edit', kwargs=dict(group_type=group.type_id, acronym=group.acronym, action="edit"))
login_testing_unauthorized(self, "secretary", url)
# normal get
@ -625,7 +625,7 @@ class GroupEditTests(TestCase):
review_req = make_review_data(doc)
group = review_req.team
url = urlreverse('group_edit', kwargs=dict(group_type=group.type_id, acronym=group.acronym))
url = urlreverse('ietf.group.views_edit.edit', kwargs=dict(group_type=group.type_id, acronym=group.acronym, action="edit"))
login_testing_unauthorized(self, "secretary", url)
# normal get

View file

@ -1,20 +1,21 @@
# Copyright The IETF Trust 2007, All Rights Reserved
from django.conf.urls import url, include
from django.conf.urls import include
from django.conf import settings
from ietf.group import views, views_ajax, views_edit
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', views.active_groups),
url(r'^groupmenu.json', views_ajax.group_menu_data, None, "group_menu_data"),
url(r'^%(acronym)s.json$' % settings.URL_REGEXPS, views_ajax.group_json),
url(r'^chartering/$', views.chartering_groups),
url(r'^chartering/create/(?P<group_type>(wg|rg))/$', views_edit.edit, {'action': "charter"}, "group_create"),
url(r'^chartering/create/(?P<group_type>(wg|rg))/$', views_edit.edit, {'action': "charter"}),
url(r'^concluded/$', views.concluded_groups),
url(r'^email-aliases/$', views.email_aliases),
url(r'^all-status/$', views.all_status),
url(r'^%(acronym)s/$' % settings.URL_REGEXPS, views.group_home, None, "group_home"),
url(r'^%(acronym)s/$' % settings.URL_REGEXPS, views.group_home),
url(r'^%(acronym)s/' % settings.URL_REGEXPS, include('ietf.group.urls_info_details')),
]

View file

@ -1,10 +1,11 @@
# Copyright The IETF Trust 2008, All Rights Reserved
from django.conf.urls import url, include
from django.conf.urls import include
from django.views.generic import RedirectView
from django.conf import settings
from ietf.group import views, views_edit
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', views.active_groups),
@ -19,7 +20,7 @@ urlpatterns = [
url(r'^chartering/create/$', RedirectView.as_view(url='/group/chartering/create/%(group_type)s/', permanent=True)),
url(r'^bofs/$', views.bofs),
url(r'^email-aliases/$', views.email_aliases),
url(r'^bofs/create/$', views_edit.edit, {'action': "create", }, "bof_create"),
url(r'^bofs/create/$', views_edit.edit, {'action': "create", }),
url(r'^photos/$', views.chair_photos),
url(r'^%(acronym)s/' % settings.URL_REGEXPS, include('ietf.group.urls_info_details')),
]

View file

@ -1,20 +1,20 @@
from django.conf.urls import url
from django.views.generic import RedirectView
from ietf.community import views as community_views
from ietf.doc import views_material as material_views
from ietf.group import views, views_edit, views_review, milestones as milestone_views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', views.group_home, None, "group_home"),
url(r'^$', views.group_home),
url(r'^documents/txt/$', views.group_documents_txt),
url(r'^documents/$', views.group_documents, None, "group_docs"),
url(r'^documents/$', views.group_documents),
url(r'^documents/manage/$', community_views.manage_list),
url(r'^documents/csv/$', community_views.export_to_csv),
url(r'^documents/feed/$', community_views.feed),
url(r'^documents/subscription/$', community_views.subscription),
url(r'^charter/$', views.group_about, None, 'group_charter'),
url(r'^about/$', views.group_about, None, 'group_about'),
url(r'^charter/$', views.group_about),
url(r'^about/$', views.group_about),
url(r'^about/status/$', views.group_about_status),
url(r'^about/status/edit/$', views.group_about_status_edit),
url(r'^about/status/meeting/(?P<num>\d+)/$', views.group_about_status_meeting),
@ -22,13 +22,13 @@ urlpatterns = [
url(r'^email/$', views.email),
url(r'^deps/(?P<output_type>[\w-]+)/$', views.dependencies),
url(r'^meetings/$', views.meetings),
url(r'^edit/$', views_edit.edit, {'action': "edit"}, "group_edit"),
url(r'^edit/$', views_edit.edit, {'action': "edit"}),
url(r'^conclude/$', views_edit.conclude),
url(r'^milestones/$', milestone_views.edit_milestones, {'milestone_set': "current"}, "group_edit_milestones"),
url(r'^milestones/charter/$', milestone_views.edit_milestones, {'milestone_set': "charter"}, "group_edit_charter_milestones"),
url(r'^milestones/charter/reset/$', milestone_views.reset_charter_milestones, None, "group_reset_charter_milestones"),
url(r'^workflow/$', views_edit.customize_workflow),
url(r'^materials/$', views.materials, None, "group_materials"),
url(r'^materials/$', views.materials),
url(r'^materials/new/$', material_views.choose_material_type),
url(r'^materials/new/(?P<doc_type>[\w-]+)/$', material_views.edit_material, { 'action': "new" }, "group_new_material"),
url(r'^archives/$', views.derived_archives),

View file

@ -1,9 +1,9 @@
# Copyright The IETF Trust 2008, All Rights Reserved
from django.conf.urls import url
from django.conf import settings
import views_stream
from ietf.group import views_stream
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', views_stream.streams),

View file

@ -169,9 +169,9 @@ def construct_group_menu_context(request, group, selected, group_type, others):
if group.features.has_documents:
entries.append(("Documents", urlreverse("ietf.group.views.group_documents", kwargs=kwargs)))
if group.features.has_chartering_process:
entries.append(("Charter", urlreverse("group_charter", kwargs=kwargs)))
entries.append(("Charter", urlreverse("ietf.group.views.group_about", kwargs=kwargs)))
else:
entries.append(("About", urlreverse("group_about", kwargs=kwargs)))
entries.append(("About", urlreverse("ietf.group.views.group_about", kwargs=kwargs)))
if group.features.has_materials and get_group_materials(group).exists():
entries.append(("Materials", urlreverse("ietf.group.views.materials", kwargs=kwargs)))
if group.features.has_reviews:
@ -220,7 +220,7 @@ def construct_group_menu_context(request, group, selected, group_type, others):
if group.state_id != "conclude" and (is_admin or can_manage):
actions.append((u"Edit group", urlreverse("group_edit", kwargs=kwargs)))
actions.append((u"Edit group", urlreverse("ietf.group.views_edit.edit", dict(kwargs, action="edit"))))
if group.features.customize_workflow and (is_admin or can_manage):
actions.append((u"Customize workflow", urlreverse("ietf.group.views_edit.customize_workflow", kwargs=kwargs)))

View file

@ -1,6 +1,6 @@
from django.conf.urls import url
from ietf.help import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^state/(?P<doc>[-\w]+)/(?P<type>[-\w]+)/?$', views.state),

View file

@ -32,11 +32,11 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from django.conf.urls import url
from django.views.generic import RedirectView
from django.conf import settings
from ietf.iesg import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^telechat/.*$', RedirectView.as_view(url='https://www.ietf.org/iesg/minutes.html', permanent=True)),

View file

@ -1,9 +1,9 @@
# Copyright The IETF Trust 2007, 2009, All Rights Reserved
from django.conf.urls import url
from django.contrib.auth.views import login, logout
from ietf.ietfauth import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', views.index),

View file

@ -10,7 +10,7 @@ from ietf.ipr.models import IprDisclosureBase
class LatestIprDisclosuresFeed(Feed):
feed_type = Atom1Feed
title = "IPR Disclosures to the IETF"
link = reverse_lazy('ipr_showlist')
link = reverse_lazy('ietf.ipr.views.showlist')
description = "Updates on new IPR Disclosures made to the IETF."
language = "en"
feed_url = "/feed/ipr/"

View file

@ -29,7 +29,7 @@ class IprDisclosureBase(models.Model):
return self.title
def get_absolute_url(self):
return settings.IDTRACKER_BASE_URL + reverse('ipr_show',kwargs={'id':self.id})
return settings.IDTRACKER_BASE_URL + reverse('ietf.ipr.views.show',kwargs={'id':self.id})
def get_child(self):
"""Returns the child instance"""

View file

@ -108,14 +108,14 @@ class IprTests(TestCase):
def test_showlist(self):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
r = self.client.get(urlreverse("ipr_showlist"))
r = self.client.get(urlreverse("ietf.ipr.views.showlist"))
self.assertEqual(r.status_code, 200)
self.assertTrue(ipr.title in unicontent(r))
def test_show_posted(self):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
r = self.client.get(urlreverse("ipr_show", kwargs=dict(id=ipr.pk)))
r = self.client.get(urlreverse("ietf.ipr.views.show", kwargs=dict(id=ipr.pk)))
self.assertEqual(r.status_code, 200)
self.assertTrue(ipr.title in unicontent(r))
@ -123,28 +123,28 @@ class IprTests(TestCase):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
ipr.set_state('parked')
r = self.client.get(urlreverse("ipr_show", kwargs=dict(id=ipr.pk)))
r = self.client.get(urlreverse("ietf.ipr.views.show", kwargs=dict(id=ipr.pk)))
self.assertEqual(r.status_code, 404)
def test_show_pending(self):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
ipr.set_state('pending')
r = self.client.get(urlreverse("ipr_show", kwargs=dict(id=ipr.pk)))
r = self.client.get(urlreverse("ietf.ipr.views.show", kwargs=dict(id=ipr.pk)))
self.assertEqual(r.status_code, 404)
def test_show_rejected(self):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
ipr.set_state('rejected')
r = self.client.get(urlreverse("ipr_show", kwargs=dict(id=ipr.pk)))
r = self.client.get(urlreverse("ietf.ipr.views.show", kwargs=dict(id=ipr.pk)))
self.assertEqual(r.status_code, 404)
def test_show_removed(self):
make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
ipr.set_state('removed')
r = self.client.get(urlreverse("ipr_show", kwargs=dict(id=ipr.pk)))
r = self.client.get(urlreverse("ietf.ipr.views.show", kwargs=dict(id=ipr.pk)))
self.assertEqual(r.status_code, 200)
self.assertTrue('This IPR disclosure was removed' in unicontent(r))
@ -176,7 +176,7 @@ class IprTests(TestCase):
draft = make_test_data()
ipr = IprDisclosureBase.objects.get(title="Statement regarding rights").get_child()
url = urlreverse("ipr_search")
url = urlreverse("ietf.ipr.views.search")
r = self.client.get(url)
self.assertEqual(r.status_code, 200)

View file

@ -1,20 +1,20 @@
# Copyright The IETF Trust 2007, All Rights Reserved
from django.conf.urls import url
from django.views.generic import RedirectView
from django.core.urlresolvers import reverse_lazy
from ietf.ipr import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', views.showlist, name='ipr_showlist'),
url(r'^$', views.showlist),
url(r'^about/$', views.about),
url(r'^admin/$', RedirectView.as_view(url=reverse_lazy('ipr_admin',kwargs={'state':'pending'}), permanent=True),name="ipr_admin_main"),
url(r'^admin/(?P<state>pending|removed|parked)/$', views.admin, name='ipr_admin'),
url(r'^ajax/search/$', views.ajax_search, name='ipr_ajax_search'),
url(r'^by-draft/$', views.by_draft_txt),
url(r'^by-draft-recursive/$', views.by_draft_recursive_txt),
url(r'^(?P<id>\d+)/$', views.show, name='ipr_show'),
url(r'^(?P<id>\d+)/$', views.show),
url(r'^(?P<id>\d+)/addcomment/$', views.add_comment, name='ipr_add_comment'),
url(r'^(?P<id>\d+)/addemail/$', views.add_email, name='ipr_add_email'),
url(r'^(?P<id>\d+)/edit/$', views.edit, name='ipr_edit'),
@ -23,8 +23,8 @@ urlpatterns = [
url(r'^(?P<id>\d+)/notify/(?P<type>update|posted)/$', views.notify, name='ipr_notify'),
url(r'^(?P<id>\d+)/post/$', views.post, name='ipr_post'),
url(r'^(?P<id>\d+)/state/$', views.state, name='ipr_state'),
url(r'^update/$', RedirectView.as_view(url=reverse_lazy('ipr_showlist'), permanent=True)),
url(r'^update/(?P<id>\d+)/$', views.update, name='ipr_update'),
url(r'^new-(?P<type>(specific|generic|third-party))/$', views.new, name='ipr_new'),
url(r'^search/$', views.search, name="ipr_search"),
url(r'^update/$', RedirectView.as_view(url=reverse_lazy('ietf.ipr.views.showlist'), permanent=True)),
url(r'^update/(?P<id>\d+)/$', views.update),
url(r'^new-(?P<type>(specific|generic|third-party))/$', views.new),
url(r'^search/$', views.search),
]

View file

@ -296,7 +296,7 @@ def edit(request, id, updates=None):
desc="Changed disclosure metadata")
messages.success(request,'Disclosure modified')
return redirect("ipr_show", id=ipr.id)
return redirect("ietf.ipr.views.show", id=ipr.id)
else:
if ipr.updates:
@ -320,7 +320,7 @@ def email(request, id):
if request.method == 'POST':
button_text = request.POST.get('submit', '')
if button_text == 'Cancel':
return redirect("ipr_show", id=ipr.id)
return redirect("ietf.ipr.views.show", id=ipr.id)
form = MessageModelForm(request.POST)
if form.is_valid():
@ -349,7 +349,7 @@ def email(request, id):
send_mail_message(None,msg)
messages.success(request, 'Email sent.')
return redirect('ipr_show', id=ipr.id)
return redirect('ietf.ipr.views.show', id=ipr.id)
else:
reply_to = get_reply_to()
@ -455,7 +455,9 @@ def new(request, type, updates=None):
valid_formsets = True
if form.is_valid() and valid_formsets:
updates = form.cleaned_data.get('updates')
if 'updates' in form.cleaned_data:
updates = form.cleaned_data['updates']
del form.cleaned_data['updates']
disclosure = form.save(commit=False)
disclosure.by = person
disclosure.state = IprDisclosureStateName.objects.get(slug='pending')
@ -528,7 +530,7 @@ def notify(request, id, type):
message = message,
)
messages.success(request,'Notifications sent')
return redirect("ipr_show", id=ipr.id)
return redirect("ietf.ipr.views.show", id=ipr.id)
else:
if type == 'update':
@ -700,7 +702,7 @@ def get_details_tabs(ipr, selected):
return [
t + (t[0].lower() == selected.lower(),)
for t in [
('Disclosure', urlreverse('ipr_show', kwargs={ 'id': ipr.pk })),
('Disclosure', urlreverse('ietf.ipr.views.show', kwargs={ 'id': ipr.pk })),
('History', urlreverse('ipr_history', kwargs={ 'id': ipr.pk }))
]]
@ -770,7 +772,7 @@ def state(request, id):
desc=form.cleaned_data['comment']
)
messages.success(request, 'State Changed')
return redirect("ipr_show", id=ipr.id)
return redirect("ietf.ipr.views.show", id=ipr.id)
else:
form = StateForm(initial={'state':ipr.state.pk,'private':True})

View file

@ -1,9 +1,9 @@
# Copyright The IETF Trust 2007, All Rights Reserved
from django.conf.urls import url
from django.views.generic import RedirectView, TemplateView
from ietf.liaisons import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^help/$', TemplateView.as_view(template_name='liaisons/help.html')),

View file

@ -1,9 +1,9 @@
# Copyright The IETF Trust 2007, All Rights Reserved
from django.conf.urls import url
from django.views.generic import RedirectView
from ietf.mailinglists import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^wg/$', views.groups),

View file

@ -1,12 +1,12 @@
from django.conf.urls import url
from django.views.generic import RedirectView
from django.core.urlresolvers import reverse_lazy
from ietf.mailtrigger import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', RedirectView.as_view(url=reverse_lazy('mailtrigger_show_triggers'), permanent=True)),
url(r'^name/$', views.show_triggers, name='mailtrigger_show_triggers' ),
url(r'^$', RedirectView.as_view(url=reverse_lazy('ietf.mailtrigger.views.show_triggers'), permanent=True)),
url(r'^name/$', views.show_triggers),
url(r'^name/(?P<mailtrigger_slug>[-\w]+)/$', views.show_triggers ),
url(r'^recipient/$', views.show_recipients ),
url(r'^recipient/(?P<recipient_slug>[-\w]+)/$', views.show_recipients ),

View file

@ -5,6 +5,7 @@ import time
from pyquery import PyQuery
from unittest import skipIf
import django.contrib.auth.views
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from django.core.urlresolvers import reverse as urlreverse
#from django.test.utils import override_settings
@ -126,7 +127,7 @@ class SlideReorderTests(StaticLiveServerTestCase):
return '%s%s'%(self.live_server_url,urlreverse(*args,**kwargs))
def secr_login(self):
url = '%s%s'%(self.live_server_url, urlreverse('django.contrib.auth.views.login'))
url = '%s%s'%(self.live_server_url, urlreverse(django.contrib.auth.views.login))
self.driver.get(url)
self.driver.find_element_by_name('username').send_keys('secretary')
self.driver.find_element_by_name('password').send_keys('secretary+password')

View file

@ -1,11 +1,11 @@
# Copyright The IETF Trust 2007, All Rights Reserved
from django.conf.urls import url, include
from django.conf.urls import include
from django.views.generic import RedirectView
from django.conf import settings
from ietf.meeting import views
from ietf.meeting import ajax
from ietf.meeting import views, ajax
from ietf.utils.urls import url
safe_for_all_meeting_types = [
url(r'^session/(?P<acronym>[-a-z0-9]+)/?$', views.session_details),
@ -38,8 +38,8 @@ type_ietf_only_patterns = [
url(r'^agenda/by-type$', views.agenda_by_type),
url(r'^agenda/by-type/(?P<type>[a-z]+)$', views.agenda_by_type),
url(r'^agenda/by-type/(?P<type>[a-z]+)/ics$', views.agenda_by_type_ics),
url(r'^agendas/list$', views.list_agendas, name='meeting_list_agendas'),
url(r'^agendas/edit$', RedirectView.as_view(pattern_name='meeting_list_agendas', permanent=True)),
url(r'^agendas/list$', views.list_agendas),
url(r'^agendas/edit$', RedirectView.as_view(pattern_name='ietf.meeting.views.list_agendas', permanent=True)),
url(r'^timeslots/edit$', views.edit_timeslots),
url(r'^rooms$', ajax.timeslot_roomsurl),
url(r'^room/(?P<roomid>\d+).json$', ajax.timeslot_roomurl),

View file

@ -1757,11 +1757,11 @@ def interim_request(request):
meeting = form.save(date=get_earliest_session_date(formset))
# need to use curry here to pass custom variable to form init
SessionFormset.form = staticmethod(curry(
InterimSessionModelForm,
SessionFormset.form.__init__ = curry(
InterimSessionModelForm.__init__,
user=request.user,
group=group,
is_approved_or_virtual=(is_approved or is_virtual)))
is_approved_or_virtual=(is_approved or is_virtual))
formset = SessionFormset(instance=meeting, data=request.POST)
formset.is_valid()
formset.save()
@ -1777,11 +1777,11 @@ def interim_request(request):
# subsequently dealt with individually
elif meeting_type == 'series':
series = []
SessionFormset.form = staticmethod(curry(
InterimSessionModelForm,
SessionFormset.form.__init__ = curry(
InterimSessionModelForm.__init__,
user=request.user,
group=group,
is_approved_or_virtual=(is_approved or is_virtual)))
is_approved_or_virtual=(is_approved or is_virtual))
formset = SessionFormset(instance=Meeting(), data=request.POST)
formset.is_valid() # re-validate
for session_form in formset.forms:
@ -1896,13 +1896,15 @@ def interim_request_edit(request, number):
data=request.POST)
group = Group.objects.get(pk=form.data['group'])
is_approved = is_meeting_approved(meeting)
SessionFormset.form = staticmethod(curry(
InterimSessionModelForm,
SessionFormset.form.__init__ = curry(
InterimSessionModelForm.__init__,
user=request.user,
group=group,
is_approved_or_virtual=is_approved))
formset = SessionFormset(instance=meeting,
data=request.POST)
is_approved_or_virtual=is_approved)
formset = SessionFormset(instance=meeting, data=request.POST)
if form.is_valid() and formset.is_valid():
meeting = form.save(date=get_earliest_session_date(formset))
formset.save()

View file

@ -26,7 +26,7 @@ class MessageTests(TestCase):
)
msg.related_groups.add(nomcom)
r = self.client.get(urlreverse("nomcom_announcement", kwargs=dict(message_id=msg.id)))
r = self.client.get(urlreverse("ietf.message.views.message", kwargs=dict(message_id=msg.id)))
self.assertEqual(r.status_code, 200)
self.assertTrue(msg.subject in unicontent(r))
self.assertTrue(msg.to in unicontent(r))

View file

@ -9,6 +9,7 @@ import re
import smtplib
import unicodedata
# old-style middleware
class SQLLogMiddleware(object):
def process_response(self, request, response):
for q in connection.queries:
@ -16,6 +17,15 @@ class SQLLogMiddleware(object):
log(q['sql'])
return response
# new-style middleware
def sql_log_middleware_factory(get_response):
def sql_log_middleware(request):
response = get_response(request)
for q in connection.queries:
if re.match('(update|insert)', q['sql'], re.IGNORECASE):
log(q['sql'])
return response
class SMTPExceptionMiddleware(object):
def process_exception(self, request, exception):
if isinstance(exception, smtplib.SMTPException):
@ -24,6 +34,11 @@ class SMTPExceptionMiddleware(object):
{'exception': extype, 'args': value, 'traceback': "".join(tb)} )
return None
def smtp_exception_middleware_factory(get_response):
def smtp_exception_middleware(request):
response = get_response(request)
return response
class RedirectTrailingPeriod(object):
def process_response(self, request, response):
if response.status_code == 404 and request.path.endswith("."):

View file

@ -1,3 +1,5 @@
import functools
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from django.utils.http import urlquote
@ -12,4 +14,4 @@ def nomcom_private_key_required(view_func):
return HttpResponseRedirect('%s?back_to=%s' % (reverse('nomcom_private_key', None, args=(year, )), urlquote(request.get_full_path())))
else:
return view_func(request, *args, **kwargs)
return inner
return functools.update_wrapper(inner, view_func)

View file

@ -1,6 +1,7 @@
from django.conf.urls import url
from django.views.generic import RedirectView
from ietf.utils.urls import url
urlpatterns = [
url(r'^nomcom/$', RedirectView.as_view(url="/nomcom/ann/", permanent=True)),
url(r'^nomcom/(?P<message_id>\d+)/$', RedirectView.as_view(url="/nomcom/ann/%(message_id)s/", permanent=True)),

View file

@ -76,7 +76,7 @@ class NomcomViewsTest(TestCase):
self.year = NOMCOM_YEAR
# private urls
self.private_index_url = reverse('nomcom_private_index', kwargs={'year': self.year})
self.private_index_url = reverse('ietf.nomcom.views.private_index', kwargs={'year': self.year})
self.private_merge_person_url = reverse('ietf.nomcom.views.private_merge_person', kwargs={'year': self.year})
self.private_merge_nominee_url = reverse('ietf.nomcom.views.private_merge_nominee', kwargs={'year': self.year})
self.edit_members_url = reverse('nomcom_edit_members', kwargs={'year': self.year})
@ -1131,7 +1131,7 @@ class InactiveNomcomTests(TestCase):
self.assertEqual(response.status_code, 403)
def test_cannot_modify_nominees(self):
url = reverse('nomcom_private_index', kwargs={'year':self.nc.year()})
url = reverse('ietf.nomcom.views.private_index', kwargs={'year':self.nc.year()})
login_testing_unauthorized(self, self.chair.user.username, url)
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
@ -1287,7 +1287,7 @@ class FeedbackLastSeenTests(TestCase):
self.assertEqual( len(q('.label-success')), 0 )
def test_feedback_nominee_badges(self):
url = reverse('nomcom_view_feedback_nominee',kwargs={'year':self.nc.year(),'nominee_id':self.nominee.id})
url = reverse('ietf.nomcom.views.view_feedback_nominee', kwargs={'year':self.nc.year(), 'nominee_id':self.nominee.id})
login_testing_unauthorized(self, self.member.user.username, url)
provide_private_key_to_test_client(self)
response = self.client.get(url)
@ -1679,7 +1679,7 @@ Junk body for testing
self.assertEqual(response.status_code, 404)
def test_edit_nominee(self):
nominee = self.nc.nominee_set.first()
nominee = self.nc.nominee_set.order_by('pk').first()
new_email = EmailFactory(person=nominee.person)
url = reverse('nomcom_edit_nominee',kwargs={'year':self.nc.year(),'nominee_id':nominee.id})
login_testing_unauthorized(self,self.chair.user.username,url)
@ -1687,7 +1687,7 @@ Junk body for testing
self.assertEqual(response.status_code, 200)
response = self.client.post(url,{'nominee_email':new_email.address})
self.assertEqual(response.status_code, 302)
nominee = self.nc.nominee_set.first()
nominee = self.nc.nominee_set.order_by('pk').first()
self.assertEqual(nominee.email,new_email)
def test_request_merge(self):

View file

@ -1,13 +1,13 @@
from django.conf.urls import url
from ietf.nomcom.forms import EditMembersForm, EditMembersFormPreview
from ietf.nomcom import views
from ietf.message import views as message_views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', views.index),
url(r'^ann/$', views.announcements),
url(r'^(?P<year>\d{4})/private/$', views.private_index, name='nomcom_private_index'),
url(r'^(?P<year>\d{4})/private/$', views.private_index),
url(r'^(?P<year>\d{4})/private/key/$', views.private_key, name='nomcom_private_key'),
url(r'^(?P<year>\d{4})/private/help/$', views.configuration_help, name='nomcom_chair_help'),
url(r'^(?P<year>\d{4})/private/nominate/$', views.private_nominate, name='nomcom_private_nominate'),
@ -18,7 +18,7 @@ urlpatterns = [
url(r'^(?P<year>\d{4})/private/view-feedback/$', views.view_feedback, name='nomcom_view_feedback'),
url(r'^(?P<year>\d{4})/private/view-feedback/unrelated/$', views.view_feedback_unrelated, name='nomcom_view_feedback_unrelated'),
url(r'^(?P<year>\d{4})/private/view-feedback/pending/$', views.view_feedback_pending, name='nomcom_view_feedback_pending'),
url(r'^(?P<year>\d{4})/private/view-feedback/nominee/(?P<nominee_id>\d+)$', views.view_feedback_nominee, name='nomcom_view_feedback_nominee'),
url(r'^(?P<year>\d{4})/private/view-feedback/nominee/(?P<nominee_id>\d+)$', views.view_feedback_nominee),
url(r'^(?P<year>\d{4})/private/edit/nominee/(?P<nominee_id>\d+)$', views.edit_nominee, name='nomcom_edit_nominee'),
url(r'^(?P<year>\d{4})/private/merge-nominee/?$', views.private_merge_nominee),
url(r'^(?P<year>\d{4})/private/merge-person/?$', views.private_merge_person),
@ -42,5 +42,5 @@ urlpatterns = [
url(r'^(?P<year>\d{4})/nominate/newperson$', views.public_nominate_newperson, name='nomcom_public_nominate_newperson'),
url(r'^(?P<year>\d{4})/process-nomination-status/(?P<nominee_position_id>\d+)/(?P<state>[\w]+)/(?P<date>[\d]+)/(?P<hash>[a-f0-9]+)/$', views.process_nomination_status, name='nomcom_process_nomination_status'),
# use the generic view from message
url(r'^ann/(?P<message_id>\d+)/$', message_views.message, {'group_type': "nomcom" }, "nomcom_announcement"),
url(r'^ann/(?P<message_id>\d+)/$', message_views.message, {'group_type': "nomcom" }),
]

View file

@ -113,7 +113,7 @@ def private_key(request, year):
else:
messages.warning(request, "You don't have a private decryption key set for this session yet")
back_url = request.GET.get('back_to', reverse('nomcom_private_index', None, args=(year, )))
back_url = request.GET.get('back_to', reverse('ietf.nomcom.views.private_index', None, args=(year, )))
if request.method == 'POST':
form = PrivateKeyForm(data=request.POST)
if form.is_valid():
@ -276,7 +276,7 @@ def private_merge_person(request, year):
if form.is_valid():
form.save()
messages.success(request, 'A merge request has been sent to the secretariat.')
return redirect('nomcom_private_index',year=year)
return redirect('ietf.nomcom.views.private_index',year=year)
else:
form = MergePersonForm(nomcom=nomcom)
@ -301,7 +301,7 @@ def private_merge_nominee(request, year):
if form.is_valid():
form.save()
messages.success(request, 'The Nominee records have been joined.')
return redirect('nomcom_private_index',year=year)
return redirect('ietf.nomcom.views.private_index',year=year)
else:
form = MergeNomineeForm(nomcom=nomcom)
@ -811,7 +811,7 @@ def edit_nominee(request, year, nominee_id):
if form.is_valid():
form.save()
messages.success(request, 'The nomination address for %s has been changed to %s'%(nominee.name(),nominee.email.address))
return redirect('nomcom_private_index', year=year)
return redirect('ietf.nomcom.views.private_index', year=year)
else:
form = EditNomineeForm(instance=nominee)

View file

@ -85,7 +85,7 @@ class SearchablePersonsField(forms.CharField):
# doing this in the constructor is difficult because the URL
# patterns may not have been fully constructed there yet
self.widget.attrs["data-ajax-url"] = urlreverse("ajax_select2_search_person_email", kwargs={ "model_name": self.model.__name__.lower() })
self.widget.attrs["data-ajax-url"] = urlreverse("ietf.person.views.ajax_select2_search", kwargs={ "model_name": self.model.__name__.lower() })
query_args = {}
if self.only_users:
query_args["user"] = "1"

View file

@ -1,8 +1,8 @@
from django.conf.urls import url
from ietf.person import views, ajax
from ietf.utils.urls import url
urlpatterns = [
url(r'^search/(?P<model_name>(person|email))/$', views.ajax_select2_search, None, 'ajax_select2_search_person_email'),
url(r'^search/(?P<model_name>(person|email))/$', views.ajax_select2_search),
url(r'^(?P<personid>[a-z0-9]+).json$', ajax.person_json),
url(ur'^(?P<email_or_name>[-\w\s\']+)', views.profile),
]

View file

@ -1,8 +1,8 @@
# Copyright The IETF Trust 2007, All Rights Reserved
from django.conf.urls import url
from ietf.redirects import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^(?P<script>.*?\.cgi)(/.*)?$', views.redirect),

View file

@ -1,7 +1,7 @@
from django.conf.urls import url
from django.views.generic import TemplateView
from ietf.release import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', views.release),

View file

@ -1,6 +1,6 @@
from django.conf.urls import url
from ietf.secr.announcement import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', views.main, name='announcement'),

View file

@ -1,6 +1,6 @@
from django.conf.urls import url
from ietf.secr.areas import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', views.list_areas, name='areas'),

View file

@ -1,6 +1,6 @@
from django.conf.urls import url
from ietf.secr.console import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', views.main, name='console'),

View file

@ -1,6 +1,6 @@
from django.conf.urls import url
from ietf.secr.drafts import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', views.search, name='drafts'),

View file

@ -1,7 +1,7 @@
from django.conf.urls import url
from django.conf import settings
from ietf.secr.groups import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', views.search, name='groups'),

View file

@ -1,6 +1,6 @@
from django.conf.urls import url
from ietf.secr.meetings import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', views.main, name='meetings'),
@ -20,7 +20,7 @@ urlpatterns = [
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/select/$', views.select_group, name='meetings_select_group'),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/times/$', views.times, name='meetings_times'),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/times/delete/(?P<time>[0-9\:]+)/$', views.times_delete, name='meetings_times_delete'),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/times/edit/(?P<time>[0-9\:]+)/$', views.times_edit, name='meetings_times_edit'),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/times/edit/(?P<time>[0-9\:]+)/$', views.times_edit),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/unschedule/(?P<session_id>\d{1,6})/$', views.unschedule, name='meetings_unschedule'),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/(?P<acronym>[-a-z0-9]+)/schedule/$', views.schedule, name='meetings_schedule'),
url(r'^(?P<meeting_id>\d{1,6})/(?P<acronym>[-a-z0-9]+)/remove/$', views.remove_session, name='meetings_remove_session'),

View file

@ -1,6 +1,6 @@
from django.conf.urls import url
from django.conf import settings
from ietf.meeting.views import OldUploadRedirect
from ietf.utils.urls import url
from ietf.secr.proceedings import views

View file

@ -1,7 +1,7 @@
from django.conf.urls import url
from django.conf import settings
from ietf.secr.roles import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', views.main, name='roles'),

View file

@ -1,6 +1,6 @@
from django.conf.urls import url
from ietf.secr.rolodex import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', views.search, name='rolodex'),

View file

@ -45,7 +45,7 @@ class SubmitRequestCase(TestCase):
def test_submit_request(self):
make_test_data()
group = Group.objects.get(acronym='mars')
url = reverse('sessions_new',kwargs={'acronym':group.acronym})
url = reverse('ietf.secr.sreq.views.new',kwargs={'acronym':group.acronym})
post_data = {'num_session':'1',
'length_session1':'3600',
'attendees':'10',
@ -58,7 +58,7 @@ class SubmitRequestCase(TestCase):
def test_submit_request_invalid(self):
make_test_data()
group = Group.objects.get(acronym='mars')
url = reverse('sessions_new',kwargs={'acronym':group.acronym})
url = reverse('ietf.secr.sreq.views.new',kwargs={'acronym':group.acronym})
post_data = {'num_session':'2',
'length_session1':'3600',
'attendees':'10',
@ -134,7 +134,7 @@ class LockAppTestCase(TestCase):
meeting.session_request_lock_message='locked'
meeting.save()
group = Group.objects.get(acronym='mars')
url = reverse('sessions_new',kwargs={'acronym':group.acronym})
url = reverse('ietf.secr.sreq.views.new',kwargs={'acronym':group.acronym})
# try as WG Chair
self.client.login(username="marschairman", password="marschairman+password")

View file

@ -1,7 +1,7 @@
from django.conf.urls import url
from django.conf import settings
from ietf.secr.sreq import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', views.main, name='sessions'),
@ -12,7 +12,7 @@ urlpatterns = [
url(r'^%(acronym)s/cancel/$' % settings.URL_REGEXPS, views.cancel, name='sessions_cancel'),
url(r'^%(acronym)s/confirm/$' % settings.URL_REGEXPS, views.confirm, name='sessions_confirm'),
url(r'^%(acronym)s/edit/$' % settings.URL_REGEXPS, views.edit, name='sessions_edit'),
url(r'^%(acronym)s/new/$' % settings.URL_REGEXPS, views.new, name='sessions_new'),
url(r'^%(acronym)s/new/$' % settings.URL_REGEXPS, views.new),
url(r'^%(acronym)s/no_session/$' % settings.URL_REGEXPS, views.no_session, name='sessions_no_session'),
url(r'^(?P<num>[A-Za-z0-9_\-\+]+)/%(acronym)s/edit/$' % settings.URL_REGEXPS, views.edit_mtg, name='sessions_edit'),
]

View file

@ -457,7 +457,7 @@ def edit_mtg(request, num, acronym):
else:
if not sessions:
return redirect('sessions_new', acronym=acronym)
return redirect('ietf.secr.sreq.views.new', acronym=acronym)
form = SessionForm(initial=initial)
return render(request, 'sreq/edit.html', {
@ -493,7 +493,7 @@ def main(request):
if button_text == 'Group will not meet':
return redirect('sessions_no_session', acronym=request.POST['group'])
else:
return redirect('sessions_new', acronym=request.POST['group'])
return redirect('ietf.secr.sreq.views.new', acronym=request.POST['group'])
meeting = get_meeting()
scheduled_groups,unscheduled_groups = groups_by_session(request.user, meeting, types=['wg','rg','ag'])
@ -568,7 +568,7 @@ def new(request, acronym):
previous_sessions = Session.objects.filter(meeting=previous_meeting,group=group).exclude(status__in=('notmeet','deleted')).order_by('id')
if not previous_sessions:
messages.warning(request, 'This group did not meet at %s' % previous_meeting)
return redirect('sessions_new', acronym=acronym)
return redirect('ietf.secr.sreq.views.new', acronym=acronym)
initial = get_initial_session(previous_sessions)
add_essential_people(group,initial)
@ -696,7 +696,7 @@ def view(request, acronym, num = None):
if is_locked:
return redirect('sessions')
else:
return redirect('sessions_new', acronym=acronym)
return redirect('ietf.secr.sreq.views.new', acronym=acronym)
# TODO simulate activity records
activities = [{'act_date':sessions[0].requested.strftime('%b %d, %Y'),

View file

@ -1,6 +1,6 @@
from django.conf.urls import url
from ietf.secr.telechat import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', views.main, name='telechat'),

View file

@ -22,7 +22,7 @@
<td>{{ item.time|date:"D" }}</td>
<td>{{ item.time|date:"H:i" }} - {{ item.end_time|date:"H:i" }}</td>
<td>{{ item.name }}</td>
<td><a href="{% url "meetings_times_edit" meeting_id=meeting.number schedule_name=schedule.name time=item.time|date:"Y:m:d:H:i" %}">Edit</a></td>
<td><a href="{% url "ietf.secr.meetings.views.times_edit" meeting_id=meeting.number schedule_name=schedule.name time=item.time|date:"Y:m:d:H:i" %}">Edit</a></td>
<td><a href="{% url "meetings_times_delete" meeting_id=meeting.number schedule_name=schedule.name time=item.time|date:"Y:m:d:H:i" %}" onclick="return window.confirm('Are you sure you want to delete this timeslot? Any sessions assigned to this timeslot will be unscheduled.');">Delete</a></td>
</tr>
{% endfor %}

View file

@ -34,7 +34,7 @@
<ul>
{% for group in unscheduled_groups %}
<li>
<a href="{% url "sessions_new" acronym=group.acronym %}">{{ group.acronym }}</a>
<a href="{% url "ietf.secr.sreq.views.new" acronym=group.acronym %}">{{ group.acronym }}</a>
{% if group.not_meeting %}
<span class="required"> (Currently, this group does not plan to hold a session at IETF {{ meeting.number }})</span>
{% endif %}

View file

@ -30,7 +30,7 @@
<br>
<ul class="session-buttons">
<li><button onclick="if (window.confirm('A message will be sent to agenda@ietf.com as well as to the area director(s).\n\nContinue?')) { window.location='{% url "sessions_no_session" acronym=group.acronym %}'};">Send a notification that the group does not plan to hold a session at IETF {{ meeting.number }}</button></li>
<li><button onclick="window.location='{% url "sessions_new" acronym=group.acronym %}?previous'">Retrieve all information from previous meeting</button></li>
<li><button onclick="window.location='{% url "ietf.secr.sreq.views.new" acronym=group.acronym %}?previous'">Retrieve all information from previous meeting</button></li>
</ul>
{% include "includes/sessions_request_form.html" %}

View file

@ -1,6 +1,6 @@
from django.conf.urls import url
from ietf.submit import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', views.upload_submission),

View file

@ -1,6 +1,6 @@
from django.conf.urls import url
from ietf.sync import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^discrepancies/$', views.discrepancies),

View file

@ -57,7 +57,7 @@
<li><a href="{% url "ietf.submit.views.approvals" %}">Approve a draft</a></li>
{% for g in user|managed_groups %}
<li><a href="{% url "group_docs" g.acronym %}">{{ g.acronym }} {{ g.type.slug }} docs</a></li>
<li><a href="{% url "ietf.group.views.group_documents" g.acronym %}">{{ g.acronym }} {{ g.type.slug }} docs</a></li>
{% endfor %}
{% for g in user|managed_groups %}
<li><a href="{% url "ietf.group.views.meetings" g.acronym %}">{{ g.acronym }} {{ g.type.slug }} meetings</a></li>

View file

@ -91,7 +91,7 @@
{% if group.charter %}
<a class="btn btn-default pull-right" href="{% url "doc_view" name=name %}">Back</a>
{% else %}
<a class="btn btn-default pull-right" href="{% url "group_charter" group_type=group.type_id acronym=group.acronym %}">Back</a>
<a class="btn btn-default pull-right" href="{% url "ietf.group.views.group_about" group_type=group.type_id acronym=group.acronym %}">Back</a>
{% endif %}
{% endbuttons %}
</form>

View file

@ -21,7 +21,7 @@
<li class="disabled"><span><b>Ballots</b></span></li>
{% for b in all_ballots %}
<li {% if b == ballot %}class="active"{% endif %}>
<a href="{% url "doc_ballot" name=doc.name ballot_id=b.pk %}">
<a href="{% url "ietf.doc.views_doc.document_ballot" name=doc.name ballot_id=b.pk %}">
{{ b.ballot_type.name }} ({{ b.rev }})
</a>
</li>

View file

@ -512,7 +512,7 @@
<div class="buttonlist">
<a class="btn btn-default btn-xs" href="mailto:{{ doc.name }}@ietf.org?subject=Mail%20regarding%20{{ doc.name }}"><span class="fa fa-envelope-o"></span> Email authors</a>
<a class="btn btn-default btn-xs" href="{% url "ipr_search" %}?submit=draft&amp;id={{ doc.name }}" rel="nofollow"><span class="fa fa-bolt"></span> IPR {% if doc.related_ipr %} <span class="badge">{{doc.related_ipr|length}}</span>{% endif %}</a>
<a class="btn btn-default btn-xs" href="{% url "ietf.ipr.views.search" %}?submit=draft&amp;id={{ doc.name }}" rel="nofollow"><span class="fa fa-bolt"></span> IPR {% if doc.related_ipr %} <span class="badge">{{doc.related_ipr|length}}</span>{% endif %}</a>
<a class="btn btn-default btn-xs" href="{% url "doc_references" doc.canonical_name %}" rel="nofollow"><span class="fa fa-long-arrow-left"></span> References</a>
<a class="btn btn-default btn-xs" href="{% url "doc_referenced_by" doc.canonical_name %}" rel="nofollow"><span class="fa fa-long-arrow-right"></span> Referenced by</a>
<a class="btn btn-default btn-xs" href="https://www.ietf.org/tools/idnits?url=https://www.ietf.org/archive/id/{{ doc.filename_with_rev }}" rel="nofollow" target="_blank"><span class="fa fa-exclamation"></span> Nits</a>

View file

@ -76,7 +76,7 @@
<th><a href="{% url "state_help" type="status-change" %}">State</a></th>
<td class="edit">
{% if not snapshot and user|has_role:"Area Director,Secretariat" %}
<a class="btn btn-default btn-xs pull-right" href="{% url "status_change_change_state" name=doc.name %}">Edit</a>
<a class="btn btn-default btn-xs pull-right" href="{% url "ietf.doc.views_status_change.change_state" name=doc.name %}">Edit</a>
{% endif %}
</td>
<td>

View file

@ -14,7 +14,7 @@
{% if action == "new" %}
<p class="help-block">
Below you can upload a document for the group {{ group.name }}
<a href="{% url "group_materials" acronym=group.acronym %}">({{ group.acronym }})</a>.
<a href="{% url "ietf.group.views.materials" acronym=group.acronym %}">({{ group.acronym }})</a>.
The document will appear under the materials tab in the group pages.
</p>
@ -22,7 +22,7 @@
{% elif action == "revise" %}
<p>
Below you can upload a new revision of {{ doc_name }} for the group {{ group.name }}
<a href="{% url "group_materials" acronym=group.acronym %}">({{ group.acronym }})</a>.
<a href="{% url "ietf.group.views.materials" acronym=group.acronym %}">({{ group.acronym }})</a>.
</p>
<h2>Upload New Revision</h2>
@ -34,7 +34,7 @@
{% bootstrap_form form %}
{% buttons %}
<a class="btn btn-default pull-right" href="{% if doc_name %}{% url "doc_view" name=doc_name %}{% else %}{% url "group_materials" acronym=group.acronym %}{% endif %}">Back</a>
<a class="btn btn-default pull-right" href="{% if doc_name %}{% url "doc_view" name=doc_name %}{% else %}{% url "ietf.group.views.materials" acronym=group.acronym %}{% endif %}">Back</a>
<button class="btn btn-primary" type="submit">{% if action == "new" or action == "revise" %}Upload{% else %}Save{% endif %}</button>
{% endbuttons %}
</form>

View file

@ -84,7 +84,7 @@
<td class="ipr text-center">
{% if doc.related_ipr %}
<a href="{% url "ipr_search" %}?submit=draft&amp;id={{ doc.name }}">
<a href="{% url "ietf.ipr.views.search" %}?submit=draft&amp;id={{ doc.name }}">
<span class="label label-default">{{ doc.related_ipr|length }}</span>
</a>
{% endif %}

View file

@ -20,6 +20,6 @@ The affected document{{ urls|pluralize }} can be obtained via
{% for u in urls %}{{ settings.IDTRACKER_BASE_URL}}{{ u }}
{% endfor %}
IESG discussion of this request can be tracked via
{{ settings.IDTRACKER_BASE_URL }}{% url "doc_ballot" name=doc %}
{{ settings.IDTRACKER_BASE_URL }}{% url "ietf.doc.views_doc.document_ballot" name=doc %}
{% endautoescape %}

View file

@ -17,7 +17,7 @@
<p>Groups in the <i>BOF</i> state.</p>
{% if user|has_role:"Area Director,Secretariat" %}
<p><a class="btn btn-default" role="button" href="{% url "bof_create" group_type="wg" %}">Create new BOF</a></p>
<p><a class="btn btn-default" role="button" href="{% url 'ietf.group.views_edit.edit' group_type='wg' action='create' %}">Create new BOF</a></p>
{% endif %}
{% if not groups %}

View file

@ -28,7 +28,7 @@
<h2>{{ t.name }}s</h2>
{% if t.can_manage %}
<p><a class="btn btn-default" role="button" href="{% url "group_create" group_type=t.pk %}">Charter new {{ t.name }}</a></p>
<p><a class="btn btn-default" role="button" href="{% url 'ietf.group.views_edit.edit' group_type=t.pk action='charter' %}">Charter new {{ t.name }}</a></p>
{% endif %}
{% if not t.chartering_groups %}

View file

@ -17,7 +17,7 @@
{% buttons %}
<button type="submit" class="btn btn-primary">Save</button>
<a class="btn btn-default pull-right" href="{% url "ipr_show" id=ipr.id %}">Back</a>
<a class="btn btn-default pull-right" href="{% url "ietf.ipr.views.show" id=ipr.id %}">Back</a>
{% endbuttons %}
</form>
{% endblock %}

View file

@ -4,6 +4,7 @@
{% load staticfiles %}
{% load ietf_filters %}
{% load textfilters %}
{% load htmlfilters %}
{% block title %}
IETF {{ schedule.meeting.number }} meeting agenda
@ -255,7 +256,7 @@
<td>
{% if item.session.historic_group.charter %}
<a href="{% url 'group_charter' acronym=item.session.historic_group.acronym %}">{{item.session.historic_group.acronym}}</a>
<a href="{% url 'ietf.group.views.group_about' acronym=item.session.historic_group.acronym %}">{{item.session.historic_group.acronym}}</a>
{% else %}
{{item.session.historic_group.acronym}}
{% endif %}

View file

@ -45,7 +45,7 @@
{% for m in regime.announcements|dictsortreversed:"time" %}
<tr>
<td class="text-nowrap">{{ m.time|date:"Y-m-d" }}</td>
<td><a href="{% url "nomcom_announcement" message_id=m.id %}">{{ m.subject }}</a></td>
<td><a href="{% url "ietf.message.views.message" message_id=m.id %}">{{ m.subject }}</a></td>
<td>{{ m.to_name }}</td>
</tr>
{% endfor %}

View file

@ -16,7 +16,7 @@
{% bootstrap_form form %}
{% buttons %}
<input class="btn btn-primary" type="submit" value="Save">
<a class="btn btn-default pull-right" href="{% url "nomcom_private_index" year %}">Back</a>
<a class="btn btn-default pull-right" href="{% url "ietf.nomcom.views.private_index" year %}">Back</a>
{% endbuttons %}
</form>

View file

@ -12,7 +12,7 @@
<h1>NomCom {{ year }} {% if nomcom.group.state_id == 'conclude' %}(Concluded){% endif %} <small>Private area {% if is_chair_task %}- Chair/Advisors only{% endif %}</small></h1>
<ul class="nav nav-tabs" role="tablist">
<li {% if selected == "index" %}class="active"{% endif %}><a href="{% url "nomcom_private_index" year %}">Nominees</a></li>
<li {% if selected == "index" %}class="active"{% endif %}><a href="{% url "ietf.nomcom.views.private_index" year %}">Nominees</a></li>
{% if nomcom|has_publickey %}
<li {% if selected == "nominate" %}class="active"{% endif %}><a href="{% url "nomcom_private_nominate" year %}">Nominate</a></li>

View file

@ -89,7 +89,7 @@
{% endif %}
<td>
<a href="{% url "ietf.nomcom.views.view_feedback_nominee" year=year nominee_id=np.nominee.id %}#comment">{{ np.nominee }}</a>
<a href="{% url 'ietf.nomcom.views.view_feedback_nominee' year=year nominee_id=np.nominee.id %}#comment">{{ np.nominee }}</a>
</td>
<td>{{ np.position.name }}</td>
<td>{{ np.state }}</td>

View file

@ -36,7 +36,7 @@
{% for fb_dict in staterank.list %}
<tr>
<td>
<a href="{% url "nomcom_view_feedback_nominee" year fb_dict.nominee.id %}">{{ fb_dict.nominee.name }}</a>
<a href="{% url 'ietf.nomcom.views.view_feedback_nominee' year=year nominee_id=fb_dict.nominee.id %}">{{ fb_dict.nominee.name }}</a>
<span class="hidden-xs">&lt;{{fb_dict.nominee.email.address}}&gt;</span>
</td>
{% for fbtype_name, fbtype_count, fbtype_newflag in fb_dict.feedback %}

View file

@ -2,9 +2,12 @@
"""Utilities for working with HTML."""
import html5lib
import bleach
from html5lib import sanitizer, serializer, tokenizer, treebuilders, treewalkers
class HTMLSanitizerMixin(sanitizer.HTMLSanitizerMixin):
from django.utils.functional import allow_lazy
from django.utils import six
acceptable_elements = ('a', 'abbr', 'acronym', 'address', 'b', 'big',
'blockquote', 'br', 'caption', 'center', 'cite', 'code', 'col',
'colgroup', 'dd', 'del', 'dfn', 'dir', 'div', 'dl', 'dt', 'em', 'font',
@ -21,6 +24,8 @@ class HTMLSanitizerMixin(sanitizer.HTMLSanitizerMixin):
'span', 'src', 'start', 'summary', 'title', 'type', 'valign', 'vspace',
'width')
class HTMLSanitizerMixin(sanitizer.HTMLSanitizerMixin):
allowed_elements = acceptable_elements
allowed_attributes = acceptable_attributes
allowed_css_properties = ()
@ -48,3 +53,13 @@ def sanitize_html(html):
quote_attr_values=True)
output_generator = s.serialize(stream)
return u''.join(output_generator)
def remove_tags(html, tags):
"""Returns the given HTML sanitized, and with the given tags removed."""
allowed = set(acceptable_elements) - set([ t.lower() for t in tags ])
return bleach.clean(html, tags=allowed)
remove_tags = allow_lazy(remove_tags, six.text_type)
def clean_html(html):
return bleach.clean(html)

View file

@ -40,6 +40,7 @@ class Command(BaseCommand):
return parser
def add_arguments(self, parser):
parser.add_argument('filenames', nargs="*")
parser.add_argument('--sections', default='template,url,code', dest='sections',
help='Specify which kinds of coverage changes to show. Default: %(default)s\n')
parser.add_argument('--release', dest='release',
@ -172,7 +173,8 @@ class Command(BaseCommand):
header_written = True
self.stdout.write(self.list_line_format % (key, lval))
def handle(self, *filenames, **options):
def handle(self, *args, **options):
sections = options.get('sections', ','.join(self.valid_sections))
options.pop('sections')
sections = sections.split(',')
@ -183,6 +185,8 @@ class Command(BaseCommand):
absolute = options.get('absolute', False)
filenames = options.get('filenames')
if absolute:
if not filenames:
filenames = [

View file

@ -76,13 +76,16 @@ template_coverage_collection = None
url_coverage_collection = None
def safe_create_1(self, verbosity, *args, **kwargs):
def safe_create_test_db(self, verbosity, *args, **kwargs):
global test_database_name, old_create
keepdb = kwargs.get('keepdb', False)
if not keepdb:
print " Creating test database..."
if settings.DATABASES["default"]["ENGINE"] == 'django.db.backends.mysql':
settings.DATABASES["default"]["OPTIONS"] = settings.DATABASE_TEST_OPTIONS
print " Using OPTIONS: %s" % settings.DATABASES["default"]["OPTIONS"]
test_database_name = old_create(self, 0, *args, **kwargs)
if settings.GLOBAL_TEST_FIXTURES:
print " Loading global test fixtures: %s" % ", ".join(settings.GLOBAL_TEST_FIXTURES)
loadable = [f for f in settings.GLOBAL_TEST_FIXTURES if "." not in f]
@ -92,14 +95,17 @@ def safe_create_1(self, verbosity, *args, **kwargs):
if f not in loadable:
# try to execute the fixture
components = f.split(".")
module = importlib.import_module(".".join(components[:-1]))
module_name = ".".join(components[:-1])
module = importlib.import_module(module_name)
fn = getattr(module, components[-1])
fn()
return test_database_name
def safe_destroy_0_1(*args, **kwargs):
def safe_destroy_test_db(*args, **kwargs):
global test_database_name, old_destroy
keepdb = kwargs.get('keepdb', False)
if not keepdb:
print " Checking that it's safe to destroy test database..."
if settings.DATABASES["default"]["NAME"] != test_database_name:
print ' NOT SAFE; Changing settings.DATABASES["default"]["NAME"] from %s to %s' % (settings.DATABASES["default"]["NAME"], test_database_name)
@ -338,6 +344,7 @@ class IetfTestRunner(DiscoverRunner):
@classmethod
def add_arguments(cls, parser):
super(IetfTestRunner, cls).add_arguments(parser)
parser.add_argument('--skip-coverage',
action='store_true', dest='skip_coverage', default=False,
help='Skip test coverage measurements for code, templates, and URLs. ' )
@ -497,9 +504,9 @@ class IetfTestRunner(DiscoverRunner):
raise EnvironmentError("Refusing to run tests on production server")
old_create = connection.creation.__class__.create_test_db
connection.creation.__class__.create_test_db = safe_create_1
connection.creation.__class__.create_test_db = safe_create_test_db
old_destroy = connection.creation.__class__.destroy_test_db
connection.creation.__class__.destroy_test_db = safe_destroy_0_1
connection.creation.__class__.destroy_test_db = safe_destroy_test_db
self.run_full_test_suite = not test_labels

View file

@ -21,7 +21,6 @@ from django.templatetags.static import StaticNode
import debug # pyflakes:ignore
import ietf.urls
from ietf.utils.management.commands import pyflakes
from ietf.utils.mail import send_mail_text, send_mail_mime, outbox
from ietf.utils.test_data import make_test_data
@ -162,6 +161,8 @@ class TemplateChecksTestCase(TestCase):
urlconf can be found, a full resolution would also fail.
"""
#
import ietf.urls
def check_that_url_tag_callbacks_exists(node, origin, callbacks):
"""
Check that an URLNode's callback is in callbacks.

View file

@ -7,20 +7,24 @@ from inspect import isclass
from django.conf.urls import url as django_url
def url(regex, view, kwargs=None, name=None):
if isinstance(view, (list, tuple)):
pass # use the name passed in
if name:
branch = 'name'
elif isinstance(view, (list, tuple)):
branch = 'list'
elif isinstance(view, six.string_types):
branch = 'string'
name = view
elif isclass(view) or hasattr(view, '__class__'):
pass
elif callable(view) and hasattr(view, '__name__'):
if str(view.__module__).startswith('django.'):
pass
else:
branch = 'callable'
name = "%s.%s" % (view.__module__, view.__name__)
elif isclass(view) or hasattr(view, '__class__'):
branch = 'class'
else:
branch = 'notimpl'
raise NotImplementedError("Auto-named url from view of type %s: %s" % (type(view), view))
if name:
branch = branch # silent pyflakes
#debug.show('branch')
#debug.show('name')
pass
return django_url(regex, view, kwargs=kwargs, name=name)

View file

@ -3,6 +3,7 @@ setuptools>=18.5 # Require this first, to prevent later errors
#
beautifulsoup4>=4.4
bibtexparser>=0.6.2
bleach>=1.5.0
coverage>=4.0.1,!=4.0.2
#cssselect>=0.6.1 # for PyQuery
decorator>=3.4.0