Merged in Django-1.10 upgrade work from ^/personal/henrik/6.43.1-django-1.10

- Legacy-Id: 12881
This commit is contained in:
Henrik Levkowetz 2017-02-19 18:18:00 +00:00
commit 8930d29a8e
149 changed files with 874 additions and 1912 deletions

View file

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

View file

@ -1,12 +1,14 @@
from django.conf.urls import url
from ietf.community import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^personal/(?P<username>[^/]+)/$', 'ietf.community.views.view_list'),
url(r'^personal/(?P<username>[^/]+)/manage/$', 'ietf.community.views.manage_list'),
url(r'^personal/(?P<username>[^/]+)/trackdocument/(?P<name>[^/]+)/$', 'ietf.community.views.track_document'),
url(r'^personal/(?P<username>[^/]+)/untrackdocument/(?P<name>[^/]+)/$', 'ietf.community.views.untrack_document'),
url(r'^personal/(?P<username>[^/]+)/csv/$', 'ietf.community.views.export_to_csv'),
url(r'^personal/(?P<username>[^/]+)/feed/$', 'ietf.community.views.feed'),
url(r'^personal/(?P<username>[^/]+)/subscription/$', 'ietf.community.views.subscription'),
url(r'^personal/(?P<username>[^/]+)/$', views.view_list),
url(r'^personal/(?P<username>[^/]+)/manage/$', views.manage_list),
url(r'^personal/(?P<username>[^/]+)/trackdocument/(?P<name>[^/]+)/$', views.track_document),
url(r'^personal/(?P<username>[^/]+)/untrackdocument/(?P<name>[^/]+)/$', views.untrack_document),
url(r'^personal/(?P<username>[^/]+)/csv/$', views.export_to_csv),
url(r'^personal/(?P<username>[^/]+)/feed/$', views.feed),
url(r'^personal/(?P<username>[^/]+)/subscription/$', views.subscription),
]

View file

@ -1,5 +1,7 @@
# Copyright The IETF Trust 2007, All Rights Reserved
import sys
import django
from django.conf import settings
from ietf import __date__, __rev__, __version__, __patch__, __id__
@ -9,8 +11,20 @@ def server_mode(request):
def rfcdiff_base_url(request):
return {'rfcdiff_base_url': settings.RFCDIFF_BASE_URL}
def python_version():
v = sys.version_info
return "%s.%s.%s" % (v.major, v.minor, v.micro, )
def revision_info(request):
return {'revision_time': __date__[7:32], 'revision_date': __date__[7:17], 'revision_num': __rev__[6:-2], "revision_id": __id__[5:-2], "version_num": __version__+__patch__ }
return {
'revision_time': __date__[7:32],
'revision_date': __date__[7:17],
'revision_num': __rev__[6:-2],
'revision_id': __id__[5:-2],
'version_num': __version__+__patch__,
'django_version': django.get_version(),
'python_version': python_version(),
}
def debug_mark_queries_from_view(request):
"Marks the queries which has occurred so far as coming from a view."

View file

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

View file

@ -4,7 +4,7 @@ from docutils.core import publish_string
from docutils.utils import SystemMessage
import debug # pyflakes:ignore
from django.template import loaders
from django.template.loaders.base import Loader as BaseLoader
from django.template.base import Template as DjangoTemplate, TemplateEncodingError
from django.template.exceptions import TemplateDoesNotExist
from django.utils.encoding import smart_unicode
@ -61,7 +61,7 @@ class RSTTemplate(PlainTemplate):
e.args = tuple(args)
raise e
class Loader(loaders.base.Loader):
class Loader(BaseLoader):
def __init__(self, engine):
super(Loader, self).__init__(engine)
self.is_usable = True

View file

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

View file

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

View file

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

View file

@ -15,7 +15,6 @@ from django import template
from django.conf import settings
from django.utils.html import escape
from django.template.defaultfilters import truncatewords_html, linebreaksbr, stringfilter, striptags, urlize
from django.template import resolve_variable
from django.utils.safestring import mark_safe, SafeData
from django.utils.html import strip_tags
@ -396,17 +395,6 @@ def has_role(user, role_names):
return False
return has_role(user, role_names.split(','))
@register.filter
def stable_dictsort(value, arg):
"""
Like dictsort, except it's stable (preserves the order of items
whose sort key is the same). See also bug report
http://code.djangoproject.com/ticket/12110
"""
decorated = [(resolve_variable('var.' + arg, {'var' : item}), item) for item in value]
decorated.sort(lambda a, b: cmp(a[0], b[0]) if a[0] and b[0] else -1 if b[0] else 1 if a[0] else 0)
return [item[1] for item in decorated]
@register.filter
def ad_area(user):
if user and user.is_authenticated():

View file

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

View file

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

View file

@ -30,11 +30,12 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from django.conf.urls import url, include
from django.conf.urls import include
from django.views.generic import RedirectView
from django.conf import settings
from ietf.doc import views_search, views_draft, views_ballot, views_status_change, views_doc, views_stats
from ietf.doc import views_search, views_draft, views_ballot, views_status_change, views_doc, views_stats, views_help
from ietf.utils.urls import url
session_patterns = [
url(r'^add$', views_doc.add_sessionpresentation),
@ -49,7 +50,7 @@ urlpatterns = [
url(r'^in-last-call/$', views_search.drafts_in_last_call, name="drafts_in_last_call"),
url(r'^ad/(?P<name>[\w.-]+)/$(?u)', views_search.docs_for_ad, name="docs_for_ad"),
url(r'^ad2/(?P<name>[\w.-]+)/$(?u)', RedirectView.as_view(url='/doc/ad/%(name)s/', permanent=True)),
url(r'^rfc-status-changes/$', views_status_change.rfc_status_changes, name='rfc_status_changes'),
url(r'^rfc-status-changes/$', views_status_change.rfc_status_changes, name='ietf.doc.views_status_change.rfc_status_changes'),
url(r'^start-rfc-status-change/(?:%(name)s/)?$' % settings.URL_REGEXPS, views_status_change.start_rfc_status_change, name='start_rfc_status_change'),
url(r'^iesg/(?P<last_call_only>[A-Za-z0-9.-]+/)?$', views_search.drafts_in_iesg_process, name="drafts_in_iesg_process"),
url(r'^email-aliases/$', views_doc.email_aliases),
@ -67,19 +68,19 @@ urlpatterns = [
url(r'^%(name)s/(?:%(rev)s/)?bibtex/$' % settings.URL_REGEXPS, views_doc.document_bibtex),
url(r'^%(name)s/history/$' % settings.URL_REGEXPS, views_doc.document_history, name="doc_history"),
url(r'^%(name)s/writeup/$' % settings.URL_REGEXPS, views_doc.document_writeup, name="doc_writeup"),
url(r'^%(name)s/email/$' % settings.URL_REGEXPS, views_doc.document_email, name="doc_email"),
url(r'^%(name)s/email/$' % settings.URL_REGEXPS, views_doc.document_email, name="ietf.doc.views_doc.document_email"),
url(r'^%(name)s/shepherdwriteup/$' % settings.URL_REGEXPS, views_doc.document_shepherd_writeup, name="doc_shepherd_writeup"),
url(r'^%(name)s/references/$' % settings.URL_REGEXPS, views_doc.document_references, name="doc_references"),
url(r'^%(name)s/referencedby/$' % settings.URL_REGEXPS, views_doc.document_referenced_by, name="doc_referenced_by"),
url(r'^%(name)s/ballot/$' % settings.URL_REGEXPS, views_doc.document_ballot, name="doc_ballot"),
url(r'^%(name)s/ballot/(?P<ballot_id>[0-9]+)/$' % settings.URL_REGEXPS, views_doc.document_ballot, name="doc_ballot"),
url(r'^%(name)s/ballot/$' % settings.URL_REGEXPS, views_doc.document_ballot),
url(r'^%(name)s/ballot/(?P<ballot_id>[0-9]+)/$' % settings.URL_REGEXPS, views_doc.document_ballot),
url(r'^%(name)s/ballot/(?P<ballot_id>[0-9]+)/position/$' % settings.URL_REGEXPS, views_ballot.edit_position),
url(r'^%(name)s/ballot/(?P<ballot_id>[0-9]+)/emailposition/$' % settings.URL_REGEXPS, views_ballot.send_ballot_comment, name='doc_send_ballot_comment'),
url(r'^%(name)s/(?:%(rev)s/)?doc.json$' % settings.URL_REGEXPS, views_doc.document_json),
url(r'^%(name)s/ballotpopup/(?P<ballot_id>[0-9]+)/$' % settings.URL_REGEXPS, views_doc.ballot_popup),
url(r'^(?P<name>[A-Za-z0-9._+-]+)/reviewrequest/', include("ietf.doc.urls_review")),
url(r'^%(name)s/email-aliases/$' % settings.URL_REGEXPS, RedirectView.as_view(pattern_name='doc_email', permanent=False),name='doc_specific_email_aliases'),
url(r'^%(name)s/email-aliases/$' % settings.URL_REGEXPS, RedirectView.as_view(pattern_name='ietf.doc.views_doc.document_email', permanent=False),name='doc_specific_email_aliases'),
url(r'^%(name)s/edit/state/$' % settings.URL_REGEXPS, views_draft.change_state, name='doc_change_state'), # IESG state
url(r'^%(name)s/edit/state/(?P<state_type>iana-action|iana-review)/$' % settings.URL_REGEXPS, views_draft.change_iana_state, name='doc_change_iana_state'),
@ -116,9 +117,9 @@ urlpatterns = [
url(r'^%(name)s/edit/approveballot/$' % settings.URL_REGEXPS, views_ballot.approve_ballot, name='doc_approve_ballot'),
url(r'^%(name)s/edit/makelastcall/$' % settings.URL_REGEXPS, views_ballot.make_last_call, name='doc_make_last_call'),
url(r'^help/state/(?P<type>[\w-]+)/$', 'ietf.doc.views_help.state_help', name="state_help"),
url(r'^help/relationships/$', 'ietf.doc.views_help.relationship_help', name="relationship_help"),
url(r'^help/relationships/(?P<subset>\w+)/$', 'ietf.doc.views_help.relationship_help', name="relationship_subset_help"),
url(r'^help/state/(?P<type>[\w-]+)/$', views_help.state_help, name="state_help"),
url(r'^help/relationships/$', views_help.relationship_help, name="relationship_help"),
url(r'^help/relationships/(?P<subset>\w+)/$', views_help.relationship_help, name="relationship_subset_help"),
url(r'^%(name)s/meetings/?$' % settings.URL_REGEXPS, views_doc.all_presentations),

View file

@ -1,19 +1,21 @@
# Copyright The IETF Trust 2011, All Rights Reserved
from django.conf.urls import url
from django.conf import settings
from ietf.doc import views_charter, views_doc
from ietf.utils.urls import url
urlpatterns = [
url(r'^state/$', "ietf.doc.views_charter.change_state", name='charter_change_state'),
url(r'^title/$', "ietf.doc.views_charter.change_title", name='charter_change_title'),
url(r'^(?P<option>initcharter|recharter|abandon)/$', "ietf.doc.views_charter.change_state", name='charter_startstop_process'),
url(r'^telechat/$', "ietf.doc.views_doc.telechat_date", name='charter_telechat_date'),
url(r'^notify/$', "ietf.doc.views_doc.edit_notify", name='charter_edit_notify'),
url(r'^ad/$', "ietf.doc.views_charter.edit_ad", name='charter_edit_ad'),
url(r'^action/$', "ietf.doc.views_charter.action_announcement_text"),
url(r'^review/$', "ietf.doc.views_charter.review_announcement_text"),
url(r'^ballotwriteupnotes/$', "ietf.doc.views_charter.ballot_writeupnotes"),
url(r'^approve/$', "ietf.doc.views_charter.approve", name='charter_approve'),
url(r'^submit/(?:(?P<option>initcharter|recharter)/)?$', "ietf.doc.views_charter.submit", name='charter_submit'),
url(r'^withmilestones-%(rev)s.txt$' % settings.URL_REGEXPS, "ietf.doc.views_charter.charter_with_milestones_txt", name='charter_with_milestones_txt'),
url(r'^state/$', views_charter.change_state, name='charter_change_state'),
url(r'^title/$', views_charter.change_title, name='charter_change_title'),
url(r'^(?P<option>initcharter|recharter|abandon)/$', views_charter.change_state, name='charter_startstop_process'),
url(r'^telechat/$', views_doc.telechat_date, name='charter_telechat_date'),
url(r'^notify/$', views_doc.edit_notify, name='charter_edit_notify'),
url(r'^ad/$', views_charter.edit_ad, name='charter_edit_ad'),
url(r'^action/$', views_charter.action_announcement_text),
url(r'^review/$', views_charter.review_announcement_text),
url(r'^ballotwriteupnotes/$', views_charter.ballot_writeupnotes),
url(r'^approve/$', views_charter.approve, name='charter_approve'),
url(r'^submit/(?:(?P<option>initcharter|recharter)/)?$', views_charter.submit, name='charter_submit'),
url(r'^withmilestones-%(rev)s.txt$' % settings.URL_REGEXPS, views_charter.charter_with_milestones_txt, name='charter_with_milestones_txt'),
]

View file

@ -1,13 +1,15 @@
from django.conf.urls import url
from ietf.doc import views_conflict_review, views_doc
from ietf.utils.urls import url
urlpatterns = [
url(r'^state/$', "ietf.doc.views_conflict_review.change_state", name='conflict_review_change_state'),
url(r'^submit/$', "ietf.doc.views_conflict_review.submit", name='conflict_review_submit'),
url(r'^ad/$', "ietf.doc.views_conflict_review.edit_ad", name='conflict_review_ad'),
url(r'^approve/$', "ietf.doc.views_conflict_review.approve", name='conflict_review_approve'),
url(r'^start_conflict_review/$', "ietf.doc.views_conflict_review.start_review", name='conflict_review_start'),
url(r'^telechat/$', "ietf.doc.views_doc.telechat_date", name='conflict_review_telechat_date'),
url(r'^notices/$', "ietf.doc.views_doc.edit_notify", name='conflict_review_notices'),
url(r'^state/$', views_conflict_review.change_state, name='conflict_review_change_state'),
url(r'^submit/$', views_conflict_review.submit, name='conflict_review_submit'),
url(r'^ad/$', views_conflict_review.edit_ad, name='conflict_review_ad'),
url(r'^approve/$', views_conflict_review.approve, name='conflict_review_approve'),
url(r'^start_conflict_review/$', views_conflict_review.start_review, name='conflict_review_start'),
url(r'^telechat/$', views_doc.telechat_date, name='conflict_review_telechat_date'),
url(r'^notices/$', views_doc.edit_notify, name='conflict_review_notices'),
]

View file

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

View file

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

View file

@ -1,15 +1,17 @@
from django.conf.urls import url
from ietf.doc import views_status_change, views_doc
from ietf.utils.urls import url
urlpatterns = [
url(r'^state/$', "ietf.doc.views_status_change.change_state", name='status_change_change_state'),
url(r'^submit/$', "ietf.doc.views_status_change.submit", name='status_change_submit'),
url(r'^ad/$', "ietf.doc.views_status_change.edit_ad", name='status_change_ad'),
url(r'^title/$', "ietf.doc.views_status_change.edit_title", name='status_change_title'),
url(r'^approve/$', "ietf.doc.views_status_change.approve", name='status_change_approve'),
url(r'^relations/$', "ietf.doc.views_status_change.edit_relations", name='status_change_relations'),
url(r'^last-call/$', "ietf.doc.views_status_change.last_call", name='status_change_last_call'),
url(r'^telechat/$', "ietf.doc.views_doc.telechat_date", name='status_change_telechat_date'),
url(r'^notices/$', "ietf.doc.views_doc.edit_notify", name='status_change_notices'),
url(r'^state/$', views_status_change.change_state),
url(r'^submit/$', views_status_change.submit, name='status_change_submit'),
url(r'^ad/$', views_status_change.edit_ad, name='status_change_ad'),
url(r'^title/$', views_status_change.edit_title, name='status_change_title'),
url(r'^approve/$', views_status_change.approve, name='status_change_approve'),
url(r'^relations/$', views_status_change.edit_relations, name='status_change_relations'),
url(r'^last-call/$', views_status_change.last_call, name='status_change_last_call'),
url(r'^telechat/$', views_doc.telechat_date, name='status_change_telechat_date'),
url(r'^notices/$', views_doc.edit_notify, name='status_change_notices'),
]

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,34 +1,37 @@
from django.conf.urls import url
from django.views.generic import RedirectView
from ietf.group import views, views_review
from ietf.community import views as community_views
from ietf.doc import views_material as material_views
from ietf.group import views, views_edit, views_review, milestones as milestone_views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', 'ietf.group.views.group_home', None, "group_home"),
url(r'^documents/txt/$', 'ietf.group.views.group_documents_txt'),
url(r'^documents/$', 'ietf.group.views.group_documents', None, "group_docs"),
url(r'^documents/manage/$', 'ietf.community.views.manage_list'),
url(r'^documents/csv/$', 'ietf.community.views.export_to_csv'),
url(r'^documents/feed/$', 'ietf.community.views.feed'),
url(r'^documents/subscription/$', 'ietf.community.views.subscription'),
url(r'^charter/$', 'ietf.group.views.group_about', None, 'group_charter'),
url(r'^about/$', 'ietf.group.views.group_about', None, 'group_about'),
url(r'^about/status/$', 'ietf.group.views.group_about_status'),
url(r'^about/status/edit/$', 'ietf.group.views.group_about_status_edit'),
url(r'^about/status/meeting/(?P<num>\d+)/$', 'ietf.group.views.group_about_status_meeting'),
url(r'^history/$','ietf.group.views.history'),
url(r'^email/$', 'ietf.group.views.email'),
url(r'^deps/(?P<output_type>[\w-]+)/$', 'ietf.group.views.dependencies'),
url(r'^meetings/$', 'ietf.group.views.meetings'),
url(r'^edit/$', 'ietf.group.views_edit.edit', {'action': "edit"}, "group_edit"),
url(r'^conclude/$', 'ietf.group.views_edit.conclude'),
url(r'^milestones/$', 'ietf.group.milestones.edit_milestones', {'milestone_set': "current"}, "group_edit_milestones"),
url(r'^milestones/charter/$', 'ietf.group.milestones.edit_milestones', {'milestone_set': "charter"}, "group_edit_charter_milestones"),
url(r'^milestones/charter/reset/$', 'ietf.group.milestones.reset_charter_milestones', None, "group_reset_charter_milestones"),
url(r'^workflow/$', 'ietf.group.views_edit.customize_workflow'),
url(r'^materials/$', 'ietf.group.views.materials', None, "group_materials"),
url(r'^materials/new/$', 'ietf.doc.views_material.choose_material_type'),
url(r'^materials/new/(?P<doc_type>[\w-]+)/$', 'ietf.doc.views_material.edit_material', { 'action': "new" }, "group_new_material"),
url(r'^archives/$', 'ietf.group.views.derived_archives'),
url(r'^$', views.group_home),
url(r'^documents/txt/$', views.group_documents_txt),
url(r'^documents/$', views.group_documents),
url(r'^documents/manage/$', community_views.manage_list),
url(r'^documents/csv/$', community_views.export_to_csv),
url(r'^documents/feed/$', community_views.feed),
url(r'^documents/subscription/$', community_views.subscription),
url(r'^charter/$', views.group_about),
url(r'^about/$', views.group_about),
url(r'^about/status/$', views.group_about_status),
url(r'^about/status/edit/$', views.group_about_status_edit),
url(r'^about/status/meeting/(?P<num>\d+)/$', views.group_about_status_meeting),
url(r'^history/$',views.history),
url(r'^email/$', views.email),
url(r'^deps/(?P<output_type>[\w-]+)/$', views.dependencies),
url(r'^meetings/$', views.meetings),
url(r'^edit/$', views_edit.edit, {'action': "edit"}),
url(r'^conclude/$', views_edit.conclude),
url(r'^milestones/$', milestone_views.edit_milestones, {'milestone_set': "current"}, "group_edit_milestones"),
url(r'^milestones/charter/$', milestone_views.edit_milestones, {'milestone_set': "charter"}, "group_edit_charter_milestones"),
url(r'^milestones/charter/reset/$', milestone_views.reset_charter_milestones, None, "group_reset_charter_milestones"),
url(r'^workflow/$', views_edit.customize_workflow),
url(r'^materials/$', views.materials),
url(r'^materials/new/$', material_views.choose_material_type),
url(r'^materials/new/(?P<doc_type>[\w-]+)/$', material_views.edit_material, { 'action': "new" }, "group_new_material"),
url(r'^archives/$', views.derived_archives),
url(r'^photos/$', views.group_photos),
url(r'^reviews/$', views_review.review_requests),
url(r'^reviews/manage/(?P<assignment_status>assigned|unassigned)/$', views_review.manage_review_requests),
@ -36,5 +39,5 @@ urlpatterns = [
url(r'^reviewers/$', views_review.reviewer_overview),
url(r'^reviewers/(?P<reviewer_email>[\w%+-.@]+)/settings/$', views_review.change_reviewer_settings),
url(r'^secretarysettings/$', views_review.change_review_secretary_settings),
url(r'^email-aliases/$', RedirectView.as_view(pattern_name='ietf.group.views.email',permanent=False),name='old_group_email_aliases'),
url(r'^email-aliases/$', RedirectView.as_view(pattern_name=views.email,permanent=False),name='old_group_email_aliases'),
]

View file

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

View file

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

View file

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

View file

@ -32,27 +32,29 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from django.conf.urls import url
from django.views.generic import RedirectView
from django.conf import settings
from ietf.iesg import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^telechat/.*$', RedirectView.as_view(url='https://www.ietf.org/iesg/minutes.html', permanent=True)),
url(r'^ann/(?:ind|new|prev)/$', RedirectView.as_view(url="/iesg/decisions/", permanent=True)),
url(r'^telechatdates/$', RedirectView.as_view(url='/admin/iesg/telechatdate/', permanent=True)),
url(r'^decisions/(?:(?P<year>[0-9]{4})/)?$', "ietf.iesg.views.review_decisions"),
url(r'^agenda/(?:%(date)s/)?$' % settings.URL_REGEXPS, "ietf.iesg.views.agenda"),
url(r'^agenda/(?:%(date)s/)?agenda.txt$' % settings.URL_REGEXPS, "ietf.iesg.views.agenda_txt"),
url(r'^agenda/(?:%(date)s/)?agenda.json$' % settings.URL_REGEXPS, "ietf.iesg.views.agenda_json"),
url(r'^agenda/(?:%(date)s/)?scribe_template.html$' % settings.URL_REGEXPS, "ietf.iesg.views.agenda_scribe_template"),
url(r'^agenda/(?:%(date)s/)?moderator_package.html$' % settings.URL_REGEXPS, "ietf.iesg.views.agenda_moderator_package"),
url(r'^agenda/(?:%(date)s/)?agenda_package.txt$' % settings.URL_REGEXPS, "ietf.iesg.views.agenda_package"),
url(r'^decisions/(?:(?P<year>[0-9]{4})/)?$', views.review_decisions),
url(r'^agenda/(?:%(date)s/)?$' % settings.URL_REGEXPS, views.agenda),
url(r'^agenda/(?:%(date)s/)?agenda.txt$' % settings.URL_REGEXPS, views.agenda_txt),
url(r'^agenda/(?:%(date)s/)?agenda.json$' % settings.URL_REGEXPS, views.agenda_json),
url(r'^agenda/(?:%(date)s/)?scribe_template.html$' % settings.URL_REGEXPS, views.agenda_scribe_template),
url(r'^agenda/(?:%(date)s/)?moderator_package.html$' % settings.URL_REGEXPS, views.agenda_moderator_package),
url(r'^agenda/(?:%(date)s/)?agenda_package.txt$' % settings.URL_REGEXPS, views.agenda_package),
url(r'^agenda/documents.txt$', "ietf.iesg.views.agenda_documents_txt"),
url(r'^agenda/documents/$', "ietf.iesg.views.agenda_documents"),
url(r'^agenda/telechat-(?:%(date)s-)?docs.tgz' % settings.URL_REGEXPS, "ietf.iesg.views.telechat_docs_tarfile"),
url(r'^discusses/$', "ietf.iesg.views.discusses"),
url(r'^milestones/$', "ietf.iesg.views.milestones_needing_review"),
url(r'^photos/$', "ietf.iesg.views.photos"),
url(r'^agenda/documents.txt$', views.agenda_documents_txt),
url(r'^agenda/documents/$', views.agenda_documents),
url(r'^agenda/telechat-(?:%(date)s-)?docs.tgz' % settings.URL_REGEXPS, views.telechat_docs_tarfile),
url(r'^discusses/$', views.discusses),
url(r'^milestones/$', views.milestones_needing_review),
url(r'^photos/$', views.photos),
]

View file

@ -43,6 +43,11 @@ class PasswordForm(forms.Form):
raise forms.ValidationError("The two password fields didn't match.")
return password_confirmation
class PersonPasswordForm(forms.ModelForm, PasswordForm):
class Meta:
model = Person
fields = ['name', 'ascii']
def ascii_cleaner(supposedly_ascii):
outside_printable_ascii_pattern = r'[^\x20-\x7F]'
@ -173,7 +178,7 @@ from django import forms
class ChangePasswordForm(forms.Form):
current_password = forms.CharField(widget=forms.PasswordInput)
new_password = forms.CharField(widget=PasswordStrengthInput)
new_password = forms.CharField(widget=PasswordStrengthInput(attrs={'class':'password_strength'}))
new_password_confirmation = forms.CharField(widget=PasswordConfirmationInput)
def __init__(self, user, data=None):

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,8 +1,10 @@
# Copyright The IETF Trust 2007, All Rights Reserved
from django.conf.urls import url
from django.views.generic import RedirectView, TemplateView
from ietf.liaisons import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^help/$', TemplateView.as_view(template_name='liaisons/help.html')),
url(r'^help/fields/$', TemplateView.as_view(template_name='liaisons/field_help.html'), name='liaisons_field_help'),
@ -13,26 +15,26 @@ urlpatterns = [
# AJAX views
urlpatterns += [
url(r'^ajax/get_info/$', 'ietf.liaisons.views.ajax_get_liaison_info'),
url(r'^ajax/select2search/$', 'ietf.liaisons.views.ajax_select2_search_liaison_statements'),
url(r'^ajax/get_info/$', views.ajax_get_liaison_info),
url(r'^ajax/select2search/$', views.ajax_select2_search_liaison_statements),
]
# Views
urlpatterns += [
url(r'^$', 'ietf.liaisons.views.liaison_list'),
url(r'^(?P<state>(posted|pending|dead))/', 'ietf.liaisons.views.liaison_list'),
url(r'^(?P<object_id>\d+)/$', 'ietf.liaisons.views.liaison_detail'),
url(r'^(?P<object_id>\d+)/addcomment/$', 'ietf.liaisons.views.add_comment'),
url(r'^(?P<object_id>\d+)/edit/$', 'ietf.liaisons.views.liaison_edit'),
url(r'^(?P<object_id>\d+)/edit-attachment/(?P<doc_id>[A-Za-z0-9._+-]+)$', 'ietf.liaisons.views.liaison_edit_attachment'),
url(r'^(?P<object_id>\d+)/delete-attachment/(?P<attach_id>[A-Za-z0-9._+-]+)$', 'ietf.liaisons.views.liaison_delete_attachment'),
url(r'^(?P<object_id>\d+)/history/$', 'ietf.liaisons.views.liaison_history'),
url(r'^(?P<object_id>\d+)/reply/$', 'ietf.liaisons.views.liaison_reply'),
url(r'^(?P<object_id>\d+)/resend/$', 'ietf.liaisons.views.liaison_resend'),
url(r'^add/(?P<type>(incoming|outgoing))/$', 'ietf.liaisons.views.liaison_add'),
url(r'^$', views.liaison_list),
url(r'^(?P<state>(posted|pending|dead))/', views.liaison_list),
url(r'^(?P<object_id>\d+)/$', views.liaison_detail),
url(r'^(?P<object_id>\d+)/addcomment/$', views.add_comment),
url(r'^(?P<object_id>\d+)/edit/$', views.liaison_edit),
url(r'^(?P<object_id>\d+)/edit-attachment/(?P<doc_id>[A-Za-z0-9._+-]+)$', views.liaison_edit_attachment),
url(r'^(?P<object_id>\d+)/delete-attachment/(?P<attach_id>[A-Za-z0-9._+-]+)$', views.liaison_delete_attachment),
url(r'^(?P<object_id>\d+)/history/$', views.liaison_history),
url(r'^(?P<object_id>\d+)/reply/$', views.liaison_reply),
url(r'^(?P<object_id>\d+)/resend/$', views.liaison_resend),
url(r'^add/(?P<type>(incoming|outgoing))/$', views.liaison_add),
# Redirects for backwards compatibility
url(r'^add/$', 'ietf.liaisons.views.redirect_add'),
url(r'^for_approval/$', 'ietf.liaisons.views.redirect_for_approval'),
url(r'^for_approval/(?P<object_id>\d+)/$', 'ietf.liaisons.views.redirect_for_approval'),
url(r'^add/$', views.redirect_add),
url(r'^for_approval/$', views.redirect_for_approval),
url(r'^for_approval/(?P<object_id>\d+)/$', views.redirect_for_approval),
]

View file

@ -1,10 +1,12 @@
# Copyright The IETF Trust 2007, All Rights Reserved
from django.conf.urls import url
from django.views.generic import RedirectView
from ietf.mailinglists import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^wg/$', 'ietf.mailinglists.views.groups'),
url(r'^wg/$', views.groups),
url(r'^nonwg/$', RedirectView.as_view(url='https://www.ietf.org/list/nonwg.html', permanent=True)),
url(r'^nonwg/update/$', RedirectView.as_view(url='https://www.ietf.org/list/nonwg.html', permanent=True)),
url(r'^request/$', RedirectView.as_view(url='https://www.ietf.org/list/request.html', permanent=True)),

View file

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

View file

@ -3,8 +3,6 @@ from __future__ import unicode_literals
from django.db import models, migrations
import datetime
import ietf.meeting.timedeltafield
class Migration(migrations.Migration):
@ -112,7 +110,7 @@ class Migration(migrations.Migration):
('attendees', models.IntegerField(null=True, blank=True)),
('agenda_note', models.CharField(max_length=255, blank=True)),
('requested', models.DateTimeField(default=datetime.datetime.now)),
('requested_duration', ietf.meeting.timedeltafield.TimedeltaField(default=0)),
('requested_duration', models.IntegerField(default=0)),
('comments', models.TextField(blank=True)),
('scheduled', models.DateTimeField(null=True, blank=True)),
('modified', models.DateTimeField(default=datetime.datetime.now)),
@ -141,7 +139,7 @@ class Migration(migrations.Migration):
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('name', models.CharField(max_length=255)),
('time', models.DateTimeField()),
('duration', ietf.meeting.timedeltafield.TimedeltaField()),
('duration', models.IntegerField()),
('show_location', models.BooleanField(default=True, help_text=b'Show location in agenda')),
('modified', models.DateTimeField(default=datetime.datetime.now)),
('location', models.ForeignKey(blank=True, to='meeting.Room', null=True)),

View file

@ -2,8 +2,6 @@
from __future__ import unicode_literals
from django.db import models, migrations
import timedelta.fields
class Migration(migrations.Migration):
@ -27,13 +25,13 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='meeting',
name='idsubmit_cutoff_time_utc',
field=timedelta.fields.TimedeltaField(default=86399.0, help_text=b'The time of day (UTC) after which submission will be closed. Use for example 23 hours, 59 minutes, 59 seconds.'),
field=models.CharField(max_length=20, default='86399.0', help_text=b'The time of day (UTC) after which submission will be closed. Use for example 23 hours, 59 minutes, 59 seconds.'),
preserve_default=True,
),
migrations.AddField(
model_name='meeting',
name='idsubmit_cutoff_warning_days',
field=timedelta.fields.TimedeltaField(default=1814400.0, help_text=b'How long before the 00 cutoff to start showing cutoff warnings. Use for example 21 days or 3 weeks.'),
field=models.CharField(max_length=20, default='1814400.0', help_text=b'How long before the 00 cutoff to start showing cutoff warnings. Use for example 21 days or 3 weeks.'),
preserve_default=True,
),
]

View file

@ -2,8 +2,6 @@
from __future__ import unicode_literals
from django.db import models, migrations
import timedelta.fields
class Migration(migrations.Migration):
@ -27,13 +25,13 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='meeting',
name='idsubmit_cutoff_time_utc',
field=timedelta.fields.TimedeltaField(default=86399.0, help_text=b'The time of day (UTC) after which submission will be closed. Use for example 23 hours, 59 minutes, 59 seconds.', blank=True),
field=models.CharField(max_length=20, default='86399.0', help_text=b'The time of day (UTC) after which submission will be closed. Use for example 23 hours, 59 minutes, 59 seconds.', blank=True),
preserve_default=True,
),
migrations.AlterField(
model_name='meeting',
name='idsubmit_cutoff_warning_days',
field=timedelta.fields.TimedeltaField(default=1814400.0, help_text=b'How long before the 00 cutoff to start showing cutoff warnings. Use for example 21 days or 3 weeks.', blank=True),
field=models.CharField(max_length=20, default='1814400.0', help_text=b'How long before the 00 cutoff to start showing cutoff warnings. Use for example 21 days or 3 weeks.', blank=True),
preserve_default=True,
),
]

View file

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

View file

@ -1,188 +0,0 @@
# -*- coding: iso-8859-1 -*-
# $Id: TimedeltaField.py 1787 2011-04-20 07:09:57Z tguettler $
# $HeadURL: svn+ssh://svnserver/svn/djangotools/trunk/dbfields/TimedeltaField.py $
# from http://djangosnippets.org/snippets/1060/ with some fixes
# Python
import datetime
# Django
import django
from django import forms
from django.db import models
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _
SECS_PER_DAY=3600*24
class TimedeltaField(models.Field):
u'''
Store Python's datetime.timedelta in an integer column.
Most database systems only support 32 bit integers by default.
'''
__metaclass__ = models.SubfieldBase
empty_strings_allowed = False
def __init__(self, *args, **kwargs):
super(TimedeltaField, self).__init__(*args, **kwargs)
def to_python(self, value):
if (value is None) or isinstance(value, datetime.timedelta):
return value
try:
# else try to convert to int (e.g. from string)
value = int(value)
except (TypeError, ValueError):
raise django.core.exceptions.ValidationError(
_("This value must be an integer or a datetime.timedelta."))
return datetime.timedelta(seconds=value)
def get_internal_type(self):
return 'IntegerField'
def get_db_prep_lookup(self, lookup_type, value, connection=None, prepared=False):
raise NotImplementedError() # SQL WHERE
def get_db_prep_save(self, value, connection=None, prepared=False):
if (value is None) or isinstance(value, int):
return value
return SECS_PER_DAY*value.days+value.seconds
def formfield(self, *args, **kwargs):
defaults={'form_class': TimedeltaFormField}
defaults.update(kwargs)
return super(TimedeltaField, self).formfield(*args, **defaults)
def value_to_string(self, obj):
value = self._get_val_from_obj(obj)
return self.get_db_prep_value(value) # pylint: disable=no-value-for-parameter
class TimedeltaFormField(forms.Field):
default_error_messages = {
'invalid': _(u'Enter a whole number.'),
}
def __init__(self, *args, **kwargs):
defaults={'widget': TimedeltaWidget}
defaults.update(kwargs)
super(TimedeltaFormField, self).__init__(*args, **defaults)
def clean(self, value):
# value comes from Timedelta.Widget.value_from_datadict(): tuple of strings
super(TimedeltaFormField, self).clean(value)
assert len(value)==len(self.widget.inputs), (value, self.widget.inputs)
i=0
for value, multiply in zip(value, self.widget.multiply):
try:
i+=int(value)*multiply
except (ValueError, TypeError):
raise forms.ValidationError(self.error_messages['invalid'])
return i
class TimedeltaWidget(forms.Widget):
INPUTS=['days', 'hours', 'minutes', 'seconds']
MULTIPLY=[60*60*24, 60*60, 60, 1]
def __init__(self, attrs=None):
self.widgets=[]
if not attrs:
attrs={}
inputs=attrs.get('inputs', self.INPUTS)
multiply=[]
for input in inputs:
assert input in self.INPUTS, (input, self.INPUT)
self.widgets.append(forms.TextInput(attrs=attrs))
multiply.append(self.MULTIPLY[self.INPUTS.index(input)])
self.inputs=inputs
self.multiply=multiply
super(TimedeltaWidget, self).__init__(attrs)
def render(self, name, value, attrs):
if value is None:
values=[0 for i in self.inputs]
elif isinstance(value, datetime.timedelta):
values=split_seconds(value.days*SECS_PER_DAY+value.seconds, self.inputs, self.multiply)
elif isinstance(value, int):
# initial data from model
values=split_seconds(value, self.inputs, self.multiply)
else:
assert isinstance(value, tuple), (value, type(value))
assert len(value)==len(self.inputs), (value, self.inputs)
values=value
id=attrs.pop('id')
assert not attrs, attrs
rendered=[]
for input, widget, val in zip(self.inputs, self.widgets, values):
rendered.append(u'%s %s' % (_(input), widget.render('%s_%s' % (name, input), val)))
return mark_safe('<div id="%s">%s</div>' % (id, ' '.join(rendered)))
def value_from_datadict(self, data, files, name):
# Don't throw ValidationError here, just return a tuple of strings.
ret=[]
for input, multi in zip(self.inputs, self.multiply):
ret.append(data.get('%s_%s' % (name, input), 0))
return tuple(ret)
def _has_changed(self, initial_value, data_value):
# data_value comes from value_from_datadict(): A tuple of strings.
if initial_value is None:
return bool(set(data_value)!=set([u'0']))
assert isinstance(initial_value, datetime.timedelta), initial_value
initial=tuple([unicode(i) for i in split_seconds(initial_value.days*SECS_PER_DAY+initial_value.seconds, self.inputs, self.multiply)])
assert len(initial)==len(data_value), (initial, data_value)
return bool(initial!=data_value)
def main():
assert split_seconds(1000000)==[11, 13, 46, 40]
field=TimedeltaField()
td=datetime.timedelta(days=10, seconds=11)
s=field.get_db_prep_save(td)
assert isinstance(s, int), (s, type(s))
td_again=field.to_python(s)
assert td==td_again, (td, td_again)
td=datetime.timedelta(seconds=11)
s=field.get_db_prep_save(td)
td_again=field.to_python(s)
assert td==td_again, (td, td_again)
field=TimedeltaFormField()
assert field.widget._has_changed(datetime.timedelta(seconds=0), (u'0', u'0', u'0', u'0',)) is False
assert field.widget._has_changed(None, (u'0', u'0', u'0', u'0',)) is False
assert field.widget._has_changed(None, (u'0', u'0')) is False
assert field.widget._has_changed(datetime.timedelta(days=1, hours=2, minutes=3, seconds=4), (u'1', u'2', u'3', u'4',)) is False
for secs, soll, kwargs in [
(100, [0, 0, 1, 40], dict()),
(100, ['0days', '0hours', '1minutes', '40seconds'], dict(with_unit=True)),
(100, ['1minutes', '40seconds'], dict(with_unit=True, remove_leading_zeros=True)),
(100000, ['1days', '3hours'], dict(inputs=['days', 'hours'], with_unit=True, remove_leading_zeros=True)),
]:
ist=split_seconds(secs, **kwargs)
if ist!=soll:
raise Exception('geg=%s soll=%s ist=%s kwargs=%s' % (secs, soll, ist, kwargs))
print "unittest OK"
def split_seconds(secs, inputs=TimedeltaWidget.INPUTS, multiply=TimedeltaWidget.MULTIPLY,
with_unit=False, remove_leading_zeros=False):
ret=[]
assert len(inputs)<=len(multiply), (inputs, multiply)
for input, multi in zip(inputs, multiply):
count, secs = divmod(secs, multi)
if remove_leading_zeros and not ret and not count:
continue
if with_unit:
ret.append('%s%s' % (count, input))
else:
ret.append(count)
return ret
if __name__=='__main__':
main()

View file

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

View file

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

View file

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

View file

@ -9,14 +9,21 @@ import re
import smtplib
import unicodedata
class SQLLogMiddleware(object):
def process_response(self, request, response):
def sql_log_middleware(get_response):
def sql_log(request):
response = get_response(request)
for q in connection.queries:
if re.match('(update|insert)', q['sql'], re.IGNORECASE):
log(q['sql'])
return response
return sql_log
class SMTPExceptionMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
return self.get_response(request)
def process_exception(self, request, exception):
if isinstance(exception, smtplib.SMTPException):
(extype, value, tb) = log_smtp_exception(exception)
@ -24,14 +31,16 @@ class SMTPExceptionMiddleware(object):
{'exception': extype, 'args': value, 'traceback': "".join(tb)} )
return None
class RedirectTrailingPeriod(object):
def process_response(self, request, response):
def redirect_trailing_period_middleware(get_response):
def redirect_trailing_period(request):
response = get_response(request)
if response.status_code == 404 and request.path.endswith("."):
return HttpResponsePermanentRedirect(request.path.rstrip("."))
return response
return redirect_trailing_period
class UnicodeNfkcNormalization(object):
def process_request(self, request):
def unicode_nfkc_normalization_middleware(get_response):
def unicode_nfkc_normalization(request):
"""Do Unicode NFKC normalization to turn ligatures into individual characters.
This was prompted by somebody actually requesting an url for /wg/ipfix/charter
where the 'fi' was composed of an \ufb01 ligature...
@ -41,4 +50,7 @@ class UnicodeNfkcNormalization(object):
"""
request.META["PATH_INFO"] = unicodedata.normalize('NFKC', request.META["PATH_INFO"])
request.path_info = unicodedata.normalize('NFKC', request.path_info)
return None
response = get_response(request)
return response
return unicode_nfkc_normalization

View file

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

View file

@ -126,7 +126,7 @@ class PositionFactory(factory.DjangoModelFactory):
class Meta:
model = Position
name = factory.Faker('sentence',nb_words=10)
name = factory.Faker('sentence',nb_words=5)
is_open = True
class NomineeFactory(factory.DjangoModelFactory):

View file

@ -1,14 +1,17 @@
from django.db import models
from django.db.models.query import QuerySet
import debug # pyflakes:ignore
class MixinManager(object):
def __getattr__(self, attr, *args):
try:
return getattr(self.__class__, attr, *args)
except AttributeError:
return getattr(self.get_queryset(), attr, *args)
if attr.startswith('__'):
return getattr(self.__class__, attr, *args)
else:
try:
return getattr(self.__class__, attr, *args)
except AttributeError:
return getattr(self.get_queryset(), attr, *args)
class NomineePositionQuerySet(QuerySet):

View file

@ -150,7 +150,7 @@ class NomineePosition(models.Model):
super(NomineePosition, self).save(**kwargs)
def __unicode__(self):
return u"%s - %s" % (self.nominee, self.position)
return u"%s - %s - %s" % (self.nominee, self.state, self.position)
@property
def questionnaires(self):

View file

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

View file

@ -76,7 +76,7 @@ class NomcomViewsTest(TestCase):
self.year = NOMCOM_YEAR
# private urls
self.private_index_url = reverse('nomcom_private_index', kwargs={'year': self.year})
self.private_index_url = reverse('ietf.nomcom.views.private_index', kwargs={'year': self.year})
self.private_merge_person_url = reverse('ietf.nomcom.views.private_merge_person', kwargs={'year': self.year})
self.private_merge_nominee_url = reverse('ietf.nomcom.views.private_merge_nominee', kwargs={'year': self.year})
self.edit_members_url = reverse('nomcom_edit_members', kwargs={'year': self.year})
@ -1103,7 +1103,7 @@ class InactiveNomcomTests(TestCase):
def test_acceptance_closed(self):
today = datetime.date.today().strftime('%Y%m%d')
pid = self.nc.position_set.first().nomineeposition_set.order_by('pk').first().id
url = reverse('nomcom_process_nomination_status', kwargs = {
url = reverse('ietf.nomcom.views.process_nomination_status', kwargs = {
'year' : self.nc.year(),
'nominee_position_id' : pid,
'state' : 'accepted',
@ -1131,7 +1131,7 @@ class InactiveNomcomTests(TestCase):
self.assertEqual(response.status_code, 403)
def test_cannot_modify_nominees(self):
url = reverse('nomcom_private_index', kwargs={'year':self.nc.year()})
url = reverse('ietf.nomcom.views.private_index', kwargs={'year':self.nc.year()})
login_testing_unauthorized(self, self.chair.user.username, url)
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
@ -1287,7 +1287,7 @@ class FeedbackLastSeenTests(TestCase):
self.assertEqual( len(q('.label-success')), 0 )
def test_feedback_nominee_badges(self):
url = reverse('nomcom_view_feedback_nominee',kwargs={'year':self.nc.year(),'nominee_id':self.nominee.id})
url = reverse('ietf.nomcom.views.view_feedback_nominee', kwargs={'year':self.nc.year(), 'nominee_id':self.nominee.id})
login_testing_unauthorized(self, self.member.user.username, url)
provide_private_key_to_test_client(self)
response = self.client.get(url)
@ -1330,16 +1330,15 @@ class NewActiveNomComTests(TestCase):
self.assertEqual(response.status_code,200)
def test_accept_reject_nomination_edges(self):
self.client.logout()
np = self.nc.nominee_set.order_by('pk').first().nomineeposition_set.order_by('pk').first()
kwargs={'year':self.nc.year(),
'nominee_position_id':np.id,
'state':'accepted',
'date':np.time.strftime("%Y%m%d"),
'hash':get_hash_nominee_position(np.time.strftime("%Y%m%d"),np.id),
}
url = reverse('nomcom_process_nomination_status', kwargs=kwargs)
url = reverse('ietf.nomcom.views.process_nomination_status', kwargs=kwargs)
response = self.client.get(url)
self.assertEqual(response.status_code,403)
self.assertTrue('already was' in unicontent(response))
@ -1349,13 +1348,13 @@ class NewActiveNomComTests(TestCase):
np.save()
kwargs['date'] = np.time.strftime("%Y%m%d")
kwargs['hash'] = get_hash_nominee_position(np.time.strftime("%Y%m%d"),np.id)
url = reverse('nomcom_process_nomination_status', kwargs=kwargs)
url = reverse('ietf.nomcom.views.process_nomination_status', kwargs=kwargs)
response = self.client.get(url)
self.assertEqual(response.status_code,403)
self.assertTrue('Link expired' in unicontent(response))
kwargs['hash'] = 'bad'
url = reverse('nomcom_process_nomination_status', kwargs=kwargs)
url = reverse('ietf.nomcom.views.process_nomination_status', kwargs=kwargs)
response = self.client.get(url)
self.assertEqual(response.status_code,403)
self.assertTrue('Bad hash!' in unicontent(response))
@ -1363,7 +1362,7 @@ class NewActiveNomComTests(TestCase):
def test_accept_reject_nomination_comment(self):
np = self.nc.nominee_set.order_by('pk').first().nomineeposition_set.order_by('pk').first()
hash = get_hash_nominee_position(np.time.strftime("%Y%m%d"),np.id)
url = reverse('nomcom_process_nomination_status',
url = reverse('ietf.nomcom.views.process_nomination_status',
kwargs={'year':self.nc.year(),
'nominee_position_id':np.id,
'state':'accepted',

View file

@ -1,45 +1,46 @@
from django.conf.urls import url
from ietf.nomcom.forms import EditMembersForm, EditMembersFormPreview
from ietf.nomcom import views
from ietf.message import views as message_views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', 'ietf.nomcom.views.index'),
url(r'^ann/$', 'ietf.nomcom.views.announcements'),
url(r'^(?P<year>\d{4})/private/$', 'ietf.nomcom.views.private_index', name='nomcom_private_index'),
url(r'^(?P<year>\d{4})/private/key/$', 'ietf.nomcom.views.private_key', name='nomcom_private_key'),
url(r'^(?P<year>\d{4})/private/help/$', 'ietf.nomcom.views.configuration_help', name='nomcom_chair_help'),
url(r'^(?P<year>\d{4})/private/nominate/$', 'ietf.nomcom.views.private_nominate', name='nomcom_private_nominate'),
url(r'^(?P<year>\d{4})/private/nominate/newperson$', 'ietf.nomcom.views.private_nominate_newperson', name='nomcom_private_nominate_newperson'),
url(r'^(?P<year>\d{4})/private/feedback/$', 'ietf.nomcom.views.private_feedback', name='nomcom_private_feedback'),
url(r'^(?P<year>\d{4})/private/feedback-email/$', 'ietf.nomcom.views.private_feedback_email', name='nomcom_private_feedback_email'),
url(r'^(?P<year>\d{4})/private/questionnaire-response/$', 'ietf.nomcom.views.private_questionnaire', name='nomcom_private_questionnaire'),
url(r'^(?P<year>\d{4})/private/view-feedback/$', 'ietf.nomcom.views.view_feedback', name='nomcom_view_feedback'),
url(r'^(?P<year>\d{4})/private/view-feedback/unrelated/$', 'ietf.nomcom.views.view_feedback_unrelated', name='nomcom_view_feedback_unrelated'),
url(r'^(?P<year>\d{4})/private/view-feedback/pending/$', 'ietf.nomcom.views.view_feedback_pending', name='nomcom_view_feedback_pending'),
url(r'^(?P<year>\d{4})/private/view-feedback/nominee/(?P<nominee_id>\d+)$', 'ietf.nomcom.views.view_feedback_nominee', name='nomcom_view_feedback_nominee'),
url(r'^(?P<year>\d{4})/private/edit/nominee/(?P<nominee_id>\d+)$', 'ietf.nomcom.views.edit_nominee', name='nomcom_edit_nominee'),
url(r'^$', views.index),
url(r'^ann/$', views.announcements),
url(r'^(?P<year>\d{4})/private/$', views.private_index),
url(r'^(?P<year>\d{4})/private/key/$', views.private_key, name='nomcom_private_key'),
url(r'^(?P<year>\d{4})/private/help/$', views.configuration_help, name='nomcom_chair_help'),
url(r'^(?P<year>\d{4})/private/nominate/$', views.private_nominate, name='nomcom_private_nominate'),
url(r'^(?P<year>\d{4})/private/nominate/newperson$', views.private_nominate_newperson, name='nomcom_private_nominate_newperson'),
url(r'^(?P<year>\d{4})/private/feedback/$', views.private_feedback, name='nomcom_private_feedback'),
url(r'^(?P<year>\d{4})/private/feedback-email/$', views.private_feedback_email, name='nomcom_private_feedback_email'),
url(r'^(?P<year>\d{4})/private/questionnaire-response/$', views.private_questionnaire, name='nomcom_private_questionnaire'),
url(r'^(?P<year>\d{4})/private/view-feedback/$', views.view_feedback, name='nomcom_view_feedback'),
url(r'^(?P<year>\d{4})/private/view-feedback/unrelated/$', views.view_feedback_unrelated, name='nomcom_view_feedback_unrelated'),
url(r'^(?P<year>\d{4})/private/view-feedback/pending/$', views.view_feedback_pending, name='nomcom_view_feedback_pending'),
url(r'^(?P<year>\d{4})/private/view-feedback/nominee/(?P<nominee_id>\d+)$', views.view_feedback_nominee),
url(r'^(?P<year>\d{4})/private/edit/nominee/(?P<nominee_id>\d+)$', views.edit_nominee, name='nomcom_edit_nominee'),
url(r'^(?P<year>\d{4})/private/merge-nominee/?$', views.private_merge_nominee),
url(r'^(?P<year>\d{4})/private/merge-person/?$', views.private_merge_person),
# url(r'^(?P<year>\d{4})/private/send-reminder-mail/$', RedirectView.as_view(url=reverse_lazy('nomcom_send_reminder_mail',kwargs={'year':year,'type':'accept'}))),
url(r'^(?P<year>\d{4})/private/send-reminder-mail/(?P<type>\w+)/$', 'ietf.nomcom.views.send_reminder_mail', name='nomcom_send_reminder_mail'),
url(r'^(?P<year>\d{4})/private/send-reminder-mail/(?P<type>\w+)/$', views.send_reminder_mail, name='nomcom_send_reminder_mail'),
url(r'^(?P<year>\d{4})/private/edit-members/$', EditMembersFormPreview(EditMembersForm), name='nomcom_edit_members'),
url(r'^(?P<year>\d{4})/private/edit-nomcom/$', 'ietf.nomcom.views.edit_nomcom', name='nomcom_edit_nomcom'),
url(r'^(?P<year>\d{4})/private/chair/templates/$', 'ietf.nomcom.views.list_templates', name='nomcom_list_templates'),
url(r'^(?P<year>\d{4})/private/chair/templates/(?P<template_id>\d+)/$', 'ietf.nomcom.views.edit_template', name='nomcom_edit_template'),
url(r'^(?P<year>\d{4})/private/chair/position/$', 'ietf.nomcom.views.list_positions', name='nomcom_list_positions'),
url(r'^(?P<year>\d{4})/private/chair/position/add/$', 'ietf.nomcom.views.edit_position', name='nomcom_add_position'),
url(r'^(?P<year>\d{4})/private/chair/position/(?P<position_id>\d+)/$', 'ietf.nomcom.views.edit_position', name='nomcom_edit_position'),
url(r'^(?P<year>\d{4})/private/chair/position/(?P<position_id>\d+)/remove/$', 'ietf.nomcom.views.remove_position', name='nomcom_remove_position'),
url(r'^(?P<year>\d{4})/private/edit-nomcom/$', views.edit_nomcom, name='nomcom_edit_nomcom'),
url(r'^(?P<year>\d{4})/private/chair/templates/$', views.list_templates, name='nomcom_list_templates'),
url(r'^(?P<year>\d{4})/private/chair/templates/(?P<template_id>\d+)/$', views.edit_template, name='nomcom_edit_template'),
url(r'^(?P<year>\d{4})/private/chair/position/$', views.list_positions, name='nomcom_list_positions'),
url(r'^(?P<year>\d{4})/private/chair/position/add/$', views.edit_position, name='nomcom_add_position'),
url(r'^(?P<year>\d{4})/private/chair/position/(?P<position_id>\d+)/$', views.edit_position, name='nomcom_edit_position'),
url(r'^(?P<year>\d{4})/private/chair/position/(?P<position_id>\d+)/remove/$', views.remove_position, name='nomcom_remove_position'),
url(r'^(?P<year>\d{4})/$', 'ietf.nomcom.views.year_index', name='nomcom_year_index'),
url(r'^(?P<year>\d{4})/requirements/$', 'ietf.nomcom.views.requirements', name='nomcom_requirements'),
url(r'^(?P<year>\d{4})/expertise/$', 'ietf.nomcom.views.requirements', name='nomcom_requirements'),
url(r'^(?P<year>\d{4})/questionnaires/$', 'ietf.nomcom.views.questionnaires', name='nomcom_questionnaires'),
url(r'^(?P<year>\d{4})/feedback/$', 'ietf.nomcom.views.public_feedback', name='nomcom_public_feedback'),
url(r'^(?P<year>\d{4})/nominate/$', 'ietf.nomcom.views.public_nominate', name='nomcom_public_nominate'),
url(r'^(?P<year>\d{4})/nominate/newperson$', 'ietf.nomcom.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]+)/$', 'ietf.nomcom.views.process_nomination_status', name='nomcom_process_nomination_status'),
url(r'^(?P<year>\d{4})/$', views.year_index, name='nomcom_year_index'),
url(r'^(?P<year>\d{4})/requirements/$', views.requirements, name='nomcom_requirements'),
url(r'^(?P<year>\d{4})/expertise/$', views.requirements, name='nomcom_requirements'),
url(r'^(?P<year>\d{4})/questionnaires/$', views.questionnaires, name='nomcom_questionnaires'),
url(r'^(?P<year>\d{4})/feedback/$', views.public_feedback, name='nomcom_public_feedback'),
url(r'^(?P<year>\d{4})/nominate/$', views.public_nominate, name='nomcom_public_nominate'),
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),
# use the generic view from message
url(r'^ann/(?P<message_id>\d+)/$', 'ietf.message.views.message', {'group_type': "nomcom" }, "nomcom_announcement"),
url(r'^ann/(?P<message_id>\d+)/$', message_views.message, {'group_type': "nomcom" }),
]

View file

@ -211,14 +211,14 @@ def send_accept_reminder_to_nominee(nominee_position):
(to_email, cc) = gather_address_lists('nomination_accept_reminder',nominee=nominee.email.address)
hash = get_hash_nominee_position(today, nominee_position.id)
accept_url = reverse('nomcom_process_nomination_status',
accept_url = reverse('ietf.nomcom.views.process_nomination_status',
None,
args=(get_year_by_nomcom(nomcom),
nominee_position.id,
'accepted',
today,
hash))
decline_url = reverse('nomcom_process_nomination_status',
decline_url = reverse('ietf.nomcom.views.process_nomination_status',
None,
args=(get_year_by_nomcom(nomcom),
nominee_position.id,
@ -290,14 +290,14 @@ def make_nomineeposition(nomcom, candidate, position, author):
domain = Site.objects.get_current().domain
today = datetime.date.today().strftime('%Y%m%d')
hash = get_hash_nominee_position(today, nominee_position.id)
accept_url = reverse('nomcom_process_nomination_status',
accept_url = reverse('ietf.nomcom.views.process_nomination_status',
None,
args=(get_year_by_nomcom(nomcom),
nominee_position.id,
'accepted',
today,
hash))
decline_url = reverse('nomcom_process_nomination_status',
decline_url = reverse('ietf.nomcom.views.process_nomination_status',
None,
args=(get_year_by_nomcom(nomcom),
nominee_position.id,

View file

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

View file

@ -8,6 +8,7 @@ from unidecode import unidecode
from django.conf import settings
from django.contrib.auth.models import User
from django.utils.text import slugify
import debug # pyflakes:ignore
@ -24,7 +25,8 @@ class UserFactory(factory.DjangoModelFactory):
locale = random.sample(faker.config.AVAILABLE_LOCALES, 1)[0]
first_name = factory.Faker('first_name', locale)
last_name = factory.Faker('last_name', locale)
email = factory.LazyAttributeSequence(lambda u, n: '%s.%s_%d@%s'%(unidecode(u.first_name),unidecode(u.last_name),n, fake.domain_name()))
email = factory.LazyAttributeSequence(lambda u, n: '%s.%s_%d@%s'%( slugify(unidecode(u.first_name)),
slugify(unidecode(u.last_name)), n, fake.domain_name()))
username = factory.LazyAttribute(lambda u: u.email)
@factory.post_generation
@ -92,6 +94,7 @@ class EmailFactory(factory.DjangoModelFactory):
model = Email
django_get_or_create = ('address',)
address = factory.Sequence(lambda n:'%s.%s_%d@%s' % (fake.first_name(),fake.last_name(),n,fake.domain_name()))
address = factory.Sequence(lambda n:'%s.%s_%d@%s' % ( slugify(unidecode(fake.first_name())),
slugify(unidecode(fake.last_name())), n, fake.domain_name()))
active = True
primary = False

View file

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

View file

@ -10,8 +10,8 @@ import debug # pyflakes:ignore
from ietf.person.factories import EmailFactory,PersonFactory
from ietf.person.models import Person
from ietf.utils.test_utils import TestCase
from ietf.utils.test_data import make_test_data
from ietf.utils.test_utils import TestCase
from ietf.utils.mail import outbox, empty_outbox
@ -35,7 +35,7 @@ class PersonTests(TestCase):
def test_profile(self):
person = PersonFactory(with_bio=True)
self.assertTrue(person.photo is not None)
self.assertTrue(person.photo.name is not None)

View file

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

View file

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

View file

@ -1,9 +1,11 @@
from django.conf.urls import url
from django.views.generic import TemplateView
from ietf.release import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', 'ietf.release.views.release'),
url(r'^(?P<version>[0-9.]+.*)/$', 'ietf.release.views.release'),
url(r'^$', views.release),
url(r'^(?P<version>[0-9.]+.*)/$', views.release),
url(r'^about/?$', TemplateView.as_view(template_name='release/about.html')),
url(r'^todo/?$', TemplateView.as_view(template_name='release/todo.html')),
]

View file

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

View file

@ -19,7 +19,7 @@ class SecrAreasTestCase(TestCase):
def test_main(self):
"Main Test"
make_test_data()
url = reverse('areas')
url = reverse('ietf.secr.areas.views.list_areas')
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
@ -29,7 +29,7 @@ class SecrAreasTestCase(TestCase):
make_test_data()
augment_data()
areas = Group.objects.filter(type='area',state='active')
url = reverse('areas_view', kwargs={'name':areas[0].acronym})
url = reverse('ietf.secr.areas.views.view', kwargs={'name':areas[0].acronym})
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)

View file

@ -1,12 +1,14 @@
from django.conf.urls import url
from ietf.secr.areas import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', 'ietf.secr.areas.views.list_areas', name='areas'),
url(r'^add/$', 'ietf.secr.areas.views.add', name='areas_add'),
url(r'^getemails', 'ietf.secr.areas.views.getemails', name='areas_emails'),
url(r'^getpeople', 'ietf.secr.areas.views.getpeople', name='areas_getpeople'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/$', 'ietf.secr.areas.views.view', name='areas_view'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/$', 'ietf.secr.areas.views.edit', name='areas_edit'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/people/$', 'ietf.secr.areas.views.people', name='areas_people'),
url(r'^(?P<name>[A-Za-z0-9.-]+)/people/modify/$', 'ietf.secr.areas.views.modify', name='areas_modify'),
url(r'^$', views.list_areas),
url(r'^add/$', views.add),
url(r'^getemails', views.getemails),
url(r'^getpeople', views.getpeople),
url(r'^(?P<name>[A-Za-z0-9.-]+)/$', views.view),
url(r'^(?P<name>[A-Za-z0-9.-]+)/edit/$', views.edit),
url(r'^(?P<name>[A-Za-z0-9.-]+)/people/$', views.people),
url(r'^(?P<name>[A-Za-z0-9.-]+)/people/modify/$', views.modify),
]

View file

@ -144,9 +144,9 @@ def edit(request, name):
time=new_area.time)
messages.success(request, 'The Area entry was changed successfully')
return redirect('areas_view', name=name)
return redirect('ietf.secr.areas.views.view', name=name)
else:
return redirect('areas_view', name=name)
return redirect('ietf.secr.areas.views.view', name=name)
else:
form = AreaForm(instance=area)
awp_formset = AWPFormSet(instance=area)
@ -215,7 +215,7 @@ def people(request, name):
Role.objects.create(name_id='pre-ad',group=area,email=email,person=person)
messages.success(request, 'New Area Director added successfully!')
return redirect('areas_view', name=name)
return redirect('ietf.secr.areas.views.view', name=name)
else:
form = AreaDirectorForm()
@ -279,7 +279,7 @@ def modify(request, name):
messages.success(request, 'Voting rights have been granted successfully!')
return redirect('areas_view', name=name)
return redirect('ietf.secr.areas.views.view', name=name)
@role_required('Secretariat')
def view(request, name):

View file

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

View file

@ -5,6 +5,8 @@ from StringIO import StringIO
from django.conf import settings
from django.core.urlresolvers import reverse as urlreverse
import debug # pyflakes:ignore
from ietf.doc.models import State
from ietf.person.models import Person
from ietf.submit.models import Preapproval
@ -50,7 +52,7 @@ class SecrDraftsTestCase(TestCase):
def test_add(self):
draft = make_test_data()
url = urlreverse('drafts_add')
url = urlreverse('ietf.secr.drafts.views.add')
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
@ -79,7 +81,7 @@ class SecrDraftsTestCase(TestCase):
make_test_data()
Preapproval.objects.create(name='draft-dummy',
by=Person.objects.get(name="(System)"))
url = urlreverse('drafts_approvals')
url = urlreverse('ietf.secr.drafts.views.approvals')
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
@ -132,26 +134,26 @@ class SecrDraftsTestCase(TestCase):
def test_search(self):
draft = make_test_data()
url = urlreverse('drafts')
url = urlreverse('ietf.secr.drafts.views.search')
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
post = dict(filename='draft',state=1,submit='submit')
response = self.client.post(url,post)
response = self.client.post(url, post)
self.assertEqual(response.status_code, 200)
self.assertTrue(draft.name in response.content)
def test_update(self):
draft = make_test_data()
url = urlreverse('drafts_update', kwargs={'id':draft.name})
url = urlreverse('ietf.secr.drafts.views.update', kwargs={'id':draft.name})
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
def test_view(self):
draft = make_test_data()
url = urlreverse('drafts_view', kwargs={'id':draft.name})
url = urlreverse('ietf.secr.drafts.views.view', kwargs={'id':draft.name})
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)

View file

@ -1,24 +1,26 @@
from django.conf.urls import url
from ietf.secr.drafts import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', 'ietf.secr.drafts.views.search', name='drafts'),
url(r'^add/$', 'ietf.secr.drafts.views.add', name='drafts_add'),
url(r'^approvals/$', 'ietf.secr.drafts.views.approvals', name='drafts_approvals'),
url(r'^dates/$', 'ietf.secr.drafts.views.dates', name='drafts_dates'),
url(r'^nudge-report/$', 'ietf.secr.drafts.views.nudge_report', name='drafts_nudge_report'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/$', 'ietf.secr.drafts.views.view', name='drafts_view'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/abstract/$', 'ietf.secr.drafts.views.abstract', name='drafts_abstract'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/announce/$', 'ietf.secr.drafts.views.announce', name='drafts_announce'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/authors/$', 'ietf.secr.drafts.views.authors', name='drafts_authors'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/author_delete/(?P<oid>\d{1,6})$', 'ietf.secr.drafts.views.author_delete', name='drafts_author_delete'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/confirm/$', 'ietf.secr.drafts.views.confirm', name='drafts_confirm'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/edit/$', 'ietf.secr.drafts.views.edit', name='drafts_edit'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/extend/$', 'ietf.secr.drafts.views.extend', name='drafts_extend'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/email/$', 'ietf.secr.drafts.views.email', name='drafts_email'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/makerfc/$', 'ietf.secr.drafts.views.makerfc', name='drafts_makerfc'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/replace/$', 'ietf.secr.drafts.views.replace', name='drafts_replace'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/resurrect/$', 'ietf.secr.drafts.views.resurrect', name='drafts_resurrect'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/revision/$', 'ietf.secr.drafts.views.revision', name='drafts_revision'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/update/$', 'ietf.secr.drafts.views.update', name='drafts_update'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/withdraw/$', 'ietf.secr.drafts.views.withdraw', name='drafts_withdraw'),
url(r'^$', views.search),
url(r'^add/$', views.add),
url(r'^approvals/$', views.approvals),
url(r'^dates/$', views.dates, name='drafts_dates'),
url(r'^nudge-report/$', views.nudge_report, name='drafts_nudge_report'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/$', views.view),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/abstract/$', views.abstract, name='drafts_abstract'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/announce/$', views.announce, name='drafts_announce'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/authors/$', views.authors, name='drafts_authors'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/author_delete/(?P<oid>\d{1,6})$', views.author_delete, name='drafts_author_delete'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/confirm/$', views.confirm, name='drafts_confirm'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/edit/$', views.edit, name='drafts_edit'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/extend/$', views.extend, name='drafts_extend'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/email/$', views.email, name='drafts_email'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/makerfc/$', views.makerfc, name='drafts_makerfc'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/replace/$', views.replace, name='drafts_replace'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/resurrect/$', views.resurrect, name='drafts_resurrect'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/revision/$', views.revision, name='drafts_revision'),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/update/$', views.update),
url(r'^(?P<id>[A-Za-z0-9._\-\+]+)/withdraw/$', views.withdraw, name='drafts_withdraw'),
]

View file

@ -518,7 +518,7 @@ def announce(request, id):
content_type='Multipart/Mixed; Boundary="NextPart"')
messages.success(request, 'Announcement scheduled successfully!')
return redirect('drafts_view', id=id)
return redirect('ietf.secr.drafts.views.view', id=id)
@role_required('Secretariat')
def approvals(request):
@ -568,7 +568,7 @@ def authors(request, id):
del request.session['action']
return redirect('drafts_announce', id=id)
return redirect('drafts_view', id=id)
return redirect('ietf.secr.drafts.views.view', id=id)
if form.is_valid():
author = form.cleaned_data['email']
@ -605,7 +605,7 @@ def confirm(request, id):
# TODO do cancel functions from session (ie remove uploaded files?)
# clear session data
clear_non_auth(request.session)
return redirect('drafts_view', id=id)
return redirect('ietf.secr.drafts.views.view', id=id)
action = request.session['action']
if action == 'revision':
@ -627,7 +627,7 @@ def confirm(request, id):
clear_non_auth(request.session)
messages.success(request, '%s action performed successfully!' % action)
return redirect('drafts_view', id=id)
return redirect('ietf.secr.drafts.views.view', id=id)
details = get_action_details(draft, request.session)
email = request.session.get('email','')
@ -681,7 +681,7 @@ def edit(request, id):
if request.method == 'POST':
button_text = request.POST.get('submit', '')
if button_text == 'Cancel':
return redirect('drafts_view', id=id)
return redirect('ietf.secr.drafts.views.view', id=id)
form = EditModelForm(request.POST, instance=draft)
if form.is_valid():
@ -696,7 +696,7 @@ def edit(request, id):
messages.success(request, 'Draft modified successfully!')
return redirect('drafts_view', id=id)
return redirect('ietf.secr.drafts.views.view', id=id)
else:
#assert False, form.errors
pass
@ -724,7 +724,7 @@ def email(request, id):
if button_text == 'Cancel':
# clear session data
clear_non_auth(request.session)
return redirect('drafts_view', id=id)
return redirect('ietf.secr.drafts.views.view', id=id)
form = EmailForm(request.POST)
if form.is_valid():
@ -768,7 +768,7 @@ def extend(request, id):
if request.method == 'POST':
button_text = request.POST.get('submit', '')
if button_text == 'Cancel':
return redirect('drafts_view', id=id)
return redirect('ietf.secr.drafts.views.view', id=id)
form = ExtendForm(request.POST)
if form.is_valid():
@ -803,13 +803,13 @@ def makerfc(request, id):
# raise error if draft intended standard is empty
if not draft.intended_std_level:
messages.error(request, 'ERROR: intended RFC status is not set')
return redirect('drafts_view', id=id)
return redirect('ietf.secr.drafts.views.view', id=id)
ObsFormset = formset_factory(RfcObsoletesForm, extra=15, max_num=15)
if request.method == 'POST':
button_text = request.POST.get('submit', '')
if button_text == 'Cancel':
return redirect('drafts_view', id=id)
return redirect('ietf.secr.drafts.views.view', id=id)
form = RfcModelForm(request.POST, instance=draft)
obs_formset = ObsFormset(request.POST, prefix='obs')
@ -846,7 +846,7 @@ def makerfc(request, id):
rfc.save_with_history([e])
messages.success(request, 'RFC created successfully!')
return redirect('drafts_view', id=id)
return redirect('ietf.secr.drafts.views.view', id=id)
else:
# assert False, (form.errors, obs_formset.errors)
pass
@ -888,7 +888,7 @@ def replace(request, id):
if request.method == 'POST':
button_text = request.POST.get('submit', '')
if button_text == 'Cancel':
return redirect('drafts_view', id=id)
return redirect('ietf.secr.drafts.views.view', id=id)
form = ReplaceForm(request.POST, draft=draft)
if form.is_valid():
@ -927,7 +927,7 @@ def revision(request, id):
if request.method == 'POST':
button_text = request.POST.get('submit', '')
if button_text == 'Cancel':
return redirect('drafts_view', id=id)
return redirect('ietf.secr.drafts.views.view', id=id)
upload_form = UploadForm(request.POST, request.FILES, draft=draft)
form = RevisionModelForm(request.POST, instance=draft)
@ -1015,7 +1015,7 @@ def search(request):
# if there's just one result go straight to view
if len(results) == 1:
return redirect('drafts_view', id=results[0].name)
return redirect('ietf.secr.drafts.views.view', id=results[0].name)
else:
active_state = State.objects.get(type='draft',slug='active')
form = SearchForm(initial={'state':active_state.pk})
@ -1039,7 +1039,7 @@ def update(request, id):
if request.method == 'POST':
button_text = request.POST.get('submit', '')
if button_text == 'Cancel':
return redirect('drafts_view', id=id)
return redirect('ietf.secr.drafts.views.view', id=id)
upload_form = UploadForm(request.POST, request.FILES, draft=draft)
form = RevisionModelForm(request.POST, instance=draft)
@ -1139,7 +1139,7 @@ def withdraw(request, id):
if request.method == 'POST':
button_text = request.POST.get('submit', '')
if button_text == 'Cancel':
return redirect('drafts_view', id=id)
return redirect('ietf.secr.drafts.views.view', id=id)
form = WithdrawForm(request.POST)
if form.is_valid():

View file

@ -1,17 +1,19 @@
from django.conf.urls import url
from django.conf import settings
from ietf.secr.groups import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', 'ietf.secr.groups.views.search', name='groups'),
url(r'^add/$', 'ietf.secr.groups.views.add', name='groups_add'),
url(r'^blue-dot-report/$', 'ietf.secr.groups.views.blue_dot', name='groups_blue_dot'),
url(r'^search/$', 'ietf.secr.groups.views.search', name='groups_search'),
#(r'^ajax/get_ads/$', 'ietf.secr.groups.views.get_ads'),
url(r'^%(acronym)s/$' % settings.URL_REGEXPS, 'ietf.secr.groups.views.view', name='groups_view'),
url(r'^%(acronym)s/delete/(?P<id>\d{1,6})/$' % settings.URL_REGEXPS, 'ietf.secr.groups.views.delete_role', name='groups_delete_role'),
url(r'^%(acronym)s/charter/$' % settings.URL_REGEXPS, 'ietf.secr.groups.views.charter', name='groups_charter'),
url(r'^%(acronym)s/edit/$' % settings.URL_REGEXPS, 'ietf.secr.groups.views.edit', name='groups_edit'),
url(r'^%(acronym)s/gm/$' % settings.URL_REGEXPS, 'ietf.secr.groups.views.view_gm', name='groups_view_gm'),
url(r'^%(acronym)s/gm/edit/$' % settings.URL_REGEXPS, 'ietf.secr.groups.views.edit_gm', name='groups_edit_gm'),
url(r'^%(acronym)s/people/$' % settings.URL_REGEXPS, 'ietf.secr.groups.views.people', name='groups_people'),
url(r'^$', views.search, name='groups'),
url(r'^add/$', views.add, name='groups_add'),
url(r'^blue-dot-report/$', views.blue_dot),
url(r'^search/$', views.search, name='groups_search'),
#(r'^ajax/get_ads/$', views.get_ads),
url(r'^%(acronym)s/$' % settings.URL_REGEXPS, views.view, name='groups_view'),
url(r'^%(acronym)s/delete/(?P<id>\d{1,6})/$' % settings.URL_REGEXPS, views.delete_role, name='groups_delete_role'),
url(r'^%(acronym)s/charter/$' % settings.URL_REGEXPS, views.charter, name='groups_charter'),
url(r'^%(acronym)s/edit/$' % settings.URL_REGEXPS, views.edit, name='groups_edit'),
url(r'^%(acronym)s/gm/$' % settings.URL_REGEXPS, views.view_gm),
url(r'^%(acronym)s/gm/edit/$' % settings.URL_REGEXPS, views.edit_gm),
url(r'^%(acronym)s/people/$' % settings.URL_REGEXPS, views.people, name='groups_people'),
]

View file

@ -49,7 +49,7 @@ class SecrMeetingTestCase(TestCase):
def test_main(self):
"Main Test"
url = reverse('meetings')
url = reverse('ietf.secr.meetings.views.main')
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
@ -57,7 +57,7 @@ class SecrMeetingTestCase(TestCase):
def test_view(self):
"View Test"
meeting = make_meeting_test_data()
url = reverse('meetings_view', kwargs={'meeting_id':meeting.number})
url = reverse('ietf.secr.meetings.views.view', kwargs={'meeting_id':meeting.number})
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
@ -69,7 +69,7 @@ class SecrMeetingTestCase(TestCase):
meeting = make_meeting_test_data()
number = int(meeting.number) + 1
count = Meeting.objects.count()
url = reverse('meetings_add')
url = reverse('ietf.secr.meetings.views.add')
post_data = dict(number=number,city='Toronto',date='2014-07-20',country='CA',
time_zone='America/New_York',venue_name='Hilton',
venue_addr='100 First Ave',
@ -92,7 +92,7 @@ class SecrMeetingTestCase(TestCase):
type_id='ietf',
date=datetime.datetime(2014,7,20),
)
url = reverse('meetings_edit_meeting',kwargs={'meeting_id':1})
url = reverse('ietf.secr.meetings.views.edit_meeting',kwargs={'meeting_id':1})
post_data = dict(number='1',date='2014-07-20',city='Toronto',
idsubmit_cutoff_day_offset_00=13,
idsubmit_cutoff_day_offset_01=20,
@ -113,7 +113,7 @@ class SecrMeetingTestCase(TestCase):
meeting = make_meeting_test_data()
os.makedirs(os.path.join(self.proceedings_dir,str(meeting.number),'bluesheets'))
url = reverse('meetings_blue_sheet',kwargs={'meeting_id':meeting.number})
url = reverse('ietf.secr.meetings.views.blue_sheet',kwargs={'meeting_id':meeting.number})
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
@ -130,7 +130,7 @@ class SecrMeetingTestCase(TestCase):
def test_blue_sheets_generate(self):
meeting = make_meeting_test_data()
url = reverse('meetings_blue_sheet_generate',kwargs={'meeting_id':meeting.number})
url = reverse('ietf.secr.meetings.views.blue_sheet_generate',kwargs={'meeting_id':meeting.number})
self.client.login(username="secretary", password="secretary+password")
response = self.client.post(url)
self.assertEqual(response.status_code, 302)
@ -139,7 +139,7 @@ class SecrMeetingTestCase(TestCase):
def test_notifications(self):
"Test Notifications"
meeting = make_meeting_test_data()
url = reverse('meetings_notifications',kwargs={'meeting_id':42})
url = reverse('ietf.secr.meetings.views.notifications',kwargs={'meeting_id':42})
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
@ -172,14 +172,14 @@ class SecrMeetingTestCase(TestCase):
def test_meetings_select(self):
make_meeting_test_data()
url = reverse('meetings_select',kwargs={'meeting_id':42,'schedule_name':'test-agenda'})
url = reverse('ietf.secr.meetings.views.select',kwargs={'meeting_id':42,'schedule_name':'test-agenda'})
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
def test_meetings_rooms(self):
meeting = make_meeting_test_data()
url = reverse('meetings_rooms',kwargs={'meeting_id':42,'schedule_name':'test-agenda'})
url = reverse('ietf.secr.meetings.views.rooms',kwargs={'meeting_id':42,'schedule_name':'test-agenda'})
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
@ -205,7 +205,7 @@ class SecrMeetingTestCase(TestCase):
def test_meetings_times(self):
make_meeting_test_data()
url = reverse('meetings_times',kwargs={'meeting_id':42,'schedule_name':'test-agenda'})
url = reverse('ietf.secr.meetings.views.times',kwargs={'meeting_id':42,'schedule_name':'test-agenda'})
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
@ -215,7 +215,7 @@ class SecrMeetingTestCase(TestCase):
qs = TimeSlot.objects.filter(meeting=meeting,type='session')
before = qs.count()
expected_deletion_count = qs.filter(time=qs.first().time).count()
url = reverse('meetings_times_delete',kwargs={
url = reverse('ietf.secr.meetings.views.times_delete',kwargs={
'meeting_id':42,
'schedule_name':'test-agenda',
'time':qs.first().time.strftime("%Y:%m:%d:%H:%M")
@ -246,14 +246,14 @@ class SecrMeetingTestCase(TestCase):
def test_meetings_nonsession(self):
make_meeting_test_data()
url = reverse('meetings_non_session',kwargs={'meeting_id':42,'schedule_name':'test-agenda'})
url = reverse('ietf.secr.meetings.views.non_session',kwargs={'meeting_id':42,'schedule_name':'test-agenda'})
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
def test_meetings_select_group(self):
make_meeting_test_data()
url = reverse('meetings_select_group',kwargs={'meeting_id':42,'schedule_name':'test-agenda'})
url = reverse('ietf.secr.meetings.views.select_group',kwargs={'meeting_id':42,'schedule_name':'test-agenda'})
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)

View file

@ -1,25 +1,27 @@
from django.conf.urls import url
from ietf.secr.meetings import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', 'ietf.secr.meetings.views.main', name='meetings'),
url(r'^add/$', 'ietf.secr.meetings.views.add', name='meetings_add'),
url(r'^ajax/get-times/(?P<meeting_id>\d{1,6})/(?P<day>\d)/$', 'ietf.secr.meetings.views.ajax_get_times', name='meetings_ajax_get_times'),
url(r'^blue_sheet/$', 'ietf.secr.meetings.views.blue_sheet_redirect', name='meetings_blue_sheet_redirect'),
url(r'^(?P<meeting_id>\d{1,6})/$', 'ietf.secr.meetings.views.view', name='meetings_view'),
url(r'^(?P<meeting_id>\d{1,6})/blue_sheet/$', 'ietf.secr.meetings.views.blue_sheet', name='meetings_blue_sheet'),
url(r'^(?P<meeting_id>\d{1,6})/blue_sheet/generate/$', 'ietf.secr.meetings.views.blue_sheet_generate', name='meetings_blue_sheet_generate'),
url(r'^(?P<meeting_id>\d{1,6})/edit/$', 'ietf.secr.meetings.views.edit_meeting', name='meetings_edit_meeting'),
url(r'^(?P<meeting_id>\d{1,6})/notifications/$', 'ietf.secr.meetings.views.notifications', name='meetings_notifications'),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/$', 'ietf.secr.meetings.views.select', name='meetings_select'),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/non_session/$', 'ietf.secr.meetings.views.non_session', name='meetings_non_session'),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/non_session/edit/(?P<slot_id>\d{1,6})/$', 'ietf.secr.meetings.views.non_session_edit', name='meetings_non_session_edit'),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/non_session/delete/(?P<slot_id>\d{1,6})/$', 'ietf.secr.meetings.views.non_session_delete', name='meetings_non_session_delete'),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/rooms/$', 'ietf.secr.meetings.views.rooms', name='meetings_rooms'),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/select/$', 'ietf.secr.meetings.views.select_group', name='meetings_select_group'),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/times/$', 'ietf.secr.meetings.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\:]+)/$', 'ietf.secr.meetings.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\:]+)/$', 'ietf.secr.meetings.views.times_edit', name='meetings_times_edit'),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/unschedule/(?P<session_id>\d{1,6})/$', 'ietf.secr.meetings.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/$', 'ietf.secr.meetings.views.schedule', name='meetings_schedule'),
url(r'^(?P<meeting_id>\d{1,6})/(?P<acronym>[-a-z0-9]+)/remove/$', 'ietf.secr.meetings.views.remove_session', name='meetings_remove_session'),
url(r'^$', views.main),
url(r'^add/$', views.add),
url(r'^ajax/get-times/(?P<meeting_id>\d{1,6})/(?P<day>\d)/$', views.ajax_get_times),
url(r'^blue_sheet/$', views.blue_sheet_redirect),
url(r'^(?P<meeting_id>\d{1,6})/$', views.view),
url(r'^(?P<meeting_id>\d{1,6})/blue_sheet/$', views.blue_sheet),
url(r'^(?P<meeting_id>\d{1,6})/blue_sheet/generate/$', views.blue_sheet_generate),
url(r'^(?P<meeting_id>\d{1,6})/edit/$', views.edit_meeting),
url(r'^(?P<meeting_id>\d{1,6})/notifications/$', views.notifications),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/$', views.select),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/non_session/$', views.non_session),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/non_session/edit/(?P<slot_id>\d{1,6})/$', views.non_session_edit),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/non_session/delete/(?P<slot_id>\d{1,6})/$', views.non_session_delete),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/rooms/$', views.rooms),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/select/$', views.select_group),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/times/$', views.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),
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),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/(?P<acronym>[-a-z0-9]+)/schedule/$', views.schedule),
url(r'^(?P<meeting_id>\d{1,6})/(?P<acronym>[-a-z0-9]+)/remove/$', views.remove_session),
]

View file

@ -295,7 +295,7 @@ def add(request):
if request.method == 'POST':
button_text = request.POST.get('submit', '')
if button_text == 'Cancel':
return redirect('meetings')
return redirect('ietf.secr.meetings.views.main')
form = MeetingModelForm(request.POST)
if form.is_valid():
@ -317,7 +317,7 @@ def add(request):
make_materials_directories(meeting)
messages.success(request, 'The Meeting was created successfully!')
return redirect('meetings')
return redirect('ietf.secr.meetings.views.main')
else:
# display initial forms
max_number = Meeting.objects.filter(type='ietf').aggregate(Max('number'))['number__max']
@ -348,7 +348,7 @@ def blue_sheet(request, meeting_id):
file = request.FILES['file']
handle_upload_file(file,file.name,meeting,'bluesheets')
messages.success(request, 'File Uploaded')
return redirect('meetings_blue_sheet', meeting_id=meeting.number)
return redirect('ietf.secr.meetings.views.blue_sheet', meeting_id=meeting.number)
else:
form = UploadBlueSheetForm()
@ -374,7 +374,7 @@ def blue_sheet_generate(request, meeting_id):
create_blue_sheets(meeting, groups)
messages.success(request, 'Blue Sheets generated')
return redirect('meetings_blue_sheet', meeting_id=meeting.number)
return redirect('ietf.secr.meetings.views.blue_sheet', meeting_id=meeting.number)
@role_required('Secretariat')
def blue_sheet_redirect(request):
@ -388,7 +388,7 @@ def blue_sheet_redirect(request):
meeting = qs[0]
else:
meeting = Meeting.objects.filter(type='ietf').order_by('-date')[0]
return redirect('meetings_blue_sheet', meeting_id=meeting.number)
return redirect('ietf.secr.meetings.views.blue_sheet', meeting_id=meeting.number)
@role_required('Secretariat')
def edit_meeting(request, meeting_id):
@ -409,13 +409,13 @@ def edit_meeting(request, meeting_id):
if request.method == 'POST':
button_text = request.POST.get('submit','')
if button_text == 'Cancel':
return redirect('meetings_view', meeting_id=meeting_id)
return redirect('ietf.secr.meetings.views.view', meeting_id=meeting_id)
form = MeetingModelForm(request.POST, instance=meeting)
if form.is_valid():
form.save()
messages.success(request,'The meeting entry was changed successfully')
return redirect('meetings_view', meeting_id=meeting_id)
return redirect('ietf.secr.meetings.views.view', meeting_id=meeting_id)
else:
form = MeetingModelForm(instance=meeting)
@ -433,7 +433,7 @@ def main(request):
meetings = Meeting.objects.filter(type='ietf').order_by('-number')
if request.method == 'POST':
return redirect('meetings_view', meeting_id=request.POST['group'])
return redirect('ietf.secr.meetings.views.view', meeting_id=request.POST['group'])
choices = [ (str(x.number),str(x.number)) for x in meetings ]
form = GroupSelectForm(choices=choices)
@ -499,7 +499,7 @@ def non_session(request, meeting_id, schedule_name):
schedule=schedule)
messages.success(request, 'Non-Sessions updated successfully')
return redirect('meetings_non_session', meeting_id=meeting_id, schedule_name=schedule_name)
return redirect('ietf.secr.meetings.views.non_session', meeting_id=meeting_id, schedule_name=schedule_name)
else:
form = NonSessionForm(initial={'show_location':True})
@ -529,13 +529,13 @@ def non_session_delete(request, meeting_id, schedule_name, slot_id):
for session in session_objects:
if session.materials.exclude(states__slug='deleted'):
messages.error(request, 'Materials have already been uploaded for "%s". You must delete those before deleting the timeslot.' % slot.name)
return redirect('meetings_non_session', meeting_id=meeting_id, schedule_name=schedule_name)
return redirect('ietf.secr.meetings.views.non_session', meeting_id=meeting_id, schedule_name=schedule_name)
else:
Session.objects.filter(pk__in=[ x.pk for x in session_objects ]).delete()
slot.delete()
messages.success(request, 'Non-Session timeslot deleted successfully')
return redirect('meetings_non_session', meeting_id=meeting_id, schedule_name=schedule_name)
return redirect('ietf.secr.meetings.views.non_session', meeting_id=meeting_id, schedule_name=schedule_name)
@role_required('Secretariat')
def non_session_edit(request, meeting_id, schedule_name, slot_id):
@ -550,7 +550,7 @@ def non_session_edit(request, meeting_id, schedule_name, slot_id):
if request.method == 'POST':
button_text = request.POST.get('submit', '')
if button_text == 'Cancel':
return redirect('meetings_non_session', meeting_id=meeting_id, schedule_name=schedule_name)
return redirect('ietf.secr.meetings.views.non_session', meeting_id=meeting_id, schedule_name=schedule_name)
form = NonSessionEditForm(request.POST,meeting=meeting, session=session)
if form.is_valid():
@ -568,7 +568,7 @@ def non_session_edit(request, meeting_id, schedule_name, slot_id):
session.save()
messages.success(request, 'Location saved')
return redirect('meetings_non_session', meeting_id=meeting_id, schedule_name=schedule_name)
return redirect('ietf.secr.meetings.views.non_session', meeting_id=meeting_id, schedule_name=schedule_name)
else:
# we need to pass the session to the form in order to disallow changing
@ -613,7 +613,7 @@ def notifications(request, meeting_id):
send_notifications(meeting,groups,request.user.person)
messages.success(request, "Notifications Sent")
return redirect('meetings_view', meeting_id=meeting.number)
return redirect('ietf.secr.meetings.views.view', meeting_id=meeting.number)
return render(request, 'meetings/notifications.html', {
'meeting': meeting,
@ -643,7 +643,7 @@ def remove_session(request, meeting_id, acronym):
session.save()
messages.success(request, '%s Session removed from agenda' % (group.acronym))
return redirect('meetings_select_group', meeting_id=meeting.number)
return redirect('ietf.secr.meetings.views.select_group', meeting_id=meeting.number)
@role_required('Secretariat')
def rooms(request, meeting_id, schedule_name):
@ -661,7 +661,7 @@ def rooms(request, meeting_id, schedule_name):
if request.method == 'POST':
button_text = request.POST.get('submit', '')
if button_text == 'Cancel':
return redirect('meetings', meeting_id=meeting_id,schedule_name=schedule_name)
return redirect('ietf.secr.meetings.views.main', meeting_id=meeting_id,schedule_name=schedule_name)
formset = RoomFormset(request.POST, instance=meeting, prefix='room')
if formset.is_valid():
@ -679,7 +679,7 @@ def rooms(request, meeting_id, schedule_name):
build_timeslots(meeting,room=form.instance)
messages.success(request, 'Meeting Rooms changed successfully')
return redirect('meetings_rooms', meeting_id=meeting_id, schedule_name=schedule_name)
return redirect('ietf.secr.meetings.views.rooms', meeting_id=meeting_id, schedule_name=schedule_name)
else:
formset = RoomFormset(instance=meeting, prefix='room')
@ -726,7 +726,7 @@ def schedule(request, meeting_id, schedule_name, acronym):
if request.method == 'POST':
button_text = request.POST.get('submit', '')
if button_text == 'Cancel':
return redirect('meetings_select_group', meeting_id=meeting_id,schedule_name=schedule_name)
return redirect('ietf.secr.meetings.views.select_group', meeting_id=meeting_id,schedule_name=schedule_name)
formset = NewSessionFormset(request.POST,initial=initial)
@ -788,7 +788,7 @@ def schedule(request, meeting_id, schedule_name, acronym):
if has_changed:
messages.success(request, 'Session(s) Scheduled for %s.' % group.acronym )
return redirect('meetings_select_group', meeting_id=meeting_id,schedule_name=schedule_name)
return redirect('ietf.secr.meetings.views.select_group', meeting_id=meeting_id,schedule_name=schedule_name)
else:
formset = NewSessionFormset(initial=initial)
@ -829,9 +829,9 @@ def select_group(request, meeting_id, schedule_name):
if request.method == 'POST':
group = request.POST.get('group',None)
if group:
redirect_url = reverse('meetings_schedule', kwargs={'meeting_id':meeting_id,'acronym':group,'schedule_name':schedule_name})
redirect_url = reverse('ietf.secr.meetings.views.schedule', kwargs={'meeting_id':meeting_id,'acronym':group,'schedule_name':schedule_name})
else:
redirect_url = reverse('meetings_select_group',kwargs={'meeting_id':meeting_id,'schedule_name':schedule_name})
redirect_url = reverse('ietf.secr.meetings.views.select_group',kwargs={'meeting_id':meeting_id,'schedule_name':schedule_name})
messages.error(request, 'No group selected')
return HttpResponseRedirect(redirect_url)
@ -901,7 +901,7 @@ def times(request, meeting_id, schedule_name):
# assert False, (new_time, time_seen)
if new_time in time_seen:
messages.error(request, 'There is already a timeslot for %s. To change you must delete the old one first.' % new_time.strftime('%a %H:%M'))
return redirect('meetings_times', meeting_id=meeting_id,schedule_name=schedule_name)
return redirect('ietf.secr.meetings.views.times', meeting_id=meeting_id,schedule_name=schedule_name)
for room in meeting.room_set.all():
TimeSlot.objects.create(type_id='session',
@ -912,7 +912,7 @@ def times(request, meeting_id, schedule_name):
duration=duration)
messages.success(request, 'Timeslots created')
return redirect('meetings_times', meeting_id=meeting_id,schedule_name=schedule_name)
return redirect('ietf.secr.meetings.views.times', meeting_id=meeting_id,schedule_name=schedule_name)
else:
form = TimeSlotForm()
@ -939,7 +939,7 @@ def times_edit(request, meeting_id, schedule_name, time):
if request.method == 'POST':
button_text = request.POST.get('submit', '')
if button_text == 'Cancel':
return redirect('meetings_times', meeting_id=meeting_id,schedule_name=schedule_name)
return redirect('ietf.secr.meetings.views.times', meeting_id=meeting_id,schedule_name=schedule_name)
form = TimeSlotForm(request.POST)
if form.is_valid():
@ -958,7 +958,7 @@ def times_edit(request, meeting_id, schedule_name, time):
timeslot.save()
messages.success(request, 'TimeSlot saved')
return redirect('meetings_times', meeting_id=meeting_id,schedule_name=schedule_name)
return redirect('ietf.secr.meetings.views.times', meeting_id=meeting_id,schedule_name=schedule_name)
else:
# we need to pass the session to the form in order to disallow changing
@ -992,7 +992,7 @@ def times_delete(request, meeting_id, schedule_name, time):
TimeSlot.objects.filter(meeting=meeting,time=dtime).delete()
messages.success(request, 'Timeslot deleted')
return redirect('meetings_times', meeting_id=meeting_id,schedule_name=schedule_name)
return redirect('ietf.secr.meetings.views.times', meeting_id=meeting_id,schedule_name=schedule_name)
@role_required('Secretariat')
def unschedule(request, meeting_id, schedule_name, session_id):
@ -1007,7 +1007,7 @@ def unschedule(request, meeting_id, schedule_name, session_id):
# TODO: change session state?
messages.success(request, 'Session unscheduled')
return redirect('meetings_select_group', meeting_id=meeting_id, schedule_name=schedule_name)
return redirect('ietf.secr.meetings.views.select_group', meeting_id=meeting_id, schedule_name=schedule_name)
@role_required('Secretariat')
def view(request, meeting_id):

View file

@ -1,16 +1,18 @@
from django.conf.urls import url
from django.conf import settings
from ietf.meeting.views import OldUploadRedirect
from ietf.utils.urls import url
from ietf.secr.proceedings import views
urlpatterns = [
url(r'^$', 'ietf.secr.proceedings.views.main', name='proceedings'),
url(r'^ajax/generate-proceedings/(?P<meeting_num>\d{1,3})/$', 'ietf.secr.proceedings.views.ajax_generate_proceedings', name='proceedings_ajax_generate_proceedings'),
url(r'^$', views.main, name='proceedings'),
url(r'^ajax/generate-proceedings/(?P<meeting_num>\d{1,3})/$', views.ajax_generate_proceedings),
# special offline URL for testing proceedings build
url(r'^process-pdfs/(?P<meeting_num>\d{1,3})/$', 'ietf.secr.proceedings.views.process_pdfs', name='proceedings_process_pdfs'),
url(r'^progress-report/(?P<meeting_num>\d{1,3})/$', 'ietf.secr.proceedings.views.progress_report', name='proceedings_progress_report'),
url(r'^(?P<meeting_num>\d{1,3})/$', 'ietf.secr.proceedings.views.select', name='proceedings_select'),
url(r'^(?P<meeting_num>\d{1,3})/recording/$', 'ietf.secr.proceedings.views.recording', name='proceedings_recording'),
url(r'^(?P<meeting_num>\d{1,3})/recording/edit/(?P<name>[A-Za-z0-9_\-\+]+)$', 'ietf.secr.proceedings.views.recording_edit', name='proceedings_recording_edit'),
url(r'^process-pdfs/(?P<meeting_num>\d{1,3})/$', views.process_pdfs, name='proceedings_process_pdfs'),
url(r'^progress-report/(?P<meeting_num>\d{1,3})/$', views.progress_report, name='proceedings_progress_report'),
url(r'^(?P<meeting_num>\d{1,3})/$', views.select, name='proceedings_select'),
url(r'^(?P<meeting_num>\d{1,3})/recording/$', views.recording, name='proceedings_recording'),
url(r'^(?P<meeting_num>\d{1,3})/recording/edit/(?P<name>[A-Za-z0-9_\-\+]+)$', views.recording_edit, name='proceedings_recording_edit'),
url(r'^(?P<num>\d{1,3}|interim-\d{4}-[A-Za-z0-9_\-\+]+)/%(acronym)s/$' % settings.URL_REGEXPS,
OldUploadRedirect.as_view(permanent=True)),
]

View file

@ -1,8 +1,10 @@
from django.conf.urls import url
from django.conf import settings
from ietf.secr.roles import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', 'ietf.secr.roles.views.main', name='roles'),
url(r'^ajax/get-roles/%(acronym)s/$' % settings.URL_REGEXPS, 'ietf.secr.roles.views.ajax_get_roles', name='roles_ajax_get_roles'),
url(r'^%(acronym)s/delete/(?P<id>\d{1,6})/$' % settings.URL_REGEXPS, 'ietf.secr.roles.views.delete_role', name='roles_delete_role'),
url(r'^$', views.main, name='roles'),
url(r'^ajax/get-roles/%(acronym)s/$' % settings.URL_REGEXPS, views.ajax_get_roles),
url(r'^%(acronym)s/delete/(?P<id>\d{1,6})/$' % settings.URL_REGEXPS, views.delete_role, name='roles_delete_role'),
]

View file

@ -1,10 +1,12 @@
from django.conf.urls import url
from ietf.secr.rolodex import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', 'ietf.secr.rolodex.views.search', name='rolodex'),
url(r'^add/$', 'ietf.secr.rolodex.views.add', name='rolodex_add'),
url(r'^add-proceed/$', 'ietf.secr.rolodex.views.add_proceed', name='rolodex_add_proceed'),
url(r'^(?P<id>\d{1,6})/edit/$', 'ietf.secr.rolodex.views.edit', name='rolodex_edit'),
#url(r'^(?P<id>\d{1,6})/delete/$', 'ietf.secr.rolodex.views.delete', name='rolodex_delete'),
url(r'^(?P<id>\d{1,6})/$', 'ietf.secr.rolodex.views.view', name='rolodex_view'),
url(r'^$', views.search, name='rolodex'),
url(r'^add/$', views.add, name='rolodex_add'),
url(r'^add-proceed/$', views.add_proceed),
url(r'^(?P<id>\d{1,6})/edit/$', views.edit),
#url(r'^(?P<id>\d{1,6})/delete/$', views.delete, name='rolodex_delete'),
url(r'^(?P<id>\d{1,6})/$', views.view, name='rolodex_view'),
]

View file

@ -32,7 +32,7 @@ class SreqUrlTests(TestCase):
class SessionRequestTestCase(TestCase):
def test_main(self):
make_meeting_test_data()
url = reverse('sessions')
url = reverse('ietf.secr.sreq.views.main')
self.client.login(username="secretary", password="secretary+password")
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
@ -45,7 +45,7 @@ class SubmitRequestCase(TestCase):
def test_submit_request(self):
make_test_data()
group = Group.objects.get(acronym='mars')
url = reverse('sessions_new',kwargs={'acronym':group.acronym})
url = reverse('ietf.secr.sreq.views.new',kwargs={'acronym':group.acronym})
post_data = {'num_session':'1',
'length_session1':'3600',
'attendees':'10',
@ -53,12 +53,12 @@ class SubmitRequestCase(TestCase):
'comments':'need projector'}
self.client.login(username="secretary", password="secretary+password")
r = self.client.post(url,post_data)
self.assertRedirects(r, reverse('sessions_confirm', kwargs={'acronym':group.acronym}))
self.assertRedirects(r, reverse('ietf.secr.sreq.views.confirm', kwargs={'acronym':group.acronym}))
def test_submit_request_invalid(self):
make_test_data()
group = Group.objects.get(acronym='mars')
url = reverse('sessions_new',kwargs={'acronym':group.acronym})
url = reverse('ietf.secr.sreq.views.new',kwargs={'acronym':group.acronym})
post_data = {'num_session':'2',
'length_session1':'3600',
'attendees':'10',
@ -78,7 +78,7 @@ class SubmitRequestCase(TestCase):
ad = group.parent.role_set.filter(name='ad').first().person
resource = ResourceAssociation.objects.first()
url = reverse('ietf.secr.sreq.views.new',kwargs={'acronym':group.acronym})
confirm_url = reverse('sessions_confirm',kwargs={'acronym':group.acronym})
confirm_url = reverse('ietf.secr.sreq.views.confirm',kwargs={'acronym':group.acronym})
len_before = len(outbox)
post_data = {'num_session':'1',
'length_session1':'3600',
@ -93,7 +93,7 @@ class SubmitRequestCase(TestCase):
self.assertRedirects(r, confirm_url)
# confirm
r = self.client.post(confirm_url,{'submit':'Submit'})
self.assertRedirects(r, reverse('sessions'))
self.assertRedirects(r, reverse('ietf.secr.sreq.views.main'))
self.assertEqual(len(outbox),len_before+1)
notification = outbox[-1]
notification_payload = unicode(notification.get_payload(decode=True),"utf-8","replace")
@ -110,7 +110,7 @@ class LockAppTestCase(TestCase):
meeting.session_request_lock_message='locked'
meeting.save()
group = Group.objects.get(acronym='mars')
url = reverse('sessions_edit',kwargs={'acronym':group.acronym})
url = reverse('ietf.secr.sreq.views.edit',kwargs={'acronym':group.acronym})
self.client.login(username="secretary", password="secretary+password")
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
@ -122,7 +122,7 @@ class LockAppTestCase(TestCase):
meeting.session_request_lock_message='locked'
meeting.save()
group = Group.objects.get(acronym='mars')
url = reverse('sessions_view',kwargs={'acronym':group.acronym})
url = reverse('ietf.secr.sreq.views.view',kwargs={'acronym':group.acronym})
self.client.login(username="secretary", password="secretary+password")
r = self.client.get(url,follow=True)
self.assertEqual(r.status_code, 200)
@ -134,11 +134,11 @@ class LockAppTestCase(TestCase):
meeting.session_request_lock_message='locked'
meeting.save()
group = Group.objects.get(acronym='mars')
url = reverse('sessions_new',kwargs={'acronym':group.acronym})
url = reverse('ietf.secr.sreq.views.new',kwargs={'acronym':group.acronym})
# try as WG Chair
self.client.login(username="marschairman", password="marschairman+password")
r = self.client.get(url,follow=True)
r = self.client.get(url, follow=True)
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
self.assertEqual(len(q('#session-request-form')),0)
@ -158,7 +158,7 @@ class NotMeetingCase(TestCase):
def test_not_meeting(self):
make_meeting_test_data()
group = Group.objects.get(acronym='mars')
url = reverse('sessions_no_session',kwargs={'acronym':group.acronym})
url = reverse('ietf.secr.sreq.views.no_session',kwargs={'acronym':group.acronym})
self.client.login(username="secretary", password="secretary+password")
empty_outbox()

View file

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

View file

@ -174,11 +174,11 @@ def approve(request, acronym):
session_save(session)
messages.success(request, 'Third session approved')
return redirect('sessions_view', acronym=acronym)
return redirect('ietf.secr.sreq.views.view', acronym=acronym)
else:
# if an unauthorized user gets here return error
messages.error(request, 'Not authorized to approve the third session')
return redirect('sessions_view', acronym=acronym)
return redirect('ietf.secr.sreq.views.view', acronym=acronym)
@check_permissions
def cancel(request, acronym):
@ -217,7 +217,7 @@ def cancel(request, acronym):
'meeting':meeting}, cc=cc_list)
messages.success(request, 'The %s Session Request has been canceled' % group.acronym)
return redirect('sessions')
return redirect('ietf.secr.sreq.views.main')
@role_required(*AUTHORIZED_ROLES)
def confirm(request, acronym):
@ -246,7 +246,7 @@ def confirm(request, acronym):
button_text = request.POST.get('submit', '')
if button_text == 'Cancel':
messages.success(request, 'Session Request has been canceled')
return redirect('sessions')
return redirect('ietf.secr.sreq.views.main')
# delete any existing session records with status = canceled or notmeet
Session.objects.filter(group=group,meeting=meeting,status__in=('canceled','notmeet')).delete()
@ -295,7 +295,7 @@ def confirm(request, acronym):
status_text = 'IETF Agenda to be scheduled'
messages.success(request, 'Your request has been sent to %s' % status_text)
return redirect('sessions')
return redirect('ietf.secr.sreq.views.main')
# GET logic
session_conflicts = session_conflicts_as_string(group, meeting)
@ -353,7 +353,7 @@ def edit_mtg(request, num, acronym):
if request.method == 'POST':
button_text = request.POST.get('submit', '')
if button_text == 'Cancel':
return redirect('sessions_view', acronym=acronym)
return redirect('ietf.secr.sreq.views.view', acronym=acronym)
form = SessionForm(request.POST,initial=initial)
if form.is_valid():
@ -453,11 +453,11 @@ def edit_mtg(request, num, acronym):
session_constraint_expire(request,session)
messages.success(request, 'Session Request updated')
return redirect('sessions_view', acronym=acronym)
return redirect('ietf.secr.sreq.views.view', acronym=acronym)
else:
if not sessions:
return redirect('sessions_new', acronym=acronym)
return redirect('ietf.secr.sreq.views.new', acronym=acronym)
form = SessionForm(initial=initial)
return render(request, 'sreq/edit.html', {
@ -491,9 +491,9 @@ def main(request):
if request.method == 'POST':
button_text = request.POST.get('submit', '')
if button_text == 'Group will not meet':
return redirect('sessions_no_session', acronym=request.POST['group'])
return redirect('ietf.secr.sreq.views.no_session', acronym=request.POST['group'])
else:
return redirect('sessions_new', acronym=request.POST['group'])
return redirect('ietf.secr.sreq.views.new', acronym=request.POST['group'])
meeting = get_meeting()
scheduled_groups,unscheduled_groups = groups_by_session(request.user, meeting, types=['wg','rg','ag'])
@ -542,24 +542,23 @@ def new(request, acronym):
is_locked = check_app_locked()
if is_locked and not has_role(request.user,'Secretariat'):
messages.warning(request, "The Session Request Tool is closed")
return redirect('sessions')
return redirect('ietf.secr.sreq.views.main')
if request.method == 'POST':
button_text = request.POST.get('submit', '')
if button_text == 'Cancel':
return redirect('sessions')
return redirect('ietf.secr.sreq.views.main')
form = SessionForm(request.POST)
if form.is_valid():
# check if request already exists for this group
if Session.objects.filter(group=group,meeting=meeting).exclude(status__in=('deleted','notmeet')):
messages.warning(request, 'Sessions for working group %s have already been requested once.' % group.acronym)
return redirect('sessions')
return redirect('ietf.secr.sreq.views.main')
# save in user session
request.session['session_form'] = form.data
return redirect('sessions_confirm',acronym=acronym)
return redirect('ietf.secr.sreq.views.confirm',acronym=acronym)
# the "previous" querystring causes the form to be returned
# pre-populated with data from last meeeting's session request
@ -568,7 +567,7 @@ def new(request, acronym):
previous_sessions = Session.objects.filter(meeting=previous_meeting,group=group).exclude(status__in=('notmeet','deleted')).order_by('id')
if not previous_sessions:
messages.warning(request, 'This group did not meet at %s' % previous_meeting)
return redirect('sessions_new', acronym=acronym)
return redirect('ietf.secr.sreq.views.new', acronym=acronym)
initial = get_initial_session(previous_sessions)
add_essential_people(group,initial)
@ -606,7 +605,7 @@ def no_session(request, acronym):
# skip if state is already notmeet
if Session.objects.filter(group=group,meeting=meeting,status='notmeet'):
messages.info(request, 'The group %s is already marked as not meeting' % group.acronym)
return redirect('sessions')
return redirect('ietf.secr.sreq.views.main')
session = Session(group=group,
meeting=meeting,
@ -634,7 +633,7 @@ def no_session(request, acronym):
# redirect
messages.success(request, 'A message was sent to notify not having a session at IETF %s' % meeting.number)
return redirect('sessions')
return redirect('ietf.secr.sreq.views.main')
@role_required('Secretariat')
def tool_status(request):
@ -647,7 +646,7 @@ def tool_status(request):
if request.method == 'POST':
button_text = request.POST.get('submit', '')
if button_text == 'Back':
return redirect('sessions')
return redirect('ietf.secr.sreq.views.main')
form = ToolStatusForm(request.POST)
@ -656,13 +655,13 @@ def tool_status(request):
meeting.session_request_lock_message = form.cleaned_data['message']
meeting.save()
messages.success(request, 'Session Request Tool is now Locked')
return redirect('sessions')
return redirect('ietf.secr.sreq.views.main')
elif button_text == 'Unlock':
meeting.session_request_lock_message = ''
meeting.save()
messages.success(request, 'Session Request Tool is now Unlocked')
return redirect('sessions')
return redirect('ietf.secr.sreq.views.main')
else:
if is_locked:
@ -694,9 +693,9 @@ def view(request, acronym, num = None):
# if there are no session requests yet, redirect to new session request page
if not sessions:
if is_locked:
return redirect('sessions')
return redirect('ietf.secr.sreq.views.main')
else:
return redirect('sessions_new', acronym=acronym)
return redirect('ietf.secr.sreq.views.new', acronym=acronym)
# TODO simulate activity records
activities = [{'act_date':sessions[0].requested.strftime('%b %d, %Y'),

View file

@ -1,14 +1,16 @@
from django.conf.urls import url
from ietf.secr.telechat import views
from ietf.utils.urls import url
urlpatterns = [
url(r'^$', 'ietf.secr.telechat.views.main', name='telechat'),
url(r'^(?P<date>[0-9\-]+)/bash/$', 'ietf.secr.telechat.views.bash', name='telechat_bash'),
url(r'^(?P<date>[0-9\-]+)/doc/$', 'ietf.secr.telechat.views.doc', name='telechat_doc'),
url(r'^(?P<date>[0-9\-]+)/doc/(?P<name>[A-Za-z0-9.-]+)/$', 'ietf.secr.telechat.views.doc_detail', name='telechat_doc_detail'),
url(r'^(?P<date>[0-9\-]+)/doc/(?P<name>[A-Za-z0-9.-]+)/(?P<nav>next|previous)/$', 'ietf.secr.telechat.views.doc_navigate',
url(r'^$', views.main, name='telechat'),
url(r'^(?P<date>[0-9\-]+)/bash/$', views.bash, name='telechat_bash'),
url(r'^(?P<date>[0-9\-]+)/doc/$', views.doc, name='telechat_doc'),
url(r'^(?P<date>[0-9\-]+)/doc/(?P<name>[A-Za-z0-9.-]+)/$', views.doc_detail, name='telechat_doc_detail'),
url(r'^(?P<date>[0-9\-]+)/doc/(?P<name>[A-Za-z0-9.-]+)/(?P<nav>next|previous)/$', views.doc_navigate,
name='telechat_doc_navigate'),
url(r'^(?P<date>[0-9\-]+)/management/$', 'ietf.secr.telechat.views.management', name='telechat_management'),
url(r'^(?P<date>[0-9\-]+)/minutes/$', 'ietf.secr.telechat.views.minutes', name='telechat_minutes'),
url(r'^(?P<date>[0-9\-]+)/roll-call/$', 'ietf.secr.telechat.views.roll_call', name='telechat_roll_call'),
url(r'^new/$', 'ietf.secr.telechat.views.new', name='telechat_new'),
url(r'^(?P<date>[0-9\-]+)/management/$', views.management, name='telechat_management'),
url(r'^(?P<date>[0-9\-]+)/minutes/$', views.minutes, name='telechat_minutes'),
url(r'^(?P<date>[0-9\-]+)/roll-call/$', views.roll_call, name='telechat_roll_call'),
url(r'^new/$', views.new),
]

View file

@ -25,7 +25,7 @@
<tbody>
{% for item in results %}
<tr class="{% cycle 'row1' 'row2' %} {{ item.state|lower }}">
<td><a href="{% url "areas_view" name=item.acronym %}">{{ item.name }}</a></td>
<td><a href="{% url "ietf.secr.areas.views.view" name=item.acronym %}">{{ item.name }}</a></td>
<td>{{ item.acronym }}</td>
<td>{{ item.state }}</td>
</tr>

View file

@ -21,7 +21,7 @@
<h2>Draft - View</h2>
<table class="full-width">
<tr><td>Document Name:</td><td>{{ draft.title }}</td></tr>
<tr><td>Area:</td><td>{% if draft.group.parent %}<a href="{% url "areas_view" name=draft.group.parent.acronym %}">{{ draft.group.parent }}{% endif %}</td></tr>
<tr><td>Area:</td><td>{% if draft.group.parent %}<a href="{% url "ietf.secr.areas.views.view" name=draft.group.parent.acronym %}">{{ draft.group.parent }}{% endif %}</td></tr>
<tr><td>Group:</td><td>{% if draft.group %}<a href="{% url "groups_view" acronym=draft.group.acronym %}">{{ draft.group.acronym }}{% endif %}</td></tr>
<tr><td>Area Director:</td><td>{{ draft.ad }}</td></tr>
<tr><td>Shepherd:</td><td>{% if draft.shepherd %}{{ draft.shepherd.person }} &lt;{{ draft.shepherd.address }}&gt;{% else %}None{% endif %}</td></tr>
@ -56,8 +56,8 @@
<tr><td>RFC Number:</td><td>{{ draft.rfc_number|default_if_none:"" }}</td></tr>
<tr><td>Comments:</td><td>{{ draft.internal_comments|default_if_none:"" }}</td></tr>
<tr><td>Last Modified Date:</td><td>{{ draft.time }}</td></tr>
<tr><td>Replaced by:</td><td>{% if draft.replaced_by %}<a href="{% url "drafts_view" id=draft.replaced_by.name %}">{{ draft.replaced_by.name }}{% endif %}</td></tr>
<tr><td>Related Documents:</td><td>{% for item in draft.relateddocument_set.all %}{% if not forloop.first %}, {% endif %}{{ item.relationship }} <a href="{% url "drafts_view" id=item.target.document.pk %}">{{ item.target.name }}</a>{% endfor %}</td></tr>
<tr><td>Replaced by:</td><td>{% if draft.replaced_by %}<a href="{% url "ietf.secr.drafts.views.view" id=draft.replaced_by.name %}">{{ draft.replaced_by.name }}{% endif %}</td></tr>
<tr><td>Related Documents:</td><td>{% for item in draft.relateddocument_set.all %}{% if not forloop.first %}, {% endif %}{{ item.relationship }} <a href="{% url "ietf.secr.drafts.views.view" id=item.target.document.pk %}">{{ item.target.name }}</a>{% endfor %}</td></tr>
<tr><td>Tags:</td>
<td>{% for tag in draft.tags.all %}
{% if not forloop.first %}, {% endif %}

View file

@ -33,7 +33,7 @@
{% endcomment %}
<tr><td>Primary Area:</td>
<td>{% if not group.parent %}(No Data){% else %}
<a href="{% url "areas_view" name=group.parent.acronym %}">{{ group.parent }}</a>
<a href="{% url "ietf.secr.areas.views.view" name=group.parent.acronym %}">{{ group.parent }}</a>
{% endif %}
</td>
</tr>

View file

@ -10,7 +10,7 @@
<tbody>
{% for item in results %}
<tr class="{% cycle 'row1' 'row2' %}">
<td><a href="{% url "drafts_view" id=item.name %}">{{ item.name }}</a></td>
<td><a href="{% url "ietf.secr.drafts.views.view" id=item.name %}">{{ item.name }}</a></td>
<td>{{item.group.acronym}}</td>
<td>{{item.get_state}}</td>
<td>{{item.intended_std_level}}</td>

View file

@ -16,8 +16,8 @@
</td>
<td>
<h3>IDs and WGs Process</h3>
<li> <a href="{% url "drafts" %}"><b>Drafts</b></a></li><br>
<li> <a href="{% url "areas" %}"><b>Areas</b></a></li><br>
<li> <a href="{% url "ietf.secr.drafts.views.search" %}"><b>Drafts</b></a></li><br>
<li> <a href="{% url "ietf.secr.areas.views.list_areas" %}"><b>Areas</b></a></li><br>
<li> <a href="{% url "groups" %}"><b>Groups</b></a></li><br>
<li> <a href="{% url "rolodex" %}"><b>Rolodex</b></a></li><br>
<li> <a href="{% url "roles" %}"><b>Roles</b></a></li><br>
@ -27,10 +27,10 @@
<td>
<h3>Meetings and Proceedings</h3>
<li> <a href="{% url "drafts_dates" %}"><b>Draft Submission Dates</b></a></li><br>
<li> <a href="{% url "sessions" %}"><b>Session Requests</b></a></li><br>
<li> <a href="{% url "ietf.secr.sreq.views.main" %}"><b>Session Requests</b></a></li><br>
<li> <a href="{% url "proceedings" %}"><b>Meeting Materials Manager (Proceedings)</b></a></li><br>
<li> <a href="{% url "meetings" %}"><b>Meeting Manager</b></a></li><br>
<li> <a href="{% url "meetings_blue_sheet_redirect" %}"><b>Blue Sheets</b></a></li><br>
<li> <a href="{% url "ietf.secr.meetings.views.main" %}"><b>Meeting Manager</b></a></li><br>
<li> <a href="{% url "ietf.secr.meetings.views.blue_sheet_redirect" %}"><b>Blue Sheets</b></a></li><br>
</td>
<td>
<h3>IPR</h3>
@ -45,7 +45,7 @@
<tr valign="top">
<td>
<h3>Section 1</h3>
<li> <a href="{% url "sessions" %}"><b>Session Requests</b></a></li><br>
<li> <a href="{% url "ietf.secr.sreq.views.main" %}"><b>Session Requests</b></a></li><br>
<li> <a href="{% url "proceedings" %}"><b>Meeting Material Manager</b></a></li><br>
<li> <a href="{% url "announcement" %}"><b>Announcements</b></a></li><br>
</td>

View file

@ -11,9 +11,9 @@
{% endblock %}
{% block breadcrumbs %}{{ block.super }}
&raquo; <a href="{% url "meetings" %}">Meetings</a>
&raquo; <a href="{% url "meetings_view" meeting_id=meeting.number %}">{{ meeting.number }}</a>
&raquo; <a href="{% url "meetings_select" meeting_id=meeting.number schedule_name=schedule.name %}">{{ schedule.name }}</a>
&raquo; <a href="{% url "ietf.secr.meetings.views.main" %}">Meetings</a>
&raquo; <a href="{% url "ietf.secr.meetings.views.view" meeting_id=meeting.number %}">{{ meeting.number }}</a>
&raquo; <a href="{% url "ietf.secr.meetings.views.select" meeting_id=meeting.number schedule_name=schedule.name %}">{{ schedule.name }}</a>
&raquo; Rooms and Times
{% endblock %}
@ -22,9 +22,9 @@
<div id="nav" class="rooms-times-nav">
<ul id="list-nav">
<li id="nav-room" class="leftmost"><a href="{% url "meetings_rooms" meeting_id=meeting.number schedule_name=schedule.name %}">Rooms</a></li>
<li id="nav-time"><a href="{% url "meetings_times" meeting_id=meeting.number schedule_name=schedule.name %}">Times</a></li>
<li id="nav-non-session"><a href="{% url "meetings_non_session" meeting_id=meeting.number schedule_name=schedule.name %}">Non-Session</a></li>
<li id="nav-room" class="leftmost"><a href="{% url "ietf.secr.meetings.views.rooms" meeting_id=meeting.number schedule_name=schedule.name %}">Rooms</a></li>
<li id="nav-time"><a href="{% url "ietf.secr.meetings.views.times" meeting_id=meeting.number schedule_name=schedule.name %}">Times</a></li>
<li id="nav-non-session"><a href="{% url "ietf.secr.meetings.views.non_session" meeting_id=meeting.number schedule_name=schedule.name %}">Non-Session</a></li>
</ul>
</div>

View file

@ -21,7 +21,7 @@
<p>Use this to generate blue sheets for meeting sessions.</p>
<ul class="none">
<li>
<form style="display:inline" method="post" action="{% url "meetings_blue_sheet_generate" meeting_id=meeting.number%}">{% csrf_token %}
<form style="display:inline" method="post" action="{% url "ietf.secr.meetings.views.blue_sheet_generate" meeting_id=meeting.number%}">{% csrf_token %}
<input type="submit" value="Generate Blue Sheets">
</form>
&nbsp;&nbsp;Last run:

View file

@ -29,7 +29,7 @@
</div> <!-- inline-related -->
<div class="button-group">
<ul id="proceedings-interim-buttons">
<li><button onclick="window.location='{% url "meetings_add" %}'">Create New Meeting</button></li>
<li><button onclick="window.location='{% url "ietf.secr.meetings.views.add" %}'">Create New Meeting</button></li>
</ul>
</div> <!-- button-group -->
</div> <!-- module -->

View file

@ -29,13 +29,13 @@
<td>{{ item.session.short }}</td>
<td>{{ item.session.group.acronym }}</td>
{% if item.type.slug != 'break' and item.type.slug != 'registration' %}
<td><a href="{% url "meetings_non_session_edit" meeting_id=meeting.number schedule_name=schedule.name slot_id=item.id %}">{{ item.location }}</a></td>
<td><a href="{% url "ietf.secr.meetings.views.non_session_edit" meeting_id=meeting.number schedule_name=schedule.name slot_id=item.id %}">{{ item.location }}</a></td>
{% else %}
<td>{{ item.location }}</td>
{% endif %}
<td>{{ item.show_location }}</td>
<td>{{ item.type }}</td>
<td><a href="{% url "meetings_non_session_delete" meeting_id=meeting.number schedule_name=schedule.name slot_id=item.id %}">Delete</a></td>
<td><a href="{% url "ietf.secr.meetings.views.non_session_delete" meeting_id=meeting.number schedule_name=schedule.name slot_id=item.id %}">Delete</a></td>
</tr>
{% endfor %}
</tbody>

View file

@ -36,10 +36,10 @@
{% endblock %}
{% block breadcrumbs %}{{ block.super }}
&raquo; <a href="{% url "meetings" %}">Meetings</a>
&raquo; <a href="{% url "meetings_view" meeting_id=meeting.number %}">{{ meeting.number }}</a>
&raquo; <a href="{% url "meetings_select" meeting_id=meeting.number schedule_name=schedule.name %}">{{ schedule.name }}</a>
&raquo; <a href="{% url "meetings_select_group" meeting_id=meeting.number schedule_name=schedule.name %}">Select</a>
&raquo; <a href="{% url "ietf.secr.meetings.views.main" %}">Meetings</a>
&raquo; <a href="{% url "ietf.secr.meetings.views.view" meeting_id=meeting.number %}">{{ meeting.number }}</a>
&raquo; <a href="{% url "ietf.secr.meetings.views.select" meeting_id=meeting.number schedule_name=schedule.name %}">{{ schedule.name }}</a>
&raquo; <a href="{% url "ietf.secr.meetings.views.select_group" meeting_id=meeting.number schedule_name=schedule.name %}">Select</a>
&raquo; {{ group.acronym }}
{% endblock %}
@ -71,8 +71,8 @@
<div class="button-group">
<ul>
<li><button type="submit" name="submit" value="Save">Save</button></li>
<li><button type="button" onclick="if (window.confirm('This group will be permanently removed from the agenda and scheduling tool')) { window.location='{% url "meetings_remove_session" meeting_id=meeting.number acronym=group.acronym %}' };">Remove this group from agenda</button></li>
<li><button type="button" onclick="window.location='{% url "meetings_select_group" meeting_id=meeting.number schedule_name=schedule.name %}'">Back</button></li>
<li><button type="button" onclick="if (window.confirm('This group will be permanently removed from the agenda and scheduling tool')) { window.location='{% url "ietf.secr.meetings.views.remove_session" meeting_id=meeting.number acronym=group.acronym %}' };">Remove this group from agenda</button></li>
<li><button type="button" onclick="window.location='{% url "ietf.secr.meetings.views.select_group" meeting_id=meeting.number schedule_name=schedule.name %}'">Back</button></li>
</ul>
</div> <!-- button-group -->

View file

@ -20,8 +20,8 @@
<div class="button-group">
<ul>
<li><button onclick="window.location='{% url "meetings_rooms" meeting_id=meeting.number schedule_name=schedule.name %}'">Rooms and Times</button></li>
<li><button onclick="window.location='{% url "meetings_select_group" meeting_id=meeting.number schedule_name=schedule.name %}'">Schedule WG Sessions</button></li>
<li><button onclick="window.location='{% url "ietf.secr.meetings.views.rooms" meeting_id=meeting.number schedule_name=schedule.name %}'">Rooms and Times</button></li>
<li><button onclick="window.location='{% url "ietf.secr.meetings.views.select_group" meeting_id=meeting.number schedule_name=schedule.name %}'">Schedule WG Sessions</button></li>
<li><button type="button" onclick="window.location='../'">Back</button></li>
</ul>
</div> <!-- button-group -->

View file

@ -8,9 +8,9 @@
{% endblock %}
{% block breadcrumbs %}{{ block.super }}
&raquo; <a href="{% url "meetings" %}">Meetings</a>
&raquo; <a href="{% url "meetings_view" meeting_id=meeting.number %}">{{ meeting.number }}</a>
&raquo; <a href="{% url "meetings_select" meeting_id=meeting.number schedule_name=schedule.name %}">{{ schedule.name }}</a>
&raquo; <a href="{% url "ietf.secr.meetings.views.main" %}">Meetings</a>
&raquo; <a href="{% url "ietf.secr.meetings.views.view" meeting_id=meeting.number %}">{{ meeting.number }}</a>
&raquo; <a href="{% url "ietf.secr.meetings.views.select" meeting_id=meeting.number schedule_name=schedule.name %}">{{ schedule.name }}</a>
&raquo; Select Group
{% endblock %}
@ -51,7 +51,7 @@
<h2>Scheduled Sessions</h2>
<ul id="id_scheduled_sessions">
{% for group in scheduled_groups %}
<li><a href="{% url "meetings_schedule" meeting_id=meeting.number schedule_name=schedule.name acronym=group.acronym %}">{{ group.acronym }}</a></li>
<li><a href="{% url "ietf.secr.meetings.views.schedule" meeting_id=meeting.number schedule_name=schedule.name acronym=group.acronym %}">{{ group.acronym }}</a></li>
{% endfor %}
</ul>
</div><!-- inline-related-->

View file

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

View file

@ -34,9 +34,9 @@
<div class="button-group">
<ul>
<li><button onclick="window.location='{% url "meetings_edit_meeting" meeting_id=meeting.number %}'">Edit</button></li>
<li><button onclick="window.location='{% url "meetings_notifications" meeting_id=meeting.number %}'">Notifications</button></li>
<li><button onclick="window.location='{% url "meetings_blue_sheet" meeting_id=meeting.number %}'">Blue Sheets</button></li>
<li><button onclick="window.location='{% url "ietf.secr.meetings.views.edit_meeting" meeting_id=meeting.number %}'">Edit</button></li>
<li><button onclick="window.location='{% url "ietf.secr.meetings.views.notifications" meeting_id=meeting.number %}'">Notifications</button></li>
<li><button onclick="window.location='{% url "ietf.secr.meetings.views.blue_sheet" meeting_id=meeting.number %}'">Blue Sheets</button></li>
<li><form id="id_schedule_selector">
<select name="forma" onchange="location = this.options[this.selectedIndex].value;">
<option value="">Select a schedule...</option>

View file

@ -35,7 +35,7 @@
{% if user|has_role:"Secretariat" %}
<div class="button-group">
<ul id="proceedings-meeting-buttons">
<li><button onclick="window.location='{% url "meetings_add" %}'">Add</button></li>
<li><button onclick="window.location='{% url "ietf.secr.meetings.views.add" %}'">Add</button></li>
</ul>
</div> <!-- button-group -->
{% endif %}

View file

@ -44,7 +44,7 @@
<td>{{ role.name }} </td>
<td>
{% if role.group.type.slug == "area" %}
<a href="{% url "areas_view" name=role.group.acronym %}">{{ role.group.acronym }}{% if role.group.state.slug == "conclude" %} (concluded){% endif %}</a>
<a href="{% url "ietf.secr.areas.views.view" name=role.group.acronym %}">{{ role.group.acronym }}{% if role.group.state.slug == "conclude" %} (concluded){% endif %}</a>
{% else %}
<a href="{% url "groups_view" acronym=role.group.acronym %}">{{ role.group.acronym }}{% if role.group.state.slug == "conclude" %} (concluded){% endif %}</a>
{% endif %}

View file

@ -8,7 +8,7 @@
{% endblock %}
{% block breadcrumbs %}{{ block.super }}
&raquo; <a href="{% url "sessions" %}">Sessions</a>
&raquo; <a href="{% url "ietf.secr.sreq.views.main" %}">Sessions</a>
&raquo; <a href="../">New</a>
&raquo; Session Request Confirmation
{% endblock %}

View file

@ -22,9 +22,9 @@
Sessions Request Tool: IETF {{ meeting.number }}
{% if user|has_role:"Secretariat" %}
{% if is_locked %}
<span class="locked"><a href="{% url "sessions_tool_status" %}">Tool Status: Locked</a></span>
<span class="locked"><a href="{% url "ietf.secr.sreq.views.tool_status" %}">Tool Status: Locked</a></span>
{% else %}
<span class="unlocked"><a href="{% url "sessions_tool_status" %}">Tool Status: Unlocked</a></span>
<span class="unlocked"><a href="{% url "ietf.secr.sreq.views.tool_status" %}">Tool Status: Unlocked</a></span>
{% endif %}
{% endif %}
</h2>
@ -34,7 +34,7 @@
<ul>
{% for group in unscheduled_groups %}
<li>
<a href="{% url "sessions_new" acronym=group.acronym %}">{{ group.acronym }}</a>
<a href="{% url "ietf.secr.sreq.views.new" acronym=group.acronym %}">{{ group.acronym }}</a>
{% if group.not_meeting %}
<span class="required"> (Currently, this group does not plan to hold a session at IETF {{ meeting.number }})</span>
{% endif %}
@ -49,7 +49,7 @@
<p>The list below includes those working groups for which you or your co-chair has requested sessions at the upcoming IETF meeting. You can click on an acronym to initiate changes to a session, or cancel a session.</p>
<ul>
{% for group in scheduled_groups %}
<li><a href="{% url "sessions_view" acronym=group.acronym %}">{{ group.acronym }} - {{ group.status_message }}</a></li>
<li><a href="{% url "ietf.secr.sreq.views.view" acronym=group.acronym %}">{{ group.acronym }} - {{ group.status_message }}</a></li>
{% empty %}
<i>NONE</i>
{% endfor %}

Some files were not shown because too many files have changed in this diff Show more