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:
|
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 ""
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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'),
|
||||||
|
|
|
@ -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)),
|
||||||
|
|
|
@ -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)),
|
||||||
|
|
|
@ -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)
|
||||||
#
|
#
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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'),
|
||||||
|
|
|
@ -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'),
|
||||||
|
|
|
@ -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'),
|
||||||
|
|
|
@ -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"),
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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'),
|
||||||
|
|
|
@ -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"):
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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():
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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')),
|
||||||
]
|
]
|
||||||
|
|
|
@ -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')),
|
||||||
]
|
]
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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)))
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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)),
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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/"
|
||||||
|
|
|
@ -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"""
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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),
|
||||||
]
|
]
|
||||||
|
|
|
@ -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})
|
||||||
|
|
||||||
|
|
|
@ -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')),
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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 ),
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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("."):
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)),
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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" }),
|
||||||
]
|
]
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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),
|
||||||
]
|
]
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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'),
|
||||||
|
|
|
@ -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'),
|
||||||
|
|
|
@ -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'),
|
||||||
|
|
|
@ -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'),
|
||||||
|
|
|
@ -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'),
|
||||||
|
|
|
@ -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'),
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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'),
|
||||||
|
|
|
@ -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'),
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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'),
|
||||||
]
|
]
|
||||||
|
|
|
@ -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'),
|
||||||
|
|
|
@ -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'),
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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" %}
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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&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_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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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&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>
|
<span class="label label-default">{{ doc.related_ipr|length }}</span>
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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"><{{fb_dict.nominee.email.address}}></span>
|
<span class="hidden-xs"><{{fb_dict.nominee.email.address}}></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 %}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 = [
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue