Move chartering groups to /group/chartering/ (with a redirect from the old location), list RGs there too, and amend the previous fix to the chartering process for non-WGs so they have internal and external review states instead of just approved. Also move the code in wginfo/ to group/ as it is no longer just about info for WGs.

- Legacy-Id: 7556
This commit is contained in:
Ole Laursen 2014-04-01 11:59:08 +00:00
parent a38a53efd0
commit f52e676793
49 changed files with 178 additions and 170 deletions

View file

@ -11,7 +11,7 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ietf.settings")
syslog.openlog(os.path.basename(__file__), syslog.LOG_PID, syslog.LOG_LOCAL0)
from ietf.wginfo.mails import *
from ietf.group.mails import *
today = datetime.date.today()

View file

@ -30,7 +30,7 @@ from ietf.person.models import Person
from ietf.utils.history import find_history_active_at
from ietf.utils.mail import send_mail_preformatted
from ietf.utils.textupload import get_cleaned_text_file_content
from ietf.wginfo.mails import email_secretariat
from ietf.group.mails import email_secretariat
class ChangeStateForm(forms.Form):
@ -46,7 +46,7 @@ class ChangeStateForm(forms.Form):
if group.type_id == "wg":
state_field.queryset = state_field.queryset.filter(slug__in=("infrev", "intrev", "extrev", "iesgrev"))
else:
state_field.queryset = state_field.queryset.filter(slug__in=("notrev", "approved"))
state_field.queryset = state_field.queryset.filter(slug__in=("intrev", "extrev", "approved"))
# hide requested fields
if self.hide:
for f in self.hide:
@ -147,7 +147,7 @@ def change_state(request, name, option=None):
email_state_changed(request, charter, "State changed to %s." % charter_state)
if charter_state.slug == "intrev":
if charter_state.slug == "intrev" and group.type_id == "wg":
if request.POST.get("ballot_wo_extern"):
create_ballot_if_not_open(charter, login, "r-wo-ext")
else:
@ -198,13 +198,15 @@ def change_state(request, name, option=None):
def state_pk(slug):
return State.objects.get(used=True, type="charter", slug=slug).pk
info_msg = {
state_pk("infrev"): 'The %s "%s" (%s) has been set to Informal IESG review by %s.' % (group.type.name, group.name, group.acronym, login.plain_name()),
state_pk("intrev"): 'The %s "%s" (%s) has been set to Internal review by %s.\nPlease place it on the next IESG telechat and inform the IAB.' % (group.type.name, group.name, group.acronym, login.plain_name()),
state_pk("extrev"): 'The %s "%s" (%s) has been set to External review by %s.\nPlease send out the external review announcement to the appropriate lists.\n\nSend the announcement to other SDOs: Yes\nAdditional recipients of the announcement: ' % (group.type.name, group.name, group.acronym, login.plain_name()),
}
info_msg = {}
if group.type_id == "wg":
info_msg[state_pk("infrev")] = 'The %s "%s" (%s) has been set to Informal IESG review by %s.' % (group.type.name, group.name, group.acronym, login.plain_name())
info_msg[state_pk("intrev")] = 'The %s "%s" (%s) has been set to Internal review by %s.\nPlease place it on the next IESG telechat and inform the IAB.' % (group.type.name, group.name, group.acronym, login.plain_name())
info_msg[state_pk("extrev")] = 'The %s "%s" (%s) has been set to External review by %s.\nPlease send out the external review announcement to the appropriate lists.\n\nSend the announcement to other SDOs: Yes\nAdditional recipients of the announcement: ' % (group.type.name, group.name, group.acronym, login.plain_name())
states_for_ballot_wo_extern = State.objects.filter(used=True, type="charter", slug="intrev").values_list("pk", flat=True)
states_for_ballot_wo_extern = State.objects.none()
if group.type_id == "wg":
states_for_ballot_wo_extern = State.objects.filter(used=True, type="charter", slug="intrev").values_list("pk", flat=True)
return render_to_response('doc/charter/change_state.html',
dict(form=form,

View file

@ -2,7 +2,7 @@ from django.conf.urls import patterns
from django.views.generic import RedirectView
from ietf.doc.feeds import DocumentChangesFeed, InLastCallFeed
from ietf.wginfo.feeds import GroupChangesFeed
from ietf.group.feeds import GroupChangesFeed
from ietf.iesg.feeds import IESGAgendaFeed
from ietf.ipr.feeds import LatestIprDisclosuresFeed
from ietf.liaisons.feeds import LiaisonStatementsFeed

View file

@ -22,7 +22,7 @@ from ietf.group.utils import save_group_in_history, can_manage_group_type
from ietf.ietfauth.utils import has_role
from ietf.person.forms import EmailsField
from ietf.person.models import Person, Email
from ietf.wginfo.mails import email_secretariat
from ietf.group.mails import email_secretariat
MAX_GROUP_DELEGATES = 3
@ -170,7 +170,7 @@ def submit_initial_charter(request, group_type, acronym=None):
return redirect('charter_submit', name=group.charter.name, option="initcharter")
@login_required
def edit(request, group_type, acronym=None, action="edit"):
def edit(request, group_type=None, acronym=None, action="edit"):
"""Edit or create a group, notifying parties as
necessary and logging changes as group events."""
if not can_manage_group_type(request.user, group_type):
@ -314,7 +314,7 @@ def edit(request, group_type, acronym=None, action="edit"):
)
form = GroupForm(initial=init, group=group, group_type=group_type)
return render(request, 'wginfo/edit.html',
return render(request, 'group/edit.html',
dict(group=group,
form=form,
action=action))
@ -348,7 +348,7 @@ def conclude(request, group_type, acronym):
else:
form = ConcludeForm()
return render(request, 'wginfo/conclude.html',
return render(request, 'group/conclude.html',
dict(form=form, group=group))
@ -382,7 +382,7 @@ def customize_workflow(request, group_type, acronym):
# redirect so the back button works correctly, otherwise
# repeated POSTs fills up the history
return redirect("ietf.wginfo.edit.customize_workflow", group_type=group.type_id, acronym=group.acronym)
return redirect("ietf.group.edit.customize_workflow", group_type=group.type_id, acronym=group.acronym)
if action == "setnextstates":
try:
@ -399,7 +399,7 @@ def customize_workflow(request, group_type, acronym):
transitions, _ = GroupStateTransitions.objects.get_or_create(group=group, state=state)
transitions.next_states = next_states
return redirect("ietf.wginfo.edit.customize_workflow", group_type=group.type_id, acronym=group.acronym)
return redirect("ietf.group.edit.customize_workflow", group_type=group.type_id, acronym=group.acronym)
if action == "settagactive":
active = request.POST.get("active") == "1"
@ -413,7 +413,7 @@ def customize_workflow(request, group_type, acronym):
else:
group.unused_tags.add(tag)
return redirect("ietf.wginfo.edit.customize_workflow", group_type=group.type_id, acronym=group.acronym)
return redirect("ietf.group.edit.customize_workflow", group_type=group.type_id, acronym=group.acronym)
# put some info for the template on tags and states
unused_tags = group.unused_tags.all().values_list('slug', flat=True)
@ -437,7 +437,7 @@ def customize_workflow(request, group_type, acronym):
s.next_states_checkboxes = [(x in n, x in default_n, x) for x in states]
s.used_next_states = [x for x in n if x.slug not in unused_states]
return render(request, 'wginfo/customize_workflow.html', {
return render(request, 'group/customize_workflow.html', {
'group': group,
'states': states,
'tags': tags,

View file

@ -11,7 +11,7 @@ from ietf.doc.models import DocEvent
class GroupChangesFeed(Feed):
feed_type = Atom1Feed
description_template = "wginfo/feed_item_description.html"
description_template = "group/feed_item_description.html"
def get_object(self, request, acronym):
return Group.objects.get(acronym=acronym)

View file

@ -49,6 +49,7 @@ from ietf.doc.models import State, DocAlias, RelatedDocument
from ietf.doc.utils import get_chartering_type
from ietf.doc.templatetags.ietf_filters import clean_whitespace
from ietf.group.models import Group, Role
from ietf.name.models import GroupTypeName
from ietf.group.utils import get_charter_text, can_manage_group_type, milestone_reviewer_for_group_type
from ietf.utils.pipe import pipe
@ -96,7 +97,7 @@ def wg_summary_area(request, group_type):
areas = [a for a in areas if a.groups]
return render(request, 'wginfo/1wg-summary.txt',
return render(request, 'group/1wg-summary.txt',
{ 'areas': areas },
content_type='text/plain; charset=UTF-8')
@ -107,7 +108,7 @@ def wg_summary_acronym(request, group_type):
groups = Group.objects.filter(type="wg", state="active").order_by("acronym").select_related("parent")
for group in groups:
group.chairs = sorted(roles(group, "chair"), key=extract_last_name)
return render(request, 'wginfo/1wg-summary-by-acronym.txt',
return render(request, 'group/1wg-summary-by-acronym.txt',
{ 'areas': areas,
'groups': groups },
content_type='text/plain; charset=UTF-8')
@ -122,7 +123,7 @@ def wg_charters(request, group_type):
for group in area.groups:
fill_in_charter_info(group, include_drafts=True)
group.area = area
return render(request, 'wginfo/1wg-charters.txt',
return render(request, 'group/1wg-charters.txt',
{ 'areas': areas },
content_type='text/plain; charset=UTF-8')
@ -138,7 +139,7 @@ def wg_charters_by_acronym(request, group_type):
for group in groups:
fill_in_charter_info(group, include_drafts=True)
group.area = areas.get(group.parent_id)
return render(request, 'wginfo/1wg-charters-by-acronym.txt',
return render(request, 'group/1wg-charters-by-acronym.txt',
{ 'groups': groups },
content_type='text/plain; charset=UTF-8')
@ -162,7 +163,7 @@ def active_wgs(request):
for group in area.groups:
group.chairs = sorted(roles(group, "chair"), key=extract_last_name)
return render(request, 'wginfo/active_wgs.html', { 'areas':areas })
return render(request, 'group/active_wgs.html', { 'areas':areas })
def active_rgs(request):
irtf = Group.objects.get(acronym="irtf")
@ -172,25 +173,27 @@ def active_rgs(request):
for group in groups:
group.chairs = sorted(roles(group, "chair"), key=extract_last_name)
return render(request, 'wginfo/active_rgs.html', { 'irtf': irtf, 'groups': groups })
return render(request, 'group/active_rgs.html', { 'irtf': irtf, 'groups': groups })
def bofs(request, group_type):
groups = Group.objects.filter(type=group_type, state="bof")
return render(request, 'wginfo/bofs.html',dict(groups=groups))
def chartering_groups(request, group_type):
if group_type != "wg":
raise Http404
return render(request, 'group/bofs.html',dict(groups=groups))
def chartering_groups(request):
charter_states = State.objects.filter(used=True, type="charter").exclude(slug__in=("approved", "notrev"))
groups = Group.objects.filter(type=group_type, charter__states__in=charter_states).select_related("state", "charter")
for g in groups:
g.chartering_type = get_chartering_type(g.charter)
group_types = GroupTypeName.objects.filter(slug__in=("wg", "rg"))
return render(request, 'wginfo/chartering_groups.html',
for t in group_types:
t.chartering_groups = Group.objects.filter(type=t, charter__states__in=charter_states).select_related("state", "charter")
t.can_manage = can_manage_group_type(request.user, t)
for g in t.chartering_groups:
g.chartering_type = get_chartering_type(g.charter)
return render(request, 'group/chartering_groups.html',
dict(charter_states=charter_states,
groups=groups))
group_types=group_types))
def construct_group_menu_context(request, group, selected, others):
@ -207,10 +210,10 @@ def construct_group_menu_context(request, group, selected, others):
actions.append((u"Edit group", urlreverse("group_edit", kwargs=dict(group_type=group.type_id, acronym=group.acronym))))
if is_chair or can_manage:
actions.append((u"Customize workflow", urlreverse("ietf.wginfo.edit.customize_workflow", kwargs=dict(group_type=group.type_id, acronym=group.acronym))))
actions.append((u"Customize workflow", urlreverse("ietf.group.edit.customize_workflow", kwargs=dict(group_type=group.type_id, acronym=group.acronym))))
if group.state_id in ("active", "dormant") and can_manage:
actions.append((u"Request closing group", urlreverse("ietf.wginfo.edit.conclude", kwargs=dict(group_type=group.type_id, acronym=group.acronym))))
actions.append((u"Request closing group", urlreverse("ietf.group.edit.conclude", kwargs=dict(group_type=group.type_id, acronym=group.acronym))))
d = {
"group": group,
@ -260,7 +263,7 @@ def group_documents(request, group_type, acronym):
docs, meta, docs_related, meta_related = search_for_group_documents(group)
return render(request, 'wginfo/group_documents.html',
return render(request, 'group/group_documents.html',
construct_group_menu_context(request, group, "documents", {
'docs': docs,
'meta': meta,
@ -309,7 +312,7 @@ def group_charter(request, group_type, acronym):
can_manage = can_manage_group_type(request.user, group.type_id)
return render(request, 'wginfo/group_charter.html',
return render(request, 'group/group_charter.html',
construct_group_menu_context(request, group, "charter", {
"milestones_in_review": group.groupmilestone_set.filter(state="review"),
"milestone_reviewer": milestone_reviewer_for_group_type(group_type),
@ -324,7 +327,7 @@ def history(request, group_type, acronym):
events = group.groupevent_set.all().select_related('by').order_by('-time', '-id')
return render(request, 'wginfo/history.html',
return render(request, 'group/history.html',
construct_group_menu_context(request, group, "history", {
"events": events,
}))
@ -443,7 +446,7 @@ def make_dot(group):
node.nodename=nodename(node.name)
node.styles = get_node_styles(node,group)
return render_to_string('wginfo/dot.txt',
return render_to_string('group/dot.txt',
dict( nodes=nodes, edges=edges )
)

View file

@ -19,7 +19,7 @@ def email_secretariat(request, group, subject, text):
text = strip_tags(text)
send_mail(request, to, None, full_subject,
"wginfo/email_secretariat.txt",
"group/email_secretariat.txt",
dict(text=text,
group=group,
group_url=settings.IDTRACKER_BASE_URL + urlreverse('group_charter', kwargs=dict(group_type=group.type_id, acronym=group.acronym)),
@ -89,7 +89,7 @@ def email_milestone_review_reminder(group, grace_period=7):
send_mail(None, to, None,
subject,
"wginfo/reminder_milestones_need_review.txt",
"group/reminder_milestones_need_review.txt",
dict(group=group,
milestones=milestones,
reviewer=milestone_reviewer_for_group_type(group.type_id),
@ -116,7 +116,7 @@ def email_milestones_due(group, early_warning_days):
send_mail(None, to, None,
subject,
"wginfo/reminder_milestones_due.txt",
"group/reminder_milestones_due.txt",
dict(group=group,
milestones=milestones,
today=today,
@ -143,7 +143,7 @@ def email_milestones_overdue(group):
send_mail(None, to, None,
subject,
"wginfo/reminder_milestones_overdue.txt",
"group/reminder_milestones_overdue.txt",
dict(group=group,
milestones=milestones,
url=settings.IDTRACKER_BASE_URL + urlreverse("group_charter", kwargs=dict(group_type=group.type_id, acronym=group.acronym))

View file

@ -14,7 +14,7 @@ from ietf.doc.utils import get_chartering_type
from ietf.group.models import Group, GroupMilestone, MilestoneGroupEvent
from ietf.group.utils import save_milestone_in_history, can_manage_group_type, milestone_reviewer_for_group_type
from ietf.name.models import GroupMilestoneStateName
from ietf.wginfo.mails import email_milestones_changed
from ietf.group.mails import email_milestones_changed
def json_doc_names(docs):
return json.dumps([{"id": doc.pk, "name": doc.name } for doc in docs])
@ -317,7 +317,7 @@ def edit_milestones(request, group_type, acronym, milestone_set="current"):
forms.sort(key=lambda f: f.milestone.due if f.milestone else datetime.date.max)
return render(request, 'wginfo/edit_milestones.html',
return render(request, 'group/edit_milestones.html',
dict(group=group,
title=title,
forms=forms,
@ -379,7 +379,7 @@ def reset_charter_milestones(request, group_type, acronym):
return redirect('group_edit_charter_milestones', group_type=group.type_id, acronym=group.acronym)
return render(request, 'wginfo/reset_charter_milestones.html',
return render(request, 'group/reset_charter_milestones.html',
dict(group=group,
charter_milestones=charter_milestones,
current_milestones=current_milestones,

View file

@ -19,7 +19,7 @@ from ietf.utils.test_utils import TestCase
from ietf.utils.mail import outbox
from ietf.utils.test_data import make_test_data
from ietf.utils.test_utils import login_testing_unauthorized
from ietf.wginfo.mails import ( email_milestone_review_reminder, email_milestones_due,
from ietf.group.mails import ( email_milestone_review_reminder, email_milestones_due,
email_milestones_overdue, groups_needing_milestones_due_reminder,
groups_needing_milestones_overdue_reminder, groups_with_milestones_needing_review )
@ -36,7 +36,7 @@ class GroupPagesTests(TestCase):
draft = make_test_data()
group = draft.group
url = urlreverse('ietf.wginfo.views.active_groups', kwargs=dict(group_type="wg"))
url = urlreverse('ietf.group.info.active_groups', kwargs=dict(group_type="wg"))
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
self.assertTrue(group.parent.name in r.content)
@ -44,7 +44,7 @@ class GroupPagesTests(TestCase):
self.assertTrue(group.name in r.content)
self.assertTrue(group.ad.plain_name() in r.content)
url = urlreverse('ietf.wginfo.views.active_groups', kwargs=dict(group_type="rg"))
url = urlreverse('ietf.group.info.active_groups', kwargs=dict(group_type="rg"))
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
@ -57,7 +57,7 @@ class GroupPagesTests(TestCase):
with open(os.path.join(self.charter_dir, "%s-%s.txt" % (group.charter.canonical_name(), group.charter.rev)), "w") as f:
f.write("This is a charter.")
url = urlreverse('ietf.wginfo.views.wg_summary_area', kwargs=dict(group_type="wg"))
url = urlreverse('ietf.group.info.wg_summary_area', kwargs=dict(group_type="wg"))
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
self.assertTrue(group.parent.name in r.content)
@ -65,14 +65,14 @@ class GroupPagesTests(TestCase):
self.assertTrue(group.name in r.content)
self.assertTrue(chair.address in r.content)
url = urlreverse('ietf.wginfo.views.wg_summary_acronym', kwargs=dict(group_type="wg"))
url = urlreverse('ietf.group.info.wg_summary_acronym', kwargs=dict(group_type="wg"))
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
self.assertTrue(group.acronym in r.content)
self.assertTrue(group.name in r.content)
self.assertTrue(chair.address in r.content)
url = urlreverse('ietf.wginfo.views.wg_charters', kwargs=dict(group_type="wg"))
url = urlreverse('ietf.group.info.wg_charters', kwargs=dict(group_type="wg"))
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
self.assertTrue(group.acronym in r.content)
@ -81,7 +81,7 @@ class GroupPagesTests(TestCase):
self.assertTrue(chair.address in r.content)
self.assertTrue("This is a charter." in r.content)
url = urlreverse('ietf.wginfo.views.wg_charters_by_acronym', kwargs=dict(group_type="wg"))
url = urlreverse('ietf.group.info.wg_charters_by_acronym', kwargs=dict(group_type="wg"))
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
self.assertTrue(group.acronym in r.content)
@ -95,7 +95,7 @@ class GroupPagesTests(TestCase):
group = draft.group
group.charter.set_state(State.objects.get(used=True, type="charter", slug="intrev"))
url = urlreverse('ietf.wginfo.views.chartering_groups', kwargs=dict(group_type="wg"))
url = urlreverse('ietf.group.info.chartering_groups')
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
@ -107,7 +107,7 @@ class GroupPagesTests(TestCase):
group.state_id = "bof"
group.save()
url = urlreverse('ietf.wginfo.views.bofs', kwargs=dict(group_type="wg"))
url = urlreverse('ietf.group.info.bofs', kwargs=dict(group_type="wg"))
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
@ -141,7 +141,7 @@ class GroupPagesTests(TestCase):
name=draft2.name,
)
url = urlreverse('ietf.wginfo.views.group_documents', kwargs=dict(group_type=group.type_id, acronym=group.acronym))
url = urlreverse('ietf.group.info.group_documents', kwargs=dict(group_type=group.type_id, acronym=group.acronym))
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
self.assertTrue(draft.name in r.content)
@ -151,7 +151,7 @@ class GroupPagesTests(TestCase):
self.assertTrue(draft2.name in r.content)
# test the txt version too while we're at it
url = urlreverse('ietf.wginfo.views.group_documents_txt', kwargs=dict(group_type=group.type_id, acronym=group.acronym))
url = urlreverse('ietf.group.info.group_documents_txt', kwargs=dict(group_type=group.type_id, acronym=group.acronym))
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
self.assertTrue(draft.name in r.content)
@ -171,7 +171,7 @@ class GroupPagesTests(TestCase):
due=datetime.date.today() + datetime.timedelta(days=100))
milestone.docs.add(draft)
url = urlreverse('ietf.wginfo.views.group_charter', kwargs=dict(group_type=group.type_id, acronym=group.acronym))
url = urlreverse('ietf.group.info.group_charter', kwargs=dict(group_type=group.type_id, acronym=group.acronym))
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
self.assertTrue(group.name in r.content)
@ -190,7 +190,7 @@ class GroupPagesTests(TestCase):
type="added_comment",
by=Person.objects.get(name="(System)"))
url = urlreverse('ietf.wginfo.views.history', kwargs=dict(group_type=group.type_id, acronym=group.acronym))
url = urlreverse('ietf.group.info.history', kwargs=dict(group_type=group.type_id, acronym=group.acronym))
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
self.assertTrue(e.desc in r.content)
@ -384,7 +384,7 @@ class GroupEditTests(TestCase):
group = Group.objects.get(acronym="mars")
url = urlreverse('ietf.wginfo.edit.conclude', kwargs=dict(group_type=group.type_id, acronym=group.acronym))
url = urlreverse('ietf.group.edit.conclude', kwargs=dict(group_type=group.type_id, acronym=group.acronym))
login_testing_unauthorized(self, "secretary", url)
# normal get
@ -825,7 +825,7 @@ class CustomizeWorkflowTests(TestCase):
group = Group.objects.get(acronym="mars")
url = urlreverse('ietf.wginfo.edit.customize_workflow', kwargs=dict(group_type=group.type_id, acronym=group.acronym))
url = urlreverse('ietf.group.edit.customize_workflow', kwargs=dict(group_type=group.type_id, acronym=group.acronym))
login_testing_unauthorized(self, "secretary", url)
state = State.objects.get(used=True, type="draft-stream-ietf", slug="wg-lc")

View file

@ -4,6 +4,8 @@ from django.conf.urls import patterns
urlpatterns = patterns('',
(r'^(?P<acronym>[a-z0-9]+).json$', 'ietf.group.ajax.group_json'),
(r'^chartering/$', 'ietf.group.info.chartering_groups'),
(r'^chartering/create/(?P<group_type>(wg|rg))/$', 'ietf.group.edit.edit', {'action': "charter"}, "group_create"),
)

View file

@ -3,28 +3,28 @@
from django.conf.urls import patterns
from django.views.generic import RedirectView
from ietf.wginfo import views, edit, milestones
from ietf.group import info, edit, milestones
urlpatterns = patterns('',
(r'^$', views.active_groups),
(r'^$', info.active_groups),
(r'^summary.txt', RedirectView.as_view(url='/wg/1wg-summary.txt')),
(r'^summary-by-area.txt', RedirectView.as_view(url='/wg/1wg-summary.txt')),
(r'^summary-by-acronym.txt', RedirectView.as_view(url='/wg/1wg-summary-by-acronym.txt')),
(r'^1wg-summary.txt', views.wg_summary_area),
(r'^1wg-summary-by-acronym.txt', views.wg_summary_acronym),
(r'^1wg-charters.txt', views.wg_charters),
(r'^1wg-charters-by-acronym.txt', views.wg_charters_by_acronym),
(r'^chartering/$', views.chartering_groups),
(r'^bofs/$', views.bofs),
(r'^chartering/create/$', edit.edit, {'action': "charter"}, "group_create"),
(r'^1wg-summary.txt', info.wg_summary_area),
(r'^1wg-summary-by-acronym.txt', info.wg_summary_acronym),
(r'^1wg-charters.txt', info.wg_charters),
(r'^1wg-charters-by-acronym.txt', info.wg_charters_by_acronym),
(r'^chartering/$', RedirectView.as_view(url='/group/chartering/')),
(r'^chartering/create/$', RedirectView.as_view(url='/group/chartering/create/%(group_type)s/')),
(r'^bofs/$', info.bofs),
(r'^bofs/create/$', edit.edit, {'action': "create"}, "bof_create"),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/documents/txt/$', views.group_documents_txt),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/$', views.group_documents, None, "group_docs"),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/charter/$', views.group_charter, None, 'group_charter'),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/documents/txt/$', info.group_documents_txt),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/$', info.group_documents, None, "group_docs"),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/charter/$', info.group_charter, None, 'group_charter'),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/init-charter/', edit.submit_initial_charter),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/history/$', views.history),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/deps/dot/$', views.dependencies_dot),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/deps/pdf/$', views.dependencies_pdf),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/history/$', info.history),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/deps/dot/$', info.dependencies_dot),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/deps/pdf/$', info.dependencies_pdf),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/edit/$', edit.edit, {'action': "edit"}, "group_edit"),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/conclude/$', edit.conclude),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/milestones/$', milestones.edit_milestones, {'milestone_set': "current"}, "group_edit_milestones"),

View file

@ -194,7 +194,6 @@ INSTALLED_APPS = (
'ietf.meeting',
'ietf.utils',
'ietf.redirects',
'ietf.wginfo',
'ietf.submit',
'ietf.sync',
'ietf.community',

View file

@ -73,8 +73,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</div></div></li>
<li style="padding-top:0;"><a href="/wg/">Active WGs</a></li>
<li><a href="{% url "ietf.wginfo.views.chartering_groups" group_type="wg" %}">Chartering WGs</a></li>
<li><a href="{% url "ietf.wginfo.views.bofs" group_type="wg" %}">BoFs</a></li>
<li><a href="{% url "ietf.group.info.chartering_groups" %}">Chartering WGs</a></li>
<li><a href="{% url "ietf.group.info.bofs" group_type="wg" %}">BoFs</a></li>
<li><a href="http://tools.ietf.org/wg/concluded">Concluded WGs</a></li>
<li><a href="http://www.ietf.org/list/nonwg.html">Non-WG Lists</a></li>

View file

@ -25,7 +25,7 @@
{% if snapshot %}Snapshot of{% endif %}
{% if doc.get_state_slug != "approved" %}Proposed{% endif %}
Charter for "{{ group.name }}"
(<a {% if group.type_id == "wg" or group.type_id == "rg" %}href="{% url "ietf.wginfo.views.group_charter" group_type=group.type_id acronym=group.acronym %}"{% endif %}>{{ group.acronym }}</a>) {{ group.type.name }}
(<a {% if group.type_id == "wg" or group.type_id == "rg" %}href="{% url "ietf.group.info.group_charter" group_type=group.type_id acronym=group.acronym %}"{% endif %}>{{ group.acronym }}</a>) {{ group.type.name }}
</div>
<table id="metatable" width="100%">
@ -137,7 +137,7 @@
</h3>
{% if milestones %}
{% include "wginfo/milestones.html" %}
{% include "group/milestones.html" %}
{% else %}
<p>No milestones for charter found.</p>
{% endif %}

View file

@ -0,0 +1,4 @@
{% autoescape off %}{% load ietf_filters %}{% for group in groups %}{{ group.acronym }}
{% endfor %}
{% for group in groups %}{% include "group/group_entry_with_charter.txt" %}{% endfor %}{% endautoescape %}

View file

@ -1,6 +1,6 @@
{% autoescape off %}{% load ietf_filters %}{% for area in areas %}{% for group in area.groups %}{{ group.acronym }}
{% endfor %}{% endfor %}
{% for area in areas %}{% for group in area.groups %}{% include "wginfo/group_entry_with_charter.txt" %}{% endfor %}{% endfor %}{% endautoescape %}
{% for area in areas %}{% for group in area.groups %}{% include "group/group_entry_with_charter.txt" %}{% endfor %}{% endfor %}{% endautoescape %}

View file

@ -7,4 +7,4 @@ The following Area Abbreviations are used in this document
{{ area.acronym|upper }} - {{ area.name }}{% endfor %}
{% for group in groups %}
{{ group.name }} ({{ group.acronym }}) -- {{ group.parent.acronym|upper }}
{% include "wginfo/group_entry.txt" %}{% endfor %}{% endautoescape %}
{% include "group/group_entry.txt" %}{% endfor %}{% endautoescape %}

View file

@ -7,5 +7,5 @@
{{ ad.person.plain_name }} <{{ ad.email.address }}>{% endfor %}
{% for group in area.groups %}{{ group.name }} ({{ group.acronym }})
{% include "wginfo/group_entry.txt" %}
{% include "group/group_entry.txt" %}
{% endfor %}{% endfor %}{% endautoescape %}

View file

@ -22,7 +22,7 @@
<table class="ietf-wg-table">
{% for group in groups %}
<tr>
<td width="10%;"><a href="{% url "ietf.wginfo.views.group_documents" group_type=group.type_id acronym=group.acronym %}">{{ group.acronym }}</a></td>
<td width="10%;"><a href="{% url "ietf.group.info.group_documents" group_type=group.type_id acronym=group.acronym %}">{{ group.acronym }}</a></td>
<td width="50%">{{ group.name }}</td>
<td width="40%">{% for chair in group.chairs %}<a href="mailto:{{ chair.email.address }}">{{ chair.person.plain_name }}</a>{% if not forloop.last %}, {% endif %}{% endfor %}</td>
</tr>

View file

@ -80,7 +80,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<table class="ietf-wg-table">
{% for group in area.groups %}
<tr>
<td width="10%;"><a href="{% url "ietf.wginfo.views.group_documents" group_type=group.type_id acronym=group.acronym %}">{{ group.acronym }}</a></td>
<td width="10%;"><a href="{% url "ietf.group.info.group_documents" group_type=group.type_id acronym=group.acronym %}">{{ group.acronym }}</a></td>
<td width="1%">{% for ad in area.ads %}{% if ad.person_id == group.ad_id %}<span title="AD for {{ group.acronym }}: {{ ad.person }}" class="square bgcolor{{forloop.counter}}"></span>{% endif %}{% endfor %}</td>
<td width="50%">{{ group.name }}</td>
<td width="39%">{% for chair in group.chairs %}<a href="mailto:{{ chair.email.address }}">{{ chair.person.plain_name }}</a>{% if not forloop.last %}, {% endif %}{% endfor %}</td>

View file

@ -0,0 +1,65 @@
{% extends "base.html" %}
{% block title %}Chartering or Re-Chartering Groups{% endblock %}
{% block content %}
{% load ietf_filters %}
{% load ballot_icon %}
<h1>Chartering or Re-Chartering Groups</h1>
<p>Groups with a charter in state
{% for s in charter_states %}{% if not forloop.first %}, {% if forloop.last %}or {% endif %}{% endif %}<i>{{ s.name }}</i>{% endfor %}.
</p>
{% for t in group_types %}
<h2>{{ t.name }}s</h2>
{% if t.can_manage %}
<p><a href="{% url "group_create" group_type=t.pk %}">Start chartering new {{ t.name }}</a></p>
{% endif %}
{% if not t.chartering_groups %}
<p><b>No groups found.</b></p>
{% else %}
<table class="ietf-table ietf-doctable">
<tr>
<th>Group</th>
<th>Charter</th>
<th>Date</th>
<th colspan="2">Status</th>
</tr>
{% for g in t.chartering_groups %}
<tr class="{{ forloop.counter|divisibleby:2|yesno:"oddrow,evenrow" }}">
<td class="acronym">
<a href="{% url "group_charter" group_type=g.type_id acronym=g.acronym %}">{{ g.acronym }}</a>
</td>
<td class="title">
<a href="{% url "doc_view" name=g.charter.name %}">{{ g.name }}</a>
</td>
<td class="date">{{ g.charter.time|date:"Y-m-d" }}</td>
<td class="status">
{{ g.charter.get_state.name }}
{% if g.chartering_type == "initial" %}(Initial Chartering){% endif %}
{% if g.chartering_type == "recharter" %}(Rechartering){% endif %}
{% if not g.chartering_type and g.state_id != "active" %}({{ g.state.name }}){% endif %}
{% if g.charter.telechat_date %}<br/>IESG Telechat: {{ g.charter.telechat_date|date:"Y-m-d" }}{% endif %}
</td>
<td class="ballot">
{% ballot_icon g.charter %}
</td>
</tr>
{% endfor %}
</table>
{% endif %}
{% endfor %}
{% endblock %}
{% block js %}
<script type="text/javascript" src="/js/utils.js"></script>
<script type="text/javascript" src="/js/doc-search.js"></script>
{% endblock %}

View file

@ -83,10 +83,10 @@ this list</a> to the milestones currently in use for the {{ group.acronym }} {{
</td>
</tr>
<tr class="edit-milestone{% if form.changed %} changed{% endif %}"><td colspan="2">{% include "wginfo/milestone_form.html" %}</td></tr>
<tr class="edit-milestone{% if form.changed %} changed{% endif %}"><td colspan="2">{% include "group/milestone_form.html" %}</td></tr>
{% endfor %}
<tr class="milestone add"><td></td><td>Add {% if milestone_set == "chartering" %}charter{% endif%} milestone {% if needs_review %}for {{ reviewer }} review{% endif %}</td></tr>
<tr class="edit-milestone template"><td colspan="2">{% include "wginfo/milestone_form.html" with form=empty_form %}</td></tr>
<tr class="edit-milestone template"><td colspan="2">{% include "group/milestone_form.html" with form=empty_form %}</td></tr>
</table>
<div class="actions">

View file

@ -66,10 +66,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<div class="ietf-navset">
<div>
<a {% if selected == "documents" %}class="selected"{% else %}href="{% url "ietf.wginfo.views.group_documents" group_type=group.type_id acronym=group.acronym %}"{% endif %}>Documents</a> |
<a {% if selected == "charter" %}class="selected"{% else %}href="{% url "ietf.wginfo.views.group_charter" group_type=group.type_id acronym=group.acronym %}"{% endif %}>Charter</a> |
<a {% if selected == "history" %}class="selected"{% else %}href="{% url "ietf.wginfo.views.history" group_type=group.type_id acronym=group.acronym %}"{% endif %}>History</a>
| <a href="{% url 'ietf.wginfo.views.dependencies_pdf' group_type=group.type_id acronym=group.acronym %}">Dependency Graph</a>
<a {% if selected == "documents" %}class="selected"{% else %}href="{% url "ietf.group.info.group_documents" group_type=group.type_id acronym=group.acronym %}"{% endif %}>Documents</a> |
<a {% if selected == "charter" %}class="selected"{% else %}href="{% url "ietf.group.info.group_charter" group_type=group.type_id acronym=group.acronym %}"{% endif %}>Charter</a> |
<a {% if selected == "history" %}class="selected"{% else %}href="{% url "ietf.group.info.history" group_type=group.type_id acronym=group.acronym %}"{% endif %}>History</a>
| <a href="{% url 'ietf.group.info.dependencies_pdf' group_type=group.type_id acronym=group.acronym %}">Dependency Graph</a>
{% if group.list_archive|startswith:"http:" or group.list_archive|startswith:"https:" or group.list_archive|startswith:"ftp:" %}
| <a href="{{ group.list_archive }}">List Archive &raquo;</a>
{% endif %}

View file

@ -1,4 +1,4 @@
{% extends "wginfo/group_base.html" %}
{% extends "group/group_base.html" %}
{% load ietf_filters %}
{% block group_subtitle %}Charter{% endblock %}
@ -47,7 +47,7 @@ is occasionally incorrect.</span>
{% else %}
none
{% if can_manage %}
- <a href="{% url "ietf.wginfo.edit.submit_initial_charter" group_type=group.type_id acronym=group.acronym %}">Submit Charter</a>
- <a href="{% url "ietf.group.edit.submit_initial_charter" group_type=group.type_id acronym=group.acronym %}">Submit Charter</a>
{% endif %}
{% endif %}
</td>
@ -158,7 +158,7 @@ is occasionally incorrect.</span>
<h2>{% if group.state_id == "proposed" %}Proposed{% endif %} Milestones</h2>
{% include "wginfo/milestones.html" with milestones=group.milestones %}
{% include "group/milestones.html" with milestones=group.milestones %}
{% if milestones_in_review %}
<p>+ {{ milestones_in_review|length }} new milestone{{ milestones_in_review|pluralize }}

View file

@ -1,4 +1,4 @@
{% extends "wginfo/group_base.html" %}
{% extends "group/group_base.html" %}
{% block group_subtitle %}Documents{% endblock %}

View file

@ -1,4 +1,4 @@
{% extends "wginfo/group_base.html" %}
{% extends "group/group_base.html" %}
{% load ietf_filters %}
{% block group_subtitle %}History{% endblock %}

View file

@ -17,7 +17,7 @@ div.milestones-for-group { margin: 0.5em 0; }
<div class="milestones-for-group">{{ g.name }} ({{ g.acronym }}) <a href="{% url "group_edit_milestones" group_type=g.type_id acronym=g.acronym %}">has new milestones</a>:</div>
{% include "wginfo/milestones.html" with milestones=g.milestones_needing_review %}
{% include "group/milestones.html" with milestones=g.milestones_needing_review %}
{% endfor %}
{% endfor %}

View file

@ -1,4 +0,0 @@
{% autoescape off %}{% load ietf_filters %}{% for group in groups %}{{ group.acronym }}
{% endfor %}
{% for group in groups %}{% include "wginfo/group_entry_with_charter.txt" %}{% endfor %}{% endautoescape %}

View file

@ -1,58 +0,0 @@
{% extends "base.html" %}
{% block title %}Chartering or Re-Chartering Groups{% endblock %}
{% block content %}
{% load ietf_filters %}
{% load ballot_icon %}
<h1>Chartering or Re-Chartering Groups</h1>
<p>Groups with a charter in state
{% for s in charter_states %}{% if not forloop.first %}, {% if forloop.last %}or {% endif %}{% endif %}<i>{{ s.name }}</i>{% endfor %}.</p>
{% if user|has_role:"Area Director,Secretariat" %}
<p><a href="{% url "group_create" group_type="wg" %}">Start chartering new WG</a></p>
{% endif %}
{% if not groups %}
<p><b>No groups found.</b></p>
{% else %}
<table class="ietf-table ietf-doctable">
<tr>
<th>Group</th>
<th>Charter</th>
<th>Date</th>
<th colspan="2">Status</th>
</tr>
{% for g in groups %}
<tr class="{{ forloop.counter|divisibleby:2|yesno:"oddrow,evenrow" }}">
<td class="acronym">
<a href="{% url "group_charter" group_type=g.type_id acronym=g.acronym %}">{{ g.acronym }}</a>
</td>
<td class="title">
<a href="{% url "doc_view" name=g.charter.name %}">{{ g.name }}</a>
</td>
<td class="date">{{ g.charter.time|date:"Y-m-d" }}</td>
<td class="status">
{{ g.charter.get_state.name }}
{% if g.chartering_type == "initial" %}(Initial Chartering){% endif %}
{% if g.chartering_type == "recharter" %}(Rechartering){% endif %}
{% if not g.chartering_type and g.state_id != "active" %}({{ g.state.name }}){% endif %}
{% if g.charter.telechat_date %}<br/>IESG Telechat: {{ g.charter.telechat_date|date:"Y-m-d" }}{% endif %}
</td>
<td class="ballot">
{% ballot_icon g.charter %}
</td>
</tr>
{% endfor %}
</table>
{% endif %}
{% endblock %}
{% block js %}
<script type="text/javascript" src="/js/utils.js"></script>
<script type="text/javascript" src="/js/doc-search.js"></script>
{% endblock %}

View file

@ -53,8 +53,8 @@ urlpatterns = patterns('',
(r'^sitemap.xml$', 'django.contrib.sitemaps.views.index', { 'sitemaps': sitemaps}),
(r'^submit/', include('ietf.submit.urls')),
(r'^sync/', include('ietf.sync.urls')),
(r'^(?P<group_type>(wg|rg))/', include('ietf.wginfo.urls')),
(r'^stream/', include('ietf.group.stream_urls')),
(r'^(?P<group_type>(wg|rg))/', include('ietf.group.urls_info')),
(r'^stream/', include('ietf.group.urls_stream')),
(r'^nomcom/', include('ietf.nomcom.urls')),
(r'^templates/', include('ietf.dbtemplate.urls')),

View file

@ -1 +0,0 @@
/*.pyc

View file

@ -1,2 +0,0 @@
# Copyright The IETF Trust 2008, All Rights Reserved

View file

@ -1,2 +0,0 @@
# Copyright The IETF Trust 2008, All Rights Reserved