Port wginfo/ to new schema, delete some dead code. Missing tests and

still a little bit of cruft left from views in other modules.
 - Legacy-Id: 6084
This commit is contained in:
Ole Laursen 2013-09-03 16:51:22 +00:00
parent 9b65f3be79
commit 6d17ab8015
34 changed files with 563 additions and 598 deletions

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.slug == "wg" %}href="{% url ietf.wginfo.views.wg_charter acronym=group.acronym %}"{% endif %}>{{ group.acronym }}</a>) {{ group.type.name }}
(<a {% if group.type.slug == "wg" %}href="{% url ietf.wginfo.views.group_charter acronym=group.acronym %}"{% endif %}>{{ group.acronym }}</a>) {{ group.type.name }}
</div>
<table id="metatable" width="100%">

View file

@ -1,4 +1,4 @@
{% load ietf_filters %}{% for wg in wg_list|dictsort:"group_acronym.acronym" %}{% if wg.area.area.status_id == 1 and wg.area.area.acronym != "iesg" %}{% if wg.start_date %}{{ wg }}
{% endif %}{% endif %}{% endfor %}
{% for wg in wg_list|dictsort:"group_acronym.acronym" %}{% if wg.area.area.status_id == 1 and wg.area.area.acronym != "iesg" %}{% if wg.start_date %}{% include "wginfo/wg-charter.txt" %}
{% endif %}{% endif %}{% endfor %}
{% 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,7 +1,6 @@
{% load ietf_filters %}{% regroup wg_list|dictsort:"area_acronym.acronym" by area.area as wga_list %}{% for area in wga_list %}{% for wg in area.list|dictsort:"group_acronym.name" %}{% if wg.area.area.status_id == 1 and wg.area.area.acronym != "iesg" %}{% if wg.start_date %}{{ wg }}
{% endif %}{% endif %}{% endfor %}{% endfor %}
{% 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 %}
{% regroup wg_list|dictsort:"area_acronym.acronym" by area.area as wga_list %}{% for area in wga_list %}{% for wg in area.list|dictsort:"group_acronym.name" %}{% if wg.area.area.status_id == 1 and wg.area.area.acronym != "iesg" %}{% if wg.start_date %}
{% include "wginfo/wg-charter.txt" %}
{% endif %}{% endif %}{% endfor %}{% endfor %}

View file

@ -1,10 +1,10 @@
{% load ietf_filters %}
{% autoescape off %}{% load ietf_filters %}
IETF Working Group Summary (By Acronym)
The following Area Abbreviations are used in this document
{% for area in area_list %}
{{ area|upper }} - {{ area.area_acronym.name }}{% endfor %}
{% for wg in wg_list|dictsort:"group_acronym.acronym" %}{% if wg.start_date %}
{{ wg.group_acronym.name|safe }} ({{ wg }}) -- {{ wg.area.area|upper }}
{% include "wginfo/wg_summary.txt" %}{% endif %}{% endfor %}
{% for area in areas %}
{{ 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 %}

View file

@ -1,8 +1,11 @@
{% load ietf_filters %} IETF Working Group Summary (By Area)
{% regroup wg_list|dictsort:"area.area.area_acronym.acronym" by area.area as wga_list %}{% for area in wga_list %}{% for wg in area.list|dictsort:"group_acronym.acronym" %}{% ifequal wg.area.area.status_id 1 %}{% if forloop.first %}
{{ wg.area_acronym.name }} ({{ wg.area_acronym }})
{{ wg.area_acronym.name|dashify }}------{% for ad in wg.area_directors %}
{{ ad.person }} <{{ ad.person.email.1 }}>{% endfor %}
{% endif %}{% if wg.start_date %}
{{ wg.group_acronym.name|safe }} ({{ wg }})
{% include "wginfo/wg_summary.txt" %}{% endif %}{% endifequal %}{% endfor %}{% endfor %}
{% autoescape off %}{% load ietf_filters %}
IETF Working Group Summary (By Area)
{% for area in areas %}{{ area.name }} ({{ area.acronym }})
{{ area.name|dashify }}------{% for ad in area.ads %}
{{ ad.person }} <{{ ad.address }}>{% endfor %}
{% for group in area.groups %}{{ group.name }} ({{ group.acronym }})
{% include "wginfo/group_entry.txt" %}
{% endfor %}{% endfor %}{% endautoescape %}

View file

@ -25,7 +25,7 @@
{% for g in groups %}
<tr class="{{ forloop.counter|divisibleby:2|yesno:"oddrow,evenrow" }}">
<td class="acronym">
<a href="{% url wg_charter acronym=g.acronym %}">{{ g.acronym }}</a>
<a href="{% url group_charter acronym=g.acronym %}">{{ g.acronym }}</a>
</td>
<td class="title">
<a {%comment%}href="{% url doc_view name=g.charter.name %}"{%endcomment%}>{{ g.name }}</a>

View file

@ -28,7 +28,7 @@
{% for g in groups %}
<tr class="{{ forloop.counter|divisibleby:2|yesno:"oddrow,evenrow" }}">
<td class="acronym">
<a href="{% url wg_charter acronym=g.acronym %}">{{ g.acronym }}</a>
<a href="{% url group_charter acronym=g.acronym %}">{{ g.acronym }}</a>
</td>
<td class="title">
<a href="{% url doc_view name=g.charter.name %}">{{ g.name }}</a>

View file

@ -28,7 +28,7 @@ form.conclude .actions {
{{ form.as_table }}
<tr>
<td colspan="2" class="actions">
<a href="{% url wg_charter acronym=wg.acronym %}">Back</a>
<a href="{% url group_charter acronym=wg.acronym %}">Back</a>
<input type="submit" value="Send request"/>
</td>
</tr>

View file

@ -66,7 +66,7 @@ Create new WG or BoF
<td></td>
<td class="actions">
{% ifequal action "edit" %}
<a href="{% url wg_charter acronym=wg.acronym %}">Back</a>
<a href="{% url group_charter acronym=wg.acronym %}">Back</a>
<input type="submit" value="Save"/>
{% else %}
{% ifequal action "charter" %}

View file

@ -42,7 +42,7 @@ tr.milestone.add { font-style: italic; }
<noscript>This page depends on Javascript being enabled to work properly.</noscript>
<p>Links:
<a href="{% url wg_charter acronym=group.acronym %}">{{ group.acronym }} {{ group.type.name }}</a>
<a href="{% url group_charter acronym=group.acronym %}">{{ group.acronym }} {{ group.type.name }}</a>
- <a href="{% url doc_view name=group.charter.canonical_name %}">{{ group.charter.canonical_name }}</a>
</p>
@ -91,7 +91,7 @@ this list</a> to the milestones currently in use for the {{ group.acronym }} {{
</table>
<div class="actions">
<a class="button" href="{% if milestone_set == "charter" %}{% url doc_view name=group.charter.canonical_name %}{% else %}{% url wg_charter acronym=group.acronym %}{% endif %}">Cancel</a>
<a class="button" href="{% if milestone_set == "charter" %}{% url doc_view name=group.charter.canonical_name %}{% else %}{% url group_charter acronym=group.acronym %}{% endif %}">Cancel</a>
<input class="button" type="submit" data-labelsave="Save" data-labelreview="Review changes" value="Save" style="display:none"/>
<input type="hidden" name="action" value="save">
</div>

View file

@ -0,0 +1,99 @@
{% extends "base.html" %}
{% comment %}
Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the Nokia Corporation and/or its
subsidiary(-ies) nor the names of its contributors may be used
to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endcomment %}
{% load ietf_filters wgchairs_tags %}
{% block title %}{{ group.name }} ({{ group.acronym }}) - {% block group_subtitle %}{% endblock %}{% endblock %}
{% block morecss %}
.ietf-navset {
background:#214197 url(/images/yui/sprite.png) repeat-x left -1400px;
color:white;
border:1px solid black;
padding:4px;
}
.ietf-navset .selected { font-weight:bold; padding: 0 3px; }
.ietf-navset a, .ietf-navset a:visited { color: white; padding:0 3px; }
.ietf-group-details { float:right; padding: 4px;margin-top:16px; margin-left: 16px; }
.ietf-group-details tr { vertical-align: top; }
.ietf-concluded-bg {background-color: #F8F8D0; }
.ietf-concluded-warning { background:red;color:white;padding:2px 2px;}
.ietf-proposed-bg { }
.ietf-proposed-warning { background:green;color:white;padding:2px 2px;}
.ietf-box th {
font-weight: bold;
padding-top: 1em;
text-align: left;
}
.ietf-box tr:first-child th {
padding-top: 0;
}
{% endblock morecss %}
{% block content %}
<div {% if group.state_id == "dormant" or group.state_id == "conclude" %}class="ietf-concluded-bg"{% endif %} {% if group.state_id == "proposed" %}class="ietf-proposed-bg"{% endif %}>
<h1>{{ group.name}} ({{ group.acronym }})
{% if group.state_id == "dormant" or group.state_id == "conclude" %}<br/><span class="ietf-concluded-warning">(concluded {{ group.type.name }})</span>{% endif %}
{% if group.state_id == "proposed" %}<br/><span class="ietf-proposed-warning">(proposed {{ group.type.name }})</span>{% endif %}
</h1>
<div class="ietf-navset">
<a {% if selected == "documents" %}class="selected"{% else %}href="{% url ietf.wginfo.views.group_documents acronym=group.acronym %}"{% endif %}>Documents</a> |
<a {% if selected == "charter" %}class="selected"{% else %}href="{% url ietf.wginfo.views.group_charter acronym=group.acronym %}"{% endif %}>Charter</a> |
{% if can_manage_workflow %}
<a {% if selected == "manage_workflow" %}class="selected"{% else %}href="{% url manage_workflow group.acronym %}"{% endif %}>Manage workflow</a> |
{% endif %}
{% if can_manage_delegates %}
<a {% if selected == "manage_delegates" %}class="selected"{% else %}href="{% url manage_delegates group..acronym %}"{% endif %}>Manage delegations</a> |
{% endif %}
{% if can_manage_shepherds %}
<a {% if selected == "manage_shepherds" %}class="selected"{% else %}href="{% url manage_shepherds group.acronym %}"{% endif %}>Manage shepherds</a> |
{% endif %}
<a {% if selected == "history" %}class="selected"{% else %}href="{% url ietf.wginfo.views.history acronym=group.acronym %}"{% endif %}>History</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 %}
<a href="http://tools.ietf.org/wg/{{ group.acronym }}/">Tools WG Page &raquo;</a>
</div>
{% block group_content %}
{% endblock group_content %}
</div>
{% endblock content %}

View file

@ -0,0 +1,171 @@
{% extends "wginfo/group_base.html" %}
{% load ietf_filters %}
{% block group_subtitle %}Charter{% endblock %}
{% block morecss %}
{{ block.super }}
h2 a.button { margin-left: 0.5em; font-size: 13px; }
{% endblock %}
{% block group_content %}
<div class="ietf-box ietf-group-details">
{% if group.state_id == "conclude" %}
<span class="ietf-concluded-warning">Note: The data for concluded WGs
is occasionally incorrect.</span>
{% endif %}
<table>
<tr><th colspan="2">Group</th></tr>
<tr valign="top">
<td style="width:14ex;">Name:</td>
<td>{{ group.name }}</td>
</tr>
<tr><td>Acronym:</td><td>{{ group.acronym }}</td></tr>
{% if group.parent %}
<tr><td>{{ group.parent.type.name }}:</td><td>{{ group.parent.name }} ({{ group.parent.acronym }})</td></tr>
{% endif %}
<tr>
<td>State:</td>
<td>{{ group.state.name }}
{% if requested_close %}
(but in the process of being closed)
{% endif %}
</td>
</tr>
<tr>
<td>Charter:</td>
<td>
{% if group.charter %}
<a href="{% url doc_view name=group.charter.name %}">{{ group.charter.name }}-{{ group.charter.rev }}</a> ({{ group.charter.get_state.name }})
{% else %}
none
{% if user|has_role:"Area Director,Secretariat" %}
- <a href="{% url ietf.wginfo.edit.submit_initial_charter acronym=group.acronym %}">Submit Charter</a>
{% endif %}
{% endif %}
</td>
</tr>
<tr><th colspan="2">Personnel</th></tr>
<tr valign="top">
<td>Chair{{ group.chairs|pluralize }}:</td>
<td>
{% for chair in group.chairs %}
<a href="mailto:{{ chair.address }}">{{ chair.person.plain_name }} &lt;{{ chair.address }}&gt;</a><br/>
{% endfor %}
</td>
</tr>
<tr><td>Area Director:</td>
<td>
{% if group.areadirector %}
<a href="mailto:{{ group.areadirector.address }}">{{ group.areadirector.person.plain_name }} &lt;{{ group.areadirector.address }}&gt;</a>
{% else %}?{% endif %}
</td>
</tr>
{% if group.techadvisors %}
<tr>
<td>Tech Advisor{{ group.techadvisors|pluralize }}:</td>
<td>
{% for techadvisor in group.techadvisors %}
<a href="mailto:{{ techadvisor.address }}">{{ techadvisor.person.plain_name }} &lt;{{ techadvisor.address }}&gt;</a><br/>
{% endfor %}
</td>
</tr>
{% endif %}
{% if group.editors %}
<tr>
<td>Editor{{ group.editors|pluralize }}:</td>
<td>
{% for editor in group.editors %}
<a href="mailto:{{ editor.address }}">{{ editor.person.plain_name }} &lt;{{ editor.address }}&gt;</a><br/>
{% endfor %}
</td>
</tr>
{% endif %}
{% if group.secretaries %}
<tr>
<td>Secretar{{ group.secretaries|pluralize:"y,ies" }}:</td>
<td>
{% for secretary in group.secretaries %}
<a href="mailto:{{ secretary.address }}">{{ secretary.person.plain_name }} &lt;{{ secretary.address }}&gt;</a><br/>
{% endfor %}
</td>
</tr>
{% endif %}
<tr><th colspan="2">Mailing List</th></tr>
<tr><td>Address:</td><td>{{ group.list_email|urlize }}</td></tr>
<tr><td>To Subscribe:</td><td>{{ group.list_subscribe|urlize }}</td></tr>
<tr><td>Archive:</td><td>{{ group.list_archive|urlize }}</td></tr>
{% if group.state_id != "conclude" %}
<tr><th colspan="2">Jabber Chat</th></tr>
<tr>
<td>Room Address:</td>
<td><a href="xmpp:{{ group.acronym }}@jabber.ietf.org">xmpp:{{ group.acronym }}@jabber.ietf.org</a></td>
</tr>
<tr>
<td>Logs:</td>
<td><a href="http://jabber.ietf.org/logs/{{ group.acronym }}/">http://jabber.ietf.org/logs/{{ group.acronym }}/</a></td>
</tr>
{% endif %}
</table>
{% if user|has_role:"Area Director,Secretariat" %}
<div style="margin: 2px; margin-top: 2em;">
{% for name, url in actions %}
<a class="button" href="{{ url }}">{{ name }}</a>
{% endfor %}
</div>
{% endif %}
</div>
{% with group.groupurl_set.all as urls %}
{% if urls %}
<p>In addition to the charter maintained by the IETF Secretariat, there is additional information about this working group on the Web at:
{% for url in urls %}
<a href="{{ url.url }}">{{ url.name }}</a>{% if not forloop.last %}, {% endif %}
{% endfor %}
</p>
{% endif %}
{% endwith %}
<h2>Charter for {% if group.state_id == "proposed" %}Proposed{% endif %} Working Group</h2>
<p>{{ group.charter_text|escape|format_charter|safe }}</p>
<h2>{% if group.state_id == "proposed" %}Proposed{% endif %} Milestones
{% if group.state_id != "proposed" %}
{% if user|has_role:"Area Director,Secretariat" or is_chair %}
<a class="button" href="{% url wg_edit_milestones acronym=group.acronym %}">Add or edit milestones</a>
{% endif %}
{% endif %}
</h2>
{% with group.milestones as milestones %}
{% include "wginfo/milestones.html" %}
{% endwith %}
{% if milestones_in_review %}
<p>+ {{ milestones_in_review|length }} new milestone{{ milestones_in_review|pluralize }}
currently in Area Director review.</p>
{% endif %}
{% endblock %}

View file

@ -0,0 +1,18 @@
{% extends "wginfo/group_base.html" %}
{% block group_subtitle %}Documents{% endblock %}
{% block group_content %}
<div class="group-documents">
{% include "doc/search/search_results.html" %}
{% with docs_related as docs %}{% with meta_related as meta %}{% include "doc/search/search_results.html" %}{% endwith %}{% endwith %}
</div>
{% endblock group_content %}
{% block js %}
<script type="text/javascript" src="/js/utils.js"></script>
<script type="text/javascript" src="/js/doc-search.js"></script>
{% endblock %}

View file

@ -0,0 +1,4 @@
{% for chair in group.chairs %}{% if forloop.first %} Chair{{ forloop.revcounter|pluralize:": ,s:" }} {% else %} {% endif %}{{ chair.person.plain_name }} <{{ chair.address }}>
{% endfor %} WG Mail: {{ group.list_email }}
To Join: {{ group.list_subscribe }}
Archive: {{ group.list_archive }}

View file

@ -0,0 +1,48 @@
{% autoescape off %}{% load ietf_filters %}{{ group.name }} ({{group.acronym}})
{{ group.name|dashify }}{{ group.acronym|dashify }}---
Charter
Last Modified: {{ group.time.date|date }}
Current Status: {{ group.state.name }}
Chair{{ group.chairs|pluralize }}:
{% for chair in group.chairs %} {{ chair.person.name }} <{{chair.address}}>
{% endfor %}
{{ group.area.name}} Directors:
{% for ad in group.area.ads %} {{ ad.person.plain_name }} <{{ ad }}>
{% endfor %}
{% if group.areadirector %} {{ group.area.name }} Advisor:
{{ group.areadirector.person.plain_name }} <{{ group.areadirector.address }}>
{% endif %}{% if group.techadvisors %}
Tech Advisor{{ group.techadvisors|pluralize }}:
{% for techadvisor in group.techadvisors %} {{ techadvisor.person.plain_name }} <{{ techadvisor.address }}>
{% endfor %}{% endif %}{% if group.editors %}
Editor{{ group.editors|pluralize }}:
{% for editor in group.editors %} {{ editor.person.plain_name }} <{{ editor.address}}>
{% endfor %}{% endif %}{% if group.secretaries %}
Secretar{{ group.secretaries|pluralize:"y,ies" }}:
{% for secretary in group.secretaries %} {{ secretary.person.plain_name }} <{{ secretary.address }}>
{% endfor %}{% endif %}
Mailing Lists:
General Discussion: {{ group.list_email }}
To Subscribe: {{ group.list_subscribe }}
Archive: {{ group.list_archive }}
Description of Working Group:
{{ group.charter_text|indent }}
Goals and Milestones:
{% for milestone in group.milestones %} {% if milestone.resolved %}{{ milestone.resolved }} {% else %}{{ milestone.due|date:"M Y" }}{% endif %} - {{ milestone.desc }}
{% endfor %}
Internet-Drafts:
{% for alias in group.drafts %} - {{ alias.document.title }} [{{ alias.name }}-{{ alias.document.rev }}] ({{ alias.document.pages }} pages)
{% endfor %}
{% if group.rfcs %}Requests for Comments:
{% for alias in group.rfcs %} {{ alias.name.upper }}: {{ alias.document.title}} ({{ alias.document.pages }} pages){% for r in alias.rel %}
* {{ r.action }} {{ r.target.name|upper }}{% endfor %}{% for r in alias.invrel %}
* {% if r.relationsship == "obs" %}{{ r.inverse_action|upper }}{% else %}{{ r.action }}{% endif %} {{ r.source.canonical_name|upper }}{% endfor %}
{% endfor %}
{% else %}No Requests for Comments{% endif %}
{% endautoescape %}

View file

@ -1,15 +1,16 @@
{% extends "wginfo/wg_base.html" %}
{% extends "wginfo/group_base.html" %}
{% load ietf_filters %}
{% block wg_titledetail %}History{% endblock %}
{% block group_subtitle %}History{% endblock %}
{% block wg_content %}
{% block group_content %}
{% load ietf_filters %}
<h2>WG History</h2>
<h2>Group History</h2>
<table class="ietf-table history">
<tr><th>Date</th><th>By</th><th>Text</th></tr>
{% for e in events %}
<tr class="{% cycle oddrow,evenrow %}">
<td>{{ e.time|date:"Y-m-d"}}</td>

View file

@ -1,47 +0,0 @@
{% if USE_DB_REDESIGN_PROXY_CLASSES %}{% include "wginfo/wg-charterREDESIGN.txt" %}{% else %}{% load ietf_filters %}{{wg.group_acronym.name|safe}} ({{wg}})
{{ wg.group_acronym.name|dashify }}{{ wg.group_acronym.acronym|dashify }}---
Charter
Last Modified: {{ wg.last_modified_date }}
Current Status: {{ wg.status }}
Chair{{ wg.chairs.count|pluralize:",s" }}:
{% for chair in wg.chairs %} {{ chair.person|safe }} <{{chair.person.email.1}}>
{% endfor %}
{{wg.area.area.area_acronym.name}} Directors:
{% for ad in wg.area_directors %} {{ ad.person|safe }} <{{ad.person.email.1}}>
{% endfor %}
{{wg.area.area.area_acronym.name}} Advisor:
{{ wg.area_director.person|safe }} <{{wg.area_director.person.email.1}}>
{% if wg.wgtechadvisor_set.count %}
Tech Advisor{{ wg.wgtechadvisor_set.count|pluralize:",s" }}:
{% for techadvisor in wg.wgtechadvisor_set.all %} {{ techadvisor.person|safe }} <{{techadvisor.person.email.1}}>
{% endfor %}{% endif %}{% if wg.wgeditor_set.count %}
Editor{{ wg.wgeditor_set.count|pluralize:",s" }}:
{% for editor in wg.wgeditor_set.all %} {{ editor.person|safe }} <{{editor.person.email.1}}>
{% endfor %}{% endif %}{% if wg.secretaries %}
Secretar{{ wg.secretaries.count|pluralize:"y,ies" }}:
{% for secretary in wg.secretaries %} {{ secretary.person|safe }} <{{secretary.person.email.1}}>
{% endfor %}{% endif %}
Mailing Lists:
General Discussion: {{ wg.email_address }}
To Subscribe: {{ wg.email_subscribe }}
Archive: {{ wg.email_archive }}
Description of Working Group:
{{ wg.charter_text|indent|safe }}
Goals and Milestones:
{% for milestone in wg.milestones %} {% ifequal milestone.done 'Done' %}Done {% else %}{%ifequal milestone.expected_due_date.month 1 %}Jan{% endifequal %}{%ifequal milestone.expected_due_date.month 2 %}Feb{% endifequal %}{%ifequal milestone.expected_due_date.month 3 %}Mar{% endifequal %}{%ifequal milestone.expected_due_date.month 4 %}Apr{% endifequal %}{%ifequal milestone.expected_due_date.month 5 %}May{% endifequal %}{%ifequal milestone.expected_due_date.month 6 %}Jun{% endifequal %}{%ifequal milestone.expected_due_date.month 7 %}Jul{% endifequal %}{%ifequal milestone.expected_due_date.month 8 %}Aug{% endifequal %}{%ifequal milestone.expected_due_date.month 9 %}Sep{% endifequal %}{%ifequal milestone.expected_due_date.month 10 %}Oct{% endifequal %}{%ifequal milestone.expected_due_date.month 11 %}Nov{% endifequal %}{%ifequal milestone.expected_due_date.month 12 %}Dec{% endifequal %} {{ milestone.expected_due_date.year }}{% endifequal %} - {{ milestone.description|safe }}
{% endfor %}
Internet-Drafts:
{% for draft in wg.drafts %} - {{draft.title|safe}} [{{draft.filename}}-{{draft.revision}}] ({{ draft.txt_page_count }} pages)
{% endfor %}
{% if wg.rfcs %}Requests for Comments:
{% for rfc in wg.rfcs %} {{rfc}}: {{rfc.title|safe}} ({{ rfc.txt_page_count }} pages){% for obs in rfc.obsoletes%}
* {{obs.action}} RFC{{obs.rfc_acted_on_id}}{% endfor %}{% for obs in rfc.obsoleted_by%}
* {%ifequal obs.action 'Obsoletes'%}OBSOLETED BY{%else%}Updated by{%endifequal%} RFC{{obs.rfc_id}}{% endfor %}
{%endfor%}
{%else%}No Requests for Comments{% endif %}{% endif %}

View file

@ -1,47 +0,0 @@
{% load ietf_filters %}{{wg.name|safe}} ({{wg.acronym}})
{{ wg.name|dashify }}{{ wg.acronym|dashify }}---
Charter
Last Modified: {{ wg.time.date }}
Current Status: {{ wg.state.name }}
Chair{{ wg.chairs|pluralize }}:
{% for chair in wg.chairs %} {{ chair.person.name|safe }} <{{chair.address}}>
{% endfor %}
{{wg.area.area.area_acronym.name}} Directors:
{% for ad in wg.area_directors %} {{ ad.person|safe }} <{{ad.person.email.1}}>
{% endfor %}
{{wg.area.area.area_acronym.name}} Advisor:
{{ wg.areadirector.person.name|safe }} <{{wg.areadirector.address}}>
{% if wg.techadvisors %}
Tech Advisor{{ wg.techadvisors|pluralize }}:
{% for techadvisor in wg.techadvisors %} {{ techadvisor.person.plain_name|safe }} <{{techadvisor.address}}>
{% endfor %}{% endif %}{% if wg.editors %}
Editor{{ wg.editors|pluralize }}:
{% for editor in wg.editors %} {{ editor.person.plain_name|safe }} <{{editor.person.address}}>
{% endfor %}{% endif %}{% if wg.secretaries %}
Secretar{{ wg.secretaries|pluralize:"y,ies" }}:
{% for secretary in wg.secretaries %} {{ secretary.person.plain_name|safe }} <{{secretary.person.address}}>
{% endfor %}{% endif %}
Mailing Lists:
General Discussion: {{ wg.email_address }}
To Subscribe: {{ wg.email_subscribe }}
Archive: {{ wg.email_archive }}
Description of Working Group:
{{ wg.charter_text|indent|safe }}
Goals and Milestones:
{% for milestone in wg.milestones %} {% if milestone.resolved %}{{ milestone.resolved }} {% else %}{{ milestone.due|date:"M Y" }}{% endif %} - {{ milestone.desc|safe }}
{% endfor %}
Internet-Drafts:
{% for alias in wg.drafts %} - {{alias.document.title|safe}} [{{alias.name}}-{{alias.document.rev}}] ({{ alias.document.pages }} pages)
{% endfor %}
{% if wg.rfcs %}Requests for Comments:
{% for alias in wg.rfcs %} {{ alias.name.upper }}: {{ alias.document.title|safe}} ({{ alias.document.pages }} pages){% for r in alias.rel %}
* {{ r.action }} {{ r.target.name|upper }}{% endfor %}{% for r in alias.invrel %}
* {% ifequal r.relationsship "obs" %}{{ r.inverse_action|upper }}{% else %}{{ r.action }}{% endifequal %} {{ r.source.canonical_name|upper }}{% endfor %}
{%endfor%}
{%else%}No Requests for Comments{% endif %}

View file

@ -1,99 +0,0 @@
{% extends "base.html" %}
{# Copyright The IETF Trust 2009, All Rights Reserved #}
{% comment %}
Portion Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the Nokia Corporation and/or its
subsidiary(-ies) nor the names of its contributors may be used
to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endcomment %}
{% block title %}Active IETF Working Groups{% endblock %}
{% block morecss %}
.ietf-wg-table { width: 100%; max-width:50em; }
.ietf-wg-table tr { vertical-align:top; }
{% endblock morecss %}
{% block content %}
<h1>Active IETF Working Groups</h1>
<p>See also:
<a href="http://www.ietf.org/wg/concluded/">Concluded Working Groups (www.ietf.org)</a>,
<a href="http://tools.ietf.org/wg/concluded/">Concluded Working Groups (tools.ietf.org)</a>,
<a href="http://www.ietf.org/dyn/wg/charter/history/">Historic Charters</a>.
</p>
{% for area in areas|dictsort:"area_acronym.name" %}
<h2 class="ietf-divider" id="{{area.area_acronym.name|cut:" "}}">{{ area.area_acronym.name }}</h2>
{% for ad in area.areadirector_set.all|dictsort:"person.last_name" %}
{% if forloop.first %}
<p>Area Director{{ forloop.revcounter|pluralize }}:</p>
<table style="margin-left: 2em" class="ietf-wg-table">
{% endif %}
<tr><td><span class="square bgcolor{{forloop.counter}}">&nbsp;</span></td> <td><a href="mailto:{{ ad.person.email.1 }}">{{ ad.person }} &lt;{{ ad.person.email.1 }}&gt;</a></td></tr>
{% if forloop.last %}
</table>
{% endif %}
{% endfor %}
{% for url in area.additional_urls %}
{% if forloop.first %}
<p>Area Specific Web Page{{ forloop.revcounter|pluralize}}:</p>
<p style="margin-left: 2em">
{% endif %}
<a href="{{url.url}}">{{ url.description }}</a>{% if not forloop.last %}<br/>{% endif %}
{% if forloop.last %}
</p>
{% endif %}
{% endfor %}
{% for wg in area.active_wgs %}
{% if forloop.first %}
<p>Active Working Groups:</p>
<div style="margin-left:2em;">
<table class="ietf-wg-table">
{% endif %}
<tr>
<td width="10%;"><a href="/wg/{{wg}}/">{{ wg }}</a></td>
<td width="1%">{% for ad in area.areadirector_set.all|dictsort:"person.last_name" %}{% ifequal ad wg.area_director %}<span title="AD for {{wg}}: {{ad.person}}" class="square bgcolor{{forloop.counter}}"></span>{% endifequal %}{% endfor %}</td>
<td width="50%">{{ wg.group_acronym.name }}</td>
<td width="39%">{% for chair in wg.chairs %}<a href="mailto:{{chair.person.email.1}}">{{chair.person}}</a>{% if not forloop.last %}, {% endif %}{% endfor %}</td>
</tr>
{% if forloop.last %}
</table>
</div>
{% endif %}
{% empty %}
<p>No Active Working Groups</p>
{% endfor %}{# wg #}
{% endfor %}{# area #}
{% endblock %}

View file

@ -66,8 +66,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<h1>{{wg.group_acronym.name}} ({{wg.group_acronym.acronym}}){% if concluded %}<br/><span class="ietf-concluded-warning">(concluded WG)</span>{% endif %}{% if proposed %}<br/><span class="ietf-proposed-warning">(proposed WG)</span>{% endif %}</h1>
<div class="ietf-navset">
{% ifequal selected "documents" %}<span class="selected">Documents</span>{% else %}<a href="{% url ietf.wginfo.views.wg_documents_html acronym=wg.group_acronym.acronym %}">Documents</a>{% endifequal %} |
{% ifequal selected "charter" %}<span class="selected">Charter</span>{% else %}<a href="{% url ietf.wginfo.views.wg_charter acronym=wg.group_acronym.acronym %}">Charter</a>{% endifequal %} |
{% ifequal selected "documents" %}<span class="selected">Documents</span>{% else %}<a href="{% url ietf.wginfo.views.group_documents acronym=wg.group_acronym.acronym %}">Documents</a>{% endifequal %} |
{% ifequal selected "charter" %}<span class="selected">Charter</span>{% else %}<a href="{% url ietf.wginfo.views.group_charter acronym=wg.group_acronym.acronym %}">Charter</a>{% endifequal %} |
{% wgchairs_admin_options wg %}
<a {% if selected == "history" %}class="selected"{% else %}href="{% url ietf.wginfo.views.history acronym=wg.group_acronym.acronym %}"{% endif %}>History</a> |
{% if wg.clean_email_archive|startswith:"http:" or wg.clean_email_archive|startswith:"https:" or wg.clean_email_archive|startswith:"ftp:" %}

View file

@ -1,182 +0,0 @@
{% extends "wginfo/wg_base.html" %}
{% comment %}
Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the Nokia Corporation and/or its
subsidiary(-ies) nor the names of its contributors may be used
to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endcomment %}
{% load ietf_filters %}
{% block wg_titledetail %}Charter{% endblock %}
{% block morecss %}
{{ block.super }}
h2 a.button { margin-left: 0.5em; font-size: 13px; }
{% endblock %}
{% block wg_content %}
<div class="ietf-box ietf-wg-details">
{% if concluded %}
<span class="ietf-concluded-warning">Note: The data for concluded WGs
is occasionally incorrect.</span>
{% endif %}
<table>
<tr><th colspan="2">Group</th></tr>
<tr valign="top">
<td style="width:14ex;">Name:</td>
<td>{{ wg.name }}</td>
</tr>
<tr><td>Acronym:</td><td>{{ wg.acronym }}</td></tr>
{% if wg.parent %}
<tr><td>Area:</td><td>{{ wg.parent.name }} ({{ wg.parent.acronym }})</td></tr>
{% endif %}
<tr>
<td>State:</td>
<td>{{ wg.state.name }}
{% if requested_close %}
(but in the process of being closed)
{% endif %}
</td>
</tr>
<tr>
<td>Charter:</td>
<td>
{% if wg.charter %}
<a href="{% url doc_view name=wg.charter.name %}">{{ wg.charter.name }}-{{ wg.charter.rev }}</a> ({{ wg.charter.get_state.name }})
{% else %}
none
{% if user|has_role:"Area Director,Secretariat" %}
- <a href="{% url ietf.wginfo.edit.submit_initial_charter acronym=wg.acronym %}">Submit Charter</a>
{% endif %}
{% endif %}
</td>
</tr>
<tr><th colspan="2">Personnel</th></tr>
<tr valign="top">
<td>Chair{{ wg.chairs|pluralize }}:</td>
<td>
{% for chair in wg.chairs %}
<a href="mailto:{{ chair.address }}">{{ chair.person.plain_name }} &lt;{{ chair.address }}&gt;</a><br/>
{% endfor %}
</td>
</tr>
<tr><td>Area Director:</td>
<td>
{% if not wg.ad %}?{% else %}
<a href="mailto:{{ wg.areadirector.address }}">{{ wg.ad.plain_name }} &lt;{{ wg.areadirector.address }}&gt;</a>{% endif %}
</td>
</tr>
{% if wg.techadvisors %}
<tr>
<td>Tech Advisor{{ wg.techadvisors|pluralize }}:</td>
<td>
{% for techadvisor in wg.techadvisors %}
<a href="mailto:{{ techadvisor.address }}">{{ techadvisor.person.plain_name }} &lt;{{ techadvisor.address }}&gt;</a><br/>
{% endfor %}
</td>
</tr>
{% endif %}
{% if wg.editors %}
<td>Editor{{ wg.editors|pluralize }}:</td>
<td>
{% for editor in wg.editors %}
<a href="mailto:{{ editor.address }}">{{ editor.person.plain_name }} &lt;{{ editor.address }}&gt;</a><br/>
{% endfor %}
</td></tr>
{% endif %}
{% if wg.secretaries %}
<tr>
<td>Secretar{{ wg.secretaries|pluralize:"y,ies" }}:</td>
<td>
{% for secretary in wg.secretaries %}
<a href="mailto:{{ secretary.address }}">{{ secretary.person.plain_name }} &lt;{{ secretary.address }}&gt;</a><br/>
{% endfor %}
</td>
</tr>
{% endif %}
<tr><th colspan="2">Mailing List</th></tr>
<tr><td>Address:</td><td>{{ wg.email_address|urlize }}</td></tr>
<tr><td>To Subscribe:</td><td>{{ wg.email_subscribe|urlize }}</td></tr>
<tr><td>Archive:</td><td>{{ wg.clean_email_archive|urlize }}</td></tr>
{% if not concluded %}
<tr><th colspan="2">Jabber Chat</th></tr>
<tr><td>Room Address:</td><td><a href="xmpp:{{ wg.acronym }}@jabber.ietf.org">xmpp:{{ wg.acronym }}@jabber.ietf.org</a></td></tr>
<tr><td>Logs:</td><td><a href="http://jabber.ietf.org/logs/{{ wg.acronym }}/">http://jabber.ietf.org/logs/{{ wg.acronym }}/</a></td></tr>
{% endif %}
</table>
{% if user|has_role:"Area Director,Secretariat" %}
<div style="margin: 2px; margin-top: 2em;">
{% for name, url in actions %}
<a href="{{ url }}">{{ name }}</a>
{% if not forloop.last %}|{% endif %}
{% endfor %}
</div>
{% endif %}
</div>
{% if wg.additional_urls %}
<p>In addition to the charter maintained by the IETF Secretariat, there is additional information about this working group on the Web at:
{% for url in wg.additional_urls %}
<a href="{{ url.url }}">{{ url.name }}</a>{% if not forloop.last %}, {% endif %}
{% endfor %}
</p>
{% endif %}
<h2>Charter for {% if wg.state_id == "proposed" %}Proposed{% endif %} Working Group</h2>
<p>{{ wg.charter_text|escape|format_charter|safe }}</p>
<h2>{% if wg.state_id == "proposed" %}Proposed{% endif %} Milestones
{% if wg.state_id != "proposed" %}
{% if user|has_role:"Area Director,Secretariat" or is_chair %}
<a class="button" href="{% url wg_edit_milestones acronym=wg.acronym %}">Add or edit milestones</a>
{% endif %}
{% endif %}
</h2>
{% with wg.milestones as milestones %}{% include "wginfo/milestones.html" %}{% endwith %}
{% if milestones_in_review %}
<p>+ {{ milestones_in_review|length }} new milestone{{ milestones_in_review|pluralize }}
currently in Area Director review.</p>
{% endif %}
{% endblock wg_content %}

View file

@ -1,50 +0,0 @@
{% extends "wginfo/wg_base.html" %}
{% comment %}
Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of the Nokia Corporation and/or its
subsidiary(-ies) nor the names of its contributors may be used
to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endcomment %}
{% block wg_titledetail %}Documents{% endblock %}
{% block wg_content %}
<div class="group-documents">
{% include "doc/search/search_results.html" %}
{% with docs_related as docs %}{% include "doc/search/search_results.html" %}{% endwith %}
</div>
{% endblock wg_content %}
{% block js %}
<script type="text/javascript" src="/js/utils.js"></script>
<script type="text/javascript" src="/js/doc-search.js"></script>
{% endblock %}

View file

@ -1,2 +0,0 @@
{% load ietf_filters %}{% regroup docs by view_sort_group as grouped_docs %}{% for doc_group in grouped_docs %}{% for doc in doc_group.list %}{% include "wginfo/wg_documents_entry.txt" %}{% endfor %}{% endfor %}{% regroup docs_related by view_sort_group as grouped_docs_related %}{% for doc_group in grouped_docs_related %}{% for doc in doc_group.list %}Related {% include "wginfo/wg_documents_entry.txt" %}{% endfor %}{% endfor %}

View file

@ -1 +0,0 @@
{% load ietf_filters %}{{doc_group.grouper}} {% if doc.rfc %}{{doc.rfc.rfc_number}} {{doc.rfc.title|clean_whitespace}}{% else %}{{doc.id.draft_name_and_revision}} {{doc.id.title|clean_whitespace}}{% endif %}

View file

@ -1,5 +0,0 @@
{% for chair in wg.wgchair_set.all %}{% if forloop.first %} Chair{{ forloop.revcounter|pluralize:": ,s:" }} {% else %} {% endif %}{{ chair.person|safe }} <{{ chair.person.email.1 }}>
{% endfor %} WG Mail: {{ wg.email_address }}
To Join: {{ wg.email_subscribe }}{%if wg.email_keyword %}
In Body: {{ wg.email_keyword|safe }}{% endif %}
Archive: {{ wg.email_archive }}

View file

@ -26,7 +26,7 @@ class GroupChanges(Feed):
def link(self, obj):
if not obj:
raise FeedDoesNotExist
return urlreverse('wg_charter', kwargs={'acronym': obj.acronym})
return urlreverse('group_charter', kwargs={'acronym': obj.acronym})
def description(self, obj):
return self.title(obj)
@ -44,7 +44,7 @@ class GroupChanges(Feed):
if isinstance(obj, DocEvent):
return urlreverse("doc_view", kwargs={'name': obj.doc_id })
elif isinstance(obj, GroupEvent):
return urlreverse('wg_charter', kwargs={'acronym': obj.group.acronym })
return urlreverse('group_charter', kwargs={'acronym': obj.group.acronym })
def item_pubdate(self, obj):
return obj.time

View file

@ -33,7 +33,7 @@ def email_secretariat(request, group, type, text):
"wgcharter/email_secretariat.txt",
dict(text=text,
group=group,
group_url=settings.IDTRACKER_BASE_URL + urlreverse('wg_charter', kwargs=dict(acronym=group.acronym)),
group_url=settings.IDTRACKER_BASE_URL + urlreverse('group_charter', kwargs=dict(acronym=group.acronym)),
charter_url=settings.IDTRACKER_BASE_URL + urlreverse('doc_view', kwargs=dict(name=group.charter.name)),
)
)

View file

@ -258,7 +258,7 @@ def edit(request, acronym=None, action="edit"):
if action=="charter":
return redirect('charter_submit', name=wg.charter.name, option="initcharter")
return redirect('wg_charter', acronym=wg.acronym)
return redirect('group_charter', acronym=wg.acronym)
else: # form.is_valid()
if not new_wg:
from ietf.person.forms import json_emails
@ -312,7 +312,7 @@ def conclude(request, acronym):
e.desc = "Requested closing group"
e.save()
return redirect('wg_charter', acronym=wg.acronym)
return redirect('group_charter', acronym=wg.acronym)
else:
form = ConcludeForm()

View file

@ -16,7 +16,7 @@ def email_milestones_changed(request, group, changes):
def wrap_up_email(to, text):
text = wrap(strip_tags(text), 70)
text += "\n\n"
text += u"URL: %s" % (settings.IDTRACKER_BASE_URL + urlreverse("wg_charter", kwargs=dict(acronym=group.acronym)))
text += u"URL: %s" % (settings.IDTRACKER_BASE_URL + urlreverse("group_charter", kwargs=dict(acronym=group.acronym)))
send_mail_text(request, to, None,
u"Milestones changed for %s %s" % (group.acronym, group.type.name),
@ -95,7 +95,7 @@ def email_milestones_due(group, early_warning_days):
milestones=milestones,
today=today,
early_warning_days=early_warning_days,
url=settings.IDTRACKER_BASE_URL + urlreverse("wg_charter", kwargs=dict(acronym=group.acronym))
url=settings.IDTRACKER_BASE_URL + urlreverse("group_charter", kwargs=dict(acronym=group.acronym))
))
def groups_needing_milestones_due_reminder(early_warning_days):
@ -120,7 +120,7 @@ def email_milestones_overdue(group):
"wginfo/reminder_milestones_overdue.txt",
dict(group=group,
milestones=milestones,
url=settings.IDTRACKER_BASE_URL + urlreverse("wg_charter", kwargs=dict(acronym=group.acronym))
url=settings.IDTRACKER_BASE_URL + urlreverse("group_charter", kwargs=dict(acronym=group.acronym))
))
def groups_needing_milestones_overdue_reminder(grace_period=30):

View file

@ -313,7 +313,7 @@ def edit_milestones(request, acronym, milestone_set="current"):
if milestone_set == "charter":
return redirect('doc_view', name=group.charter.canonical_name())
else:
return redirect('wg_charter', acronym=group.acronym)
return redirect('group_charter', acronym=group.acronym)
else:
for m in milestones:
forms.append(MilestoneForm(instance=m, needs_review=needs_review))

View file

@ -178,7 +178,7 @@ class WgEditTestCase(django.test.TestCase):
make_test_data()
group = Group.objects.get(acronym="mars")
url = urlreverse('wg_edit', kwargs=dict(acronym=group.acronym))
url = urlreverse('group_edit', kwargs=dict(acronym=group.acronym))
login_testing_unauthorized(self, "secretary", url)
# normal get

View file

@ -6,7 +6,7 @@ from django.views.generic.simple import redirect_to
urlpatterns = patterns('',
(r'^$', views.wg_dir),
(r'^$', views.active_wgs),
(r'^summary.txt', redirect_to, { 'url':'/wg/1wg-summary.txt' }),
(r'^summary-by-area.txt', redirect_to, { 'url':'/wg/1wg-summary.txt' }),
(r'^summary-by-acronym.txt', redirect_to, { 'url':'/wg/1wg-summary-by-acronym.txt' }),
@ -18,12 +18,12 @@ urlpatterns = patterns('',
(r'^bofs/$', views.bofs),
(r'^chartering/create/$', edit.edit, {'action': "charter"}, "wg_create"),
(r'^bofs/create/$', edit.edit, {'action': "create"}, "bof_create"),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/documents/txt/$', views.wg_documents_txt),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/$', views.wg_documents_html, None, "wg_docs"),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/charter/$', views.wg_charter, None, 'wg_charter'),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/documents/txt/$', views.group_documents_txt),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/$', views.group_documents, None, "wg_docs"),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/charter/$', views.group_charter, None, 'group_charter'),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/init-charter/', edit.submit_initial_charter, None, "wg_init_charter"),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/history/$', views.history),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/edit/$', edit.edit, {'action': "edit"}, "wg_edit"),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/edit/$', edit.edit, {'action': "edit"}, "group_edit"),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/conclude/$', edit.conclude, None, "wg_conclude"),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/milestones/$', milestones.edit_milestones, {'milestone_set': "current"}, "wg_edit_milestones"),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/milestones/charter/$', milestones.edit_milestones, {'milestone_set': "charter"}, "wg_edit_charter_milestones"),

View file

@ -32,77 +32,111 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import itertools
from django.shortcuts import get_object_or_404, render_to_response
from django.template import RequestContext, loader
from django.template import RequestContext
from django.http import HttpResponse
from django.conf import settings
from django.core.urlresolvers import reverse as urlreverse
from ietf.idtracker.models import Area, IETFWG
from ietf.doc.views_search import SearchForm, retrieve_search_results
from ietf.idrfc.idrfc_wrapper import IdRfcWrapper
from ietf.ipr.models import IprDetail
from ietf.group.models import Group
from ietf.doc.models import State
from ietf.group.models import Group, GroupURL
from ietf.doc.models import State, DocAlias, RelatedDocument
from ietf.doc.utils import get_chartering_type
from ietf.person.models import Email
from ietf.group.utils import get_charter_text
from ietf.doc.templatetags.ietf_filters import clean_whitespace
from ietf.wgchairs.accounts import (can_manage_workflow_in_group,
can_manage_delegates_in_group,
can_manage_shepherds_in_group)
def fill_in_charter_info(wg, include_drafts=False):
from ietf.person.models import Email
from ietf.doc.models import DocAlias, RelatedDocument
def fill_in_charter_info(group, include_drafts=False):
group.areadirector = group.ad.role_email("ad", group.parent) if group.ad else None
group.chairs = Email.objects.filter(role__group=group, role__name="chair")
group.techadvisors = Email.objects.filter(role__group=group, role__name="techadv")
group.editors = Email.objects.filter(role__group=group, role__name="editor")
group.secretaries = Email.objects.filter(role__group=group, role__name="secr")
milestone_state = "charter" if group.state_id == "proposed" else "active"
group.milestones = group.groupmilestone_set.filter(state=milestone_state).order_by('due')
wg.areadirector = wg.ad.role_email("ad", wg.parent) if wg.ad else None
wg.chairs = Email.objects.filter(role__group=wg, role__name="chair")
wg.techadvisors = Email.objects.filter(role__group=wg, role__name="techadv")
wg.editors = Email.objects.filter(role__group=wg, role__name="editor")
wg.secretaries = Email.objects.filter(role__group=wg, role__name="secr")
milestone_state = "charter" if wg.state_id == "proposed" else "active"
wg.milestones = wg.groupmilestone_set.filter(state=milestone_state).order_by('due')
group.charter_text = get_charter_text(group)
if include_drafts:
aliases = DocAlias.objects.filter(document__type="draft", document__group=wg).select_related('document').order_by("name")
wg.drafts = []
wg.rfcs = []
aliases = DocAlias.objects.filter(document__type="draft", document__group=group).select_related('document').order_by("name")
group.drafts = []
group.rfcs = []
for a in aliases:
if a.name.startswith("draft"):
wg.drafts.append(a)
group.drafts.append(a)
else:
wg.rfcs.append(a)
group.rfcs.append(a)
a.rel = RelatedDocument.objects.filter(source=a.document).distinct()
a.invrel = RelatedDocument.objects.filter(target=a).distinct()
def wg_summary_acronym(request):
areas = Area.active_areas()
wgs = IETFWG.objects.filter(status=IETFWG.ACTIVE)
return HttpResponse(loader.render_to_string('wginfo/1wg-summary-by-acronym.txt', {'area_list': areas, 'wg_list': wgs}),mimetype='text/plain; charset=UTF-8')
def extract_last_name(email):
return email.person.name_parts()[3]
def extract_group_chairs(group):
return sorted(Email.objects.filter(role__group=group, role__name="chair").select_related("person"), key=extract_last_name)
def wg_summary_area(request):
wgs = IETFWG.objects.filter(status='1',group_type='1',start_date__isnull=False).exclude(parent=None)
return HttpResponse(loader.render_to_string('wginfo/1wg-summary.txt', {'wg_list': wgs}),mimetype='text/plain; charset=UTF-8')
def wg_charters(request):
wgs = IETFWG.objects.filter(status='1',group_type='1',start_date__isnull=False).exclude(parent=None)
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
for wg in wgs:
fill_in_charter_info(wg, include_drafts=True)
return HttpResponse(loader.render_to_string('wginfo/1wg-charters.txt', {'wg_list': wgs, 'USE_DB_REDESIGN_PROXY_CLASSES': settings.USE_DB_REDESIGN_PROXY_CLASSES}),mimetype='text/plain; charset=UTF-8')
def wg_charters_by_acronym(request):
wgs = IETFWG.objects.filter(status='1',group_type='1',start_date__isnull=False)
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
for wg in wgs:
fill_in_charter_info(wg, include_drafts=True)
return HttpResponse(loader.render_to_string('wginfo/1wg-charters-by-acronym.txt', {'wg_list': wgs, 'USE_DB_REDESIGN_PROXY_CLASSES': settings.USE_DB_REDESIGN_PROXY_CLASSES}),mimetype='text/plain; charset=UTF-8')
def wg_dir(request):
areas = Area.active_areas()
return render_to_response('wginfo/wg-dir.html', {'areas':areas}, RequestContext(request))
def wg_dirREDESIGN(request):
from ietf.group.models import Group, GroupURL
from ietf.person.models import Email
areas = Group.objects.filter(type="area", state="active").order_by("name")
for area in areas:
area.ads = sorted(Email.objects.filter(role__group=area, role__name="ad").select_related("person"), key=extract_last_name)
area.groups = Group.objects.filter(parent=area, type="wg", state="active").order_by("acronym")
for group in area.groups:
group.chairs = extract_group_chairs(group)
areas = [a for a in areas if a.groups]
return render_to_response('wginfo/1wg-summary.txt',
{ 'areas': areas },
mimetype='text/plain; charset=UTF-8')
def wg_summary_acronym(request):
areas = Group.objects.filter(type="area", state="active").order_by("name")
groups = Group.objects.filter(type="wg", state="active").order_by("acronym").select_related("parent")
for group in groups:
group.chairs = extract_group_chairs(group)
return render_to_response('wginfo/1wg-summary-by-acronym.txt',
{ 'areas': areas,
'groups': groups },
mimetype='text/plain; charset=UTF-8')
def wg_charters(request):
areas = Group.objects.filter(type="area", state="active").order_by("name")
for area in areas:
area.ads = sorted(Email.objects.filter(role__group=area, role__name="ad").select_related("person"), key=extract_last_name)
area.groups = Group.objects.filter(parent=area, type="wg", state="active").order_by("name")
for group in area.groups:
fill_in_charter_info(group, include_drafts=True)
group.area = area
return render_to_response('wginfo/1wg-charters.txt',
{ 'areas': areas },
mimetype='text/plain; charset=UTF-8')
def wg_charters_by_acronym(request):
areas = dict((a.id, a) for a in Group.objects.filter(type="area", state="active").order_by("name"))
for area in areas.itervalues():
area.ads = sorted(Email.objects.filter(role__group=area, role__name="ad").select_related("person"), key=extract_last_name)
groups = Group.objects.filter(type="wg", state="active").exclude(parent=None).order_by("acronym")
for group in groups:
fill_in_charter_info(group, include_drafts=True)
group.area = areas.get(group.parent_id)
return render_to_response('wginfo/1wg-charters-by-acronym.txt',
{ 'groups': groups },
mimetype='text/plain; charset=UTF-8')
def active_wgs(request):
areas = Group.objects.filter(type="area", state="active").order_by("name")
for area in areas:
# dig out information for template
area.ads = []
for e in Email.objects.filter(role__group=area, role__name="ad").select_related("person"):
e.incoming = False
@ -112,26 +146,22 @@ def wg_dirREDESIGN(request):
e.incoming = True
area.ads.append(e)
area.ads.sort(key=lambda e: (e.incoming, e.person.name_parts()[3]))
area.ads.sort(key=lambda e: (e.incoming, extract_last_name(e)))
area.wgs = Group.objects.filter(parent=area, type="wg", state="active").order_by("acronym")
area.urls = area.groupurl_set.all().order_by("name")
for wg in area.wgs:
wg.chairs = sorted(Email.objects.filter(role__group=wg, role__name="chair").select_related("person"), key=lambda e: e.person.name_parts()[3])
return render_to_response('wginfo/wg-dirREDESIGN.html', {'areas':areas}, RequestContext(request))
wg.chairs = extract_group_chairs(wg)
if settings.USE_DB_REDESIGN_PROXY_CLASSES:
wg_dir = wg_dirREDESIGN
return render_to_response('wginfo/active_wgs.html', {'areas':areas}, RequestContext(request))
def bofs(request):
groups = Group.objects.filter(type="wg", state="bof")
return render_to_response('wginfo/bofs.html',dict(groups=groups),RequestContext(request))
return render_to_response('wginfo/bofs.html',dict(groups=groups), RequestContext(request))
def chartering_wgs(request):
charter_states = State.objects.filter(used=True, type="charter").exclude(slug__in=("approved", "notrev"))
groups = Group.objects.filter(type="wg", charter__states__in=charter_states).select_related("state", "charter")
for g in groups:
g.chartering_type = get_chartering_type(g.charter)
@ -141,31 +171,40 @@ def chartering_wgs(request):
RequestContext(request))
def wg_documents(request, acronym):
wg = get_object_or_404(IETFWG, group_acronym__acronym=acronym, group_type=1)
concluded = wg.status_id in [ 2, 3, ]
proposed = (wg.status_id == 4)
form = SearchForm({'by':'group', 'group':str(wg.group_acronym.acronym),
'rfcs':'on', 'activedrafts':'on'})
def construct_group_menu_context(request, group, selected, others):
"""Return context with info for the group menu filled in."""
d = {
"group": group,
"selected": selected,
"can_manage_delegates": can_manage_delegates_in_group(request.user, group),
"can_manage_workflow": can_manage_workflow_in_group(request.user, group),
"can_manage_shepherds": can_manage_shepherds_in_group(request.user, group),
}
d.update(others)
return d
def search_for_group_documents(group):
form = SearchForm({ 'by':'group', 'group': group.acronym or "", 'rfcs':'on', 'activedrafts': 'on' })
docs, meta = retrieve_search_results(form)
# get the related docs
form_related = SearchForm({'by':'group', 'name':'-'+str(wg.group_acronym.acronym)+'-', 'activedrafts':'on'})
docs_related, meta_related = retrieve_search_results(form_related)
docs_related_pruned = []
for d in docs_related:
form_related = SearchForm({ 'by':'group', 'name': u'-%s-' % group.acronym, 'activedrafts': 'on' })
raw_docs_related, meta_related = retrieve_search_results(form_related)
docs_related = []
for d in raw_docs_related:
parts = d.name.split("-", 2);
# canonical form draft-<name|ietf>-wg-etc
if len(parts) >= 3 and parts[1] != "ietf" and parts[2].startswith(wg.group_acronym.acronym + "-"):
docs_related_pruned.append(d)
docs_related = docs_related_pruned
if len(parts) >= 3 and parts[1] != "ietf" and parts[2].startswith(group.acronym + "-"):
docs_related.append(d)
# move call for WG adoption to related
cleaned_docs = []
docs_related_names = set(d.name for d in docs_related)
for d in docs:
if d.stream_id == "ietf" and d.get_state_slug("draft-stream-ietf") == "c-adopt":
if d.stream_id and d.get_state_slug("draft-stream-%s" % d.stream_id) == "c-adopt":
if d.name not in docs_related_names:
docs_related.append(d)
else:
@ -175,59 +214,75 @@ def wg_documents(request, acronym):
docs_related.sort(key=lambda d: d.name)
return wg, concluded, proposed, docs, meta, docs_related, meta_related
return docs, meta, docs_related, meta_related
def wg_documents_txt(request, acronym):
wg, concluded, proposed, docs, meta, docs_related, meta_related = wg_documents(request, acronym)
return HttpResponse(loader.render_to_string('wginfo/wg_documents.txt', {'wg': wg, 'concluded':concluded, 'proposed':proposed, 'selected':'documents', 'docs':docs, 'meta':meta, 'docs_related':docs_related, 'meta_related':meta_related}),mimetype='text/plain; charset=UTF-8')
def group_documents(request, acronym):
group = get_object_or_404(Group, type="wg", acronym=acronym)
def wg_documents_html(request, acronym):
wg, concluded, proposed, docs, meta, docs_related, meta_related = wg_documents(request, acronym)
return render_to_response('wginfo/wg_documents.html', {'wg': wg, 'concluded':concluded, 'proposed':proposed, 'selected':'documents', 'docs':docs, 'meta':meta, 'docs_related':docs_related, 'meta_related':meta_related}, RequestContext(request))
docs, meta, docs_related, meta_related = search_for_group_documents(group)
def wg_charter(request, acronym):
wg = get_object_or_404(IETFWG, group_acronym__acronym=acronym, group_type=1)
concluded = wg.status_id in [ 2, 3, ]
proposed = (wg.status_id == 4)
return render_to_response('wginfo/group_documents.html',
construct_group_menu_context(request, group, "documents", {
'docs': docs,
'meta': meta,
'docs_related': docs_related,
'meta_related': meta_related
}), RequestContext(request))
def group_documents_txt(request, acronym):
"""Return tabulator-separated rows with documents for group."""
group = get_object_or_404(Group, type="wg", acronym=acronym)
docs, meta, docs_related, meta_related = search_for_group_documents(group)
for d in docs_related:
d.search_heading = u"Related %s" % d.search_heading
rows = []
for d in itertools.chain(docs, docs_related):
rfc_number = d.rfc_number()
if rfc_number != None:
name = rfc_number
else:
name = "%s-%s" % (d.name, d.rev)
rows.append(u"\t".join((d.search_heading.replace("Internet-Draft", ""), name, clean_whitespace(d.title))))
return HttpResponse(u"\n".join(rows), mimetype='text/plain; charset=UTF-8')
def group_charter(request, acronym):
group = get_object_or_404(Group, type="wg", acronym=acronym)
fill_in_charter_info(group, include_drafts=False)
fill_in_charter_info(wg)
actions = []
if wg.state_id != "conclude":
actions.append(("Edit WG", urlreverse("wg_edit", kwargs=dict(acronym=wg.acronym))))
if group.state_id != "conclude":
actions.append((u"Edit %s" % group.type.name, urlreverse("group_edit", kwargs=dict(acronym=group.acronym))))
e = wg.latest_event(type__in=("changed_state", "requested_close",))
requested_close = wg.state_id != "conclude" and e and e.type == "requested_close"
e = group.latest_event(type__in=("changed_state", "requested_close",))
requested_close = group.state_id != "conclude" and e and e.type == "requested_close"
if wg.state_id in ("active", "dormant"):
actions.append(("Request closing WG", urlreverse("wg_conclude", kwargs=dict(acronym=wg.acronym))))
if group.state_id in ("active", "dormant"):
actions.append((u"Request closing %s" % group.type.name, urlreverse("wg_conclude", kwargs=dict(acronym=group.acronym))))
context = get_wg_menu_context(wg, "charter")
context.update(dict(
actions=actions,
is_chair=request.user.is_authenticated() and wg.role_set.filter(name="chair", person__user=request.user),
milestones_in_review=wg.groupmilestone_set.filter(state="review"),
requested_close=requested_close,
))
is_chair = request.user.is_authenticated() and group.role_set.filter(name="chair", person__user=request.user),
return render_to_response('wginfo/wg_charter.html',
context,
RequestContext(request))
return render_to_response('wginfo/group_charter.html',
construct_group_menu_context(request, group, "charter", {
"actions": actions,
"is_chair": is_chair,
"milestones_in_review": group.groupmilestone_set.filter(state="review"),
"requested_close": requested_close,
}), RequestContext(request))
def get_wg_menu_context(wg, selected):
# it would probably be better to refactor wginfo into rendering
# the menu separately instead of each view having to include the information
return dict(wg=wg, concluded=wg.state_id == "conclude", proposed=wg.state_id == "proposed", selected=selected)
def history(request, acronym):
wg = get_object_or_404(Group, acronym=acronym)
group = get_object_or_404(Group, acronym=acronym)
events = wg.groupevent_set.all().select_related('by').order_by('-time', '-id')
events = group.groupevent_set.all().select_related('by').order_by('-time', '-id')
context = get_wg_menu_context(wg, "history")
context.update(dict(events=events,
))
wg.group_acronym = wg # hack for compatibility with old templates
return render_to_response('wginfo/history.html', context, RequestContext(request))
return render_to_response('wginfo/history.html',
construct_group_menu_context(request, group, "history", {
"events": events,
}), RequestContext(request))