From a871d6e19e647a072a20201bac812ac07860e1b5 Mon Sep 17 00:00:00 2001 From: Ole Laursen Date: Thu, 19 Sep 2013 15:22:59 +0000 Subject: [PATCH] Remove wgchairs app, all of its functionality is now superceded by wginfo/ and other recent developments in doc/ - Legacy-Id: 6198 --- bin/mkdiagram | 2 +- ietf/doc/proxy.py | 5 - ietf/group/proxy.py | 16 +- ietf/settings.py | 1 - .../wgchairs/confirm_management_writeup.html | 55 -- ietf/templates/wgchairs/draft_state.html | 1 - .../wgchairs/edit_management_shepherd.html | 41 -- .../wgchairs/edit_management_writeup.html | 67 --- ietf/templates/wgchairs/manage_delegates.html | 60 --- ietf/templates/wgchairs/manage_workflow.html | 165 ------ ietf/templates/wgchairs/notexistdelegate.html | 28 - .../notexistsdelegate_delegate_email.txt | 10 - .../notexistsdelegate_secretariat_email.txt | 15 - .../notexistsdelegate_wgchairs_email.txt | 12 - .../wgchairs/shepherd_document_row.html | 17 - .../wgchairs/wg_shepherd_documents.html | 122 ----- .../wgchairs/wgchairs_admin_options.html | 23 - ietf/templates/wginfo/wg_base.html | 83 --- ietf/wgchairs/.gitignore | 1 - ietf/wgchairs/__init__.py | 18 - ietf/wgchairs/accounts.py | 108 ---- ietf/wgchairs/forms.py | 478 ------------------ ietf/wgchairs/migrations/.gitignore | 1 - ietf/wgchairs/migrations/0001_initial.py | 110 ---- ietf/wgchairs/migrations/0002_add_writeup.py | 163 ------ ietf/wgchairs/migrations/__init__.py | 0 ietf/wgchairs/models.py | 87 ---- ietf/wgchairs/templatetags/.gitignore | 1 - ietf/wgchairs/templatetags/__init__.py | 0 ietf/wgchairs/templatetags/wgchairs_tags.py | 47 -- ietf/wgchairs/tests.py | 214 -------- ietf/wgchairs/urls.py | 7 - ietf/wgchairs/views.py | 73 --- 33 files changed, 15 insertions(+), 2016 deletions(-) delete mode 100644 ietf/templates/wgchairs/confirm_management_writeup.html delete mode 100644 ietf/templates/wgchairs/draft_state.html delete mode 100644 ietf/templates/wgchairs/edit_management_shepherd.html delete mode 100644 ietf/templates/wgchairs/edit_management_writeup.html delete mode 100644 ietf/templates/wgchairs/manage_delegates.html delete mode 100644 ietf/templates/wgchairs/manage_workflow.html delete mode 100644 ietf/templates/wgchairs/notexistdelegate.html delete mode 100644 ietf/templates/wgchairs/notexistsdelegate_delegate_email.txt delete mode 100644 ietf/templates/wgchairs/notexistsdelegate_secretariat_email.txt delete mode 100644 ietf/templates/wgchairs/notexistsdelegate_wgchairs_email.txt delete mode 100644 ietf/templates/wgchairs/shepherd_document_row.html delete mode 100644 ietf/templates/wgchairs/wg_shepherd_documents.html delete mode 100644 ietf/templates/wgchairs/wgchairs_admin_options.html delete mode 100644 ietf/templates/wginfo/wg_base.html delete mode 100644 ietf/wgchairs/.gitignore delete mode 100644 ietf/wgchairs/__init__.py delete mode 100644 ietf/wgchairs/accounts.py delete mode 100644 ietf/wgchairs/forms.py delete mode 100644 ietf/wgchairs/migrations/.gitignore delete mode 100644 ietf/wgchairs/migrations/0001_initial.py delete mode 100644 ietf/wgchairs/migrations/0002_add_writeup.py delete mode 100644 ietf/wgchairs/migrations/__init__.py delete mode 100644 ietf/wgchairs/models.py delete mode 100644 ietf/wgchairs/templatetags/.gitignore delete mode 100644 ietf/wgchairs/templatetags/__init__.py delete mode 100644 ietf/wgchairs/templatetags/wgchairs_tags.py delete mode 100644 ietf/wgchairs/tests.py delete mode 100644 ietf/wgchairs/urls.py delete mode 100644 ietf/wgchairs/views.py diff --git a/bin/mkdiagram b/bin/mkdiagram index 765a7ba52..5eca0efc1 100755 --- a/bin/mkdiagram +++ b/bin/mkdiagram @@ -9,7 +9,7 @@ trap 'echo "$program($LINENO): Command failed with error code $? ($0 $*)"; exit if [ "$*" ]; then apps="$@"; graph="${1%.*}"; else apps=$(ls */models.py | sed 's!/models.py!!'); graph="models"; fi newapps="doc group meeting message person name" -legacyapps="announcements idindex idrfc idtracker iesg ietfauth ietfworkflows ipr liaisons mailinglists proceedings redirects submit wgchairs wgcharter wginfo" +legacyapps="announcements idindex idrfc idtracker iesg ietfauth ietfworkflows ipr liaisons mailinglists proceedings redirects submit wgcharter wginfo" proxy="$(grep ^class */proxy.py | tr '()' ' ' | awk '{printf $2 ","}')" names="$(grep ^class name/models.py | tr '()' ' ' | awk '{printf $2 ","}')" diff --git a/ietf/doc/proxy.py b/ietf/doc/proxy.py index 21993174c..6b2fbe15c 100644 --- a/ietf/doc/proxy.py +++ b/ietf/doc/proxy.py @@ -194,11 +194,6 @@ class InternetDraft(Document): def authors(self): return IDAuthor.objects.filter(document=self) - @property - def protowriteup_set(self): - from ietf.wgchairs.models import ProtoWriteUpProxy - return ProtoWriteUpProxy.objects.filter(doc=self, type="changed_protocol_writeup") - # methods from InternetDraft def displayname(self): return self.name diff --git a/ietf/group/proxy.py b/ietf/group/proxy.py index 2ab006760..5245eb0cc 100644 --- a/ietf/group/proxy.py +++ b/ietf/group/proxy.py @@ -94,6 +94,19 @@ def proxied_role_emails(emails): proxy_role_email(e) return emails +class WGDelegateProxy(Role): + #person = models.ForeignKey(PersonOrOrgInfo) # same name + #wg = models.ForeignKey(IETFWG) + @property + def wg(self): + return self.group + + def __unicode__(self): + return u"%s" % self.person + + class Meta: + proxy = True + class IETFWG(Group): objects = TranslatingManager(dict(group_acronym="id", group_acronym__acronym="acronym", @@ -211,8 +224,7 @@ class IETFWG(Group): return d @property def wgdelegate_set(self): - from ietf.wgchairs.models import WGDelegate - return WGDelegate.objects.filter(group=self, name="delegate") + return WGDelegateProxy.objects.filter(group=self, name="delegate") class Meta: proxy = True diff --git a/ietf/settings.py b/ietf/settings.py index d3b7367cc..ad5f1069b 100644 --- a/ietf/settings.py +++ b/ietf/settings.py @@ -175,7 +175,6 @@ INSTALLED_APPS = ( 'ietf.wginfo', 'ietf.submit', 'ietf.ietfworkflows', - 'ietf.wgchairs', 'ietf.wgcharter', 'ietf.sync', 'ietf.community', diff --git a/ietf/templates/wgchairs/confirm_management_writeup.html b/ietf/templates/wgchairs/confirm_management_writeup.html deleted file mode 100644 index 3bc5ceab9..000000000 --- a/ietf/templates/wgchairs/confirm_management_writeup.html +++ /dev/null @@ -1,55 +0,0 @@ -{% extends "wginfo/wg_base.html" %} -{% load ietf_filters wgchairs_tags %} - -{% block title %}Change shepherd write-up for {{ doc }}{% endblock %} - -{% block wg_content %} - -

-Return to shepherd list -

- -

Updating write-up for {{ doc }}

- -

-Before you modify the shepherd write-up please revise the 'Doc Shepherd Follow-up Underway' annotation tag and set or reset it if appropriate. -

-

-Remember that you must provide a comment if you change the annotation tag state. -

- -
-
- - -{% if form.message %} - -{% endif %} - - -
Doc Shepherd Follow-up Underway
- {{ form.message.value }} -
- - - - -
-{{ form.comment }} -
-

- Change write-up and ...
- -
- Cancel, I don't want to do any change! -

- -
- - - -
New shepherd write-up
{{ form.get_writeup|linebreaksbr }}
- -
-
-{% endblock %} diff --git a/ietf/templates/wgchairs/draft_state.html b/ietf/templates/wgchairs/draft_state.html deleted file mode 100644 index 956ebd44f..000000000 --- a/ietf/templates/wgchairs/draft_state.html +++ /dev/null @@ -1 +0,0 @@ -{{ state.name }} diff --git a/ietf/templates/wgchairs/edit_management_shepherd.html b/ietf/templates/wgchairs/edit_management_shepherd.html deleted file mode 100644 index b9a9e616a..000000000 --- a/ietf/templates/wgchairs/edit_management_shepherd.html +++ /dev/null @@ -1,41 +0,0 @@ -{% extends "wginfo/wg_base.html" %} -{% load ietf_filters %} - -{% block title %}Change shepherd for {{ doc }}{% endblock %} - -{% block wg_content %} - -

-Return to shepherd list -Return to {{ doc }} -

- -

Change shepherd for {{ doc }}

- -
-
- - - -
Actual shepherd
{% if doc.shepherd %}{{ doc.shepherd }}{% else %}No shepherd assigned{% endif %}
- - - -
-
-
- - -{% if form.message %} - -{% endif %} - - -
Change shepherd
- {{ form.message.value }} -
{{ form.as_p }}
- - {% if form.can_cancel %}No! I don't want to continue{% endif %} -
-
-{% endblock %} diff --git a/ietf/templates/wgchairs/edit_management_writeup.html b/ietf/templates/wgchairs/edit_management_writeup.html deleted file mode 100644 index 7a61437c0..000000000 --- a/ietf/templates/wgchairs/edit_management_writeup.html +++ /dev/null @@ -1,67 +0,0 @@ -{% extends "wginfo/wg_base.html" %} -{% load ietf_filters wgchairs_tags %} - -{% block title %} {% if can_edit %} Change {% else %} View {% endif %} shepherd write-up for {{ doc }}{% endblock %} - -{% block wg_content %} - -

-Return to shepherd list -

- -

{% if can_edit %} Change {% else %} View {% endif %} shepherd write-up for {{ doc }}

- - - - -
Draft stateActual shepherd write-upLast updated
{% show_state doc %}{{ writeup.writeup|linebreaksbr }}{% if writeup %}{{ writeup.date }} by {{ writeup.person }}{% endif %}
- -

-Please, note that the 'Doc Shepherd Follow-up Underway' annotation tag is {% if not followup %}NOT{% endif %} set for {{ doc }}. -

- -{% if can_edit %} -
-
- - -{% if form.message %} - -{% endif %} - - -
Edit shepherd write-up
- {{ form.message.value }} -
-
- -
- -
- -
- - - -
Upload a new shepherd write-up
-

Replace the current write-up with the contents of a plain ascii file:

-
- -
-
-{% else %} -{% if authorized_user %} - - - -
Edit shepherd write-up
-

- You can not edit or upload the shepherd write-up for {{ doc }} because the draft is not on "WG Consensus: Waiting for Write-Up" state. -

-

- Please contact with the {{ wg }} Working Group chair. -

-
-{% endif %} -{% endif %} -{% endblock %} diff --git a/ietf/templates/wgchairs/manage_delegates.html b/ietf/templates/wgchairs/manage_delegates.html deleted file mode 100644 index f1f2eaf58..000000000 --- a/ietf/templates/wgchairs/manage_delegates.html +++ /dev/null @@ -1,60 +0,0 @@ -{% extends "wginfo/wg_base.html" %} - - -{% block wg_titledetail %}Delegates{% endblock %} - -{% block wg_content %} -
- -

Manage delegates

-

-Sometimes, a WG has one (or more) WG Secretaries, in addition to the WG Chairs. -This page lets the WG Chairs delegate the authority to do updates to the WG state of WG documents in the datatracker. -

- -

-You may at most delegate the datatracker update rights to {{ max_delegates }} persons at any given time. -

- - - - -
-{% if delegates %} -
- - - {% for delegate in delegates %} - - {% endfor %} -
RemoveDelegate name
{{ delegate.person }}
- -
-{% else %} -No delegates -{% endif %} -
- - -{% if add_form.message %} - -{% endif %} - -
Add new delegate
- {{ add_form.message.value }} -
-{% if can_add %} -
- {{ add_form.as_p }} -

- - {% if add_form.can_cancel %}No! I don't want to continue{% endif %} -

-
-{% else %} -You can only assign {{ max_delegates }} delegates. Please remove delegates to add a new one. -{% endif %} -
-
-
-{% endblock %} diff --git a/ietf/templates/wgchairs/manage_workflow.html b/ietf/templates/wgchairs/manage_workflow.html deleted file mode 100644 index bc5a4fbd7..000000000 --- a/ietf/templates/wgchairs/manage_workflow.html +++ /dev/null @@ -1,165 +0,0 @@ -{% extends "wginfo/wg_base.html" %} - -{% block wg_titledetail %}Manage Workflow{% endblock %} - -{% block pagehead %} -{{ block.super }} - - - -{% endblock pagehead %} - -{% block wg_content %} -
-

Edit workflow

-
- - -
-
-
- - - - - {% for state in states %} - - - -{% endfor %} -
States used in {{ wg }} Working Group
{{ state.name }}

- - - - - {% for tag in tags %} - - - -{% endfor %} -
Annotation tags used in {{ wg }} Working Group
{{ tag.name }}
-
- - - - - {% for transition in workflow.transitions.all %} - - - - - - {% endfor %} - {% if not workflow.transitions.all.count %} - - {% endif %} -
Transition nameInitial statesDestination state
- {{ transition.name }} - - {% for state in transition.states.all %} - {{state.name }}{% if not forloop.last %}
{% endif %} - {% endfor %} -
- {{ transition.destination.name }} -
There are no transitions defined so any state change is allowed
-
-
- -
-

-Please note that the states you can not uncheck are needed in all IETF WGs. -

-

-You can see the default Working Group I-D State Diagram in Section 4.1 of RFC6174 -

-
- - - - - {% for state in default_states %} - - - - - -{% endfor %} -
Used in {{ wg }}Available statesDefinition
-
-
[+] {{ state.statedescription_set.all.0.definition|safe }}
-
-
- -
-
- -
-

-You can see the default Working Group I-D State Diagram in Section 4.1 of RFC6174 -

-
- - - - -{{ formset.as_table }} -
DeleteTransition nameInitial statesDestination state
- -
-
- -
-
- - - - - {% for tag in default_tags %} - - - - -{% endfor %} -
Used in {{ wg }}Available annotation tags
- -
-
-
-
- - - -{% endblock %} diff --git a/ietf/templates/wgchairs/notexistdelegate.html b/ietf/templates/wgchairs/notexistdelegate.html deleted file mode 100644 index 706907022..000000000 --- a/ietf/templates/wgchairs/notexistdelegate.html +++ /dev/null @@ -1,28 +0,0 @@ -{% if shepherd %} -

-The shepherd you are trying to designate does not have a personal user-id and password to log-on to the Datatracker. -

-

-An email will be sent to the following addresses to inform that -the person you have designated to be one of your document shepherds -currently does not have login credentials for the Datatracker -and should contact the Secretariat to obtain their own user-id and -password for the Datatracker. -

-{% else %} -

-The delegate you are trying to designate does not have a personal user-id and password to log-on to the Datatracker. -

-

-An email will be sent to the following addresses to inform that -the person you have designated to be one of your delegates -currently does not have login credentials for the Datatracker -and should contact the Secretariat to obtain their own user-id and -password for the Datatracker. -

-{% endif %} - diff --git a/ietf/templates/wgchairs/notexistsdelegate_delegate_email.txt b/ietf/templates/wgchairs/notexistsdelegate_delegate_email.txt deleted file mode 100644 index de2318a93..000000000 --- a/ietf/templates/wgchairs/notexistsdelegate_delegate_email.txt +++ /dev/null @@ -1,10 +0,0 @@ -{% autoescape off %}{{ chair }} as a WG Chair of {{ wg }} wants to add you as a {{ wg }} {% if shepherd %}shepherd of document {{ shepherd }}{% else %}WG Delegate{% endif %}. - -You don't have an user/password to log into the datatracker so you must contact -the Secretariat at iesg-secretary@ietf.org in order to get your credentials. - -When you get your credentials, please inform {{ chair }} at -{{ chair.email.1 }} so he/she can finish the designate process. - -Thank you. -{% endautoescape %} diff --git a/ietf/templates/wgchairs/notexistsdelegate_secretariat_email.txt b/ietf/templates/wgchairs/notexistsdelegate_secretariat_email.txt deleted file mode 100644 index 27edacc11..000000000 --- a/ietf/templates/wgchairs/notexistsdelegate_secretariat_email.txt +++ /dev/null @@ -1,15 +0,0 @@ -{% autoescape off %}{{ chair }} as a WG Chair of {{ wg }} wants to add a person with email -{{ delegate_email }} as a {% if shepherd %}shepherd of document {{ shepherd }}{% else %}WG Delegate{% endif %}. - -This person don't have an user/password to log into the datatracker so -an email has been seent to {{ delegate_email }} in order to he/she contacs the -Secretariat to request his/her credentials. - -{% if delegate_persons %} -Please, note that the following persons with {{ delegate_email }} email address -already exists in the system but they can not log in. -{% for person in delegate_persons %} -{{ person.pk }} - {{ person }} -{% endfor %} -{% endif %} -{% endautoescape %} \ No newline at end of file diff --git a/ietf/templates/wgchairs/notexistsdelegate_wgchairs_email.txt b/ietf/templates/wgchairs/notexistsdelegate_wgchairs_email.txt deleted file mode 100644 index 477111dcf..000000000 --- a/ietf/templates/wgchairs/notexistsdelegate_wgchairs_email.txt +++ /dev/null @@ -1,12 +0,0 @@ -{% autoescape off %}{{ chair }} as a WG Chair of {{ wg }} wants to add a person with email -{{ delegate_email }} as a {% if shepherd %}shepherd of document {{ shepherd }}{% else %}WG Delegate{% endif %}. - -This person don't have an user/password to log into the datatracker so -an email has been seent to {{ delegate_email }} in order to he/she contacs the -Secretariat to request his/her credentials. - -When he/she gets her credentials then he/she will send an email to -{{ chair }} at {{ chair.email.1 }}. - -{{ chair }} could then assign this person as {% if shepherd %}shepherd of document {{ shepherd }}{% else %}WG Delegate{% endif %}. -{% endautoescape%} \ No newline at end of file diff --git a/ietf/templates/wgchairs/shepherd_document_row.html b/ietf/templates/wgchairs/shepherd_document_row.html deleted file mode 100644 index a58e1eac5..000000000 --- a/ietf/templates/wgchairs/shepherd_document_row.html +++ /dev/null @@ -1,17 +0,0 @@ -{% load wgchairs_tags %} - - - - {{ doc.title }} - - - Change shepherd - - - {% writeup doc %} - [Edit] - - - {% writeupdate doc %} - - diff --git a/ietf/templates/wgchairs/wg_shepherd_documents.html b/ietf/templates/wgchairs/wg_shepherd_documents.html deleted file mode 100644 index 2afcd9bac..000000000 --- a/ietf/templates/wgchairs/wg_shepherd_documents.html +++ /dev/null @@ -1,122 +0,0 @@ -{% extends "wginfo/wg_base.html" %} -{% comment %} -Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -All rights reserved. Contact: Pasi Eronen - -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 pagehead %} -{{ block.super }} - - - -{% endblock pagehead %} - -{% block wg_content %} - -

Documents by its shepherd

-
- - -
-
- - - - - - - - - {% for doc in no_shepherd %} - {% include "wgchairs/shepherd_document_row.html" %} - {% endfor %} - -
DocumentChange shepherdShepherd write-upShepherd write-up last update
-
- -
- - - - - - - - - {% for doc in my_documents %} - {% include "wgchairs/shepherd_document_row.html" %} - {% endfor %} - -
DocumentStatusShepherd write-upShepherd write-up last update
-
- -
-{% regroup other_shepherds by shepherd as regrouped %} -{% for documents in regrouped %} -

{{ documents.grouper }}

- - - - - - - - {% for doc in documents.list %} - {% include "wgchairs/shepherd_document_row.html" %} - {% endfor %} -
DocumentStatusShepherd write-upShepherd write-up last update
-{% endfor %} -
- - -{% endblock wg_content %} - diff --git a/ietf/templates/wgchairs/wgchairs_admin_options.html b/ietf/templates/wgchairs/wgchairs_admin_options.html deleted file mode 100644 index b8c45a00f..000000000 --- a/ietf/templates/wgchairs/wgchairs_admin_options.html +++ /dev/null @@ -1,23 +0,0 @@ -{% if can_manage_workflow %} - {% ifequal selected "manage_workflow" %} - Manage workflow - {% else %} - Manage workflow - {% endifequal %} | -{% endif %} - -{% if can_manage_delegates %} - {% ifequal selected "manage_delegates" %} - Manage delegations - {% else %} - Manage delegations - {% endifequal %} | -{% endif %} - -{% if can_manage_shepherds %} - {% ifequal selected "manage_shepherds" %} - Manage shepherds - {% else %} - Manage shepherds - {% endifequal %} | -{% endif %} diff --git a/ietf/templates/wginfo/wg_base.html b/ietf/templates/wginfo/wg_base.html deleted file mode 100644 index 4f73e3fe4..000000000 --- a/ietf/templates/wginfo/wg_base.html +++ /dev/null @@ -1,83 +0,0 @@ -{% extends "base.html" %} -{% comment %} -Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -All rights reserved. Contact: Pasi Eronen - -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 %}{{wg.group_acronym.name}} ({{wg.group_acronym.acronym}}) - {% block wg_titledetail %}{% 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-wg-details { float:right; padding: 4px;margin-top:16px; margin-left: 16px; } -.ietf-wg-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 %} -
-

{{wg.group_acronym.name}} ({{wg.group_acronym.acronym}}){% if concluded %}
(concluded WG){% endif %}{% if proposed %}
(proposed WG){% endif %}

- -
-{% ifequal selected "documents" %}Documents{% else %}Documents{% endifequal %} | -{% ifequal selected "charter" %}Charter{% else %}Charter{% endifequal %} | -{% wgchairs_admin_options wg %} -History | -{% if wg.clean_email_archive|startswith:"http:" or wg.clean_email_archive|startswith:"https:" or wg.clean_email_archive|startswith:"ftp:" %} -List Archive » | -{% endif %} -Tools WG Page » -
- -{% block wg_content %} -{% endblock wg_content %} - -
-{% endblock content %} diff --git a/ietf/wgchairs/.gitignore b/ietf/wgchairs/.gitignore deleted file mode 100644 index a74b07aee..000000000 --- a/ietf/wgchairs/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/*.pyc diff --git a/ietf/wgchairs/__init__.py b/ietf/wgchairs/__init__.py deleted file mode 100644 index e8d53c9a3..000000000 --- a/ietf/wgchairs/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -# coding: latin-1 - -from types import ModuleType -import urls, models, views, forms, accounts - -# These people will be sent a stack trace if there's an uncaught exception in -# code any of the modules imported above: -DEBUG_EMAILS = [ - ('Emilio A. Sánchez', 'esanchez@yaco.es'), -] - -for k in locals().keys(): - m = locals()[k] - if isinstance(m, ModuleType): - if hasattr(m, "DEBUG_EMAILS"): - DEBUG_EMAILS += list(getattr(m, "DEBUG_EMAILS")) - setattr(m, "DEBUG_EMAILS", DEBUG_EMAILS) - diff --git a/ietf/wgchairs/accounts.py b/ietf/wgchairs/accounts.py deleted file mode 100644 index c6b5b7645..000000000 --- a/ietf/wgchairs/accounts.py +++ /dev/null @@ -1,108 +0,0 @@ -from django.conf import settings -from ietf.group.models import Role - -def is_secretariat(user): - if not user or not user.is_authenticated(): - return False - return bool(user.groups.filter(name='Secretariat')) - - -def is_area_director_for_group(person, group): - return bool(group.area.area.areadirector_set.filter(person=person).count()) - -def is_area_director_for_groupREDESIGN(person, group): - return bool(Role.objects.filter(group=group.parent, person=person, name__in=("ad", "pre-ad"))) - - -def is_group_chair(person, group): - if group.chairs().filter(person=person): - return True - return False - -def is_group_chairREDESIGN(person, group): - return bool(Role.objects.filter(group=group, person=person, name="chair")) - - -def is_group_delegate(person, group): - return bool(group.wgdelegate_set.filter(person=person).count()) - -def is_group_delegateREDESIGN(person, group): - return bool(Role.objects.filter(group=group, person=person, name="delegate")) - - -def get_person_for_user(user): - try: - return user.get_profile().person() - except: - return None - - -if settings.USE_DB_REDESIGN_PROXY_CLASSES: - from ietf.liaisons.accounts import is_secretariat, get_person_for_user - is_area_director_for_group = is_area_director_for_groupREDESIGN - is_group_chair = is_group_chairREDESIGN - is_group_delegate = is_group_delegateREDESIGN - - -def can_do_wg_workflow_in_group(user, group): - person = get_person_for_user(user) - if not person: - return False - return (is_secretariat(user) or is_group_chair(person, group)) - - -def can_do_wg_workflow_in_document(user, document): - person = get_person_for_user(user) - if not person or not document.group: - return False - return (is_secretariat(user) or can_do_wg_workflow_in_group(document.group.ietfwg)) - - -def can_manage_workflow_in_group(user, group): - person = get_person_for_user(user) - if not person: - return False - return (is_secretariat(user) or is_group_chair(person, group)) - - -def can_manage_delegates_in_group(user, group): - person = get_person_for_user(user) - if not person: - return False - return (is_secretariat(user) or is_group_chair(person, group)) - - -def can_manage_shepherds_in_group(user, group): - person = get_person_for_user(user) - if not person: - return False - return (is_secretariat(user) or is_group_chair(person, group)) - - -def can_manage_shepherd_of_a_document(user, document): - person = get_person_for_user(user) - if not person or not document.group: - return False - return can_manage_shepherds_in_group(user, document.group.ietfwg) - - -def can_manage_writeup_of_a_document_no_state(user, document): - person = get_person_for_user(user) - if not person or not document.group: - return False - group = document.group.ietfwg - return (is_secretariat(user) or - is_group_chair(person, group) or - is_area_director_for_group(person, group) or - is_group_delegate(person, group)) - - -def can_manage_writeup_of_a_document(user, document): - person = get_person_for_user(user) - if not person or not document.group: - return False - return (can_manage_writeup_of_a_document_no_state(user, document) or - person == document.shepherd) - - - diff --git a/ietf/wgchairs/forms.py b/ietf/wgchairs/forms.py deleted file mode 100644 index 001acec7c..000000000 --- a/ietf/wgchairs/forms.py +++ /dev/null @@ -1,478 +0,0 @@ -import datetime - -from django import forms -from django.conf import settings -from django.db.models import Q -from django.forms.models import BaseModelFormSet -from django.template.loader import render_to_string -from django.utils.safestring import mark_safe - -from ietf.wgchairs.models import WGDelegate, ProtoWriteUp -from ietf.wgchairs.accounts import get_person_for_user -from ietf.ietfworkflows.constants import REQUIRED_STATES -from ietf.ietfworkflows.utils import (get_default_workflow_for_wg, get_workflow_for_wg, - update_tags, FOLLOWUP_TAG, get_state_by_name) -from ietf.ietfworkflows.models import AnnotationTag, State -from ietf.idtracker.models import PersonOrOrgInfo -from ietf.utils.mail import send_mail_text - -from workflows.models import Transition - -from ietf.doc.models import WriteupDocEvent -from ietf.person.models import Person, Email -from ietf.group.models import Group, Role, RoleName -from ietf.group.utils import save_group_in_history -from ietf.name.models import DocTagName - - -class RelatedWGForm(forms.Form): - - can_cancel = False - - def __init__(self, *args, **kwargs): - self.wg = kwargs.pop('wg', None) - self.user = kwargs.pop('user', None) - self.message = {} - super(RelatedWGForm, self).__init__(*args, **kwargs) - - def get_message(self): - return self.message - - def set_message(self, msg_type, msg_value): - self.message = {'type': msg_type, - 'value': msg_value, - } - - -class TagForm(RelatedWGForm): - - tags = forms.ModelMultipleChoiceField(AnnotationTag.objects.filter(workflow__name='Default WG Workflow'), - widget=forms.CheckboxSelectMultiple, required=False) - - def save(self): - workflow = get_workflow_for_wg(self.wg) - workflow.selected_tags.clear() - for tag in self.cleaned_data['tags']: - workflow.selected_tags.add(tag) - return workflow - - -class StateForm(RelatedWGForm): - - states = forms.ModelMultipleChoiceField(State.objects.filter(workflow__name='Default WG Workflow'), - widget=forms.CheckboxSelectMultiple, required=False) - - def update_transitions(self, workflow): - for transition in workflow.transitions.all(): - if not workflow.selected_states.filter(pk=transition.destination.pk).count(): - transition.delete() - continue - for state in transition.states.all(): - if not workflow.selected_states.filter(pk=state.pk).count(): - transition.states.remove(state) - if not transition.states.count(): - transition.delete() - continue - - def save(self): - workflow = get_workflow_for_wg(self.wg) - workflow.selected_states.clear() - for state in self.cleaned_data['states']: - workflow.selected_states.add(state) - for name in REQUIRED_STATES: - rstate = get_state_by_name(name) - if rstate: - workflow.selected_states.add(rstate) - self.update_transitions(workflow) - return workflow - - -class DeleteTransitionForm(RelatedWGForm): - - transitions = forms.ModelMultipleChoiceField(Transition.objects.all(), - widget=forms.CheckboxSelectMultiple) - - def __init__(self, *args, **kwargs): - super(DeleteTransitionForm, self).__init__(*args, **kwargs) - workflow = get_workflow_for_wg(self.wg) - self.fields['transitions'].queryset = self.fields['transitions'].queryset.filter(workflow=workflow) - - def save(self): - for transition in self.cleaned_data['transitions']: - transition.delete() - - -class TransitionForm(forms.ModelForm): - - states = forms.ModelMultipleChoiceField(State.objects.filter(workflow__name='Default WG Workflow')) - - class Meta: - model = Transition - fields = ('name', 'states', 'destination', ) - - def __init__(self, *args, **kwargs): - self.wg = kwargs.pop('wg', None) - self.user = kwargs.pop('user', None) - super(TransitionForm, self).__init__(*args, **kwargs) - workflow = get_workflow_for_wg(self.wg) - self.fields['states'].queryset = workflow.selected_states.all() - self.fields['destination'].queryset = workflow.selected_states.all() - self.fields['destination'].required = True - if self.instance.pk: - self.fields['states'].initial = [i.pk for i in self.instance.states.all()] - self.instance.workflow = workflow - - def as_row(self): - return self._html_output(u'%(errors)s%(field)s%(help_text)s', u'%s', '', u'
%s', False) - - def save(self, *args, **kwargs): - instance = super(TransitionForm, self).save(*args, **kwargs) - for state in self.cleaned_data['states']: - state.transitions.add(instance) - - -class TransitionFormSet(BaseModelFormSet): - - form = TransitionForm - can_delete = True - extra = 2 - max_num = 0 - can_order = False - model = Transition - - def __init__(self, *args, **kwargs): - self.wg = kwargs.pop('wg', None) - self.user = kwargs.pop('user', None) - super(TransitionFormSet, self).__init__(*args, **kwargs) - - def _construct_form(self, i, **kwargs): - kwargs = kwargs or {} - kwargs.update({'wg': self.wg, 'user': self.user}) - return super(TransitionFormSet, self)._construct_form(i, **kwargs) - - def as_table(self): - html = u'' - csscl = 'oddrow' - for form in self.forms: - html += u'' % csscl - html += form.as_row() - html += u'' - if csscl == 'oddrow': - csscl = 'evenrow' - else: - csscl = 'oddrow' - return mark_safe(u'\n'.join([unicode(self.management_form), html])) - - -def workflow_form_factory(request, wg, user): - - if request.POST.get('update_transitions', None): - return TransitionFormSet(wg=wg, user=user, data=request.POST) - elif request.POST.get('update_states', None): - return StateForm(wg=wg, user=user, data=request.POST) - return TagForm(wg=wg, user=user, data=request.POST) - - -class RemoveDelegateForm(RelatedWGForm): - - delete = forms.MultipleChoiceField() - - def __init__(self, *args, **kwargs): - super(RemoveDelegateForm, self).__init__(*args, **kwargs) - self.fields['delete'].choices = [(i.pk, i.pk) for i in self.wg.wgdelegate_set.all()] - - def save(self): - delegates = self.cleaned_data.get('delete') - save_group_in_history(Group.objects.get(pk=self.wg.pk)) - WGDelegate.objects.filter(pk__in=delegates).delete() - self.set_message('success', 'Delegates removed') - -def assign_shepherd(user, internetdraft, shepherd): - if internetdraft.shepherd == shepherd: - return - - from ietf.doc.models import save_document_in_history, DocEvent, Document - - # saving the proxy object is a bit of a mess, so convert it to a - # proper document - doc = Document.objects.get(name=internetdraft.name) - - save_document_in_history(doc) - - doc.time = datetime.datetime.now() - doc.shepherd = shepherd - doc.save() - - e = DocEvent(type="changed_document") - e.time = doc.time - e.doc = doc - e.by = user.get_profile() - if not shepherd: - e.desc = u"Unassigned shepherd" - else: - e.desc = u"Changed shepherd to %s" % shepherd.plain_name() - e.save() - - # update proxy too - internetdraft.shepherd = shepherd - -class AddDelegateForm(RelatedWGForm): - - email = forms.EmailField() - form_type = forms.CharField(widget=forms.HiddenInput, initial='single') - - def __init__(self, *args, **kwargs): - self.shepherd = kwargs.pop('shepherd', False) - super(AddDelegateForm, self).__init__(*args, **kwargs) - self.next_form = self - - def get_next_form(self): - return self.next_form - - def get_person(self, email): - persons = PersonOrOrgInfo.objects.filter(emailaddress__address=email).filter( - Q(iesglogin__isnull=False)| - Q(legacywgpassword__isnull=False)| - Q(legacyliaisonuser__isnull=False)).distinct() - if not persons: - raise PersonOrOrgInfo.DoesNotExist - if len(persons) > 1: - raise PersonOrOrgInfo.MultipleObjectsReturned - return persons[0] - - def save(self): - email = self.cleaned_data.get('email') - if settings.USE_DB_REDESIGN_PROXY_CLASSES: - try: - person = Person.objects.filter(email__address=email).exclude(user=None).distinct().get() - except Person.DoesNotExist: - self.next_form = NotExistDelegateForm(wg=self.wg, user=self.user, email=email, shepherd=self.shepherd) - self.next_form.set_message('doesnotexist', 'There is no user with this email allowed to login to the system') - return - except Person.MultipleObjectsReturned: - self.next_form = MultipleDelegateForm(wg=self.wg, user=self.user, email=email, shepherd=self.shepherd) - self.next_form.set_message('multiple', 'There are multiple users with this email in the system') - return - else: - try: - person = self.get_person(email) - except PersonOrOrgInfo.DoesNotExist: - self.next_form = NotExistDelegateForm(wg=self.wg, user=self.user, email=email, shepherd=self.shepherd) - self.next_form.set_message('doesnotexist', 'There is no user with this email allowed to login to the system') - return - except PersonOrOrgInfo.MultipleObjectsReturned: - self.next_form = MultipleDelegateForm(wg=self.wg, user=self.user, email=email, shepherd=self.shepherd) - self.next_form.set_message('multiple', 'There are multiple users with this email in the system') - return - if self.shepherd: - self.assign_shepherd(person) - else: - self.create_delegate(person) - - def assign_shepherd(self, person): - if settings.USE_DB_REDESIGN_PROXY_CLASSES: - assign_shepherd(self.user, self.shepherd, person) - else: - self.shepherd.shepherd = person - self.shepherd.save() - self.next_form = AddDelegateForm(wg=self.wg, user=self.user, shepherd=self.shepherd) - self.next_form.set_message('success', 'Shepherd assigned successfully') - - def create_delegate(self, person): - if settings.USE_DB_REDESIGN_PROXY_CLASSES: - created = False - e = Email.objects.get(address=self.cleaned_data.get('email')) - if not Role.objects.filter(name="delegate", group=self.wg, person=person, email=e): - created = True - save_group_in_history(Group.objects.get(pk=self.wg.pk)) - delegate, _ = Role.objects.get_or_create( - name=RoleName.objects.get(slug="delegate"), group=self.wg, person=e.person, email=e) - else: - (delegate, created) = WGDelegate.objects.get_or_create(wg=self.wg, - person=person) - if not created: - self.set_message('error', 'The email belongs to a person who is already a delegate') - else: - self.next_form = AddDelegateForm(wg=self.wg, user=self.user) - self.next_form.set_message('success', 'A new delegate has been added') - - -class MultipleDelegateForm(AddDelegateForm): - - email = forms.EmailField(widget=forms.HiddenInput) - form_type = forms.CharField(widget=forms.HiddenInput, initial='multiple') - persons = forms.ChoiceField(widget=forms.RadioSelect, help_text='Please select one person from the list') - submit_msg = 'Designate as delegate' - - def __init__(self, *args, **kwargs): - self.email = kwargs.pop('email', None) - super(MultipleDelegateForm, self).__init__(*args, **kwargs) - if not self.email: - self.email = self.data.get('email', None) - self.fields['email'].initial = self.email - if settings.USE_DB_REDESIGN_PROXY_CLASSES: - self.fields['persons'].choices = [(i.pk, unicode(i)) for i in Person.objects.filter(email__address=self.email).exclude(user=None).distinct().order_by('name')] - else: - self.fields['persons'].choices = [(i.pk, unicode(i)) for i in PersonOrOrgInfo.objects.filter(emailaddress__address=self.email).filter( - Q(iesglogin__isnull=False)| - Q(legacywgpassword__isnull=False)| - Q(legacyliaisonuser__isnull=False)).distinct().order_by('first_name')] - - def save(self): - person_id = self.cleaned_data.get('persons') - if settings.USE_DB_REDESIGN_PROXY_CLASSES: - person = Person.objects.get(pk=person_id) - else: - person = PersonOrOrgInfo.objects.get(pk=person_id) - if self.shepherd: - self.assign_shepherd(person) - else: - self.create_delegate(person) - - -class NotExistDelegateForm(MultipleDelegateForm): - - email = forms.EmailField(widget=forms.HiddenInput) - form_type = forms.CharField(widget=forms.HiddenInput, initial='notexist') - can_cancel = True - submit_msg = 'Send email to these addresses' - - def __init__(self, *args, **kwargs): - super(NotExistDelegateForm, self).__init__(*args, **kwargs) - self.email_list = [] - del(self.fields['persons']) - - def get_email_list(self): - if self.email_list: - return self.email_list - email_list = [self.email] - email_list.append('IETF Secretariat ') - email_list += ['%s <%s>' % i.person.email() for i in self.wg.wgchair_set.all() if i.person.email()] - self.email_list = email_list - return email_list - - def as_p(self): - email_list = self.get_email_list() - info = render_to_string('wgchairs/notexistdelegate.html', {'email_list': email_list, 'shepherd': self.shepherd}) - return info + super(NotExistDelegateForm, self).as_p() - - def send_email(self, to_email, template): - if self.shepherd: - subject = 'WG shepherd needs system credentials' - else: - subject = 'WG Delegate needs system credentials' - if settings.USE_DB_REDESIGN_PROXY_CLASSES: - persons = Person.objects.filter(email__address=self.email).distinct() - else: - persons = PersonOrOrgInfo.objects.filter(emailaddress__address=self.email).distinct() - body = render_to_string(template, - {'chair': get_person_for_user(self.user), - 'delegate_email': self.email, - 'shepherd': self.shepherd, - 'delegate_persons': persons, - 'wg': self.wg, - }) - - send_mail_text(self.request, to_email, settings.DEFAULT_FROM_EMAIL, subject, body) - - def save(self): - self.next_form = AddDelegateForm(wg=self.wg, user=self.user) - if settings.DEBUG: - self.next_form.set_message('warning', 'Email was not sent cause tool is in DEBUG mode') - else: - # this is ugly... - email_list = self.get_email_list() - delegate = email_list[0] - secretariat = email_list[1] - wgchairs = email_list[2:] - self.send_email(delegate, 'wgchairs/notexistsdelegate_delegate_email.txt') - self.send_email(secretariat, 'wgchairs/notexistsdelegate_secretariat_email.txt') - self.send_email(wgchairs, 'wgchairs/notexistsdelegate_wgchairs_email.txt') - self.next_form.set_message('success', 'Email sent successfully') - - -def add_form_factory(request, wg, user, shepherd=False): - if request.method != 'POST' or request.POST.get('update_shepehrd'): - return AddDelegateForm(wg=wg, user=user, shepherd=shepherd) - - if request.POST.get('form_type', None) == 'multiple': - f = MultipleDelegateForm(wg=wg, user=user, data=request.POST.copy(), shepherd=shepherd) - elif request.POST.get('form_type', None) == 'notexist': - f = NotExistDelegateForm(wg=wg, user=user, data=request.POST.copy(), shepherd=shepherd) - elif request.POST.get('form_type', None) == 'single': - f = AddDelegateForm(wg=wg, user=user, data=request.POST.copy(), shepherd=shepherd) - else: - f = AddDelegateForm(wg=wg, user=user, shepherd=shepherd) - - f.request = request - return f - -class WriteUpEditForm(RelatedWGForm): - - writeup = forms.CharField(widget=forms.Textarea, required=False) - followup = forms.BooleanField(required=False) - comment = forms.CharField(widget=forms.Textarea, required=False) - - def __init__(self, *args, **kwargs): - self.doc = kwargs.pop('doc', None) - self.doc_writeup = self.doc.protowriteup_set.all() - if self.doc_writeup.count(): - self.doc_writeup = self.doc_writeup[0] - else: - self.doc_writeup = None - super(WriteUpEditForm, self).__init__(*args, **kwargs) - self.person = get_person_for_user(self.user) - - def get_writeup(self): - return self.data.get('writeup', self.doc_writeup and self.doc_writeup.writeup or '') - - def save(self): - if settings.USE_DB_REDESIGN_PROXY_CLASSES: - e = WriteupDocEvent(type="changed_protocol_writeup") - e.doc = self.doc - e.by = self.person - e.desc = e.get_type_display() - e.text = self.cleaned_data['writeup'] - e.save() - from ietf.wgchairs.models import ProtoWriteUpProxy - self.doc_writeup = ProtoWriteUpProxy.objects.get(pk=e.pk) - else: - if not self.doc_writeup: - self.doc_writeup = ProtoWriteUp.objects.create( - person=self.person, - draft=self.doc, - writeup=self.cleaned_data['writeup']) - else: - self.doc_writeup.writeup = self.cleaned_data['writeup'] - self.doc_writeup.save() - - if self.data.get('modify_tag', False): - followup = self.cleaned_data.get('followup', False) - comment = self.cleaned_data.get('comment', False) - try: - shepherd = self.doc.shepherd - except PersonOrOrgInfo.DoesNotExist: - shepherd = None - if shepherd: - if settings.USE_DB_REDESIGN_PROXY_CLASSES: - extra_notify = [shepherd.formatted_email()] - else: - extra_notify = ['%s <%s>' % shepherd.email()] - else: - extra_notify = [] - if settings.USE_DB_REDESIGN_PROXY_CLASSES: - tags = DocTagName.objects.filter(slug="sheph-u") - else: - tags = [FOLLOWUP_TAG] - if followup: - update_tags(self.request, self.doc, comment, self.person, set_tags=tags, extra_notify=extra_notify) - else: - update_tags(self.request, self.doc, comment, self.person, reset_tags=tags, extra_notify=extra_notify) - return self.doc_writeup - - def is_valid(self): - if self.data.get('confirm', False) and self.data.get('modify_tag', False): - self.fields['comment'].required = True - else: - self.fields['comment'].required = False - return super(WriteUpEditForm, self).is_valid() diff --git a/ietf/wgchairs/migrations/.gitignore b/ietf/wgchairs/migrations/.gitignore deleted file mode 100644 index a74b07aee..000000000 --- a/ietf/wgchairs/migrations/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/*.pyc diff --git a/ietf/wgchairs/migrations/0001_initial.py b/ietf/wgchairs/migrations/0001_initial.py deleted file mode 100644 index 6aa9fb58f..000000000 --- a/ietf/wgchairs/migrations/0001_initial.py +++ /dev/null @@ -1,110 +0,0 @@ - -from south.db import db -from django.db import models -from ietf.wgchairs.models import * - -class Migration: - - def forwards(self, orm): - - # Adding model 'WGDelegate' - db.create_table('wgchairs_wgdelegate', ( - ('id', orm['wgchairs.WGDelegate:id']), - ('person', orm['wgchairs.WGDelegate:person']), - ('wg', orm['wgchairs.WGDelegate:wg']), - )) - db.send_create_signal('wgchairs', ['WGDelegate']) - - - - def backwards(self, orm): - - # Deleting model 'WGDelegate' - db.delete_table('wgchairs_wgdelegate') - - - - models = { - 'idtracker.acronym': { - 'Meta': {'db_table': "'acronym'"}, - 'acronym': ('django.db.models.fields.CharField', [], {'max_length': '12'}), - 'acronym_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name_key': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'idtracker.area': { - 'Meta': {'db_table': "'areas'"}, - 'area_acronym': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['idtracker.Acronym']", 'unique': 'True', 'primary_key': 'True'}), - 'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'concluded_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'extra_email_addresses': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'last_modified_date': ('django.db.models.fields.DateField', [], {'auto_now': 'True', 'blank': 'True'}), - 'start_date': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'status': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.AreaStatus']"}) - }, - 'idtracker.areadirector': { - 'Meta': {'db_table': "'area_directors'"}, - 'area': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.Area']", 'null': 'True', 'db_column': "'area_acronym_id'"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']", 'db_column': "'person_or_org_tag'"}) - }, - 'idtracker.areastatus': { - 'Meta': {'db_table': "'area_status'"}, - 'status': ('django.db.models.fields.CharField', [], {'max_length': '25', 'db_column': "'status_value'"}), - 'status_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - }, - 'idtracker.ietfwg': { - 'Meta': {'db_table': "'groups_ietf'"}, - 'area_director': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.AreaDirector']", 'null': 'True'}), - 'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'concluded_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'dormant_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'email_address': ('django.db.models.fields.CharField', [], {'max_length': '60', 'blank': 'True'}), - 'email_archive': ('django.db.models.fields.CharField', [], {'max_length': '95', 'blank': 'True'}), - 'email_keyword': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), - 'email_subscribe': ('django.db.models.fields.CharField', [], {'max_length': '120', 'blank': 'True'}), - 'group_acronym': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['idtracker.Acronym']", 'unique': 'True', 'primary_key': 'True'}), - 'group_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.WGType']"}), - 'last_modified_date': ('django.db.models.fields.DateField', [], {}), - 'meeting_scheduled': ('django.db.models.fields.CharField', [], {'max_length': '3', 'blank': 'True'}), - 'meeting_scheduled_old': ('django.db.models.fields.CharField', [], {'max_length': '3', 'blank': 'True'}), - 'proposed_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'status': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.WGStatus']"}) - }, - 'idtracker.personororginfo': { - 'Meta': {'db_table': "'person_or_org_info'"}, - 'address_type': ('django.db.models.fields.CharField', [], {'max_length': '4', 'null': 'True', 'blank': 'True'}), - 'created_by': ('django.db.models.fields.CharField', [], {'max_length': '8', 'null': 'True', 'blank': 'True'}), - 'date_created': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), - 'date_modified': ('django.db.models.fields.DateField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '20', 'blank': 'True'}), - 'first_name_key': ('django.db.models.fields.CharField', [], {'max_length': '20', 'blank': 'True'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), - 'last_name_key': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), - 'middle_initial': ('django.db.models.fields.CharField', [], {'max_length': '4', 'null': 'True', 'blank': 'True'}), - 'middle_initial_key': ('django.db.models.fields.CharField', [], {'max_length': '4', 'null': 'True', 'blank': 'True'}), - 'modified_by': ('django.db.models.fields.CharField', [], {'max_length': '8', 'null': 'True', 'blank': 'True'}), - 'name_prefix': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), - 'name_suffix': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), - 'person_or_org_tag': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'record_type': ('django.db.models.fields.CharField', [], {'max_length': '8', 'null': 'True', 'blank': 'True'}) - }, - 'idtracker.wgstatus': { - 'Meta': {'db_table': "'g_status'"}, - 'status': ('django.db.models.fields.CharField', [], {'max_length': '25', 'db_column': "'status_value'"}), - 'status_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - }, - 'idtracker.wgtype': { - 'Meta': {'db_table': "'g_type'"}, - 'group_type_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'type': ('django.db.models.fields.CharField', [], {'max_length': '25', 'db_column': "'group_type'"}) - }, - 'wgchairs.wgdelegate': { - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']"}), - 'wg': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.IETFWG']"}) - } - } - - complete_apps = ['wgchairs'] diff --git a/ietf/wgchairs/migrations/0002_add_writeup.py b/ietf/wgchairs/migrations/0002_add_writeup.py deleted file mode 100644 index e1754ed22..000000000 --- a/ietf/wgchairs/migrations/0002_add_writeup.py +++ /dev/null @@ -1,163 +0,0 @@ - -from south.db import db -from django.db import models -from ietf.wgchairs.models import * - -class Migration: - - def forwards(self, orm): - - # Adding model 'ProtoWriteUp' - db.create_table('wgchairs_protowriteup', ( - ('id', orm['wgchairs.protowriteup:id']), - ('person', orm['wgchairs.protowriteup:person']), - ('draft', orm['wgchairs.protowriteup:draft']), - ('date', orm['wgchairs.protowriteup:date']), - ('writeup', orm['wgchairs.protowriteup:writeup']), - )) - db.send_create_signal('wgchairs', ['ProtoWriteUp']) - - - - def backwards(self, orm): - - # Deleting model 'ProtoWriteUp' - db.delete_table('wgchairs_protowriteup') - - - - models = { - 'idtracker.acronym': { - 'Meta': {'db_table': "'acronym'"}, - 'acronym': ('django.db.models.fields.CharField', [], {'max_length': '12'}), - 'acronym_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name_key': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'idtracker.area': { - 'Meta': {'db_table': "'areas'"}, - 'area_acronym': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['idtracker.Acronym']", 'unique': 'True', 'primary_key': 'True'}), - 'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'concluded_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'extra_email_addresses': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'last_modified_date': ('django.db.models.fields.DateField', [], {'auto_now': 'True', 'blank': 'True'}), - 'start_date': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'status': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.AreaStatus']"}) - }, - 'idtracker.areadirector': { - 'Meta': {'db_table': "'area_directors'"}, - 'area': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.Area']", 'null': 'True', 'db_column': "'area_acronym_id'"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']", 'db_column': "'person_or_org_tag'"}) - }, - 'idtracker.areastatus': { - 'Meta': {'db_table': "'area_status'"}, - 'status': ('django.db.models.fields.CharField', [], {'max_length': '25', 'db_column': "'status_value'"}), - 'status_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - }, - 'idtracker.idintendedstatus': { - 'Meta': {'db_table': "'id_intended_status'"}, - 'intended_status': ('django.db.models.fields.CharField', [], {'max_length': '25', 'db_column': "'status_value'"}), - 'intended_status_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - }, - 'idtracker.idstatus': { - 'Meta': {'db_table': "'id_status'"}, - 'status': ('django.db.models.fields.CharField', [], {'max_length': '25', 'db_column': "'status_value'"}), - 'status_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - }, - 'idtracker.ietfwg': { - 'Meta': {'db_table': "'groups_ietf'"}, - 'area_director': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.AreaDirector']", 'null': 'True'}), - 'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'concluded_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'dormant_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'email_address': ('django.db.models.fields.CharField', [], {'max_length': '60', 'blank': 'True'}), - 'email_archive': ('django.db.models.fields.CharField', [], {'max_length': '95', 'blank': 'True'}), - 'email_keyword': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), - 'email_subscribe': ('django.db.models.fields.CharField', [], {'max_length': '120', 'blank': 'True'}), - 'group_acronym': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['idtracker.Acronym']", 'unique': 'True', 'primary_key': 'True'}), - 'group_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.WGType']"}), - 'last_modified_date': ('django.db.models.fields.DateField', [], {}), - 'meeting_scheduled': ('django.db.models.fields.CharField', [], {'max_length': '3', 'blank': 'True'}), - 'meeting_scheduled_old': ('django.db.models.fields.CharField', [], {'max_length': '3', 'blank': 'True'}), - 'proposed_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'status': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.WGStatus']"}) - }, - 'idtracker.internetdraft': { - 'Meta': {'db_table': "'internet_drafts'"}, - 'abstract': ('django.db.models.fields.TextField', [], {}), - 'b_approve_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'b_discussion_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'b_sent_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'comments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'dunn_sent_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'expiration_date': ('django.db.models.fields.DateField', [], {'null': 'True'}), - 'expired_tombstone': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'extension_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'file_type': ('django.db.models.fields.CharField', [], {'max_length': '20'}), - 'filename': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}), - 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.Acronym']", 'db_column': "'group_acronym_id'"}), - 'id_document_key': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'id_document_tag': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'intended_status': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.IDIntendedStatus']"}), - 'last_modified_date': ('django.db.models.fields.DateField', [], {}), - 'lc_changes': ('django.db.models.fields.CharField', [], {'max_length': '3', 'null': 'True'}), - 'lc_expiration_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'lc_sent_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), - 'local_path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), - 'replaced_by': ('django.db.models.fields.related.ForeignKey', ["orm['idtracker.InternetDraft']"], {'related_name': "'replaces_set'", 'null': 'True', 'db_column': "'replaced_by'", 'blank': 'True'}), - 'review_by_rfc_editor': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'revision': ('django.db.models.fields.CharField', [], {'max_length': '2'}), - 'revision_date': ('django.db.models.fields.DateField', [], {}), - 'rfc_number': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), - 'shepherd': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']", 'null': 'True', 'blank': 'True'}), - 'start_date': ('django.db.models.fields.DateField', [], {}), - 'status': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.IDStatus']"}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_column': "'id_document_name'"}), - 'txt_page_count': ('django.db.models.fields.IntegerField', [], {}), - 'wgreturn_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}) - }, - 'idtracker.personororginfo': { - 'Meta': {'db_table': "'person_or_org_info'"}, - 'address_type': ('django.db.models.fields.CharField', [], {'max_length': '4', 'null': 'True', 'blank': 'True'}), - 'created_by': ('django.db.models.fields.CharField', [], {'max_length': '8', 'null': 'True', 'blank': 'True'}), - 'date_created': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), - 'date_modified': ('django.db.models.fields.DateField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '20', 'blank': 'True'}), - 'first_name_key': ('django.db.models.fields.CharField', [], {'max_length': '20', 'blank': 'True'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), - 'last_name_key': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}), - 'middle_initial': ('django.db.models.fields.CharField', [], {'max_length': '4', 'null': 'True', 'blank': 'True'}), - 'middle_initial_key': ('django.db.models.fields.CharField', [], {'max_length': '4', 'null': 'True', 'blank': 'True'}), - 'modified_by': ('django.db.models.fields.CharField', [], {'max_length': '8', 'null': 'True', 'blank': 'True'}), - 'name_prefix': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), - 'name_suffix': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), - 'person_or_org_tag': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'record_type': ('django.db.models.fields.CharField', [], {'max_length': '8', 'null': 'True', 'blank': 'True'}) - }, - 'idtracker.wgstatus': { - 'Meta': {'db_table': "'g_status'"}, - 'status': ('django.db.models.fields.CharField', [], {'max_length': '25', 'db_column': "'status_value'"}), - 'status_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - }, - 'idtracker.wgtype': { - 'Meta': {'db_table': "'g_type'"}, - 'group_type_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'type': ('django.db.models.fields.CharField', [], {'max_length': '25', 'db_column': "'group_type'"}) - }, - 'wgchairs.protowriteup': { - 'date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now()'}), - 'draft': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.InternetDraft']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']"}), - 'writeup': ('django.db.models.fields.TextField', [], {}) - }, - 'wgchairs.wgdelegate': { - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']"}), - 'wg': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.IETFWG']"}) - } - } - - complete_apps = ['wgchairs'] diff --git a/ietf/wgchairs/migrations/__init__.py b/ietf/wgchairs/migrations/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ietf/wgchairs/models.py b/ietf/wgchairs/models.py deleted file mode 100644 index ea0a74c97..000000000 --- a/ietf/wgchairs/models.py +++ /dev/null @@ -1,87 +0,0 @@ -import datetime - -from django.db import models -from django.conf import settings - -from ietf.idtracker.models import (IETFWG, PersonOrOrgInfo, - InternetDraft) - - -class WGDelegate(models.Model): - person = models.ForeignKey( - PersonOrOrgInfo, - ) - - wg = models.ForeignKey(IETFWG, related_name="old_wgdelegate_set" if settings.USE_DB_REDESIGN_PROXY_CLASSES else None) - - def __unicode__(self): - return "%s" % self.person - - class Meta: - verbose_name = "WG Delegate" - -class ProtoWriteUp(models.Model): - person = models.ForeignKey( - PersonOrOrgInfo, - blank=False, - null=False, - ) - - if settings.USE_DB_REDESIGN_PROXY_CLASSES: - from ietf.idtracker.models import InternetDraftOld as InternetDraft - - draft = models.ForeignKey( - InternetDraft, - blank=False, - null=False, - ) - - date = models.DateTimeField( - default=datetime.datetime.now(), - blank=False, - null=False, - ) - - writeup = models.TextField( - blank=False, - null=False, - ) - -if settings.USE_DB_REDESIGN_PROXY_CLASSES: - from ietf.group.models import Role - class WGDelegateProxy(Role): - #person = models.ForeignKey(PersonOrOrgInfo) # same name - #wg = models.ForeignKey(IETFWG) - @property - def wg(self): - return self.group - - def __unicode__(self): - return u"%s" % self.person - - class Meta: - proxy = True - - from ietf.doc.models import WriteupDocEvent - class ProtoWriteUpProxy(WriteupDocEvent): - #person = models.ForeignKey(PersonOrOrgInfo, blank=False, null=False) - @property - def person(self): - return self.by - #draft = models.ForeignKey(InternetDraft, blank=False, null=False) - @property - def draft(self): - return self.doc - #date = models.DateTimeField(default=datetime.datetime.now(), blank=False, null=False) - @property - def date(self): - return self.time - #writeup = models.TextField(blank=False, null=False) - @property - def writeup(self): - return self.text - class Meta: - proxy = True - - #WGDelegateOld = WGDelegate - WGDelegate = WGDelegateProxy diff --git a/ietf/wgchairs/templatetags/.gitignore b/ietf/wgchairs/templatetags/.gitignore deleted file mode 100644 index a74b07aee..000000000 --- a/ietf/wgchairs/templatetags/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/*.pyc diff --git a/ietf/wgchairs/templatetags/__init__.py b/ietf/wgchairs/templatetags/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/ietf/wgchairs/templatetags/wgchairs_tags.py b/ietf/wgchairs/templatetags/wgchairs_tags.py deleted file mode 100644 index df51dafae..000000000 --- a/ietf/wgchairs/templatetags/wgchairs_tags.py +++ /dev/null @@ -1,47 +0,0 @@ -from django.conf import settings -from django import template - -from ietf.ietfworkflows.utils import get_state_for_draft -from ietf.wgchairs.accounts import (can_manage_workflow_in_group, - can_manage_delegates_in_group, - can_manage_shepherds_in_group) - - -register = template.Library() - - -@register.inclusion_tag('wgchairs/wgchairs_admin_options.html', takes_context=True) -def wgchairs_admin_options(context, wg): - request = context.get('request', None) - user = request and request.user - return {'user': user, - 'can_manage_delegates': can_manage_delegates_in_group(user, wg), - 'can_manage_workflow': can_manage_workflow_in_group(user, wg), - 'can_manage_shepherds': can_manage_shepherds_in_group(user, wg), - 'wg': wg, - 'selected': context.get('selected', None), - } - -@register.simple_tag -def writeup(doc): - writeup = doc.protowriteup_set.all() - if not writeup: - return '' - else: - return writeup[0].writeup - - -@register.simple_tag -def writeupdate(doc): - writeup = doc.protowriteup_set.all() - if not writeup: - return '' - else: - return writeup[0].date - - -@register.inclusion_tag('wgchairs/draft_state.html', takes_context=True) -def show_state(context, doc): - return {'doc': doc, - 'state': get_state_for_draft(doc), - } diff --git a/ietf/wgchairs/tests.py b/ietf/wgchairs/tests.py deleted file mode 100644 index 8433e9399..000000000 --- a/ietf/wgchairs/tests.py +++ /dev/null @@ -1,214 +0,0 @@ -import datetime, os, shutil - -from django.conf import settings -from django.contrib.auth.models import User -from django.core.urlresolvers import reverse as urlreverse -import django.test -from StringIO import StringIO -from pyquery import PyQuery - -from ietf.utils.test_utils import login_testing_unauthorized -from ietf.utils.test_data import make_test_data -from ietf.utils.mail import outbox - -if settings.USE_DB_REDESIGN_PROXY_CLASSES: - from ietf.person.models import Person, Email - from ietf.group.models import Group, GroupHistory, Role, GroupStateTransitions - from ietf.doc.models import Document, State, WriteupDocEvent - from ietf.name.models import DocTagName - -class ManageDelegatesTestCase(django.test.TestCase): - fixtures = ['names'] - - def test_delete_delegate(self): - make_test_data() - - url = urlreverse('manage_delegates', kwargs=dict(acronym="mars")) - login_testing_unauthorized(self, "secretary", url) - - delegates = Role.objects.filter(name="delegate", group__acronym="mars") - self.assertTrue(len(delegates) > 0) - - # get - r = self.client.get(url) - self.assertEquals(r.status_code, 200) - q = PyQuery(r.content) - self.assertEquals(len(q('form input[name=delete]')), len(delegates)) - - # delete - r = self.client.post(url, - dict(remove="1", - delete=[d.pk for d in delegates])) - self.assertEquals(r.status_code, 200) - q = PyQuery(r.content) - self.assertEquals(len(q('form input[name=delete]')), 0) - self.assertEquals(Role.objects.filter(name="delegate", group__acronym="mars").count(), 0) - - def test_add_not_existing_delegate(self): - make_test_data() - - url = urlreverse('manage_delegates', kwargs=dict(acronym="mars")) - login_testing_unauthorized(self, "secretary", url) - - # get - r = self.client.get(url) - self.assertEquals(r.status_code, 200) - q = PyQuery(r.content) - self.assertEquals(len(q('form input[name=email]')), 1) - - # add non-existing - r = self.client.post(url, - dict(email="unknown@example.com", - form_type="single")) - self.assertEquals(r.status_code, 200) - self.assertTrue("unknown@example.com" in r.content) - q = PyQuery(r.content) - self.assertEquals(len(q('form input[type=submit][value*="Send email"]')), 1) - - # we get back a warning and offer to send email, do that - mailbox_before = len(outbox) - r = self.client.post(url, - dict(email="unknown@example.com", - form_type="notexist")) - self.assertEquals(r.status_code, 200) - self.assertTrue("Email sent" in r.content) - self.assertEquals(len(outbox), mailbox_before + 3) - - def test_add_delegate(self): - make_test_data() - - url = urlreverse('manage_delegates', kwargs=dict(acronym="mars")) - login_testing_unauthorized(self, "secretary", url) - - # get - r = self.client.get(url) - self.assertEquals(r.status_code, 200) - q = PyQuery(r.content) - self.assertEquals(len(q('form input[name=email]')), 1) - - # add existing person - history_before = GroupHistory.objects.filter(acronym="mars").count() - r = self.client.post(url, - dict(email="plain@example.com", - form_type="single")) - self.assertEquals(r.status_code, 200) - q = PyQuery(r.content) - self.assertTrue("new delegate" in r.content) - self.assertTrue(Email.objects.get(address="plain@example.com").person.plain_name() in r.content) - self.assertEquals(Role.objects.filter(name="delegate", group__acronym="mars", email__address="plain@example.com").count(), 1) - self.assertEquals(history_before + 1, GroupHistory.objects.filter(acronym="mars").count()) - - -class ManageShepherdsTestCase(django.test.TestCase): - fixtures = ['names'] - - def test_manage_shepherds(self): - make_test_data() - - url = urlreverse('manage_shepherds', kwargs=dict(acronym="mars")) - login_testing_unauthorized(self, "secretary", url) - - # setup test documents - group = Group.objects.get(acronym="mars") - - from ietf.doc.models import Document - common = dict(group=group, - ad=Person.objects.get(user__username="ad"), - type_id="draft") - Document.objects.create(name="test-shepherd-no", - title="No shepherd", - shepherd=None, - **common) - Document.objects.create(name="test-shepherd-me", - title="Shepherd me", - shepherd=Person.objects.get(user__username="secretary"), - **common) - Document.objects.create(name="test-shepherd-other", title="Shepherd other", - shepherd=Person.objects.get(user__username="plain"), - **common) - for d in Document.objects.filter(name__startswith="test-shepherd"): - d.set_state(State.objects.get(used=True, type="draft", slug="active")) - - # get and make sure they are divided correctly - r = self.client.get(url) - self.assertEquals(r.status_code, 200) - q = PyQuery(r.content) - self.assertEquals(len(q('div#noshepherd a:contains("No shepherd")')), 1) - self.assertEquals(len(q('div#mydocs a:contains("Shepherd me")')), 1) - self.assertEquals(len(q('div#othershepherds a:contains("Shepherd other")')), 1) - - -class ManageWorkflowTestCase(django.test.TestCase): - fixtures = ['names'] - - def test_manage_workflows(self): - make_test_data() - - group = Group.objects.get(acronym="mars") - - url = urlreverse('manage_workflow', kwargs=dict(acronym=group.acronym)) - login_testing_unauthorized(self, "secretary", url) - - state = State.objects.get(used=True, type="draft-stream-ietf", slug="wg-lc") - self.assertTrue(state not in group.unused_states.all()) - - # get - r = self.client.get(url) - self.assertEquals(r.status_code, 200) - q = PyQuery(r.content) - self.assertEquals(len(q("form.set-state").find("input[name=state][value='%s']" % state.pk).parents("form").find("input[name=active][value='0']")), 1) - - # deactivate state - r = self.client.post(url, - dict(action="setstateactive", - state=state.pk, - active="0")) - self.assertEquals(r.status_code, 200) - q = PyQuery(r.content) - self.assertEquals(len(q("form.set-state").find("input[name=state][value='%s']" % state.pk).parents("form").find("input[name=active][value='1']")), 1) - group = Group.objects.get(acronym=group.acronym) - self.assertTrue(state in group.unused_states.all()) - - # change next states - state = State.objects.get(used=True, type="draft-stream-ietf", slug="wg-doc") - next_states = State.objects.filter(used=True, type=b"draft-stream-ietf", slug__in=["parked", "dead", "wait-wgw", 'sub-pub']).values_list('pk', flat=True) - r = self.client.post(url, - dict(action="setnextstates", - state=state.pk, - next_states=next_states)) - self.assertEquals(r.status_code, 200) - q = PyQuery(r.content) - self.assertEquals(len(q("form.set-next-states").find("input[name=state][value='%s']" % state.pk).parents('form').find("input[name=next_states][checked=checked]")), len(next_states)) - transitions = GroupStateTransitions.objects.filter(group=group, state=state) - self.assertEquals(len(transitions), 1) - self.assertEquals(set(transitions[0].next_states.values_list("pk", flat=True)), set(next_states)) - - # change them back to default - next_states = state.next_states.values_list("pk", flat=True) - r = self.client.post(url, - dict(action="setnextstates", - state=state.pk, - next_states=next_states)) - self.assertEquals(r.status_code, 200) - q = PyQuery(r.content) - transitions = GroupStateTransitions.objects.filter(group=group, state=state) - self.assertEquals(len(transitions), 0) - - # deactivate tag - tag = DocTagName.objects.get(slug="w-expert") - r = self.client.post(url, - dict(action="settagactive", - tag=tag.pk, - active="0")) - self.assertEquals(r.status_code, 200) - q = PyQuery(r.content) - self.assertEquals(len(q('form').find('input[name=tag][value="%s"]' % tag.pk).parents("form").find("input[name=active]")), 1) - group = Group.objects.get(acronym=group.acronym) - self.assertTrue(tag in group.unused_tags.all()) - -if not settings.USE_DB_REDESIGN_PROXY_CLASSES: - # the above tests only work with the new schema - del ManageDelegatesTestCase - del ManageShepherdsTestCase - del ManageWorkflowTestCase - del ManageWriteupCase diff --git a/ietf/wgchairs/urls.py b/ietf/wgchairs/urls.py deleted file mode 100644 index b9b32c240..000000000 --- a/ietf/wgchairs/urls.py +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright The IETF Trust 2008, All Rights Reserved - -from django.conf.urls.defaults import patterns, url - -urlpatterns = patterns('ietf.wgchairs.views', - url(r'^delegates/$', 'manage_delegates', name='manage_delegates'), -) diff --git a/ietf/wgchairs/views.py b/ietf/wgchairs/views.py deleted file mode 100644 index 1f9552e3d..000000000 --- a/ietf/wgchairs/views.py +++ /dev/null @@ -1,73 +0,0 @@ -from django.conf import settings -from ietf.idtracker.models import IETFWG, InternetDraft -from django.shortcuts import get_object_or_404, render_to_response -from django.template import RequestContext -from django.http import HttpResponseForbidden, Http404 - -from ietf.wgchairs.forms import (RemoveDelegateForm, add_form_factory, - workflow_form_factory, TransitionFormSet, - WriteUpEditForm, assign_shepherd) -from ietf.wgchairs.accounts import (can_manage_delegates_in_group, get_person_for_user, - can_manage_shepherds_in_group, - can_manage_workflow_in_group, - can_manage_shepherd_of_a_document, - can_manage_writeup_of_a_document, - can_manage_writeup_of_a_document_no_state, - ) -from ietf.ietfworkflows.constants import REQUIRED_STATES -from ietf.ietfworkflows.utils import (get_workflow_for_wg, - get_default_workflow_for_wg, - get_state_by_name, - get_annotation_tags_for_draft, - get_state_for_draft, WAITING_WRITEUP, - FOLLOWUP_TAG) -from ietf.name.models import DocTagName -from ietf.doc.models import State -from ietf.doc.utils import get_tags_for_stream_id - -def manage_delegates(request, acronym): - wg = get_object_or_404(IETFWG, group_acronym__acronym=acronym, group_type=1) - user = request.user - if not can_manage_delegates_in_group(user, wg): - return HttpResponseForbidden('You have no permission to access this view') - delegates = wg.wgdelegate_set.all() - add_form = add_form_factory(request, wg, user) - if request.method == 'POST': - if request.POST.get('remove', None): - form = RemoveDelegateForm(wg=wg, data=request.POST.copy()) - if form.is_valid(): - form.save() - elif add_form.is_valid(): - add_form.save() - add_form = add_form.get_next_form() - max_delegates = getattr(settings, 'MAX_WG_DELEGATES', 3) - return render_to_response('wgchairs/manage_delegates.html', - {'wg': wg, - 'delegates': delegates, - 'selected': 'manage_delegates', - 'can_add': delegates.count() < max_delegates, - 'max_delegates': max_delegates, - 'add_form': add_form, - }, RequestContext(request)) - - -def wg_shepherd_documents(request, acronym): - wg = get_object_or_404(IETFWG, group_acronym__acronym=acronym, group_type=1) - user = request.user - if not can_manage_shepherds_in_group(user, wg): - return HttpResponseForbidden('You have no permission to access this view') - current_person = get_person_for_user(user) - - base_qs = InternetDraft.objects.filter(group=wg, states__type="draft", states__slug="active").select_related("status").order_by('title') - documents_no_shepherd = base_qs.filter(shepherd=None) - documents_my = base_qs.filter(shepherd=current_person) - documents_other = base_qs.exclude(shepherd=None).exclude(shepherd__pk__in=[current_person.pk, 0]) - context = { - 'no_shepherd': documents_no_shepherd, - 'my_documents': documents_my, - 'other_shepherds': documents_other, - 'selected': 'manage_shepherds', - 'wg': wg, - } - return render_to_response('wgchairs/wg_shepherd_documents.html', context, RequestContext(request)) -