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: if self.user:
return urlreverse(ietf.community.views.view_list, kwargs={ 'username': self.user.username }) return urlreverse(ietf.community.views.view_list, kwargs={ 'username': self.user.username })
elif self.group: 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 "" return ""

View file

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

View file

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

View file

@ -1,7 +1,7 @@
from django.conf.urls import url
from ietf.dbtemplate import views from ietf.dbtemplate import views
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^(?P<acronym>[-a-z0-9]+)/$', views.template_list, name='template_list'), 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 # Copyright The IETF Trust 2007, All Rights Reserved
from django.conf.urls import url
from django.views.generic import RedirectView from django.views.generic import RedirectView
from django.http import HttpResponsePermanentRedirect from django.http import HttpResponsePermanentRedirect
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from ietf.group.models import Group from ietf.group.models import Group
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^$', RedirectView.as_view(url='/doc/', permanent=True)), 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 django.views.generic import RedirectView
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^help/(?:sub)?state/(?:\d+/)?$', RedirectView.as_view(url='/doc/help/state/draft-iesg/', permanent=True)), 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)), 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("approved" in outbox[0]['Subject'].lower())
self.assertTrue("iesg-secretary" in outbox[0]['To']) self.assertTrue("iesg-secretary" in outbox[0]['To'])
body = outbox[0].get_payload() body = outbox[0].get_payload()
for word in ["WG", "/wg/ames/charter/", for word in ["WG", "/wg/ames/about/",
"Charter", "/doc/charter-ietf-ames/", ]: "Charter", "/doc/charter-ietf-ames/", ]:
self.assertIn(word, body) self.assertIn(word, body)
# #

View file

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

View file

@ -30,11 +30,12 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # 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.views.generic import RedirectView
from django.conf import settings 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.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 = [ session_patterns = [
url(r'^add$', views_doc.add_sessionpresentation), 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/(?:%(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/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/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/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/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/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/$' % settings.URL_REGEXPS, views_doc.document_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/(?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]+)/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/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/(?:%(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'^%(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'^(?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/$' % 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'), 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 # Copyright The IETF Trust 2011, All Rights Reserved
from django.conf.urls import url
from django.conf import settings from django.conf import settings
from ietf.doc import views_charter, views_doc from ietf.doc import views_charter, views_doc
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^state/$', views_charter.change_state, name='charter_change_state'), 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.doc import views_conflict_review, views_doc
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^state/$', views_conflict_review.change_state, name='conflict_review_change_state'), 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.doc import views_material
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^(?P<action>state|title|abstract|revise)/$', views_material.edit_material, name="material_edit"), 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.doc import views_review
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^$', views_review.request_review), 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.doc import views_status_change, views_doc
from ietf.utils.urls import url
urlpatterns = [ 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'^submit/$', views_status_change.submit, name='status_change_submit'),
url(r'^ad/$', views_status_change.edit_ad, name='status_change_ad'), url(r'^ad/$', views_status_change.edit_ad, name='status_change_ad'),
url(r'^title/$', views_status_change.edit_title, name='status_change_title'), 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: if 'ballot_edit_return_point' in request.session:
return_to_url = request.session['ballot_edit_return_point'] return_to_url = request.session['ballot_edit_return_point']
else: 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 we're in the Secretariat, we can select an AD to act as stand-in for
if has_role(request.user, "Secretariat"): 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: if 'ballot_edit_return_point' in request.session:
return_to_url = request.session['ballot_edit_return_point'] return_to_url = request.session['ballot_edit_return_point']
else: 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: if 'HTTP_REFERER' in request.META:
back_url = request.META['HTTP_REFERER'] back_url = request.META['HTTP_REFERER']
else: 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 we're in the Secretariat, we can select an AD to act as stand-in for
if not has_role(request.user, "Area Director"): 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") ballot = doc.latest_event(BallotDocEvent, type="created_ballot")
if doc.type_id in ("draft","conflrev", "statchg"): 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": 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"): 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(("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)) tabs.append(("History", "history", urlreverse("doc_history", kwargs=dict(name=name)), True, None))
if name.startswith("rfc"): if name.startswith("rfc"):
@ -260,7 +260,7 @@ def document_main(request, name, rev=None):
elif group.type_id in ("rg", "wg"): elif group.type_id in ("rg", "wg"):
submission = "%s %s" % (group.acronym, group.type) submission = "%s %s" % (group.acronym, group.type)
if group.type_id == "wg": 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": if doc.stream_id and doc.get_state_slug("draft-stream-%s" % doc.stream_id) == "c-adopt":
submission = "candidate for %s" % submission submission = "candidate for %s" % submission

View file

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

View file

@ -10,7 +10,7 @@ class GroupFeatures(object):
has_reviews = False has_reviews = False
has_default_jabber = False has_default_jabber = False
customize_workflow = False customize_workflow = False
about_page = "group_about" about_page = "ietf.group.views.group_about"
default_tab = about_page default_tab = about_page
material_types = ["slides"] material_types = ["slides"]
admin_roles = ["chair"] admin_roles = ["chair"]
@ -23,10 +23,10 @@ class GroupFeatures(object):
self.customize_workflow = True self.customize_workflow = True
self.has_default_jabber = True self.has_default_jabber = True
self.has_dependencies = True self.has_dependencies = True
self.default_tab = "group_docs" self.default_tab = "ietf.group.views.group_documents"
elif group.type_id in ("team",): elif group.type_id in ("team",):
self.has_materials = True self.has_materials = True
self.default_tab = "group_about" self.default_tab = "ietf.group.views.group_about"
elif group.type_id in ("program",): elif group.type_id in ("program",):
self.has_documents = True self.has_documents = True
self.has_milestones = True self.has_milestones = True
@ -35,7 +35,7 @@ class GroupFeatures(object):
self.admin_roles = ["chair", "secr"] self.admin_roles = ["chair", "secr"]
if self.has_chartering_process: 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 from ietf.review.utils import active_review_teams
if group in 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.title in unicontent(r))
self.assertTrue(doc.name 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 # try deleting the document and check it's gone
doc.set_state(State.objects.get(type="slides", slug="deleted")) doc.set_state(State.objects.get(type="slides", slug="deleted"))
@ -429,7 +429,7 @@ class GroupEditTests(TestCase):
def test_create(self): def test_create(self):
make_test_data() 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) login_testing_unauthorized(self, "secretary", url)
num_wgs = len(Group.objects.filter(type="wg")) num_wgs = len(Group.objects.filter(type="wg"))
@ -488,7 +488,7 @@ class GroupEditTests(TestCase):
make_test_data() 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) login_testing_unauthorized(self, "secretary", url)
irtf = Group.objects.get(acronym='irtf') irtf = Group.objects.get(acronym='irtf')
@ -513,7 +513,7 @@ class GroupEditTests(TestCase):
def test_create_based_on_existing_bof(self): def test_create_based_on_existing_bof(self):
make_test_data() 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) login_testing_unauthorized(self, "secretary", url)
group = Group.objects.get(acronym="mars") group = Group.objects.get(acronym="mars")
@ -548,7 +548,7 @@ class GroupEditTests(TestCase):
make_test_data() make_test_data()
group = Group.objects.get(acronym="mars") 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) login_testing_unauthorized(self, "secretary", url)
# normal get # normal get
@ -625,7 +625,7 @@ class GroupEditTests(TestCase):
review_req = make_review_data(doc) review_req = make_review_data(doc)
group = review_req.team 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) login_testing_unauthorized(self, "secretary", url)
# normal get # normal get

View file

@ -1,20 +1,21 @@
# Copyright The IETF Trust 2007, All Rights Reserved # 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 django.conf import settings
from ietf.group import views, views_ajax, views_edit from ietf.group import views, views_ajax, views_edit
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^$', views.active_groups), url(r'^$', views.active_groups),
url(r'^groupmenu.json', views_ajax.group_menu_data, None, "group_menu_data"), 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'^%(acronym)s.json$' % settings.URL_REGEXPS, views_ajax.group_json),
url(r'^chartering/$', views.chartering_groups), 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'^concluded/$', views.concluded_groups),
url(r'^email-aliases/$', views.email_aliases), url(r'^email-aliases/$', views.email_aliases),
url(r'^all-status/$', views.all_status), 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')), 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 # 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.views.generic import RedirectView
from django.conf import settings from django.conf import settings
from ietf.group import views, views_edit from ietf.group import views, views_edit
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^$', views.active_groups), 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'^chartering/create/$', RedirectView.as_view(url='/group/chartering/create/%(group_type)s/', permanent=True)),
url(r'^bofs/$', views.bofs), url(r'^bofs/$', views.bofs),
url(r'^email-aliases/$', views.email_aliases), 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'^photos/$', views.chair_photos),
url(r'^%(acronym)s/' % settings.URL_REGEXPS, include('ietf.group.urls_info_details')), 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 django.views.generic import RedirectView
from ietf.community import views as community_views from ietf.community import views as community_views
from ietf.doc import views_material as material_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.group import views, views_edit, views_review, milestones as milestone_views
from ietf.utils.urls import url
urlpatterns = [ 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/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/manage/$', community_views.manage_list),
url(r'^documents/csv/$', community_views.export_to_csv), url(r'^documents/csv/$', community_views.export_to_csv),
url(r'^documents/feed/$', community_views.feed), url(r'^documents/feed/$', community_views.feed),
url(r'^documents/subscription/$', community_views.subscription), url(r'^documents/subscription/$', community_views.subscription),
url(r'^charter/$', views.group_about, None, 'group_charter'), url(r'^charter/$', views.group_about),
url(r'^about/$', views.group_about, None, 'group_about'), url(r'^about/$', views.group_about),
url(r'^about/status/$', views.group_about_status), url(r'^about/status/$', views.group_about_status),
url(r'^about/status/edit/$', views.group_about_status_edit), url(r'^about/status/edit/$', views.group_about_status_edit),
url(r'^about/status/meeting/(?P<num>\d+)/$', views.group_about_status_meeting), 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'^email/$', views.email),
url(r'^deps/(?P<output_type>[\w-]+)/$', views.dependencies), url(r'^deps/(?P<output_type>[\w-]+)/$', views.dependencies),
url(r'^meetings/$', views.meetings), 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'^conclude/$', views_edit.conclude),
url(r'^milestones/$', milestone_views.edit_milestones, {'milestone_set': "current"}, "group_edit_milestones"), 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/$', 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'^milestones/charter/reset/$', milestone_views.reset_charter_milestones, None, "group_reset_charter_milestones"),
url(r'^workflow/$', views_edit.customize_workflow), 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/$', material_views.choose_material_type),
url(r'^materials/new/(?P<doc_type>[\w-]+)/$', material_views.edit_material, { 'action': "new" }, "group_new_material"), url(r'^materials/new/(?P<doc_type>[\w-]+)/$', material_views.edit_material, { 'action': "new" }, "group_new_material"),
url(r'^archives/$', views.derived_archives), url(r'^archives/$', views.derived_archives),

View file

@ -1,9 +1,9 @@
# Copyright The IETF Trust 2008, All Rights Reserved # Copyright The IETF Trust 2008, All Rights Reserved
from django.conf.urls import url
from django.conf import settings from django.conf import settings
import views_stream from ietf.group import views_stream
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^$', views_stream.streams), 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: if group.features.has_documents:
entries.append(("Documents", urlreverse("ietf.group.views.group_documents", kwargs=kwargs))) entries.append(("Documents", urlreverse("ietf.group.views.group_documents", kwargs=kwargs)))
if group.features.has_chartering_process: 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: 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(): if group.features.has_materials and get_group_materials(group).exists():
entries.append(("Materials", urlreverse("ietf.group.views.materials", kwargs=kwargs))) entries.append(("Materials", urlreverse("ietf.group.views.materials", kwargs=kwargs)))
if group.features.has_reviews: 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): 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): 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))) 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.help import views
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^state/(?P<doc>[-\w]+)/(?P<type>[-\w]+)/?$', views.state), 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 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # 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.views.generic import RedirectView
from django.conf import settings from django.conf import settings
from ietf.iesg import views from ietf.iesg import views
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^telechat/.*$', RedirectView.as_view(url='https://www.ietf.org/iesg/minutes.html', permanent=True)), 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 # Copyright The IETF Trust 2007, 2009, All Rights Reserved
from django.conf.urls import url
from django.contrib.auth.views import login, logout from django.contrib.auth.views import login, logout
from ietf.ietfauth import views from ietf.ietfauth import views
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^$', views.index), url(r'^$', views.index),

View file

@ -10,7 +10,7 @@ from ietf.ipr.models import IprDisclosureBase
class LatestIprDisclosuresFeed(Feed): class LatestIprDisclosuresFeed(Feed):
feed_type = Atom1Feed feed_type = Atom1Feed
title = "IPR Disclosures to the IETF" 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." description = "Updates on new IPR Disclosures made to the IETF."
language = "en" language = "en"
feed_url = "/feed/ipr/" feed_url = "/feed/ipr/"

View file

@ -29,7 +29,7 @@ class IprDisclosureBase(models.Model):
return self.title return self.title
def get_absolute_url(self): 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): def get_child(self):
"""Returns the child instance""" """Returns the child instance"""

View file

@ -108,14 +108,14 @@ class IprTests(TestCase):
def test_showlist(self): def test_showlist(self):
make_test_data() make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights') 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.assertEqual(r.status_code, 200)
self.assertTrue(ipr.title in unicontent(r)) self.assertTrue(ipr.title in unicontent(r))
def test_show_posted(self): def test_show_posted(self):
make_test_data() make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights') 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.assertEqual(r.status_code, 200)
self.assertTrue(ipr.title in unicontent(r)) self.assertTrue(ipr.title in unicontent(r))
@ -123,28 +123,28 @@ class IprTests(TestCase):
make_test_data() make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights') ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
ipr.set_state('parked') 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) self.assertEqual(r.status_code, 404)
def test_show_pending(self): def test_show_pending(self):
make_test_data() make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights') ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
ipr.set_state('pending') 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) self.assertEqual(r.status_code, 404)
def test_show_rejected(self): def test_show_rejected(self):
make_test_data() make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights') ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
ipr.set_state('rejected') 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) self.assertEqual(r.status_code, 404)
def test_show_removed(self): def test_show_removed(self):
make_test_data() make_test_data()
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights') ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
ipr.set_state('removed') 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.assertEqual(r.status_code, 200)
self.assertTrue('This IPR disclosure was removed' in unicontent(r)) self.assertTrue('This IPR disclosure was removed' in unicontent(r))
@ -176,7 +176,7 @@ class IprTests(TestCase):
draft = make_test_data() draft = make_test_data()
ipr = IprDisclosureBase.objects.get(title="Statement regarding rights").get_child() 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) r = self.client.get(url)
self.assertEqual(r.status_code, 200) self.assertEqual(r.status_code, 200)

View file

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

View file

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

View file

@ -1,9 +1,9 @@
# Copyright The IETF Trust 2007, All Rights Reserved # Copyright The IETF Trust 2007, All Rights Reserved
from django.conf.urls import url
from django.views.generic import RedirectView, TemplateView from django.views.generic import RedirectView, TemplateView
from ietf.liaisons import views from ietf.liaisons import views
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^help/$', TemplateView.as_view(template_name='liaisons/help.html')), 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 # Copyright The IETF Trust 2007, All Rights Reserved
from django.conf.urls import url
from django.views.generic import RedirectView from django.views.generic import RedirectView
from ietf.mailinglists import views from ietf.mailinglists import views
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^wg/$', views.groups), 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.views.generic import RedirectView
from django.core.urlresolvers import reverse_lazy from django.core.urlresolvers import reverse_lazy
from ietf.mailtrigger import views from ietf.mailtrigger import views
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^$', RedirectView.as_view(url=reverse_lazy('mailtrigger_show_triggers'), permanent=True)), url(r'^$', RedirectView.as_view(url=reverse_lazy('ietf.mailtrigger.views.show_triggers'), permanent=True)),
url(r'^name/$', views.show_triggers, name='mailtrigger_show_triggers' ), url(r'^name/$', views.show_triggers),
url(r'^name/(?P<mailtrigger_slug>[-\w]+)/$', views.show_triggers ), url(r'^name/(?P<mailtrigger_slug>[-\w]+)/$', views.show_triggers ),
url(r'^recipient/$', views.show_recipients ), url(r'^recipient/$', views.show_recipients ),
url(r'^recipient/(?P<recipient_slug>[-\w]+)/$', 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 pyquery import PyQuery
from unittest import skipIf from unittest import skipIf
import django.contrib.auth.views
from django.contrib.staticfiles.testing import StaticLiveServerTestCase from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from django.core.urlresolvers import reverse as urlreverse from django.core.urlresolvers import reverse as urlreverse
#from django.test.utils import override_settings #from django.test.utils import override_settings
@ -126,7 +127,7 @@ class SlideReorderTests(StaticLiveServerTestCase):
return '%s%s'%(self.live_server_url,urlreverse(*args,**kwargs)) return '%s%s'%(self.live_server_url,urlreverse(*args,**kwargs))
def secr_login(self): 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.get(url)
self.driver.find_element_by_name('username').send_keys('secretary') self.driver.find_element_by_name('username').send_keys('secretary')
self.driver.find_element_by_name('password').send_keys('secretary+password') 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 # 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.views.generic import RedirectView
from django.conf import settings from django.conf import settings
from ietf.meeting import views from ietf.meeting import views, ajax
from ietf.meeting import ajax from ietf.utils.urls import url
safe_for_all_meeting_types = [ safe_for_all_meeting_types = [
url(r'^session/(?P<acronym>[-a-z0-9]+)/?$', views.session_details), 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$', 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]+)$', views.agenda_by_type),
url(r'^agenda/by-type/(?P<type>[a-z]+)/ics$', views.agenda_by_type_ics), 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/list$', views.list_agendas),
url(r'^agendas/edit$', RedirectView.as_view(pattern_name='meeting_list_agendas', permanent=True)), 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'^timeslots/edit$', views.edit_timeslots),
url(r'^rooms$', ajax.timeslot_roomsurl), url(r'^rooms$', ajax.timeslot_roomsurl),
url(r'^room/(?P<roomid>\d+).json$', ajax.timeslot_roomurl), 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)) meeting = form.save(date=get_earliest_session_date(formset))
# need to use curry here to pass custom variable to form init # need to use curry here to pass custom variable to form init
SessionFormset.form = staticmethod(curry( SessionFormset.form.__init__ = curry(
InterimSessionModelForm, InterimSessionModelForm.__init__,
user=request.user, user=request.user,
group=group, 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 = SessionFormset(instance=meeting, data=request.POST)
formset.is_valid() formset.is_valid()
formset.save() formset.save()
@ -1777,11 +1777,11 @@ def interim_request(request):
# subsequently dealt with individually # subsequently dealt with individually
elif meeting_type == 'series': elif meeting_type == 'series':
series = [] series = []
SessionFormset.form = staticmethod(curry( SessionFormset.form.__init__ = curry(
InterimSessionModelForm, InterimSessionModelForm.__init__,
user=request.user, user=request.user,
group=group, 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 = SessionFormset(instance=Meeting(), data=request.POST)
formset.is_valid() # re-validate formset.is_valid() # re-validate
for session_form in formset.forms: for session_form in formset.forms:
@ -1896,13 +1896,15 @@ def interim_request_edit(request, number):
data=request.POST) data=request.POST)
group = Group.objects.get(pk=form.data['group']) group = Group.objects.get(pk=form.data['group'])
is_approved = is_meeting_approved(meeting) is_approved = is_meeting_approved(meeting)
SessionFormset.form = staticmethod(curry(
InterimSessionModelForm, SessionFormset.form.__init__ = curry(
InterimSessionModelForm.__init__,
user=request.user, user=request.user,
group=group, group=group,
is_approved_or_virtual=is_approved)) is_approved_or_virtual=is_approved)
formset = SessionFormset(instance=meeting,
data=request.POST) formset = SessionFormset(instance=meeting, data=request.POST)
if form.is_valid() and formset.is_valid(): if form.is_valid() and formset.is_valid():
meeting = form.save(date=get_earliest_session_date(formset)) meeting = form.save(date=get_earliest_session_date(formset))
formset.save() formset.save()

View file

@ -26,7 +26,7 @@ class MessageTests(TestCase):
) )
msg.related_groups.add(nomcom) 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.assertEqual(r.status_code, 200)
self.assertTrue(msg.subject in unicontent(r)) self.assertTrue(msg.subject in unicontent(r))
self.assertTrue(msg.to in unicontent(r)) self.assertTrue(msg.to in unicontent(r))

View file

@ -9,6 +9,7 @@ import re
import smtplib import smtplib
import unicodedata import unicodedata
# old-style middleware
class SQLLogMiddleware(object): class SQLLogMiddleware(object):
def process_response(self, request, response): def process_response(self, request, response):
for q in connection.queries: for q in connection.queries:
@ -16,6 +17,15 @@ class SQLLogMiddleware(object):
log(q['sql']) log(q['sql'])
return response 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): class SMTPExceptionMiddleware(object):
def process_exception(self, request, exception): def process_exception(self, request, exception):
if isinstance(exception, smtplib.SMTPException): if isinstance(exception, smtplib.SMTPException):
@ -24,6 +34,11 @@ class SMTPExceptionMiddleware(object):
{'exception': extype, 'args': value, 'traceback': "".join(tb)} ) {'exception': extype, 'args': value, 'traceback': "".join(tb)} )
return None return None
def smtp_exception_middleware_factory(get_response):
def smtp_exception_middleware(request):
response = get_response(request)
return response
class RedirectTrailingPeriod(object): class RedirectTrailingPeriod(object):
def process_response(self, request, response): def process_response(self, request, response):
if response.status_code == 404 and request.path.endswith("."): 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.core.urlresolvers import reverse
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.utils.http import urlquote 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()))) return HttpResponseRedirect('%s?back_to=%s' % (reverse('nomcom_private_key', None, args=(year, )), urlquote(request.get_full_path())))
else: else:
return view_func(request, *args, **kwargs) 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 django.views.generic import RedirectView
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^nomcom/$', RedirectView.as_view(url="/nomcom/ann/", permanent=True)), 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)), 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 self.year = NOMCOM_YEAR
# private urls # 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_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.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}) 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) self.assertEqual(response.status_code, 403)
def test_cannot_modify_nominees(self): 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) login_testing_unauthorized(self, self.chair.user.username, url)
response = self.client.get(url) response = self.client.get(url)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@ -1287,7 +1287,7 @@ class FeedbackLastSeenTests(TestCase):
self.assertEqual( len(q('.label-success')), 0 ) self.assertEqual( len(q('.label-success')), 0 )
def test_feedback_nominee_badges(self): 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) login_testing_unauthorized(self, self.member.user.username, url)
provide_private_key_to_test_client(self) provide_private_key_to_test_client(self)
response = self.client.get(url) response = self.client.get(url)
@ -1679,7 +1679,7 @@ Junk body for testing
self.assertEqual(response.status_code, 404) self.assertEqual(response.status_code, 404)
def test_edit_nominee(self): 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) new_email = EmailFactory(person=nominee.person)
url = reverse('nomcom_edit_nominee',kwargs={'year':self.nc.year(),'nominee_id':nominee.id}) url = reverse('nomcom_edit_nominee',kwargs={'year':self.nc.year(),'nominee_id':nominee.id})
login_testing_unauthorized(self,self.chair.user.username,url) login_testing_unauthorized(self,self.chair.user.username,url)
@ -1687,7 +1687,7 @@ Junk body for testing
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
response = self.client.post(url,{'nominee_email':new_email.address}) response = self.client.post(url,{'nominee_email':new_email.address})
self.assertEqual(response.status_code, 302) 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) self.assertEqual(nominee.email,new_email)
def test_request_merge(self): 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.forms import EditMembersForm, EditMembersFormPreview
from ietf.nomcom import views from ietf.nomcom import views
from ietf.message import views as message_views from ietf.message import views as message_views
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^$', views.index), url(r'^$', views.index),
url(r'^ann/$', views.announcements), 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/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/help/$', views.configuration_help, name='nomcom_chair_help'),
url(r'^(?P<year>\d{4})/private/nominate/$', views.private_nominate, name='nomcom_private_nominate'), 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/$', 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/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/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/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-nominee/?$', views.private_merge_nominee),
url(r'^(?P<year>\d{4})/private/merge-person/?$', views.private_merge_person), 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})/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'), 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 # 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: else:
messages.warning(request, "You don't have a private decryption key set for this session yet") 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': if request.method == 'POST':
form = PrivateKeyForm(data=request.POST) form = PrivateKeyForm(data=request.POST)
if form.is_valid(): if form.is_valid():
@ -276,7 +276,7 @@ def private_merge_person(request, year):
if form.is_valid(): if form.is_valid():
form.save() form.save()
messages.success(request, 'A merge request has been sent to the secretariat.') 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: else:
form = MergePersonForm(nomcom=nomcom) form = MergePersonForm(nomcom=nomcom)
@ -301,7 +301,7 @@ def private_merge_nominee(request, year):
if form.is_valid(): if form.is_valid():
form.save() form.save()
messages.success(request, 'The Nominee records have been joined.') 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: else:
form = MergeNomineeForm(nomcom=nomcom) form = MergeNomineeForm(nomcom=nomcom)
@ -811,7 +811,7 @@ def edit_nominee(request, year, nominee_id):
if form.is_valid(): if form.is_valid():
form.save() form.save()
messages.success(request, 'The nomination address for %s has been changed to %s'%(nominee.name(),nominee.email.address)) 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: else:
form = EditNomineeForm(instance=nominee) form = EditNomineeForm(instance=nominee)

View file

@ -85,7 +85,7 @@ class SearchablePersonsField(forms.CharField):
# doing this in the constructor is difficult because the URL # doing this in the constructor is difficult because the URL
# patterns may not have been fully constructed there yet # 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 = {} query_args = {}
if self.only_users: if self.only_users:
query_args["user"] = "1" query_args["user"] = "1"

View file

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

View file

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

View file

@ -1,6 +1,6 @@
from django.conf.urls import url
from ietf.secr.announcement import views from ietf.secr.announcement import views
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^$', views.main, name='announcement'), 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.secr.areas import views
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^$', views.list_areas, name='areas'), 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.secr.console import views
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^$', views.main, name='console'), 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.secr.drafts import views
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^$', views.search, name='drafts'), url(r'^$', views.search, name='drafts'),

View file

@ -1,7 +1,7 @@
from django.conf.urls import url
from django.conf import settings from django.conf import settings
from ietf.secr.groups import views from ietf.secr.groups import views
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^$', views.search, name='groups'), 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.secr.meetings import views
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^$', views.main, name='meetings'), 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_\-]+)/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/$', 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/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_\-]+)/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<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'), 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 django.conf import settings
from ietf.meeting.views import OldUploadRedirect from ietf.meeting.views import OldUploadRedirect
from ietf.utils.urls import url
from ietf.secr.proceedings import views from ietf.secr.proceedings import views

View file

@ -1,7 +1,7 @@
from django.conf.urls import url
from django.conf import settings from django.conf import settings
from ietf.secr.roles import views from ietf.secr.roles import views
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^$', views.main, name='roles'), 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.secr.rolodex import views
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^$', views.search, name='rolodex'), url(r'^$', views.search, name='rolodex'),

View file

@ -45,7 +45,7 @@ class SubmitRequestCase(TestCase):
def test_submit_request(self): def test_submit_request(self):
make_test_data() make_test_data()
group = Group.objects.get(acronym='mars') 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', post_data = {'num_session':'1',
'length_session1':'3600', 'length_session1':'3600',
'attendees':'10', 'attendees':'10',
@ -58,7 +58,7 @@ class SubmitRequestCase(TestCase):
def test_submit_request_invalid(self): def test_submit_request_invalid(self):
make_test_data() make_test_data()
group = Group.objects.get(acronym='mars') 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', post_data = {'num_session':'2',
'length_session1':'3600', 'length_session1':'3600',
'attendees':'10', 'attendees':'10',
@ -134,7 +134,7 @@ class LockAppTestCase(TestCase):
meeting.session_request_lock_message='locked' meeting.session_request_lock_message='locked'
meeting.save() meeting.save()
group = Group.objects.get(acronym='mars') 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 # try as WG Chair
self.client.login(username="marschairman", password="marschairman+password") 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 django.conf import settings
from ietf.secr.sreq import views from ietf.secr.sreq import views
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^$', views.main, name='sessions'), 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/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/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/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'^%(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'), 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: else:
if not sessions: if not sessions:
return redirect('sessions_new', acronym=acronym) return redirect('ietf.secr.sreq.views.new', acronym=acronym)
form = SessionForm(initial=initial) form = SessionForm(initial=initial)
return render(request, 'sreq/edit.html', { return render(request, 'sreq/edit.html', {
@ -493,7 +493,7 @@ def main(request):
if button_text == 'Group will not meet': if button_text == 'Group will not meet':
return redirect('sessions_no_session', acronym=request.POST['group']) return redirect('sessions_no_session', acronym=request.POST['group'])
else: else:
return redirect('sessions_new', acronym=request.POST['group']) return redirect('ietf.secr.sreq.views.new', acronym=request.POST['group'])
meeting = get_meeting() meeting = get_meeting()
scheduled_groups,unscheduled_groups = groups_by_session(request.user, meeting, types=['wg','rg','ag']) 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') previous_sessions = Session.objects.filter(meeting=previous_meeting,group=group).exclude(status__in=('notmeet','deleted')).order_by('id')
if not previous_sessions: if not previous_sessions:
messages.warning(request, 'This group did not meet at %s' % previous_meeting) 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) initial = get_initial_session(previous_sessions)
add_essential_people(group,initial) add_essential_people(group,initial)
@ -696,7 +696,7 @@ def view(request, acronym, num = None):
if is_locked: if is_locked:
return redirect('sessions') return redirect('sessions')
else: else:
return redirect('sessions_new', acronym=acronym) return redirect('ietf.secr.sreq.views.new', acronym=acronym)
# TODO simulate activity records # TODO simulate activity records
activities = [{'act_date':sessions[0].requested.strftime('%b %d, %Y'), 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.secr.telechat import views
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^$', views.main, name='telechat'), url(r'^$', views.main, name='telechat'),

View file

@ -22,7 +22,7 @@
<td>{{ item.time|date:"D" }}</td> <td>{{ item.time|date:"D" }}</td>
<td>{{ item.time|date:"H:i" }} - {{ item.end_time|date:"H:i" }}</td> <td>{{ item.time|date:"H:i" }} - {{ item.end_time|date:"H:i" }}</td>
<td>{{ item.name }}</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> <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> </tr>
{% endfor %} {% endfor %}

View file

@ -34,7 +34,7 @@
<ul> <ul>
{% for group in unscheduled_groups %} {% for group in unscheduled_groups %}
<li> <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 %} {% if group.not_meeting %}
<span class="required"> (Currently, this group does not plan to hold a session at IETF {{ meeting.number }})</span> <span class="required"> (Currently, this group does not plan to hold a session at IETF {{ meeting.number }})</span>
{% endif %} {% endif %}

View file

@ -30,7 +30,7 @@
<br> <br>
<ul class="session-buttons"> <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="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> </ul>
{% include "includes/sessions_request_form.html" %} {% 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.submit import views
from ietf.utils.urls import url
urlpatterns = [ urlpatterns = [
url(r'^$', views.upload_submission), url(r'^$', views.upload_submission),

View file

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

View file

@ -57,7 +57,7 @@
<li><a href="{% url "ietf.submit.views.approvals" %}">Approve a draft</a></li> <li><a href="{% url "ietf.submit.views.approvals" %}">Approve a draft</a></li>
{% for g in user|managed_groups %} {% 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 %} {% endfor %}
{% for g in user|managed_groups %} {% for g in user|managed_groups %}
<li><a href="{% url "ietf.group.views.meetings" g.acronym %}">{{ g.acronym }} {{ g.type.slug }} meetings</a></li> <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 %} {% if group.charter %}
<a class="btn btn-default pull-right" href="{% url "doc_view" name=name %}">Back</a> <a class="btn btn-default pull-right" href="{% url "doc_view" name=name %}">Back</a>
{% else %} {% 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 %} {% endif %}
{% endbuttons %} {% endbuttons %}
</form> </form>

View file

@ -21,7 +21,7 @@
<li class="disabled"><span><b>Ballots</b></span></li> <li class="disabled"><span><b>Ballots</b></span></li>
{% for b in all_ballots %} {% for b in all_ballots %}
<li {% if b == ballot %}class="active"{% endif %}> <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 }}) {{ b.ballot_type.name }} ({{ b.rev }})
</a> </a>
</li> </li>

View file

@ -512,7 +512,7 @@
<div class="buttonlist"> <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="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_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="{% 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> <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> <th><a href="{% url "state_help" type="status-change" %}">State</a></th>
<td class="edit"> <td class="edit">
{% if not snapshot and user|has_role:"Area Director,Secretariat" %} {% 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 %} {% endif %}
</td> </td>
<td> <td>

View file

@ -14,7 +14,7 @@
{% if action == "new" %} {% if action == "new" %}
<p class="help-block"> <p class="help-block">
Below you can upload a document for the group {{ group.name }} 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. The document will appear under the materials tab in the group pages.
</p> </p>
@ -22,7 +22,7 @@
{% elif action == "revise" %} {% elif action == "revise" %}
<p> <p>
Below you can upload a new revision of {{ doc_name }} for the group {{ group.name }} 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> </p>
<h2>Upload New Revision</h2> <h2>Upload New Revision</h2>
@ -34,7 +34,7 @@
{% bootstrap_form form %} {% bootstrap_form form %}
{% buttons %} {% 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> <button class="btn btn-primary" type="submit">{% if action == "new" or action == "revise" %}Upload{% else %}Save{% endif %}</button>
{% endbuttons %} {% endbuttons %}
</form> </form>

View file

@ -84,7 +84,7 @@
<td class="ipr text-center"> <td class="ipr text-center">
{% if doc.related_ipr %} {% 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> <span class="label label-default">{{ doc.related_ipr|length }}</span>
</a> </a>
{% endif %} {% 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 }} {% for u in urls %}{{ settings.IDTRACKER_BASE_URL}}{{ u }}
{% endfor %} {% endfor %}
IESG discussion of this request can be tracked via 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 %} {% endautoescape %}

View file

@ -17,7 +17,7 @@
<p>Groups in the <i>BOF</i> state.</p> <p>Groups in the <i>BOF</i> state.</p>
{% if user|has_role:"Area Director,Secretariat" %} {% 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 %} {% endif %}
{% if not groups %} {% if not groups %}

View file

@ -28,7 +28,7 @@
<h2>{{ t.name }}s</h2> <h2>{{ t.name }}s</h2>
{% if t.can_manage %} {% 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 %} {% endif %}
{% if not t.chartering_groups %} {% if not t.chartering_groups %}

View file

@ -17,7 +17,7 @@
{% buttons %} {% buttons %}
<button type="submit" class="btn btn-primary">Save</button> <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 %} {% endbuttons %}
</form> </form>
{% endblock %} {% endblock %}

View file

@ -4,6 +4,7 @@
{% load staticfiles %} {% load staticfiles %}
{% load ietf_filters %} {% load ietf_filters %}
{% load textfilters %} {% load textfilters %}
{% load htmlfilters %}
{% block title %} {% block title %}
IETF {{ schedule.meeting.number }} meeting agenda IETF {{ schedule.meeting.number }} meeting agenda
@ -255,7 +256,7 @@
<td> <td>
{% if item.session.historic_group.charter %} {% 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 %} {% else %}
{{item.session.historic_group.acronym}} {{item.session.historic_group.acronym}}
{% endif %} {% endif %}

View file

@ -45,7 +45,7 @@
{% for m in regime.announcements|dictsortreversed:"time" %} {% for m in regime.announcements|dictsortreversed:"time" %}
<tr> <tr>
<td class="text-nowrap">{{ m.time|date:"Y-m-d" }}</td> <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> <td>{{ m.to_name }}</td>
</tr> </tr>
{% endfor %} {% endfor %}

View file

@ -16,7 +16,7 @@
{% bootstrap_form form %} {% bootstrap_form form %}
{% buttons %} {% buttons %}
<input class="btn btn-primary" type="submit" value="Save"> <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 %} {% endbuttons %}
</form> </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> <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"> <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 %} {% if nomcom|has_publickey %}
<li {% if selected == "nominate" %}class="active"{% endif %}><a href="{% url "nomcom_private_nominate" year %}">Nominate</a></li> <li {% if selected == "nominate" %}class="active"{% endif %}><a href="{% url "nomcom_private_nominate" year %}">Nominate</a></li>

View file

@ -89,7 +89,7 @@
{% endif %} {% endif %}
<td> <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>
<td>{{ np.position.name }}</td> <td>{{ np.position.name }}</td>
<td>{{ np.state }}</td> <td>{{ np.state }}</td>

View file

@ -36,7 +36,7 @@
{% for fb_dict in staterank.list %} {% for fb_dict in staterank.list %}
<tr> <tr>
<td> <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> <span class="hidden-xs">&lt;{{fb_dict.nominee.email.address}}&gt;</span>
</td> </td>
{% for fbtype_name, fbtype_count, fbtype_newflag in fb_dict.feedback %} {% for fbtype_name, fbtype_count, fbtype_newflag in fb_dict.feedback %}

View file

@ -2,25 +2,30 @@
"""Utilities for working with HTML.""" """Utilities for working with HTML."""
import html5lib import html5lib
import bleach
from html5lib import sanitizer, serializer, tokenizer, treebuilders, treewalkers from html5lib import sanitizer, serializer, tokenizer, treebuilders, treewalkers
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',
'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'ins', 'kbd',
'li', 'ol', 'p', 'pre', 'q', 's', 'samp', 'small', 'span', 'strike',
'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead',
'tr', 'tt', 'u', 'ul', 'var')
acceptable_attributes = ('abbr', 'align', 'alt', 'axis', 'border',
'cellpadding', 'cellspacing', 'char', 'charoff', 'charset', 'cite',
'cols', 'colspan', 'datetime', 'dir', 'frame', 'headers', 'height',
'href', 'hreflang', 'hspace', 'lang', 'longdesc', 'name', 'nohref',
'noshade', 'nowrap', 'rel', 'rev', 'rows', 'rowspan', 'rules', 'scope',
'span', 'src', 'start', 'summary', 'title', 'type', 'valign', 'vspace',
'width')
class HTMLSanitizerMixin(sanitizer.HTMLSanitizerMixin): class HTMLSanitizerMixin(sanitizer.HTMLSanitizerMixin):
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',
'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'ins', 'kbd',
'li', 'ol', 'p', 'pre', 'q', 's', 'samp', 'small', 'span', 'strike',
'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead',
'tr', 'tt', 'u', 'ul', 'var')
acceptable_attributes = ('abbr', 'align', 'alt', 'axis', 'border',
'cellpadding', 'cellspacing', 'char', 'charoff', 'charset', 'cite',
'cols', 'colspan', 'datetime', 'dir', 'frame', 'headers', 'height',
'href', 'hreflang', 'hspace', 'lang', 'longdesc', 'name', 'nohref',
'noshade', 'nowrap', 'rel', 'rev', 'rows', 'rowspan', 'rules', 'scope',
'span', 'src', 'start', 'summary', 'title', 'type', 'valign', 'vspace',
'width')
allowed_elements = acceptable_elements allowed_elements = acceptable_elements
allowed_attributes = acceptable_attributes allowed_attributes = acceptable_attributes
allowed_css_properties = () allowed_css_properties = ()
@ -48,3 +53,13 @@ def sanitize_html(html):
quote_attr_values=True) quote_attr_values=True)
output_generator = s.serialize(stream) output_generator = s.serialize(stream)
return u''.join(output_generator) 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 return parser
def add_arguments(self, parser): def add_arguments(self, parser):
parser.add_argument('filenames', nargs="*")
parser.add_argument('--sections', default='template,url,code', dest='sections', parser.add_argument('--sections', default='template,url,code', dest='sections',
help='Specify which kinds of coverage changes to show. Default: %(default)s\n') help='Specify which kinds of coverage changes to show. Default: %(default)s\n')
parser.add_argument('--release', dest='release', parser.add_argument('--release', dest='release',
@ -172,7 +173,8 @@ class Command(BaseCommand):
header_written = True header_written = True
self.stdout.write(self.list_line_format % (key, lval)) 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)) sections = options.get('sections', ','.join(self.valid_sections))
options.pop('sections') options.pop('sections')
sections = sections.split(',') sections = sections.split(',')
@ -183,6 +185,8 @@ class Command(BaseCommand):
absolute = options.get('absolute', False) absolute = options.get('absolute', False)
filenames = options.get('filenames')
if absolute: if absolute:
if not filenames: if not filenames:
filenames = [ filenames = [

View file

@ -76,13 +76,16 @@ template_coverage_collection = None
url_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 global test_database_name, old_create
print " Creating test database..." keepdb = kwargs.get('keepdb', False)
if settings.DATABASES["default"]["ENGINE"] == 'django.db.backends.mysql': if not keepdb:
settings.DATABASES["default"]["OPTIONS"] = settings.DATABASE_TEST_OPTIONS print " Creating test database..."
print " Using OPTIONS: %s" % settings.DATABASES["default"]["OPTIONS"] 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) test_database_name = old_create(self, 0, *args, **kwargs)
if settings.GLOBAL_TEST_FIXTURES: if settings.GLOBAL_TEST_FIXTURES:
print " Loading global test fixtures: %s" % ", ".join(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] loadable = [f for f in settings.GLOBAL_TEST_FIXTURES if "." not in f]
@ -92,18 +95,21 @@ def safe_create_1(self, verbosity, *args, **kwargs):
if f not in loadable: if f not in loadable:
# try to execute the fixture # try to execute the fixture
components = f.split(".") 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 = getattr(module, components[-1])
fn() fn()
return test_database_name return test_database_name
def safe_destroy_0_1(*args, **kwargs): def safe_destroy_test_db(*args, **kwargs):
global test_database_name, old_destroy global test_database_name, old_destroy
print " Checking that it's safe to destroy test database..." keepdb = kwargs.get('keepdb', False)
if settings.DATABASES["default"]["NAME"] != test_database_name: if not keepdb:
print ' NOT SAFE; Changing settings.DATABASES["default"]["NAME"] from %s to %s' % (settings.DATABASES["default"]["NAME"], test_database_name) print " Checking that it's safe to destroy test database..."
settings.DATABASES["default"]["NAME"] = test_database_name 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)
settings.DATABASES["default"]["NAME"] = test_database_name
return old_destroy(*args, **kwargs) return old_destroy(*args, **kwargs)
class TemplateCoverageLoader(BaseLoader): class TemplateCoverageLoader(BaseLoader):
@ -338,6 +344,7 @@ class IetfTestRunner(DiscoverRunner):
@classmethod @classmethod
def add_arguments(cls, parser): def add_arguments(cls, parser):
super(IetfTestRunner, cls).add_arguments(parser)
parser.add_argument('--skip-coverage', parser.add_argument('--skip-coverage',
action='store_true', dest='skip_coverage', default=False, action='store_true', dest='skip_coverage', default=False,
help='Skip test coverage measurements for code, templates, and URLs. ' ) 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") raise EnvironmentError("Refusing to run tests on production server")
old_create = connection.creation.__class__.create_test_db 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 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 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 debug # pyflakes:ignore
import ietf.urls
from ietf.utils.management.commands import pyflakes from ietf.utils.management.commands import pyflakes
from ietf.utils.mail import send_mail_text, send_mail_mime, outbox from ietf.utils.mail import send_mail_text, send_mail_mime, outbox
from ietf.utils.test_data import make_test_data 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. urlconf can be found, a full resolution would also fail.
""" """
# #
import ietf.urls
def check_that_url_tag_callbacks_exists(node, origin, callbacks): def check_that_url_tag_callbacks_exists(node, origin, callbacks):
""" """
Check that an URLNode's callback is in 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 from django.conf.urls import url as django_url
def url(regex, view, kwargs=None, name=None): def url(regex, view, kwargs=None, name=None):
if isinstance(view, (list, tuple)): if name:
pass # use the name passed in branch = 'name'
elif isinstance(view, (list, tuple)):
branch = 'list'
elif isinstance(view, six.string_types): elif isinstance(view, six.string_types):
branch = 'string'
name = view name = view
elif isclass(view) or hasattr(view, '__class__'):
pass
elif callable(view) and hasattr(view, '__name__'): elif callable(view) and hasattr(view, '__name__'):
if str(view.__module__).startswith('django.'): branch = 'callable'
pass name = "%s.%s" % (view.__module__, view.__name__)
else: elif isclass(view) or hasattr(view, '__class__'):
name = "%s.%s" % (view.__module__, view.__name__) branch = 'class'
else: else:
branch = 'notimpl'
raise NotImplementedError("Auto-named url from view of type %s: %s" % (type(view), view)) raise NotImplementedError("Auto-named url from view of type %s: %s" % (type(view), view))
if name: if name:
branch = branch # silent pyflakes
#debug.show('branch')
#debug.show('name') #debug.show('name')
pass pass
return django_url(regex, view, kwargs=kwargs, name=name) 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 beautifulsoup4>=4.4
bibtexparser>=0.6.2 bibtexparser>=0.6.2
bleach>=1.5.0
coverage>=4.0.1,!=4.0.2 coverage>=4.0.1,!=4.0.2
#cssselect>=0.6.1 # for PyQuery #cssselect>=0.6.1 # for PyQuery
decorator>=3.4.0 decorator>=3.4.0