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:
parent
19d585255a
commit
aa5e61d958
|
@ -28,7 +28,7 @@ class CommunityList(models.Model):
|
|||
if self.user:
|
||||
return urlreverse(ietf.community.views.view_list, kwargs={ 'username': self.user.username })
|
||||
elif self.group:
|
||||
return urlreverse("group_docs", kwargs={ 'acronym': self.group.acronym })
|
||||
return urlreverse("ietf.group.views.group_documents", kwargs={ 'acronym': self.group.acronym })
|
||||
return ""
|
||||
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from django.conf.urls import url
|
||||
|
||||
|
||||
from ietf.community import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^personal/(?P<username>[^/]+)/$', views.view_list),
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# Copyright The IETF Trust 2010, All Rights Reserved
|
||||
|
||||
from django.conf.urls import url
|
||||
from ietf.cookies import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.preferences),
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from django.conf.urls import url
|
||||
|
||||
|
||||
from ietf.dbtemplate import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^(?P<acronym>[-a-z0-9]+)/$', views.template_list, name='template_list'),
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
# Copyright The IETF Trust 2007, All Rights Reserved
|
||||
|
||||
from django.conf.urls import url
|
||||
from django.views.generic import RedirectView
|
||||
from django.http import HttpResponsePermanentRedirect
|
||||
from django.shortcuts import get_object_or_404
|
||||
|
||||
from ietf.group.models import Group
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', RedirectView.as_view(url='/doc/', permanent=True)),
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
from django.conf.urls import url
|
||||
from django.views.generic import RedirectView
|
||||
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^help/(?:sub)?state/(?:\d+/)?$', RedirectView.as_view(url='/doc/help/state/draft-iesg/', permanent=True)),
|
||||
url(r'^help/evaluation/$', RedirectView.as_view(url='https://www.ietf.org/iesg/voting-procedures.html', permanent=True)),
|
||||
|
|
|
@ -559,7 +559,7 @@ class EditCharterTests(TestCase):
|
|||
self.assertTrue("approved" in outbox[0]['Subject'].lower())
|
||||
self.assertTrue("iesg-secretary" in outbox[0]['To'])
|
||||
body = outbox[0].get_payload()
|
||||
for word in ["WG", "/wg/ames/charter/",
|
||||
for word in ["WG", "/wg/ames/about/",
|
||||
"Charter", "/doc/charter-ietf-ames/", ]:
|
||||
self.assertIn(word, body)
|
||||
#
|
||||
|
|
|
@ -77,7 +77,7 @@ class StatusChangeTests(TestCase):
|
|||
def test_change_state(self):
|
||||
|
||||
doc = Document.objects.get(name='status-change-imaginary-mid-review')
|
||||
url = urlreverse('status_change_change_state',kwargs=dict(name=doc.name))
|
||||
url = urlreverse('ietf.doc.views_status_change.change_state',kwargs=dict(name=doc.name))
|
||||
|
||||
login_testing_unauthorized(self, "ad", url)
|
||||
|
||||
|
@ -432,7 +432,7 @@ class StatusChangeSubmitTests(TestCase):
|
|||
f.write('This is the old proposal.')
|
||||
f.close()
|
||||
# Put the old proposal into IESG review (exercises ballot tab when looking at an older revision below)
|
||||
state_change_url = urlreverse('status_change_change_state',kwargs=dict(name=doc.name))
|
||||
state_change_url = urlreverse('ietf.doc.views_status_change.change_state',kwargs=dict(name=doc.name))
|
||||
iesgeval_pk = str(State.objects.get(slug='iesgeval',type__slug='statchg').pk)
|
||||
r = self.client.post(state_change_url,dict(new_state=iesgeval_pk))
|
||||
self.assertEqual(r.status_code, 302)
|
||||
|
|
|
@ -30,11 +30,12 @@
|
|||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
from django.conf.urls import url, include
|
||||
from django.conf.urls import include
|
||||
from django.views.generic import RedirectView
|
||||
from django.conf import settings
|
||||
|
||||
from ietf.doc import views_search, views_draft, views_ballot, views_status_change, views_doc, views_stats, views_help
|
||||
from ietf.utils.urls import url
|
||||
|
||||
session_patterns = [
|
||||
url(r'^add$', views_doc.add_sessionpresentation),
|
||||
|
@ -67,19 +68,19 @@ urlpatterns = [
|
|||
url(r'^%(name)s/(?:%(rev)s/)?bibtex/$' % settings.URL_REGEXPS, views_doc.document_bibtex),
|
||||
url(r'^%(name)s/history/$' % settings.URL_REGEXPS, views_doc.document_history, name="doc_history"),
|
||||
url(r'^%(name)s/writeup/$' % settings.URL_REGEXPS, views_doc.document_writeup, name="doc_writeup"),
|
||||
url(r'^%(name)s/email/$' % settings.URL_REGEXPS, views_doc.document_email, name="doc_email"),
|
||||
url(r'^%(name)s/email/$' % settings.URL_REGEXPS, views_doc.document_email, name="ietf.doc.views_doc.document_email"),
|
||||
url(r'^%(name)s/shepherdwriteup/$' % settings.URL_REGEXPS, views_doc.document_shepherd_writeup, name="doc_shepherd_writeup"),
|
||||
url(r'^%(name)s/references/$' % settings.URL_REGEXPS, views_doc.document_references, name="doc_references"),
|
||||
url(r'^%(name)s/referencedby/$' % settings.URL_REGEXPS, views_doc.document_referenced_by, name="doc_referenced_by"),
|
||||
url(r'^%(name)s/ballot/$' % settings.URL_REGEXPS, views_doc.document_ballot, name="doc_ballot"),
|
||||
url(r'^%(name)s/ballot/(?P<ballot_id>[0-9]+)/$' % settings.URL_REGEXPS, views_doc.document_ballot, name="doc_ballot"),
|
||||
url(r'^%(name)s/ballot/$' % settings.URL_REGEXPS, views_doc.document_ballot),
|
||||
url(r'^%(name)s/ballot/(?P<ballot_id>[0-9]+)/$' % settings.URL_REGEXPS, views_doc.document_ballot),
|
||||
url(r'^%(name)s/ballot/(?P<ballot_id>[0-9]+)/position/$' % settings.URL_REGEXPS, views_ballot.edit_position),
|
||||
url(r'^%(name)s/ballot/(?P<ballot_id>[0-9]+)/emailposition/$' % settings.URL_REGEXPS, views_ballot.send_ballot_comment, name='doc_send_ballot_comment'),
|
||||
url(r'^%(name)s/(?:%(rev)s/)?doc.json$' % settings.URL_REGEXPS, views_doc.document_json),
|
||||
url(r'^%(name)s/ballotpopup/(?P<ballot_id>[0-9]+)/$' % settings.URL_REGEXPS, views_doc.ballot_popup),
|
||||
url(r'^(?P<name>[A-Za-z0-9._+-]+)/reviewrequest/', include("ietf.doc.urls_review")),
|
||||
|
||||
url(r'^%(name)s/email-aliases/$' % settings.URL_REGEXPS, RedirectView.as_view(pattern_name='doc_email', permanent=False),name='doc_specific_email_aliases'),
|
||||
url(r'^%(name)s/email-aliases/$' % settings.URL_REGEXPS, RedirectView.as_view(pattern_name='ietf.doc.views_doc.document_email', permanent=False),name='doc_specific_email_aliases'),
|
||||
|
||||
url(r'^%(name)s/edit/state/$' % settings.URL_REGEXPS, views_draft.change_state, name='doc_change_state'), # IESG state
|
||||
url(r'^%(name)s/edit/state/(?P<state_type>iana-action|iana-review)/$' % settings.URL_REGEXPS, views_draft.change_iana_state, name='doc_change_iana_state'),
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
# Copyright The IETF Trust 2011, All Rights Reserved
|
||||
|
||||
from django.conf.urls import url
|
||||
from django.conf import settings
|
||||
|
||||
from ietf.doc import views_charter, views_doc
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^state/$', views_charter.change_state, name='charter_change_state'),
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from django.conf.urls import url
|
||||
|
||||
from ietf.doc import views_conflict_review, views_doc
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^state/$', views_conflict_review.change_state, name='conflict_review_change_state'),
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from django.conf.urls import url
|
||||
|
||||
from ietf.doc import views_material
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^(?P<action>state|title|abstract|revise)/$', views_material.edit_material, name="material_edit"),
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
from django.conf.urls import url
|
||||
from ietf.doc import views_review
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views_review.request_review),
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
from django.conf.urls import url
|
||||
|
||||
from ietf.doc import views_status_change, views_doc
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^state/$', views_status_change.change_state, name='status_change_change_state'),
|
||||
url(r'^state/$', views_status_change.change_state),
|
||||
url(r'^submit/$', views_status_change.submit, name='status_change_submit'),
|
||||
url(r'^ad/$', views_status_change.edit_ad, name='status_change_ad'),
|
||||
url(r'^title/$', views_status_change.edit_title, name='status_change_title'),
|
||||
|
|
|
@ -116,7 +116,7 @@ def edit_position(request, name, ballot_id):
|
|||
if 'ballot_edit_return_point' in request.session:
|
||||
return_to_url = request.session['ballot_edit_return_point']
|
||||
else:
|
||||
return_to_url = urlreverse("doc_ballot", kwargs=dict(name=doc.name, ballot_id=ballot_id))
|
||||
return_to_url = urlreverse("ietf.doc.views_doc.document_ballot", kwargs=dict(name=doc.name, ballot_id=ballot_id))
|
||||
|
||||
# if we're in the Secretariat, we can select an AD to act as stand-in for
|
||||
if has_role(request.user, "Secretariat"):
|
||||
|
@ -245,12 +245,12 @@ def send_ballot_comment(request, name, ballot_id):
|
|||
if 'ballot_edit_return_point' in request.session:
|
||||
return_to_url = request.session['ballot_edit_return_point']
|
||||
else:
|
||||
return_to_url = urlreverse("doc_ballot", kwargs=dict(name=doc.name, ballot_id=ballot_id))
|
||||
return_to_url = urlreverse("ietf.doc.views_doc.document_ballot", kwargs=dict(name=doc.name, ballot_id=ballot_id))
|
||||
|
||||
if 'HTTP_REFERER' in request.META:
|
||||
back_url = request.META['HTTP_REFERER']
|
||||
else:
|
||||
back_url = urlreverse("doc_ballot", kwargs=dict(name=doc.name, ballot_id=ballot_id))
|
||||
back_url = urlreverse("ietf.doc.views_doc.document_ballot", kwargs=dict(name=doc.name, ballot_id=ballot_id))
|
||||
|
||||
# if we're in the Secretariat, we can select an AD to act as stand-in for
|
||||
if not has_role(request.user, "Area Director"):
|
||||
|
|
|
@ -73,14 +73,14 @@ def render_document_top(request, doc, tab, name):
|
|||
|
||||
ballot = doc.latest_event(BallotDocEvent, type="created_ballot")
|
||||
if doc.type_id in ("draft","conflrev", "statchg"):
|
||||
tabs.append(("IESG Evaluation Record", "ballot", urlreverse("doc_ballot", kwargs=dict(name=name)), ballot, None if ballot else "IESG Evaluation Ballot has not been created yet"))
|
||||
tabs.append(("IESG Evaluation Record", "ballot", urlreverse("ietf.doc.views_doc.document_ballot", kwargs=dict(name=name)), ballot, None if ballot else "IESG Evaluation Ballot has not been created yet"))
|
||||
elif doc.type_id == "charter" and doc.group.type_id == "wg":
|
||||
tabs.append(("IESG Review", "ballot", urlreverse("doc_ballot", kwargs=dict(name=name)), ballot, None if ballot else "IESG Review Ballot has not been created yet"))
|
||||
tabs.append(("IESG Review", "ballot", urlreverse("ietf.doc.views_doc.document_ballot", kwargs=dict(name=name)), ballot, None if ballot else "IESG Review Ballot has not been created yet"))
|
||||
|
||||
if doc.type_id == "draft" or (doc.type_id == "charter" and doc.group.type_id == "wg"):
|
||||
tabs.append(("IESG Writeups", "writeup", urlreverse("doc_writeup", kwargs=dict(name=name)), True, None))
|
||||
|
||||
tabs.append(("Email expansions","email",urlreverse("doc_email", kwargs=dict(name=name)), True, None))
|
||||
tabs.append(("Email expansions","email",urlreverse("ietf.doc.views_doc.document_email", kwargs=dict(name=name)), True, None))
|
||||
tabs.append(("History", "history", urlreverse("doc_history", kwargs=dict(name=name)), True, None))
|
||||
|
||||
if name.startswith("rfc"):
|
||||
|
@ -260,7 +260,7 @@ def document_main(request, name, rev=None):
|
|||
elif group.type_id in ("rg", "wg"):
|
||||
submission = "%s %s" % (group.acronym, group.type)
|
||||
if group.type_id == "wg":
|
||||
submission = "<a href=\"%s\">%s</a>" % (urlreverse("group_home", kwargs=dict(group_type=group.type_id, acronym=group.acronym)), submission)
|
||||
submission = "<a href=\"%s\">%s</a>" % (urlreverse("ietf.group.views.group_home", kwargs=dict(group_type=group.type_id, acronym=group.acronym)), submission)
|
||||
if doc.stream_id and doc.get_state_slug("draft-stream-%s" % doc.stream_id) == "c-adopt":
|
||||
submission = "candidate for %s" % submission
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ class GroupAdmin(admin.ModelAdmin):
|
|||
|
||||
# SDO reminder
|
||||
def get_urls(self):
|
||||
from django.conf.urls import url
|
||||
from ietf.utils.urls import url
|
||||
|
||||
def wrap(view):
|
||||
def wrapper(*args, **kwargs):
|
||||
|
|
|
@ -10,7 +10,7 @@ class GroupFeatures(object):
|
|||
has_reviews = False
|
||||
has_default_jabber = False
|
||||
customize_workflow = False
|
||||
about_page = "group_about"
|
||||
about_page = "ietf.group.views.group_about"
|
||||
default_tab = about_page
|
||||
material_types = ["slides"]
|
||||
admin_roles = ["chair"]
|
||||
|
@ -23,10 +23,10 @@ class GroupFeatures(object):
|
|||
self.customize_workflow = True
|
||||
self.has_default_jabber = True
|
||||
self.has_dependencies = True
|
||||
self.default_tab = "group_docs"
|
||||
self.default_tab = "ietf.group.views.group_documents"
|
||||
elif group.type_id in ("team",):
|
||||
self.has_materials = True
|
||||
self.default_tab = "group_about"
|
||||
self.default_tab = "ietf.group.views.group_about"
|
||||
elif group.type_id in ("program",):
|
||||
self.has_documents = True
|
||||
self.has_milestones = True
|
||||
|
@ -35,7 +35,7 @@ class GroupFeatures(object):
|
|||
self.admin_roles = ["chair", "secr"]
|
||||
|
||||
if self.has_chartering_process:
|
||||
self.about_page = "group_charter"
|
||||
self.about_page = "ietf.group.views.group_about"
|
||||
|
||||
from ietf.review.utils import active_review_teams
|
||||
if group in active_review_teams():
|
||||
|
|
|
@ -342,7 +342,7 @@ class GroupPagesTests(TestCase):
|
|||
self.assertTrue(doc.title in unicontent(r))
|
||||
self.assertTrue(doc.name in unicontent(r))
|
||||
|
||||
url = urlreverse("group_materials", kwargs={ 'acronym': group.acronym })
|
||||
url = urlreverse("ietf.group.views.materials", kwargs={ 'acronym': group.acronym })
|
||||
|
||||
# try deleting the document and check it's gone
|
||||
doc.set_state(State.objects.get(type="slides", slug="deleted"))
|
||||
|
@ -429,7 +429,7 @@ class GroupEditTests(TestCase):
|
|||
def test_create(self):
|
||||
make_test_data()
|
||||
|
||||
url = urlreverse('group_create', kwargs=dict(group_type="wg"))
|
||||
url = urlreverse('ietf.group.views_edit.edit', kwargs=dict(group_type="wg", action="charter"))
|
||||
login_testing_unauthorized(self, "secretary", url)
|
||||
|
||||
num_wgs = len(Group.objects.filter(type="wg"))
|
||||
|
@ -488,7 +488,7 @@ class GroupEditTests(TestCase):
|
|||
|
||||
make_test_data()
|
||||
|
||||
url = urlreverse('group_create', kwargs=dict(group_type="rg"))
|
||||
url = urlreverse('ietf.group.views_edit.edit', kwargs=dict(group_type="rg", action="charter"))
|
||||
login_testing_unauthorized(self, "secretary", url)
|
||||
|
||||
irtf = Group.objects.get(acronym='irtf')
|
||||
|
@ -513,7 +513,7 @@ class GroupEditTests(TestCase):
|
|||
def test_create_based_on_existing_bof(self):
|
||||
make_test_data()
|
||||
|
||||
url = urlreverse('group_create', kwargs=dict(group_type="wg"))
|
||||
url = urlreverse('ietf.group.views_edit.edit', kwargs=dict(group_type="wg", action="charter"))
|
||||
login_testing_unauthorized(self, "secretary", url)
|
||||
|
||||
group = Group.objects.get(acronym="mars")
|
||||
|
@ -548,7 +548,7 @@ class GroupEditTests(TestCase):
|
|||
make_test_data()
|
||||
group = Group.objects.get(acronym="mars")
|
||||
|
||||
url = urlreverse('group_edit', kwargs=dict(group_type=group.type_id, acronym=group.acronym))
|
||||
url = urlreverse('ietf.group.views_edit.edit', kwargs=dict(group_type=group.type_id, acronym=group.acronym, action="edit"))
|
||||
login_testing_unauthorized(self, "secretary", url)
|
||||
|
||||
# normal get
|
||||
|
@ -625,7 +625,7 @@ class GroupEditTests(TestCase):
|
|||
review_req = make_review_data(doc)
|
||||
group = review_req.team
|
||||
|
||||
url = urlreverse('group_edit', kwargs=dict(group_type=group.type_id, acronym=group.acronym))
|
||||
url = urlreverse('ietf.group.views_edit.edit', kwargs=dict(group_type=group.type_id, acronym=group.acronym, action="edit"))
|
||||
login_testing_unauthorized(self, "secretary", url)
|
||||
|
||||
# normal get
|
||||
|
|
|
@ -1,20 +1,21 @@
|
|||
# Copyright The IETF Trust 2007, All Rights Reserved
|
||||
|
||||
from django.conf.urls import url, include
|
||||
from django.conf.urls import include
|
||||
from django.conf import settings
|
||||
|
||||
from ietf.group import views, views_ajax, views_edit
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.active_groups),
|
||||
url(r'^groupmenu.json', views_ajax.group_menu_data, None, "group_menu_data"),
|
||||
url(r'^%(acronym)s.json$' % settings.URL_REGEXPS, views_ajax.group_json),
|
||||
url(r'^chartering/$', views.chartering_groups),
|
||||
url(r'^chartering/create/(?P<group_type>(wg|rg))/$', views_edit.edit, {'action': "charter"}, "group_create"),
|
||||
url(r'^chartering/create/(?P<group_type>(wg|rg))/$', views_edit.edit, {'action': "charter"}),
|
||||
url(r'^concluded/$', views.concluded_groups),
|
||||
url(r'^email-aliases/$', views.email_aliases),
|
||||
url(r'^all-status/$', views.all_status),
|
||||
|
||||
url(r'^%(acronym)s/$' % settings.URL_REGEXPS, views.group_home, None, "group_home"),
|
||||
url(r'^%(acronym)s/$' % settings.URL_REGEXPS, views.group_home),
|
||||
url(r'^%(acronym)s/' % settings.URL_REGEXPS, include('ietf.group.urls_info_details')),
|
||||
]
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
# Copyright The IETF Trust 2008, All Rights Reserved
|
||||
|
||||
from django.conf.urls import url, include
|
||||
from django.conf.urls import include
|
||||
from django.views.generic import RedirectView
|
||||
from django.conf import settings
|
||||
|
||||
from ietf.group import views, views_edit
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.active_groups),
|
||||
|
@ -19,7 +20,7 @@ urlpatterns = [
|
|||
url(r'^chartering/create/$', RedirectView.as_view(url='/group/chartering/create/%(group_type)s/', permanent=True)),
|
||||
url(r'^bofs/$', views.bofs),
|
||||
url(r'^email-aliases/$', views.email_aliases),
|
||||
url(r'^bofs/create/$', views_edit.edit, {'action': "create", }, "bof_create"),
|
||||
url(r'^bofs/create/$', views_edit.edit, {'action': "create", }),
|
||||
url(r'^photos/$', views.chair_photos),
|
||||
url(r'^%(acronym)s/' % settings.URL_REGEXPS, include('ietf.group.urls_info_details')),
|
||||
]
|
||||
|
|
|
@ -1,20 +1,20 @@
|
|||
from django.conf.urls import url
|
||||
from django.views.generic import RedirectView
|
||||
|
||||
from ietf.community import views as community_views
|
||||
from ietf.doc import views_material as material_views
|
||||
from ietf.group import views, views_edit, views_review, milestones as milestone_views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.group_home, None, "group_home"),
|
||||
url(r'^$', views.group_home),
|
||||
url(r'^documents/txt/$', views.group_documents_txt),
|
||||
url(r'^documents/$', views.group_documents, None, "group_docs"),
|
||||
url(r'^documents/$', views.group_documents),
|
||||
url(r'^documents/manage/$', community_views.manage_list),
|
||||
url(r'^documents/csv/$', community_views.export_to_csv),
|
||||
url(r'^documents/feed/$', community_views.feed),
|
||||
url(r'^documents/subscription/$', community_views.subscription),
|
||||
url(r'^charter/$', views.group_about, None, 'group_charter'),
|
||||
url(r'^about/$', views.group_about, None, 'group_about'),
|
||||
url(r'^charter/$', views.group_about),
|
||||
url(r'^about/$', views.group_about),
|
||||
url(r'^about/status/$', views.group_about_status),
|
||||
url(r'^about/status/edit/$', views.group_about_status_edit),
|
||||
url(r'^about/status/meeting/(?P<num>\d+)/$', views.group_about_status_meeting),
|
||||
|
@ -22,13 +22,13 @@ urlpatterns = [
|
|||
url(r'^email/$', views.email),
|
||||
url(r'^deps/(?P<output_type>[\w-]+)/$', views.dependencies),
|
||||
url(r'^meetings/$', views.meetings),
|
||||
url(r'^edit/$', views_edit.edit, {'action': "edit"}, "group_edit"),
|
||||
url(r'^edit/$', views_edit.edit, {'action': "edit"}),
|
||||
url(r'^conclude/$', views_edit.conclude),
|
||||
url(r'^milestones/$', milestone_views.edit_milestones, {'milestone_set': "current"}, "group_edit_milestones"),
|
||||
url(r'^milestones/charter/$', milestone_views.edit_milestones, {'milestone_set': "charter"}, "group_edit_charter_milestones"),
|
||||
url(r'^milestones/charter/reset/$', milestone_views.reset_charter_milestones, None, "group_reset_charter_milestones"),
|
||||
url(r'^workflow/$', views_edit.customize_workflow),
|
||||
url(r'^materials/$', views.materials, None, "group_materials"),
|
||||
url(r'^materials/$', views.materials),
|
||||
url(r'^materials/new/$', material_views.choose_material_type),
|
||||
url(r'^materials/new/(?P<doc_type>[\w-]+)/$', material_views.edit_material, { 'action': "new" }, "group_new_material"),
|
||||
url(r'^archives/$', views.derived_archives),
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
# Copyright The IETF Trust 2008, All Rights Reserved
|
||||
|
||||
from django.conf.urls import url
|
||||
from django.conf import settings
|
||||
|
||||
import views_stream
|
||||
from ietf.group import views_stream
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views_stream.streams),
|
||||
|
|
|
@ -169,9 +169,9 @@ def construct_group_menu_context(request, group, selected, group_type, others):
|
|||
if group.features.has_documents:
|
||||
entries.append(("Documents", urlreverse("ietf.group.views.group_documents", kwargs=kwargs)))
|
||||
if group.features.has_chartering_process:
|
||||
entries.append(("Charter", urlreverse("group_charter", kwargs=kwargs)))
|
||||
entries.append(("Charter", urlreverse("ietf.group.views.group_about", kwargs=kwargs)))
|
||||
else:
|
||||
entries.append(("About", urlreverse("group_about", kwargs=kwargs)))
|
||||
entries.append(("About", urlreverse("ietf.group.views.group_about", kwargs=kwargs)))
|
||||
if group.features.has_materials and get_group_materials(group).exists():
|
||||
entries.append(("Materials", urlreverse("ietf.group.views.materials", kwargs=kwargs)))
|
||||
if group.features.has_reviews:
|
||||
|
@ -220,7 +220,7 @@ def construct_group_menu_context(request, group, selected, group_type, others):
|
|||
|
||||
|
||||
if group.state_id != "conclude" and (is_admin or can_manage):
|
||||
actions.append((u"Edit group", urlreverse("group_edit", kwargs=kwargs)))
|
||||
actions.append((u"Edit group", urlreverse("ietf.group.views_edit.edit", dict(kwargs, action="edit"))))
|
||||
|
||||
if group.features.customize_workflow and (is_admin or can_manage):
|
||||
actions.append((u"Customize workflow", urlreverse("ietf.group.views_edit.customize_workflow", kwargs=kwargs)))
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from django.conf.urls import url
|
||||
|
||||
from ietf.help import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^state/(?P<doc>[-\w]+)/(?P<type>[-\w]+)/?$', views.state),
|
||||
|
|
|
@ -32,11 +32,11 @@
|
|||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
from django.conf.urls import url
|
||||
from django.views.generic import RedirectView
|
||||
from django.conf import settings
|
||||
|
||||
from ietf.iesg import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^telechat/.*$', RedirectView.as_view(url='https://www.ietf.org/iesg/minutes.html', permanent=True)),
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
# Copyright The IETF Trust 2007, 2009, All Rights Reserved
|
||||
|
||||
from django.conf.urls import url
|
||||
from django.contrib.auth.views import login, logout
|
||||
|
||||
from ietf.ietfauth import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.index),
|
||||
|
|
|
@ -10,7 +10,7 @@ from ietf.ipr.models import IprDisclosureBase
|
|||
class LatestIprDisclosuresFeed(Feed):
|
||||
feed_type = Atom1Feed
|
||||
title = "IPR Disclosures to the IETF"
|
||||
link = reverse_lazy('ipr_showlist')
|
||||
link = reverse_lazy('ietf.ipr.views.showlist')
|
||||
description = "Updates on new IPR Disclosures made to the IETF."
|
||||
language = "en"
|
||||
feed_url = "/feed/ipr/"
|
||||
|
|
|
@ -29,7 +29,7 @@ class IprDisclosureBase(models.Model):
|
|||
return self.title
|
||||
|
||||
def get_absolute_url(self):
|
||||
return settings.IDTRACKER_BASE_URL + reverse('ipr_show',kwargs={'id':self.id})
|
||||
return settings.IDTRACKER_BASE_URL + reverse('ietf.ipr.views.show',kwargs={'id':self.id})
|
||||
|
||||
def get_child(self):
|
||||
"""Returns the child instance"""
|
||||
|
|
|
@ -108,14 +108,14 @@ class IprTests(TestCase):
|
|||
def test_showlist(self):
|
||||
make_test_data()
|
||||
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
|
||||
r = self.client.get(urlreverse("ipr_showlist"))
|
||||
r = self.client.get(urlreverse("ietf.ipr.views.showlist"))
|
||||
self.assertEqual(r.status_code, 200)
|
||||
self.assertTrue(ipr.title in unicontent(r))
|
||||
|
||||
def test_show_posted(self):
|
||||
make_test_data()
|
||||
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
|
||||
r = self.client.get(urlreverse("ipr_show", kwargs=dict(id=ipr.pk)))
|
||||
r = self.client.get(urlreverse("ietf.ipr.views.show", kwargs=dict(id=ipr.pk)))
|
||||
self.assertEqual(r.status_code, 200)
|
||||
self.assertTrue(ipr.title in unicontent(r))
|
||||
|
||||
|
@ -123,28 +123,28 @@ class IprTests(TestCase):
|
|||
make_test_data()
|
||||
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
|
||||
ipr.set_state('parked')
|
||||
r = self.client.get(urlreverse("ipr_show", kwargs=dict(id=ipr.pk)))
|
||||
r = self.client.get(urlreverse("ietf.ipr.views.show", kwargs=dict(id=ipr.pk)))
|
||||
self.assertEqual(r.status_code, 404)
|
||||
|
||||
def test_show_pending(self):
|
||||
make_test_data()
|
||||
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
|
||||
ipr.set_state('pending')
|
||||
r = self.client.get(urlreverse("ipr_show", kwargs=dict(id=ipr.pk)))
|
||||
r = self.client.get(urlreverse("ietf.ipr.views.show", kwargs=dict(id=ipr.pk)))
|
||||
self.assertEqual(r.status_code, 404)
|
||||
|
||||
def test_show_rejected(self):
|
||||
make_test_data()
|
||||
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
|
||||
ipr.set_state('rejected')
|
||||
r = self.client.get(urlreverse("ipr_show", kwargs=dict(id=ipr.pk)))
|
||||
r = self.client.get(urlreverse("ietf.ipr.views.show", kwargs=dict(id=ipr.pk)))
|
||||
self.assertEqual(r.status_code, 404)
|
||||
|
||||
def test_show_removed(self):
|
||||
make_test_data()
|
||||
ipr = IprDisclosureBase.objects.get(title='Statement regarding rights')
|
||||
ipr.set_state('removed')
|
||||
r = self.client.get(urlreverse("ipr_show", kwargs=dict(id=ipr.pk)))
|
||||
r = self.client.get(urlreverse("ietf.ipr.views.show", kwargs=dict(id=ipr.pk)))
|
||||
self.assertEqual(r.status_code, 200)
|
||||
self.assertTrue('This IPR disclosure was removed' in unicontent(r))
|
||||
|
||||
|
@ -176,7 +176,7 @@ class IprTests(TestCase):
|
|||
draft = make_test_data()
|
||||
ipr = IprDisclosureBase.objects.get(title="Statement regarding rights").get_child()
|
||||
|
||||
url = urlreverse("ipr_search")
|
||||
url = urlreverse("ietf.ipr.views.search")
|
||||
|
||||
r = self.client.get(url)
|
||||
self.assertEqual(r.status_code, 200)
|
||||
|
|
|
@ -1,20 +1,20 @@
|
|||
# Copyright The IETF Trust 2007, All Rights Reserved
|
||||
|
||||
from django.conf.urls import url
|
||||
from django.views.generic import RedirectView
|
||||
from django.core.urlresolvers import reverse_lazy
|
||||
|
||||
from ietf.ipr import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.showlist, name='ipr_showlist'),
|
||||
url(r'^$', views.showlist),
|
||||
url(r'^about/$', views.about),
|
||||
url(r'^admin/$', RedirectView.as_view(url=reverse_lazy('ipr_admin',kwargs={'state':'pending'}), permanent=True),name="ipr_admin_main"),
|
||||
url(r'^admin/(?P<state>pending|removed|parked)/$', views.admin, name='ipr_admin'),
|
||||
url(r'^ajax/search/$', views.ajax_search, name='ipr_ajax_search'),
|
||||
url(r'^by-draft/$', views.by_draft_txt),
|
||||
url(r'^by-draft-recursive/$', views.by_draft_recursive_txt),
|
||||
url(r'^(?P<id>\d+)/$', views.show, name='ipr_show'),
|
||||
url(r'^(?P<id>\d+)/$', views.show),
|
||||
url(r'^(?P<id>\d+)/addcomment/$', views.add_comment, name='ipr_add_comment'),
|
||||
url(r'^(?P<id>\d+)/addemail/$', views.add_email, name='ipr_add_email'),
|
||||
url(r'^(?P<id>\d+)/edit/$', views.edit, name='ipr_edit'),
|
||||
|
@ -23,8 +23,8 @@ urlpatterns = [
|
|||
url(r'^(?P<id>\d+)/notify/(?P<type>update|posted)/$', views.notify, name='ipr_notify'),
|
||||
url(r'^(?P<id>\d+)/post/$', views.post, name='ipr_post'),
|
||||
url(r'^(?P<id>\d+)/state/$', views.state, name='ipr_state'),
|
||||
url(r'^update/$', RedirectView.as_view(url=reverse_lazy('ipr_showlist'), permanent=True)),
|
||||
url(r'^update/(?P<id>\d+)/$', views.update, name='ipr_update'),
|
||||
url(r'^new-(?P<type>(specific|generic|third-party))/$', views.new, name='ipr_new'),
|
||||
url(r'^search/$', views.search, name="ipr_search"),
|
||||
url(r'^update/$', RedirectView.as_view(url=reverse_lazy('ietf.ipr.views.showlist'), permanent=True)),
|
||||
url(r'^update/(?P<id>\d+)/$', views.update),
|
||||
url(r'^new-(?P<type>(specific|generic|third-party))/$', views.new),
|
||||
url(r'^search/$', views.search),
|
||||
]
|
||||
|
|
|
@ -296,7 +296,7 @@ def edit(request, id, updates=None):
|
|||
desc="Changed disclosure metadata")
|
||||
|
||||
messages.success(request,'Disclosure modified')
|
||||
return redirect("ipr_show", id=ipr.id)
|
||||
return redirect("ietf.ipr.views.show", id=ipr.id)
|
||||
|
||||
else:
|
||||
if ipr.updates:
|
||||
|
@ -320,7 +320,7 @@ def email(request, id):
|
|||
if request.method == 'POST':
|
||||
button_text = request.POST.get('submit', '')
|
||||
if button_text == 'Cancel':
|
||||
return redirect("ipr_show", id=ipr.id)
|
||||
return redirect("ietf.ipr.views.show", id=ipr.id)
|
||||
|
||||
form = MessageModelForm(request.POST)
|
||||
if form.is_valid():
|
||||
|
@ -349,7 +349,7 @@ def email(request, id):
|
|||
send_mail_message(None,msg)
|
||||
|
||||
messages.success(request, 'Email sent.')
|
||||
return redirect('ipr_show', id=ipr.id)
|
||||
return redirect('ietf.ipr.views.show', id=ipr.id)
|
||||
|
||||
else:
|
||||
reply_to = get_reply_to()
|
||||
|
@ -455,7 +455,9 @@ def new(request, type, updates=None):
|
|||
valid_formsets = True
|
||||
|
||||
if form.is_valid() and valid_formsets:
|
||||
updates = form.cleaned_data.get('updates')
|
||||
if 'updates' in form.cleaned_data:
|
||||
updates = form.cleaned_data['updates']
|
||||
del form.cleaned_data['updates']
|
||||
disclosure = form.save(commit=False)
|
||||
disclosure.by = person
|
||||
disclosure.state = IprDisclosureStateName.objects.get(slug='pending')
|
||||
|
@ -528,7 +530,7 @@ def notify(request, id, type):
|
|||
message = message,
|
||||
)
|
||||
messages.success(request,'Notifications sent')
|
||||
return redirect("ipr_show", id=ipr.id)
|
||||
return redirect("ietf.ipr.views.show", id=ipr.id)
|
||||
|
||||
else:
|
||||
if type == 'update':
|
||||
|
@ -700,7 +702,7 @@ def get_details_tabs(ipr, selected):
|
|||
return [
|
||||
t + (t[0].lower() == selected.lower(),)
|
||||
for t in [
|
||||
('Disclosure', urlreverse('ipr_show', kwargs={ 'id': ipr.pk })),
|
||||
('Disclosure', urlreverse('ietf.ipr.views.show', kwargs={ 'id': ipr.pk })),
|
||||
('History', urlreverse('ipr_history', kwargs={ 'id': ipr.pk }))
|
||||
]]
|
||||
|
||||
|
@ -770,7 +772,7 @@ def state(request, id):
|
|||
desc=form.cleaned_data['comment']
|
||||
)
|
||||
messages.success(request, 'State Changed')
|
||||
return redirect("ipr_show", id=ipr.id)
|
||||
return redirect("ietf.ipr.views.show", id=ipr.id)
|
||||
else:
|
||||
form = StateForm(initial={'state':ipr.state.pk,'private':True})
|
||||
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
# Copyright The IETF Trust 2007, All Rights Reserved
|
||||
|
||||
from django.conf.urls import url
|
||||
from django.views.generic import RedirectView, TemplateView
|
||||
|
||||
from ietf.liaisons import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^help/$', TemplateView.as_view(template_name='liaisons/help.html')),
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
# Copyright The IETF Trust 2007, All Rights Reserved
|
||||
|
||||
from django.conf.urls import url
|
||||
from django.views.generic import RedirectView
|
||||
|
||||
from ietf.mailinglists import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^wg/$', views.groups),
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
from django.conf.urls import url
|
||||
from django.views.generic import RedirectView
|
||||
from django.core.urlresolvers import reverse_lazy
|
||||
|
||||
from ietf.mailtrigger import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', RedirectView.as_view(url=reverse_lazy('mailtrigger_show_triggers'), permanent=True)),
|
||||
url(r'^name/$', views.show_triggers, name='mailtrigger_show_triggers' ),
|
||||
url(r'^$', RedirectView.as_view(url=reverse_lazy('ietf.mailtrigger.views.show_triggers'), permanent=True)),
|
||||
url(r'^name/$', views.show_triggers),
|
||||
url(r'^name/(?P<mailtrigger_slug>[-\w]+)/$', views.show_triggers ),
|
||||
url(r'^recipient/$', views.show_recipients ),
|
||||
url(r'^recipient/(?P<recipient_slug>[-\w]+)/$', views.show_recipients ),
|
||||
|
|
|
@ -5,6 +5,7 @@ import time
|
|||
from pyquery import PyQuery
|
||||
from unittest import skipIf
|
||||
|
||||
import django.contrib.auth.views
|
||||
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
|
||||
from django.core.urlresolvers import reverse as urlreverse
|
||||
#from django.test.utils import override_settings
|
||||
|
@ -126,7 +127,7 @@ class SlideReorderTests(StaticLiveServerTestCase):
|
|||
return '%s%s'%(self.live_server_url,urlreverse(*args,**kwargs))
|
||||
|
||||
def secr_login(self):
|
||||
url = '%s%s'%(self.live_server_url, urlreverse('django.contrib.auth.views.login'))
|
||||
url = '%s%s'%(self.live_server_url, urlreverse(django.contrib.auth.views.login))
|
||||
self.driver.get(url)
|
||||
self.driver.find_element_by_name('username').send_keys('secretary')
|
||||
self.driver.find_element_by_name('password').send_keys('secretary+password')
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
# Copyright The IETF Trust 2007, All Rights Reserved
|
||||
|
||||
from django.conf.urls import url, include
|
||||
from django.conf.urls import include
|
||||
from django.views.generic import RedirectView
|
||||
from django.conf import settings
|
||||
|
||||
from ietf.meeting import views
|
||||
from ietf.meeting import ajax
|
||||
from ietf.meeting import views, ajax
|
||||
from ietf.utils.urls import url
|
||||
|
||||
safe_for_all_meeting_types = [
|
||||
url(r'^session/(?P<acronym>[-a-z0-9]+)/?$', views.session_details),
|
||||
|
@ -38,8 +38,8 @@ type_ietf_only_patterns = [
|
|||
url(r'^agenda/by-type$', views.agenda_by_type),
|
||||
url(r'^agenda/by-type/(?P<type>[a-z]+)$', views.agenda_by_type),
|
||||
url(r'^agenda/by-type/(?P<type>[a-z]+)/ics$', views.agenda_by_type_ics),
|
||||
url(r'^agendas/list$', views.list_agendas, name='meeting_list_agendas'),
|
||||
url(r'^agendas/edit$', RedirectView.as_view(pattern_name='meeting_list_agendas', permanent=True)),
|
||||
url(r'^agendas/list$', views.list_agendas),
|
||||
url(r'^agendas/edit$', RedirectView.as_view(pattern_name='ietf.meeting.views.list_agendas', permanent=True)),
|
||||
url(r'^timeslots/edit$', views.edit_timeslots),
|
||||
url(r'^rooms$', ajax.timeslot_roomsurl),
|
||||
url(r'^room/(?P<roomid>\d+).json$', ajax.timeslot_roomurl),
|
||||
|
|
|
@ -1757,11 +1757,11 @@ def interim_request(request):
|
|||
meeting = form.save(date=get_earliest_session_date(formset))
|
||||
|
||||
# need to use curry here to pass custom variable to form init
|
||||
SessionFormset.form = staticmethod(curry(
|
||||
InterimSessionModelForm,
|
||||
SessionFormset.form.__init__ = curry(
|
||||
InterimSessionModelForm.__init__,
|
||||
user=request.user,
|
||||
group=group,
|
||||
is_approved_or_virtual=(is_approved or is_virtual)))
|
||||
is_approved_or_virtual=(is_approved or is_virtual))
|
||||
formset = SessionFormset(instance=meeting, data=request.POST)
|
||||
formset.is_valid()
|
||||
formset.save()
|
||||
|
@ -1777,11 +1777,11 @@ def interim_request(request):
|
|||
# subsequently dealt with individually
|
||||
elif meeting_type == 'series':
|
||||
series = []
|
||||
SessionFormset.form = staticmethod(curry(
|
||||
InterimSessionModelForm,
|
||||
SessionFormset.form.__init__ = curry(
|
||||
InterimSessionModelForm.__init__,
|
||||
user=request.user,
|
||||
group=group,
|
||||
is_approved_or_virtual=(is_approved or is_virtual)))
|
||||
is_approved_or_virtual=(is_approved or is_virtual))
|
||||
formset = SessionFormset(instance=Meeting(), data=request.POST)
|
||||
formset.is_valid() # re-validate
|
||||
for session_form in formset.forms:
|
||||
|
@ -1896,13 +1896,15 @@ def interim_request_edit(request, number):
|
|||
data=request.POST)
|
||||
group = Group.objects.get(pk=form.data['group'])
|
||||
is_approved = is_meeting_approved(meeting)
|
||||
SessionFormset.form = staticmethod(curry(
|
||||
InterimSessionModelForm,
|
||||
|
||||
SessionFormset.form.__init__ = curry(
|
||||
InterimSessionModelForm.__init__,
|
||||
user=request.user,
|
||||
group=group,
|
||||
is_approved_or_virtual=is_approved))
|
||||
formset = SessionFormset(instance=meeting,
|
||||
data=request.POST)
|
||||
is_approved_or_virtual=is_approved)
|
||||
|
||||
formset = SessionFormset(instance=meeting, data=request.POST)
|
||||
|
||||
if form.is_valid() and formset.is_valid():
|
||||
meeting = form.save(date=get_earliest_session_date(formset))
|
||||
formset.save()
|
||||
|
|
|
@ -26,7 +26,7 @@ class MessageTests(TestCase):
|
|||
)
|
||||
msg.related_groups.add(nomcom)
|
||||
|
||||
r = self.client.get(urlreverse("nomcom_announcement", kwargs=dict(message_id=msg.id)))
|
||||
r = self.client.get(urlreverse("ietf.message.views.message", kwargs=dict(message_id=msg.id)))
|
||||
self.assertEqual(r.status_code, 200)
|
||||
self.assertTrue(msg.subject in unicontent(r))
|
||||
self.assertTrue(msg.to in unicontent(r))
|
||||
|
|
|
@ -9,6 +9,7 @@ import re
|
|||
import smtplib
|
||||
import unicodedata
|
||||
|
||||
# old-style middleware
|
||||
class SQLLogMiddleware(object):
|
||||
def process_response(self, request, response):
|
||||
for q in connection.queries:
|
||||
|
@ -16,6 +17,15 @@ class SQLLogMiddleware(object):
|
|||
log(q['sql'])
|
||||
return response
|
||||
|
||||
# new-style middleware
|
||||
def sql_log_middleware_factory(get_response):
|
||||
def sql_log_middleware(request):
|
||||
response = get_response(request)
|
||||
for q in connection.queries:
|
||||
if re.match('(update|insert)', q['sql'], re.IGNORECASE):
|
||||
log(q['sql'])
|
||||
return response
|
||||
|
||||
class SMTPExceptionMiddleware(object):
|
||||
def process_exception(self, request, exception):
|
||||
if isinstance(exception, smtplib.SMTPException):
|
||||
|
@ -24,6 +34,11 @@ class SMTPExceptionMiddleware(object):
|
|||
{'exception': extype, 'args': value, 'traceback': "".join(tb)} )
|
||||
return None
|
||||
|
||||
def smtp_exception_middleware_factory(get_response):
|
||||
def smtp_exception_middleware(request):
|
||||
response = get_response(request)
|
||||
return response
|
||||
|
||||
class RedirectTrailingPeriod(object):
|
||||
def process_response(self, request, response):
|
||||
if response.status_code == 404 and request.path.endswith("."):
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
import functools
|
||||
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.utils.http import urlquote
|
||||
|
@ -12,4 +14,4 @@ def nomcom_private_key_required(view_func):
|
|||
return HttpResponseRedirect('%s?back_to=%s' % (reverse('nomcom_private_key', None, args=(year, )), urlquote(request.get_full_path())))
|
||||
else:
|
||||
return view_func(request, *args, **kwargs)
|
||||
return inner
|
||||
return functools.update_wrapper(inner, view_func)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
from django.conf.urls import url
|
||||
from django.views.generic import RedirectView
|
||||
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^nomcom/$', RedirectView.as_view(url="/nomcom/ann/", permanent=True)),
|
||||
url(r'^nomcom/(?P<message_id>\d+)/$', RedirectView.as_view(url="/nomcom/ann/%(message_id)s/", permanent=True)),
|
||||
|
|
|
@ -76,7 +76,7 @@ class NomcomViewsTest(TestCase):
|
|||
self.year = NOMCOM_YEAR
|
||||
|
||||
# private urls
|
||||
self.private_index_url = reverse('nomcom_private_index', kwargs={'year': self.year})
|
||||
self.private_index_url = reverse('ietf.nomcom.views.private_index', kwargs={'year': self.year})
|
||||
self.private_merge_person_url = reverse('ietf.nomcom.views.private_merge_person', kwargs={'year': self.year})
|
||||
self.private_merge_nominee_url = reverse('ietf.nomcom.views.private_merge_nominee', kwargs={'year': self.year})
|
||||
self.edit_members_url = reverse('nomcom_edit_members', kwargs={'year': self.year})
|
||||
|
@ -1131,7 +1131,7 @@ class InactiveNomcomTests(TestCase):
|
|||
self.assertEqual(response.status_code, 403)
|
||||
|
||||
def test_cannot_modify_nominees(self):
|
||||
url = reverse('nomcom_private_index', kwargs={'year':self.nc.year()})
|
||||
url = reverse('ietf.nomcom.views.private_index', kwargs={'year':self.nc.year()})
|
||||
login_testing_unauthorized(self, self.chair.user.username, url)
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
@ -1287,7 +1287,7 @@ class FeedbackLastSeenTests(TestCase):
|
|||
self.assertEqual( len(q('.label-success')), 0 )
|
||||
|
||||
def test_feedback_nominee_badges(self):
|
||||
url = reverse('nomcom_view_feedback_nominee',kwargs={'year':self.nc.year(),'nominee_id':self.nominee.id})
|
||||
url = reverse('ietf.nomcom.views.view_feedback_nominee', kwargs={'year':self.nc.year(), 'nominee_id':self.nominee.id})
|
||||
login_testing_unauthorized(self, self.member.user.username, url)
|
||||
provide_private_key_to_test_client(self)
|
||||
response = self.client.get(url)
|
||||
|
@ -1679,7 +1679,7 @@ Junk body for testing
|
|||
self.assertEqual(response.status_code, 404)
|
||||
|
||||
def test_edit_nominee(self):
|
||||
nominee = self.nc.nominee_set.first()
|
||||
nominee = self.nc.nominee_set.order_by('pk').first()
|
||||
new_email = EmailFactory(person=nominee.person)
|
||||
url = reverse('nomcom_edit_nominee',kwargs={'year':self.nc.year(),'nominee_id':nominee.id})
|
||||
login_testing_unauthorized(self,self.chair.user.username,url)
|
||||
|
@ -1687,7 +1687,7 @@ Junk body for testing
|
|||
self.assertEqual(response.status_code, 200)
|
||||
response = self.client.post(url,{'nominee_email':new_email.address})
|
||||
self.assertEqual(response.status_code, 302)
|
||||
nominee = self.nc.nominee_set.first()
|
||||
nominee = self.nc.nominee_set.order_by('pk').first()
|
||||
self.assertEqual(nominee.email,new_email)
|
||||
|
||||
def test_request_merge(self):
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
from django.conf.urls import url
|
||||
|
||||
from ietf.nomcom.forms import EditMembersForm, EditMembersFormPreview
|
||||
from ietf.nomcom import views
|
||||
from ietf.message import views as message_views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.index),
|
||||
url(r'^ann/$', views.announcements),
|
||||
url(r'^(?P<year>\d{4})/private/$', views.private_index, name='nomcom_private_index'),
|
||||
url(r'^(?P<year>\d{4})/private/$', views.private_index),
|
||||
url(r'^(?P<year>\d{4})/private/key/$', views.private_key, name='nomcom_private_key'),
|
||||
url(r'^(?P<year>\d{4})/private/help/$', views.configuration_help, name='nomcom_chair_help'),
|
||||
url(r'^(?P<year>\d{4})/private/nominate/$', views.private_nominate, name='nomcom_private_nominate'),
|
||||
|
@ -18,7 +18,7 @@ urlpatterns = [
|
|||
url(r'^(?P<year>\d{4})/private/view-feedback/$', views.view_feedback, name='nomcom_view_feedback'),
|
||||
url(r'^(?P<year>\d{4})/private/view-feedback/unrelated/$', views.view_feedback_unrelated, name='nomcom_view_feedback_unrelated'),
|
||||
url(r'^(?P<year>\d{4})/private/view-feedback/pending/$', views.view_feedback_pending, name='nomcom_view_feedback_pending'),
|
||||
url(r'^(?P<year>\d{4})/private/view-feedback/nominee/(?P<nominee_id>\d+)$', views.view_feedback_nominee, name='nomcom_view_feedback_nominee'),
|
||||
url(r'^(?P<year>\d{4})/private/view-feedback/nominee/(?P<nominee_id>\d+)$', views.view_feedback_nominee),
|
||||
url(r'^(?P<year>\d{4})/private/edit/nominee/(?P<nominee_id>\d+)$', views.edit_nominee, name='nomcom_edit_nominee'),
|
||||
url(r'^(?P<year>\d{4})/private/merge-nominee/?$', views.private_merge_nominee),
|
||||
url(r'^(?P<year>\d{4})/private/merge-person/?$', views.private_merge_person),
|
||||
|
@ -42,5 +42,5 @@ urlpatterns = [
|
|||
url(r'^(?P<year>\d{4})/nominate/newperson$', views.public_nominate_newperson, name='nomcom_public_nominate_newperson'),
|
||||
url(r'^(?P<year>\d{4})/process-nomination-status/(?P<nominee_position_id>\d+)/(?P<state>[\w]+)/(?P<date>[\d]+)/(?P<hash>[a-f0-9]+)/$', views.process_nomination_status, name='nomcom_process_nomination_status'),
|
||||
# use the generic view from message
|
||||
url(r'^ann/(?P<message_id>\d+)/$', message_views.message, {'group_type': "nomcom" }, "nomcom_announcement"),
|
||||
url(r'^ann/(?P<message_id>\d+)/$', message_views.message, {'group_type': "nomcom" }),
|
||||
]
|
||||
|
|
|
@ -113,7 +113,7 @@ def private_key(request, year):
|
|||
else:
|
||||
messages.warning(request, "You don't have a private decryption key set for this session yet")
|
||||
|
||||
back_url = request.GET.get('back_to', reverse('nomcom_private_index', None, args=(year, )))
|
||||
back_url = request.GET.get('back_to', reverse('ietf.nomcom.views.private_index', None, args=(year, )))
|
||||
if request.method == 'POST':
|
||||
form = PrivateKeyForm(data=request.POST)
|
||||
if form.is_valid():
|
||||
|
@ -276,7 +276,7 @@ def private_merge_person(request, year):
|
|||
if form.is_valid():
|
||||
form.save()
|
||||
messages.success(request, 'A merge request has been sent to the secretariat.')
|
||||
return redirect('nomcom_private_index',year=year)
|
||||
return redirect('ietf.nomcom.views.private_index',year=year)
|
||||
else:
|
||||
form = MergePersonForm(nomcom=nomcom)
|
||||
|
||||
|
@ -301,7 +301,7 @@ def private_merge_nominee(request, year):
|
|||
if form.is_valid():
|
||||
form.save()
|
||||
messages.success(request, 'The Nominee records have been joined.')
|
||||
return redirect('nomcom_private_index',year=year)
|
||||
return redirect('ietf.nomcom.views.private_index',year=year)
|
||||
else:
|
||||
form = MergeNomineeForm(nomcom=nomcom)
|
||||
|
||||
|
@ -811,7 +811,7 @@ def edit_nominee(request, year, nominee_id):
|
|||
if form.is_valid():
|
||||
form.save()
|
||||
messages.success(request, 'The nomination address for %s has been changed to %s'%(nominee.name(),nominee.email.address))
|
||||
return redirect('nomcom_private_index', year=year)
|
||||
return redirect('ietf.nomcom.views.private_index', year=year)
|
||||
else:
|
||||
form = EditNomineeForm(instance=nominee)
|
||||
|
||||
|
|
|
@ -85,7 +85,7 @@ class SearchablePersonsField(forms.CharField):
|
|||
|
||||
# doing this in the constructor is difficult because the URL
|
||||
# patterns may not have been fully constructed there yet
|
||||
self.widget.attrs["data-ajax-url"] = urlreverse("ajax_select2_search_person_email", kwargs={ "model_name": self.model.__name__.lower() })
|
||||
self.widget.attrs["data-ajax-url"] = urlreverse("ietf.person.views.ajax_select2_search", kwargs={ "model_name": self.model.__name__.lower() })
|
||||
query_args = {}
|
||||
if self.only_users:
|
||||
query_args["user"] = "1"
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
from django.conf.urls import url
|
||||
from ietf.person import views, ajax
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^search/(?P<model_name>(person|email))/$', views.ajax_select2_search, None, 'ajax_select2_search_person_email'),
|
||||
url(r'^search/(?P<model_name>(person|email))/$', views.ajax_select2_search),
|
||||
url(r'^(?P<personid>[a-z0-9]+).json$', ajax.person_json),
|
||||
url(ur'^(?P<email_or_name>[-\w\s\']+)', views.profile),
|
||||
]
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# Copyright The IETF Trust 2007, All Rights Reserved
|
||||
|
||||
from django.conf.urls import url
|
||||
|
||||
from ietf.redirects import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^(?P<script>.*?\.cgi)(/.*)?$', views.redirect),
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from django.conf.urls import url
|
||||
from django.views.generic import TemplateView
|
||||
|
||||
from ietf.release import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.release),
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from django.conf.urls import url
|
||||
|
||||
from ietf.secr.announcement import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.main, name='announcement'),
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from django.conf.urls import url
|
||||
|
||||
from ietf.secr.areas import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.list_areas, name='areas'),
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from django.conf.urls import url
|
||||
|
||||
from ietf.secr.console import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.main, name='console'),
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from django.conf.urls import url
|
||||
|
||||
from ietf.secr.drafts import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.search, name='drafts'),
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from django.conf.urls import url
|
||||
from django.conf import settings
|
||||
|
||||
from ietf.secr.groups import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.search, name='groups'),
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from django.conf.urls import url
|
||||
|
||||
from ietf.secr.meetings import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.main, name='meetings'),
|
||||
|
@ -20,7 +20,7 @@ urlpatterns = [
|
|||
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/select/$', views.select_group, name='meetings_select_group'),
|
||||
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/times/$', views.times, name='meetings_times'),
|
||||
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/times/delete/(?P<time>[0-9\:]+)/$', views.times_delete, name='meetings_times_delete'),
|
||||
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/times/edit/(?P<time>[0-9\:]+)/$', views.times_edit, name='meetings_times_edit'),
|
||||
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/times/edit/(?P<time>[0-9\:]+)/$', views.times_edit),
|
||||
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/unschedule/(?P<session_id>\d{1,6})/$', views.unschedule, name='meetings_unschedule'),
|
||||
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/(?P<acronym>[-a-z0-9]+)/schedule/$', views.schedule, name='meetings_schedule'),
|
||||
url(r'^(?P<meeting_id>\d{1,6})/(?P<acronym>[-a-z0-9]+)/remove/$', views.remove_session, name='meetings_remove_session'),
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from django.conf.urls import url
|
||||
from django.conf import settings
|
||||
from ietf.meeting.views import OldUploadRedirect
|
||||
from ietf.utils.urls import url
|
||||
|
||||
from ietf.secr.proceedings import views
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from django.conf.urls import url
|
||||
from django.conf import settings
|
||||
|
||||
from ietf.secr.roles import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.main, name='roles'),
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from django.conf.urls import url
|
||||
|
||||
from ietf.secr.rolodex import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.search, name='rolodex'),
|
||||
|
|
|
@ -45,7 +45,7 @@ class SubmitRequestCase(TestCase):
|
|||
def test_submit_request(self):
|
||||
make_test_data()
|
||||
group = Group.objects.get(acronym='mars')
|
||||
url = reverse('sessions_new',kwargs={'acronym':group.acronym})
|
||||
url = reverse('ietf.secr.sreq.views.new',kwargs={'acronym':group.acronym})
|
||||
post_data = {'num_session':'1',
|
||||
'length_session1':'3600',
|
||||
'attendees':'10',
|
||||
|
@ -58,7 +58,7 @@ class SubmitRequestCase(TestCase):
|
|||
def test_submit_request_invalid(self):
|
||||
make_test_data()
|
||||
group = Group.objects.get(acronym='mars')
|
||||
url = reverse('sessions_new',kwargs={'acronym':group.acronym})
|
||||
url = reverse('ietf.secr.sreq.views.new',kwargs={'acronym':group.acronym})
|
||||
post_data = {'num_session':'2',
|
||||
'length_session1':'3600',
|
||||
'attendees':'10',
|
||||
|
@ -134,7 +134,7 @@ class LockAppTestCase(TestCase):
|
|||
meeting.session_request_lock_message='locked'
|
||||
meeting.save()
|
||||
group = Group.objects.get(acronym='mars')
|
||||
url = reverse('sessions_new',kwargs={'acronym':group.acronym})
|
||||
url = reverse('ietf.secr.sreq.views.new',kwargs={'acronym':group.acronym})
|
||||
|
||||
# try as WG Chair
|
||||
self.client.login(username="marschairman", password="marschairman+password")
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from django.conf.urls import url
|
||||
from django.conf import settings
|
||||
|
||||
from ietf.secr.sreq import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.main, name='sessions'),
|
||||
|
@ -12,7 +12,7 @@ urlpatterns = [
|
|||
url(r'^%(acronym)s/cancel/$' % settings.URL_REGEXPS, views.cancel, name='sessions_cancel'),
|
||||
url(r'^%(acronym)s/confirm/$' % settings.URL_REGEXPS, views.confirm, name='sessions_confirm'),
|
||||
url(r'^%(acronym)s/edit/$' % settings.URL_REGEXPS, views.edit, name='sessions_edit'),
|
||||
url(r'^%(acronym)s/new/$' % settings.URL_REGEXPS, views.new, name='sessions_new'),
|
||||
url(r'^%(acronym)s/new/$' % settings.URL_REGEXPS, views.new),
|
||||
url(r'^%(acronym)s/no_session/$' % settings.URL_REGEXPS, views.no_session, name='sessions_no_session'),
|
||||
url(r'^(?P<num>[A-Za-z0-9_\-\+]+)/%(acronym)s/edit/$' % settings.URL_REGEXPS, views.edit_mtg, name='sessions_edit'),
|
||||
]
|
||||
|
|
|
@ -457,7 +457,7 @@ def edit_mtg(request, num, acronym):
|
|||
|
||||
else:
|
||||
if not sessions:
|
||||
return redirect('sessions_new', acronym=acronym)
|
||||
return redirect('ietf.secr.sreq.views.new', acronym=acronym)
|
||||
form = SessionForm(initial=initial)
|
||||
|
||||
return render(request, 'sreq/edit.html', {
|
||||
|
@ -493,7 +493,7 @@ def main(request):
|
|||
if button_text == 'Group will not meet':
|
||||
return redirect('sessions_no_session', acronym=request.POST['group'])
|
||||
else:
|
||||
return redirect('sessions_new', acronym=request.POST['group'])
|
||||
return redirect('ietf.secr.sreq.views.new', acronym=request.POST['group'])
|
||||
|
||||
meeting = get_meeting()
|
||||
scheduled_groups,unscheduled_groups = groups_by_session(request.user, meeting, types=['wg','rg','ag'])
|
||||
|
@ -568,7 +568,7 @@ def new(request, acronym):
|
|||
previous_sessions = Session.objects.filter(meeting=previous_meeting,group=group).exclude(status__in=('notmeet','deleted')).order_by('id')
|
||||
if not previous_sessions:
|
||||
messages.warning(request, 'This group did not meet at %s' % previous_meeting)
|
||||
return redirect('sessions_new', acronym=acronym)
|
||||
return redirect('ietf.secr.sreq.views.new', acronym=acronym)
|
||||
|
||||
initial = get_initial_session(previous_sessions)
|
||||
add_essential_people(group,initial)
|
||||
|
@ -696,7 +696,7 @@ def view(request, acronym, num = None):
|
|||
if is_locked:
|
||||
return redirect('sessions')
|
||||
else:
|
||||
return redirect('sessions_new', acronym=acronym)
|
||||
return redirect('ietf.secr.sreq.views.new', acronym=acronym)
|
||||
|
||||
# TODO simulate activity records
|
||||
activities = [{'act_date':sessions[0].requested.strftime('%b %d, %Y'),
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from django.conf.urls import url
|
||||
|
||||
from ietf.secr.telechat import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.main, name='telechat'),
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
<td>{{ item.time|date:"D" }}</td>
|
||||
<td>{{ item.time|date:"H:i" }} - {{ item.end_time|date:"H:i" }}</td>
|
||||
<td>{{ item.name }}</td>
|
||||
<td><a href="{% url "meetings_times_edit" meeting_id=meeting.number schedule_name=schedule.name time=item.time|date:"Y:m:d:H:i" %}">Edit</a></td>
|
||||
<td><a href="{% url "ietf.secr.meetings.views.times_edit" meeting_id=meeting.number schedule_name=schedule.name time=item.time|date:"Y:m:d:H:i" %}">Edit</a></td>
|
||||
<td><a href="{% url "meetings_times_delete" meeting_id=meeting.number schedule_name=schedule.name time=item.time|date:"Y:m:d:H:i" %}" onclick="return window.confirm('Are you sure you want to delete this timeslot? Any sessions assigned to this timeslot will be unscheduled.');">Delete</a></td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
<ul>
|
||||
{% for group in unscheduled_groups %}
|
||||
<li>
|
||||
<a href="{% url "sessions_new" acronym=group.acronym %}">{{ group.acronym }}</a>
|
||||
<a href="{% url "ietf.secr.sreq.views.new" acronym=group.acronym %}">{{ group.acronym }}</a>
|
||||
{% if group.not_meeting %}
|
||||
<span class="required"> (Currently, this group does not plan to hold a session at IETF {{ meeting.number }})</span>
|
||||
{% endif %}
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
<br>
|
||||
<ul class="session-buttons">
|
||||
<li><button onclick="if (window.confirm('A message will be sent to agenda@ietf.com as well as to the area director(s).\n\nContinue?')) { window.location='{% url "sessions_no_session" acronym=group.acronym %}'};">Send a notification that the group does not plan to hold a session at IETF {{ meeting.number }}</button></li>
|
||||
<li><button onclick="window.location='{% url "sessions_new" acronym=group.acronym %}?previous'">Retrieve all information from previous meeting</button></li>
|
||||
<li><button onclick="window.location='{% url "ietf.secr.sreq.views.new" acronym=group.acronym %}?previous'">Retrieve all information from previous meeting</button></li>
|
||||
</ul>
|
||||
|
||||
{% include "includes/sessions_request_form.html" %}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from django.conf.urls import url
|
||||
|
||||
from ietf.submit import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.upload_submission),
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from django.conf.urls import url
|
||||
|
||||
from ietf.sync import views
|
||||
from ietf.utils.urls import url
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^discrepancies/$', views.discrepancies),
|
||||
|
|
|
@ -57,7 +57,7 @@
|
|||
<li><a href="{% url "ietf.submit.views.approvals" %}">Approve a draft</a></li>
|
||||
|
||||
{% for g in user|managed_groups %}
|
||||
<li><a href="{% url "group_docs" g.acronym %}">{{ g.acronym }} {{ g.type.slug }} docs</a></li>
|
||||
<li><a href="{% url "ietf.group.views.group_documents" g.acronym %}">{{ g.acronym }} {{ g.type.slug }} docs</a></li>
|
||||
{% endfor %}
|
||||
{% for g in user|managed_groups %}
|
||||
<li><a href="{% url "ietf.group.views.meetings" g.acronym %}">{{ g.acronym }} {{ g.type.slug }} meetings</a></li>
|
||||
|
|
|
@ -91,7 +91,7 @@
|
|||
{% if group.charter %}
|
||||
<a class="btn btn-default pull-right" href="{% url "doc_view" name=name %}">Back</a>
|
||||
{% else %}
|
||||
<a class="btn btn-default pull-right" href="{% url "group_charter" group_type=group.type_id acronym=group.acronym %}">Back</a>
|
||||
<a class="btn btn-default pull-right" href="{% url "ietf.group.views.group_about" group_type=group.type_id acronym=group.acronym %}">Back</a>
|
||||
{% endif %}
|
||||
{% endbuttons %}
|
||||
</form>
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
<li class="disabled"><span><b>Ballots</b></span></li>
|
||||
{% for b in all_ballots %}
|
||||
<li {% if b == ballot %}class="active"{% endif %}>
|
||||
<a href="{% url "doc_ballot" name=doc.name ballot_id=b.pk %}">
|
||||
<a href="{% url "ietf.doc.views_doc.document_ballot" name=doc.name ballot_id=b.pk %}">
|
||||
{{ b.ballot_type.name }} ({{ b.rev }})
|
||||
</a>
|
||||
</li>
|
||||
|
|
|
@ -512,7 +512,7 @@
|
|||
|
||||
<div class="buttonlist">
|
||||
<a class="btn btn-default btn-xs" href="mailto:{{ doc.name }}@ietf.org?subject=Mail%20regarding%20{{ doc.name }}"><span class="fa fa-envelope-o"></span> Email authors</a>
|
||||
<a class="btn btn-default btn-xs" href="{% url "ipr_search" %}?submit=draft&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&id={{ doc.name }}" rel="nofollow"><span class="fa fa-bolt"></span> IPR {% if doc.related_ipr %} <span class="badge">{{doc.related_ipr|length}}</span>{% endif %}</a>
|
||||
<a class="btn btn-default btn-xs" href="{% url "doc_references" doc.canonical_name %}" rel="nofollow"><span class="fa fa-long-arrow-left"></span> References</a>
|
||||
<a class="btn btn-default btn-xs" href="{% url "doc_referenced_by" doc.canonical_name %}" rel="nofollow"><span class="fa fa-long-arrow-right"></span> Referenced by</a>
|
||||
<a class="btn btn-default btn-xs" href="https://www.ietf.org/tools/idnits?url=https://www.ietf.org/archive/id/{{ doc.filename_with_rev }}" rel="nofollow" target="_blank"><span class="fa fa-exclamation"></span> Nits</a>
|
||||
|
|
|
@ -76,7 +76,7 @@
|
|||
<th><a href="{% url "state_help" type="status-change" %}">State</a></th>
|
||||
<td class="edit">
|
||||
{% if not snapshot and user|has_role:"Area Director,Secretariat" %}
|
||||
<a class="btn btn-default btn-xs pull-right" href="{% url "status_change_change_state" name=doc.name %}">Edit</a>
|
||||
<a class="btn btn-default btn-xs pull-right" href="{% url "ietf.doc.views_status_change.change_state" name=doc.name %}">Edit</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
{% if action == "new" %}
|
||||
<p class="help-block">
|
||||
Below you can upload a document for the group {{ group.name }}
|
||||
<a href="{% url "group_materials" acronym=group.acronym %}">({{ group.acronym }})</a>.
|
||||
<a href="{% url "ietf.group.views.materials" acronym=group.acronym %}">({{ group.acronym }})</a>.
|
||||
The document will appear under the materials tab in the group pages.
|
||||
</p>
|
||||
|
||||
|
@ -22,7 +22,7 @@
|
|||
{% elif action == "revise" %}
|
||||
<p>
|
||||
Below you can upload a new revision of {{ doc_name }} for the group {{ group.name }}
|
||||
<a href="{% url "group_materials" acronym=group.acronym %}">({{ group.acronym }})</a>.
|
||||
<a href="{% url "ietf.group.views.materials" acronym=group.acronym %}">({{ group.acronym }})</a>.
|
||||
</p>
|
||||
|
||||
<h2>Upload New Revision</h2>
|
||||
|
@ -34,7 +34,7 @@
|
|||
{% bootstrap_form form %}
|
||||
|
||||
{% buttons %}
|
||||
<a class="btn btn-default pull-right" href="{% if doc_name %}{% url "doc_view" name=doc_name %}{% else %}{% url "group_materials" acronym=group.acronym %}{% endif %}">Back</a>
|
||||
<a class="btn btn-default pull-right" href="{% if doc_name %}{% url "doc_view" name=doc_name %}{% else %}{% url "ietf.group.views.materials" acronym=group.acronym %}{% endif %}">Back</a>
|
||||
<button class="btn btn-primary" type="submit">{% if action == "new" or action == "revise" %}Upload{% else %}Save{% endif %}</button>
|
||||
{% endbuttons %}
|
||||
</form>
|
||||
|
|
|
@ -84,7 +84,7 @@
|
|||
|
||||
<td class="ipr text-center">
|
||||
{% if doc.related_ipr %}
|
||||
<a href="{% url "ipr_search" %}?submit=draft&id={{ doc.name }}">
|
||||
<a href="{% url "ietf.ipr.views.search" %}?submit=draft&id={{ doc.name }}">
|
||||
<span class="label label-default">{{ doc.related_ipr|length }}</span>
|
||||
</a>
|
||||
{% endif %}
|
||||
|
|
|
@ -20,6 +20,6 @@ The affected document{{ urls|pluralize }} can be obtained via
|
|||
{% for u in urls %}{{ settings.IDTRACKER_BASE_URL}}{{ u }}
|
||||
{% endfor %}
|
||||
IESG discussion of this request can be tracked via
|
||||
{{ settings.IDTRACKER_BASE_URL }}{% url "doc_ballot" name=doc %}
|
||||
{{ settings.IDTRACKER_BASE_URL }}{% url "ietf.doc.views_doc.document_ballot" name=doc %}
|
||||
|
||||
{% endautoescape %}
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
<p>Groups in the <i>BOF</i> state.</p>
|
||||
|
||||
{% if user|has_role:"Area Director,Secretariat" %}
|
||||
<p><a class="btn btn-default" role="button" href="{% url "bof_create" group_type="wg" %}">Create new BOF</a></p>
|
||||
<p><a class="btn btn-default" role="button" href="{% url 'ietf.group.views_edit.edit' group_type='wg' action='create' %}">Create new BOF</a></p>
|
||||
{% endif %}
|
||||
|
||||
{% if not groups %}
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
<h2>{{ t.name }}s</h2>
|
||||
|
||||
{% if t.can_manage %}
|
||||
<p><a class="btn btn-default" role="button" href="{% url "group_create" group_type=t.pk %}">Charter new {{ t.name }}</a></p>
|
||||
<p><a class="btn btn-default" role="button" href="{% url 'ietf.group.views_edit.edit' group_type=t.pk action='charter' %}">Charter new {{ t.name }}</a></p>
|
||||
{% endif %}
|
||||
|
||||
{% if not t.chartering_groups %}
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
{% buttons %}
|
||||
<button type="submit" class="btn btn-primary">Save</button>
|
||||
<a class="btn btn-default pull-right" href="{% url "ipr_show" id=ipr.id %}">Back</a>
|
||||
<a class="btn btn-default pull-right" href="{% url "ietf.ipr.views.show" id=ipr.id %}">Back</a>
|
||||
{% endbuttons %}
|
||||
</form>
|
||||
{% endblock %}
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
{% load staticfiles %}
|
||||
{% load ietf_filters %}
|
||||
{% load textfilters %}
|
||||
{% load htmlfilters %}
|
||||
|
||||
{% block title %}
|
||||
IETF {{ schedule.meeting.number }} meeting agenda
|
||||
|
@ -255,7 +256,7 @@
|
|||
|
||||
<td>
|
||||
{% if item.session.historic_group.charter %}
|
||||
<a href="{% url 'group_charter' acronym=item.session.historic_group.acronym %}">{{item.session.historic_group.acronym}}</a>
|
||||
<a href="{% url 'ietf.group.views.group_about' acronym=item.session.historic_group.acronym %}">{{item.session.historic_group.acronym}}</a>
|
||||
{% else %}
|
||||
{{item.session.historic_group.acronym}}
|
||||
{% endif %}
|
||||
|
|
|
@ -45,7 +45,7 @@
|
|||
{% for m in regime.announcements|dictsortreversed:"time" %}
|
||||
<tr>
|
||||
<td class="text-nowrap">{{ m.time|date:"Y-m-d" }}</td>
|
||||
<td><a href="{% url "nomcom_announcement" message_id=m.id %}">{{ m.subject }}</a></td>
|
||||
<td><a href="{% url "ietf.message.views.message" message_id=m.id %}">{{ m.subject }}</a></td>
|
||||
<td>{{ m.to_name }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
{% bootstrap_form form %}
|
||||
{% buttons %}
|
||||
<input class="btn btn-primary" type="submit" value="Save">
|
||||
<a class="btn btn-default pull-right" href="{% url "nomcom_private_index" year %}">Back</a>
|
||||
<a class="btn btn-default pull-right" href="{% url "ietf.nomcom.views.private_index" year %}">Back</a>
|
||||
{% endbuttons %}
|
||||
</form>
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
<h1>NomCom {{ year }} {% if nomcom.group.state_id == 'conclude' %}(Concluded){% endif %} <small>Private area {% if is_chair_task %}- Chair/Advisors only{% endif %}</small></h1>
|
||||
|
||||
<ul class="nav nav-tabs" role="tablist">
|
||||
<li {% if selected == "index" %}class="active"{% endif %}><a href="{% url "nomcom_private_index" year %}">Nominees</a></li>
|
||||
<li {% if selected == "index" %}class="active"{% endif %}><a href="{% url "ietf.nomcom.views.private_index" year %}">Nominees</a></li>
|
||||
|
||||
{% if nomcom|has_publickey %}
|
||||
<li {% if selected == "nominate" %}class="active"{% endif %}><a href="{% url "nomcom_private_nominate" year %}">Nominate</a></li>
|
||||
|
|
|
@ -89,7 +89,7 @@
|
|||
{% endif %}
|
||||
|
||||
<td>
|
||||
<a href="{% url "ietf.nomcom.views.view_feedback_nominee" year=year nominee_id=np.nominee.id %}#comment">{{ np.nominee }}</a>
|
||||
<a href="{% url 'ietf.nomcom.views.view_feedback_nominee' year=year nominee_id=np.nominee.id %}#comment">{{ np.nominee }}</a>
|
||||
</td>
|
||||
<td>{{ np.position.name }}</td>
|
||||
<td>{{ np.state }}</td>
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
{% for fb_dict in staterank.list %}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{% url "nomcom_view_feedback_nominee" year fb_dict.nominee.id %}">{{ fb_dict.nominee.name }}</a>
|
||||
<a href="{% url 'ietf.nomcom.views.view_feedback_nominee' year=year nominee_id=fb_dict.nominee.id %}">{{ fb_dict.nominee.name }}</a>
|
||||
<span class="hidden-xs"><{{fb_dict.nominee.email.address}}></span>
|
||||
</td>
|
||||
{% for fbtype_name, fbtype_count, fbtype_newflag in fb_dict.feedback %}
|
||||
|
|
|
@ -2,10 +2,13 @@
|
|||
|
||||
"""Utilities for working with HTML."""
|
||||
import html5lib
|
||||
import bleach
|
||||
from html5lib import sanitizer, serializer, tokenizer, treebuilders, treewalkers
|
||||
|
||||
class HTMLSanitizerMixin(sanitizer.HTMLSanitizerMixin):
|
||||
acceptable_elements = ('a', 'abbr', 'acronym', 'address', 'b', 'big',
|
||||
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',
|
||||
|
@ -13,7 +16,7 @@ class HTMLSanitizerMixin(sanitizer.HTMLSanitizerMixin):
|
|||
'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead',
|
||||
'tr', 'tt', 'u', 'ul', 'var')
|
||||
|
||||
acceptable_attributes = ('abbr', 'align', 'alt', 'axis', 'border',
|
||||
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',
|
||||
|
@ -21,6 +24,8 @@ class HTMLSanitizerMixin(sanitizer.HTMLSanitizerMixin):
|
|||
'span', 'src', 'start', 'summary', 'title', 'type', 'valign', 'vspace',
|
||||
'width')
|
||||
|
||||
|
||||
class HTMLSanitizerMixin(sanitizer.HTMLSanitizerMixin):
|
||||
allowed_elements = acceptable_elements
|
||||
allowed_attributes = acceptable_attributes
|
||||
allowed_css_properties = ()
|
||||
|
@ -48,3 +53,13 @@ def sanitize_html(html):
|
|||
quote_attr_values=True)
|
||||
output_generator = s.serialize(stream)
|
||||
return u''.join(output_generator)
|
||||
|
||||
def remove_tags(html, tags):
|
||||
"""Returns the given HTML sanitized, and with the given tags removed."""
|
||||
allowed = set(acceptable_elements) - set([ t.lower() for t in tags ])
|
||||
return bleach.clean(html, tags=allowed)
|
||||
remove_tags = allow_lazy(remove_tags, six.text_type)
|
||||
|
||||
def clean_html(html):
|
||||
return bleach.clean(html)
|
||||
|
|
@ -40,6 +40,7 @@ class Command(BaseCommand):
|
|||
return parser
|
||||
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument('filenames', nargs="*")
|
||||
parser.add_argument('--sections', default='template,url,code', dest='sections',
|
||||
help='Specify which kinds of coverage changes to show. Default: %(default)s\n')
|
||||
parser.add_argument('--release', dest='release',
|
||||
|
@ -172,7 +173,8 @@ class Command(BaseCommand):
|
|||
header_written = True
|
||||
self.stdout.write(self.list_line_format % (key, lval))
|
||||
|
||||
def handle(self, *filenames, **options):
|
||||
def handle(self, *args, **options):
|
||||
|
||||
sections = options.get('sections', ','.join(self.valid_sections))
|
||||
options.pop('sections')
|
||||
sections = sections.split(',')
|
||||
|
@ -183,6 +185,8 @@ class Command(BaseCommand):
|
|||
|
||||
absolute = options.get('absolute', False)
|
||||
|
||||
filenames = options.get('filenames')
|
||||
|
||||
if absolute:
|
||||
if not filenames:
|
||||
filenames = [
|
||||
|
|
|
@ -76,13 +76,16 @@ template_coverage_collection = None
|
|||
url_coverage_collection = None
|
||||
|
||||
|
||||
def safe_create_1(self, verbosity, *args, **kwargs):
|
||||
def safe_create_test_db(self, verbosity, *args, **kwargs):
|
||||
global test_database_name, old_create
|
||||
keepdb = kwargs.get('keepdb', False)
|
||||
if not keepdb:
|
||||
print " Creating test database..."
|
||||
if settings.DATABASES["default"]["ENGINE"] == 'django.db.backends.mysql':
|
||||
settings.DATABASES["default"]["OPTIONS"] = settings.DATABASE_TEST_OPTIONS
|
||||
print " Using OPTIONS: %s" % settings.DATABASES["default"]["OPTIONS"]
|
||||
test_database_name = old_create(self, 0, *args, **kwargs)
|
||||
|
||||
if settings.GLOBAL_TEST_FIXTURES:
|
||||
print " Loading global test fixtures: %s" % ", ".join(settings.GLOBAL_TEST_FIXTURES)
|
||||
loadable = [f for f in settings.GLOBAL_TEST_FIXTURES if "." not in f]
|
||||
|
@ -92,14 +95,17 @@ def safe_create_1(self, verbosity, *args, **kwargs):
|
|||
if f not in loadable:
|
||||
# try to execute the fixture
|
||||
components = f.split(".")
|
||||
module = importlib.import_module(".".join(components[:-1]))
|
||||
module_name = ".".join(components[:-1])
|
||||
module = importlib.import_module(module_name)
|
||||
fn = getattr(module, components[-1])
|
||||
fn()
|
||||
|
||||
return test_database_name
|
||||
|
||||
def safe_destroy_0_1(*args, **kwargs):
|
||||
def safe_destroy_test_db(*args, **kwargs):
|
||||
global test_database_name, old_destroy
|
||||
keepdb = kwargs.get('keepdb', False)
|
||||
if not keepdb:
|
||||
print " Checking that it's safe to destroy test database..."
|
||||
if settings.DATABASES["default"]["NAME"] != test_database_name:
|
||||
print ' NOT SAFE; Changing settings.DATABASES["default"]["NAME"] from %s to %s' % (settings.DATABASES["default"]["NAME"], test_database_name)
|
||||
|
@ -338,6 +344,7 @@ class IetfTestRunner(DiscoverRunner):
|
|||
|
||||
@classmethod
|
||||
def add_arguments(cls, parser):
|
||||
super(IetfTestRunner, cls).add_arguments(parser)
|
||||
parser.add_argument('--skip-coverage',
|
||||
action='store_true', dest='skip_coverage', default=False,
|
||||
help='Skip test coverage measurements for code, templates, and URLs. ' )
|
||||
|
@ -497,9 +504,9 @@ class IetfTestRunner(DiscoverRunner):
|
|||
raise EnvironmentError("Refusing to run tests on production server")
|
||||
|
||||
old_create = connection.creation.__class__.create_test_db
|
||||
connection.creation.__class__.create_test_db = safe_create_1
|
||||
connection.creation.__class__.create_test_db = safe_create_test_db
|
||||
old_destroy = connection.creation.__class__.destroy_test_db
|
||||
connection.creation.__class__.destroy_test_db = safe_destroy_0_1
|
||||
connection.creation.__class__.destroy_test_db = safe_destroy_test_db
|
||||
|
||||
self.run_full_test_suite = not test_labels
|
||||
|
||||
|
|
|
@ -21,7 +21,6 @@ from django.templatetags.static import StaticNode
|
|||
|
||||
import debug # pyflakes:ignore
|
||||
|
||||
import ietf.urls
|
||||
from ietf.utils.management.commands import pyflakes
|
||||
from ietf.utils.mail import send_mail_text, send_mail_mime, outbox
|
||||
from ietf.utils.test_data import make_test_data
|
||||
|
@ -162,6 +161,8 @@ class TemplateChecksTestCase(TestCase):
|
|||
urlconf can be found, a full resolution would also fail.
|
||||
"""
|
||||
#
|
||||
import ietf.urls
|
||||
|
||||
def check_that_url_tag_callbacks_exists(node, origin, callbacks):
|
||||
"""
|
||||
Check that an URLNode's callback is in callbacks.
|
||||
|
|
|
@ -7,20 +7,24 @@ from inspect import isclass
|
|||
from django.conf.urls import url as django_url
|
||||
|
||||
def url(regex, view, kwargs=None, name=None):
|
||||
if isinstance(view, (list, tuple)):
|
||||
pass # use the name passed in
|
||||
if name:
|
||||
branch = 'name'
|
||||
elif isinstance(view, (list, tuple)):
|
||||
branch = 'list'
|
||||
elif isinstance(view, six.string_types):
|
||||
branch = 'string'
|
||||
name = view
|
||||
elif isclass(view) or hasattr(view, '__class__'):
|
||||
pass
|
||||
elif callable(view) and hasattr(view, '__name__'):
|
||||
if str(view.__module__).startswith('django.'):
|
||||
pass
|
||||
else:
|
||||
branch = 'callable'
|
||||
name = "%s.%s" % (view.__module__, view.__name__)
|
||||
elif isclass(view) or hasattr(view, '__class__'):
|
||||
branch = 'class'
|
||||
else:
|
||||
branch = 'notimpl'
|
||||
raise NotImplementedError("Auto-named url from view of type %s: %s" % (type(view), view))
|
||||
if name:
|
||||
branch = branch # silent pyflakes
|
||||
#debug.show('branch')
|
||||
#debug.show('name')
|
||||
pass
|
||||
return django_url(regex, view, kwargs=kwargs, name=name)
|
||||
|
|
|
@ -3,6 +3,7 @@ setuptools>=18.5 # Require this first, to prevent later errors
|
|||
#
|
||||
beautifulsoup4>=4.4
|
||||
bibtexparser>=0.6.2
|
||||
bleach>=1.5.0
|
||||
coverage>=4.0.1,!=4.0.2
|
||||
#cssselect>=0.6.1 # for PyQuery
|
||||
decorator>=3.4.0
|
||||
|
|
Loading…
Reference in a new issue