Merged /branch/yaco/wgchairs.r3120:r3154-3558 from esanchez@yaco.es. This adds support for alternate streams document tracking, similar to the WG chairs tracking functionality.

- Legacy-Id: 3559
This commit is contained in:
Henrik Levkowetz 2011-11-02 15:47:44 +00:00
commit 941d22e3d5
19 changed files with 1179 additions and 521 deletions

View file

@ -22,17 +22,42 @@ def is_wgdelegate(person):
return bool(person.wgdelegate_set.all())
def is_chair_of_draft(user, draft):
def is_delegate_of_stream(user, stream):
if is_secretariat(user):
return True
person = get_person_for_user(user)
return stream.check_delegate(person)
def is_chair_of_stream(user, stream):
if is_secretariat(user):
return True
person = get_person_for_user(user)
return stream.check_chair(person)
def is_authorized_in_draft_stream(user, draft):
if is_secretariat(user):
return True
person = get_person_for_user(user)
if not person:
return False
streamed = get_streamed_draft(draft)
if not streamed or not streamed.stream:
return False
group = streamed.group
if not group or not hasattr(group, 'chairs'):
return False
return bool(group.chairs().filter(person=person).count())
# Check if the person is chair of the stream
if is_chair_of_stream(user, streamed.stream):
return True
# Check if the person is delegate of the stream
if is_delegate_of_stream(user, streamed.stream):
return True
# Check if the person is chair of the related group
chairs = streamed.stream.get_chairs_for_document(draft)
if chairs and person in chairs:
return True
# Check if the person is authorized by a delegate system
delegates = streamed.stream.get_delegates_for_document(draft)
return bool(person in delegates)
def can_edit_state(user, draft):
@ -45,7 +70,7 @@ def can_edit_state(user, draft):
is_wgchair(person) or
is_wgdelegate(person))
return (is_secretariat(user) or
is_chair_of_draft(user, draft))
is_authorized_in_draft_stream(user, draft))
def can_edit_stream(user, draft):

View file

@ -1,461 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<django-objects version="1.0">
<object pk="1" model="workflows.workflow">
<field type="CharField" name="name">Default WG Workflow</field>
<field to="workflows.state" name="initial_state" rel="ManyToOneRel">14</field>
</object>
<object pk="2" model="workflows.workflow">
<field type="CharField" name="name">IAB Workflow</field>
<field to="workflows.state" name="initial_state" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="3" model="workflows.workflow">
<field type="CharField" name="name">IRTF Workflow</field>
<field to="workflows.state" name="initial_state" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="4" model="workflows.workflow">
<field type="CharField" name="name">ISE Workflow</field>
<field to="workflows.state" name="initial_state" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="32" model="workflows.state">
<field type="CharField" name="name">Active IAB Document</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">2</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="42" model="workflows.state">
<field type="CharField" name="name">Active RG Document</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">3</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="12" model="workflows.state">
<field type="CharField" name="name">Adopted by a WG</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"><object pk="12"></object></field>
</object>
<object pk="13" model="workflows.state">
<field type="CharField" name="name">Adopted for WG Info Only</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="36" model="workflows.state">
<field type="CharField" name="name">Approved by IAB, To Be Sent to RFC Editor</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">2</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="47" model="workflows.state">
<field type="CharField" name="name">Awaiting IRSG Reviews</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">3</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="11" model="workflows.state">
<field type="CharField" name="name">Call For Adoption By WG Issued</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"><object pk="10"></object><object pk="11"></object></field>
</object>
<object pk="31" model="workflows.state">
<field type="CharField" name="name">Candidate IAB Document</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">2</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="41" model="workflows.state">
<field type="CharField" name="name">Candidate RG Document</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">3</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="35" model="workflows.state">
<field type="CharField" name="name">Community Review</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">2</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="40" model="workflows.state">
<field type="CharField" name="name">Dead IAB Document</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">2</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="53" model="workflows.state">
<field type="CharField" name="name">Dead IRTF Document</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">3</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="16" model="workflows.state">
<field type="CharField" name="name">Dead WG Document</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"><object pk="12"></object></field>
</object>
<object pk="51" model="workflows.state">
<field type="CharField" name="name">Document on Hold Based On IESG Request</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">3</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="62" model="workflows.state">
<field type="CharField" name="name">Document on Hold Based On IESG Request</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">4</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="55" model="workflows.state">
<field type="CharField" name="name">Finding Reviewers</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">4</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="34" model="workflows.state">
<field type="CharField" name="name">IAB Review</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">2</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="49" model="workflows.state">
<field type="CharField" name="name">In IESG Review</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">3</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="58" model="workflows.state">
<field type="CharField" name="name">In IESG Review</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">4</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="48" model="workflows.state">
<field type="CharField" name="name">In IRSG Poll</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">3</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="56" model="workflows.state">
<field type="CharField" name="name">In ISE Review</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">4</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="44" model="workflows.state">
<field type="CharField" name="name">In RG Last Call</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">3</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="17" model="workflows.state">
<field type="CharField" name="name">In WG Last Call</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"><object pk="12"></object><object pk="17"></object><object pk="18"></object></field>
</object>
<object pk="61" model="workflows.state">
<field type="CharField" name="name">No Longer In Independent Submission Stream</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">4</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="33" model="workflows.state">
<field type="CharField" name="name">Parked IAB Document</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">2</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="43" model="workflows.state">
<field type="CharField" name="name">Parked RG Document</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">3</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="15" model="workflows.state">
<field type="CharField" name="name">Parked WG Document</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"><object pk="12"></object></field>
</object>
<object pk="52" model="workflows.state">
<field type="CharField" name="name">Published RFC</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">3</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="60" model="workflows.state">
<field type="CharField" name="name">Published RFC</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">4</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="39" model="workflows.state">
<field type="CharField" name="name">Published RFC</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">2</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="57" model="workflows.state">
<field type="CharField" name="name">Response to Review Needed</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">4</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="37" model="workflows.state">
<field type="CharField" name="name">Sent to a Different Organization for Publication</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">2</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="38" model="workflows.state">
<field type="CharField" name="name">Sent to the RFC Editor</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">2</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="59" model="workflows.state">
<field type="CharField" name="name">Sent to the RFC Editor</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">4</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="50" model="workflows.state">
<field type="CharField" name="name">Sent to the RFC Editor</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">3</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="54" model="workflows.state">
<field type="CharField" name="name">Submission Received</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">4</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="20" model="workflows.state">
<field type="CharField" name="name">Submitted to IESG for Publication</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"><object pk="12"></object></field>
</object>
<object pk="45" model="workflows.state">
<field type="CharField" name="name">Waiting for Document Shepherd</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">3</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="46" model="workflows.state">
<field type="CharField" name="name">Waiting for IRTF Chair</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">3</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"></field>
</object>
<object pk="18" model="workflows.state">
<field type="CharField" name="name">Waiting for WG Chair Go-Ahead</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"><object pk="16"></object><object pk="17"></object></field>
</object>
<object pk="19" model="workflows.state">
<field type="CharField" name="name">WG Consensus: Waiting for Write-Up</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"><object pk="15"></object></field>
</object>
<object pk="14" model="workflows.state">
<field type="CharField" name="name">WG Document</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="workflows.transition" name="transitions" rel="ManyToManyRel"><object pk="13"></object><object pk="14"></object><object pk="16"></object><object pk="17"></object></field>
</object>
<object pk="18" model="workflows.transition">
<field type="CharField" name="name">Wait for go-ahead</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="workflows.state" name="destination" rel="ManyToOneRel">18</field>
<field type="CharField" name="condition"></field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="17" model="workflows.transition">
<field type="CharField" name="name">Reach consensus</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="workflows.state" name="destination" rel="ManyToOneRel">19</field>
<field type="CharField" name="condition"></field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="10" model="workflows.transition">
<field type="CharField" name="name">Adopt</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="workflows.state" name="destination" rel="ManyToOneRel">12</field>
<field type="CharField" name="condition"></field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="11" model="workflows.transition">
<field type="CharField" name="name">Adopt for WG info only</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="workflows.state" name="destination" rel="ManyToOneRel">13</field>
<field type="CharField" name="condition"></field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="12" model="workflows.transition">
<field type="CharField" name="name">Develop</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="workflows.state" name="destination" rel="ManyToOneRel">14</field>
<field type="CharField" name="condition"></field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="13" model="workflows.transition">
<field type="CharField" name="name">Park</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="workflows.state" name="destination" rel="ManyToOneRel">15</field>
<field type="CharField" name="condition"></field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="14" model="workflows.transition">
<field type="CharField" name="name">Die</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="workflows.state" name="destination" rel="ManyToOneRel">16</field>
<field type="CharField" name="condition"></field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="15" model="workflows.transition">
<field type="CharField" name="name">Submit to IESG</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="workflows.state" name="destination" rel="ManyToOneRel">20</field>
<field type="CharField" name="condition"></field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="16" model="workflows.transition">
<field type="CharField" name="name">Raise last call</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="workflows.state" name="destination" rel="ManyToOneRel">17</field>
<field type="CharField" name="condition"></field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="31" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Revised I-D Needed</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">3</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="29" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Shepherd Needed</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">3</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="30" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Waiting for Dependency on Other Document</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">3</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="26" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Revised I-D Needed</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">2</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="27" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Document Shepherd Followup</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">2</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="28" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Editor Needed</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">3</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="25" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Awaiting Reviews</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">2</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="24" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Waiting for Partner Feedback</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">2</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="11" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Other - see Comment Log</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="23" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Editor Needed</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">2</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="10" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Doc Shepherd Follow-Up Underway</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="9" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Revised I-D Needed - Issue raised by IESG</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="1" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Awaiting Expert Review/Resolution of Issues Raised</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="2" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Awaiting External Review/Resolution of Issues Raised</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="3" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Awaiting Merge with Other Document</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="4" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Author or Editor Needed</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="5" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Waiting for Referenced Document</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="8" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Revised I-D Needed - Issue raised by AD</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="7" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Revised I-D Needed - Issue raised by WGLC</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="6" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Waiting for Referencing Document</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">1</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="32" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">IESG Review Completed</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">3</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="33" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Waiting for Dependency on Other Document</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">4</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="34" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Awaiting Reviews</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">4</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="35" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">Revised I-D Needed</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">4</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="36" model="ietfworkflows.annotationtag">
<field type="CharField" name="name">IESG Review Completed</field>
<field to="workflows.workflow" name="workflow" rel="ManyToOneRel">4</field>
<field to="permissions.permission" name="permission" rel="ManyToOneRel"><None></None></field>
</object>
<object pk="1" model="ietfworkflows.wgworkflow">
<field to="workflows.state" name="selected_states" rel="ManyToManyRel"></field>
<field to="ietfworkflows.annotationtag" name="selected_tags" rel="ManyToManyRel"></field>
</object>
<object pk="2" model="ietfworkflows.wgworkflow">
<field to="workflows.state" name="selected_states" rel="ManyToManyRel"></field>
<field to="ietfworkflows.annotationtag" name="selected_tags" rel="ManyToManyRel"></field>
</object>
<object pk="3" model="ietfworkflows.wgworkflow">
<field to="workflows.state" name="selected_states" rel="ManyToManyRel"></field>
<field to="ietfworkflows.annotationtag" name="selected_tags" rel="ManyToManyRel"></field>
</object>
<object pk="4" model="ietfworkflows.wgworkflow">
<field to="workflows.state" name="selected_states" rel="ManyToManyRel"></field>
<field to="ietfworkflows.annotationtag" name="selected_tags" rel="ManyToManyRel"></field>
</object>
<object pk="1" model="ietfworkflows.stream">
<field type="CharField" name="name">IETF</field>
<field type="BooleanField" name="with_groups">True</field>
<field type="CharField" name="group_model">idtracker.IETFWG</field>
<field type="CharField" name="group_chair_model">idtracker.WGChair</field>
<field type="CharField" name="document_group_attribute">group.ietfwg</field>
<field type="CharField" name="group_chair_attribute">chairs</field>
<field to="ietfworkflows.wgworkflow" name="workflow" rel="ManyToOneRel">1</field>
</object>
<object pk="2" model="ietfworkflows.stream">
<field type="CharField" name="name">IAB</field>
<field type="BooleanField" name="with_groups">False</field>
<field type="CharField" name="group_model"></field>
<field type="CharField" name="group_chair_model"></field>
<field type="CharField" name="document_group_attribute"></field>
<field type="CharField" name="group_chair_attribute"></field>
<field to="ietfworkflows.wgworkflow" name="workflow" rel="ManyToOneRel">2</field>
</object>
<object pk="3" model="ietfworkflows.stream">
<field type="CharField" name="name">IRTF</field>
<field type="BooleanField" name="with_groups">True</field>
<field type="CharField" name="group_model">idtracker.IRTF</field>
<field type="CharField" name="group_chair_model">idtracker.IRTFChair</field>
<field type="CharField" name="document_group_attribute"></field>
<field type="CharField" name="group_chair_attribute"></field>
<field to="ietfworkflows.wgworkflow" name="workflow" rel="ManyToOneRel">3</field>
</object>
<object pk="4" model="ietfworkflows.stream">
<field type="CharField" name="name">ISE</field>
<field type="BooleanField" name="with_groups">False</field>
<field type="CharField" name="group_model"></field>
<field type="CharField" name="group_chair_model"></field>
<field type="CharField" name="document_group_attribute"></field>
<field type="CharField" name="group_chair_attribute"></field>
<field to="ietfworkflows.wgworkflow" name="workflow" rel="ManyToOneRel">4</field>
</object>
<object pk="1" model="ietfworkflows.statedescription">

View file

@ -8,7 +8,7 @@ from workflows.utils import set_workflow_for_object
from ietf.idtracker.models import PersonOrOrgInfo, IETFWG
from ietf.wgchairs.accounts import get_person_for_user
from ietf.ietfworkflows.models import Stream
from ietf.ietfworkflows.models import Stream, StreamDelegate
from ietf.ietfworkflows.utils import (get_workflow_for_draft, get_workflow_for_wg,
get_state_for_draft, get_state_by_name,
update_state, FOLLOWUP_TAG,
@ -62,7 +62,7 @@ class NoWorkflowStateForm(StreamDraftForm):
wgs = set([i.group_acronym for i in self.person.wgchair_set.all()]).union(set([i.wg for i in self.person.wgdelegate_set.all()]))
if len(wgs) > 1:
self.wgs = list(wgs)
self.wgs.sort(lambda x,y: cmp(x.group_acronym.acronym, y.group_acronym.acronym))
self.wgs.sort(lambda x, y: cmp(x.group_acronym.acronym, y.group_acronym.acronym))
self.fields['wg'].choices = [(i.pk, '%s - %s' % (i.group_acronym.acronym, i.group_acronym.name)) for i in self.wgs]
else:
self.onlywg = list(wgs)[0].group_acronym
@ -200,3 +200,28 @@ class DraftStreamForm(StreamDraftForm):
comment=comment,
person=self.person,
to_stream=to_stream)
class StreamDelegatesForm(forms.Form):
email = forms.EmailField()
def __init__(self, *args, **kwargs):
self.stream = kwargs.pop('stream')
super(StreamDelegatesForm, self).__init__(*args, **kwargs)
def get_person(self, email):
persons = PersonOrOrgInfo.objects.filter(emailaddress__address=email).distinct()
if not persons:
return None
return persons[0]
def clean_email(self):
email = self.cleaned_data.get('email')
self.person = self.get_person(email)
if not self.person:
raise forms.ValidationError('There is no user with this email in the system')
def save(self):
StreamDelegate.objects.get_or_create(
person=self.person,
stream=self.stream)

View file

@ -0,0 +1,205 @@
from south.db import db
from django.db import models
from ietf.ietfworkflows.models import *
class Migration:
def forwards(self, orm):
# Deleting field 'StreamedID.content_type'
db.delete_column('ietfworkflows_streamedid', 'content_type_id')
# Deleting field 'StreamedID.content_id'
db.delete_column('ietfworkflows_streamedid', 'content_id')
def backwards(self, orm):
# Adding field 'StreamedID.content_type'
db.add_column('ietfworkflows_streamedid', 'content_type', orm['ietfworkflows.streamedid:content_type'])
# Adding field 'StreamedID.content_id'
db.add_column('ietfworkflows_streamedid', 'content_id', orm['ietfworkflows.streamedid:content_id'])
models = {
'contenttypes.contenttype': {
'Meta': {'unique_together': "(('app_label', 'model'),)", 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'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.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.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', ["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'})
},
'ietfworkflows.annotationtag': {
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'permission': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['permissions.Permission']", 'null': 'True', 'blank': 'True'}),
'workflow': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'annotation_tags'", 'to': "orm['workflows.Workflow']"})
},
'ietfworkflows.annotationtagobjectrelation': {
'annotation_tag': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ietfworkflows.AnnotationTag']"}),
'content_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'annotation_tags'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
},
'ietfworkflows.objectannotationtaghistoryentry': {
'objecthistoryentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['ietfworkflows.ObjectHistoryEntry']", 'unique': 'True', 'primary_key': 'True'}),
'setted': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'unsetted': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
},
'ietfworkflows.objecthistoryentry': {
'comment': ('django.db.models.fields.TextField', [], {}),
'content_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'workflow_history'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}),
'date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']"})
},
'ietfworkflows.objectstreamhistoryentry': {
'from_stream': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'objecthistoryentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['ietfworkflows.ObjectHistoryEntry']", 'unique': 'True', 'primary_key': 'True'}),
'to_stream': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
},
'ietfworkflows.objectworkflowhistoryentry': {
'from_state': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'objecthistoryentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['ietfworkflows.ObjectHistoryEntry']", 'unique': 'True', 'primary_key': 'True'}),
'to_state': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'ietfworkflows.statedescription': {
'definition': ('django.db.models.fields.TextField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'order': ('django.db.models.fields.PositiveIntegerField', [], {}),
'state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['workflows.State']"})
},
'ietfworkflows.stateobjectrelationmetadata': {
'estimated_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'from_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'relation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['workflows.StateObjectRelation']"})
},
'ietfworkflows.stream': {
'group_chair_model': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
'group_model': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'with_groups': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
'workflow': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ietfworkflows.WGWorkflow']"})
},
'ietfworkflows.streamedid': {
'draft': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['idtracker.InternetDraft']", 'unique': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'stream': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ietfworkflows.Stream']", 'null': 'True', 'blank': 'True'})
},
'ietfworkflows.wgworkflow': {
'selected_states': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['workflows.State']", 'null': 'True', 'blank': 'True'}),
'selected_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['ietfworkflows.AnnotationTag']", 'null': 'True', 'blank': 'True'}),
'workflow_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['workflows.Workflow']", 'unique': 'True', 'primary_key': 'True'})
},
'permissions.permission': {
'codename': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
'content_types': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['contenttypes.ContentType']", 'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'})
},
'workflows.state': {
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'transitions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['workflows.Transition']", 'null': 'True', 'blank': 'True'}),
'workflow': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'states'", 'to': "orm['workflows.Workflow']"})
},
'workflows.stateobjectrelation': {
'Meta': {'unique_together': "(('content_type', 'content_id', 'state'),)"},
'content_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'state_object'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['workflows.State']"})
},
'workflows.transition': {
'condition': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'destination': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'destination_state'", 'null': 'True', 'to': "orm['workflows.State']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'permission': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['permissions.Permission']", 'null': 'True', 'blank': 'True'}),
'workflow': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'transitions'", 'to': "orm['workflows.Workflow']"})
},
'workflows.workflow': {
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'initial_state': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'workflow_state'", 'null': 'True', 'to': "orm['workflows.State']"}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['permissions.Permission']", 'symmetrical': 'False'})
}
}
complete_apps = ['ietfworkflows']

View file

@ -0,0 +1,222 @@
from south.db import db
from django.db import models
from ietf.ietfworkflows.models import *
class Migration:
def forwards(self, orm):
# Adding field 'Stream.group_chair_attribute'
db.add_column('ietfworkflows_stream', 'group_chair_attribute', orm['ietfworkflows.stream:group_chair_attribute'])
# Adding field 'Stream.document_group_attribute'
db.add_column('ietfworkflows_stream', 'document_group_attribute', orm['ietfworkflows.stream:document_group_attribute'])
# Deleting field 'Stream.group_chair_model'
db.delete_column('ietfworkflows_stream', 'group_chair_model')
# Deleting field 'Stream.with_groups'
db.delete_column('ietfworkflows_stream', 'with_groups')
# Deleting field 'Stream.group_model'
db.delete_column('ietfworkflows_stream', 'group_model')
def backwards(self, orm):
# Deleting field 'Stream.group_chair_attribute'
db.delete_column('ietfworkflows_stream', 'group_chair_attribute')
# Deleting field 'Stream.document_group_attribute'
db.delete_column('ietfworkflows_stream', 'document_group_attribute')
# Adding field 'Stream.group_chair_model'
db.add_column('ietfworkflows_stream', 'group_chair_model', orm['ietfworkflows.stream:group_chair_model'])
# Adding field 'Stream.with_groups'
db.add_column('ietfworkflows_stream', 'with_groups', orm['ietfworkflows.stream:with_groups'])
# Adding field 'Stream.group_model'
db.add_column('ietfworkflows_stream', 'group_model', orm['ietfworkflows.stream:group_model'])
models = {
'contenttypes.contenttype': {
'Meta': {'unique_together': "(('app_label', 'model'),)", 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'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.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.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', ["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'})
},
'ietfworkflows.annotationtag': {
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'permission': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['permissions.Permission']", 'null': 'True', 'blank': 'True'}),
'workflow': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'annotation_tags'", 'to': "orm['workflows.Workflow']"})
},
'ietfworkflows.annotationtagobjectrelation': {
'annotation_tag': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ietfworkflows.AnnotationTag']"}),
'content_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'annotation_tags'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
},
'ietfworkflows.objectannotationtaghistoryentry': {
'objecthistoryentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['ietfworkflows.ObjectHistoryEntry']", 'unique': 'True', 'primary_key': 'True'}),
'setted': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'unsetted': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
},
'ietfworkflows.objecthistoryentry': {
'comment': ('django.db.models.fields.TextField', [], {}),
'content_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'workflow_history'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}),
'date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']"})
},
'ietfworkflows.objectstreamhistoryentry': {
'from_stream': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'objecthistoryentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['ietfworkflows.ObjectHistoryEntry']", 'unique': 'True', 'primary_key': 'True'}),
'to_stream': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
},
'ietfworkflows.objectworkflowhistoryentry': {
'from_state': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'objecthistoryentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['ietfworkflows.ObjectHistoryEntry']", 'unique': 'True', 'primary_key': 'True'}),
'to_state': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'ietfworkflows.statedescription': {
'definition': ('django.db.models.fields.TextField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'order': ('django.db.models.fields.PositiveIntegerField', [], {}),
'state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['workflows.State']"})
},
'ietfworkflows.stateobjectrelationmetadata': {
'estimated_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'from_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'relation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['workflows.StateObjectRelation']"})
},
'ietfworkflows.stream': {
'document_group_attribute': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
'group_chair_attribute': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'workflow': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ietfworkflows.WGWorkflow']"})
},
'ietfworkflows.streamedid': {
'draft': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['idtracker.InternetDraft']", 'unique': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'stream': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ietfworkflows.Stream']", 'null': 'True', 'blank': 'True'})
},
'ietfworkflows.wgworkflow': {
'selected_states': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['workflows.State']", 'null': 'True', 'blank': 'True'}),
'selected_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['ietfworkflows.AnnotationTag']", 'null': 'True', 'blank': 'True'}),
'workflow_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['workflows.Workflow']", 'unique': 'True', 'primary_key': 'True'})
},
'permissions.permission': {
'codename': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
'content_types': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['contenttypes.ContentType']", 'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'})
},
'workflows.state': {
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'transitions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['workflows.Transition']", 'null': 'True', 'blank': 'True'}),
'workflow': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'states'", 'to': "orm['workflows.Workflow']"})
},
'workflows.stateobjectrelation': {
'Meta': {'unique_together': "(('content_type', 'content_id', 'state'),)"},
'content_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'state_object'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['workflows.State']"})
},
'workflows.transition': {
'condition': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'destination': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'destination_state'", 'null': 'True', 'to': "orm['workflows.State']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'permission': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['permissions.Permission']", 'null': 'True', 'blank': 'True'}),
'workflow': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'transitions'", 'to': "orm['workflows.Workflow']"})
},
'workflows.workflow': {
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'initial_state': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'workflow_state'", 'null': 'True', 'to': "orm['workflows.State']"}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['permissions.Permission']", 'symmetrical': 'False'})
}
}
complete_apps = ['ietfworkflows']

View file

@ -0,0 +1,208 @@
from south.db import db
from django.db import models
from ietf.ietfworkflows.models import *
class Migration:
def forwards(self, orm):
# Adding model 'StreamDelegate'
db.create_table('ietfworkflows_streamdelegate', (
('id', orm['ietfworkflows.streamdelegate:id']),
('stream', orm['ietfworkflows.streamdelegate:stream']),
('person', orm['ietfworkflows.streamdelegate:person']),
))
db.send_create_signal('ietfworkflows', ['StreamDelegate'])
def backwards(self, orm):
# Deleting model 'StreamDelegate'
db.delete_table('ietfworkflows_streamdelegate')
models = {
'contenttypes.contenttype': {
'Meta': {'unique_together': "(('app_label', 'model'),)", 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'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.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.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', ["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'})
},
'ietfworkflows.annotationtag': {
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'permission': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['permissions.Permission']", 'null': 'True', 'blank': 'True'}),
'workflow': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'annotation_tags'", 'to': "orm['workflows.Workflow']"})
},
'ietfworkflows.annotationtagobjectrelation': {
'annotation_tag': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ietfworkflows.AnnotationTag']"}),
'content_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'annotation_tags'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
},
'ietfworkflows.objectannotationtaghistoryentry': {
'objecthistoryentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['ietfworkflows.ObjectHistoryEntry']", 'unique': 'True', 'primary_key': 'True'}),
'setted': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'unsetted': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
},
'ietfworkflows.objecthistoryentry': {
'comment': ('django.db.models.fields.TextField', [], {}),
'content_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'workflow_history'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}),
'date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']"})
},
'ietfworkflows.objectstreamhistoryentry': {
'from_stream': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'objecthistoryentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['ietfworkflows.ObjectHistoryEntry']", 'unique': 'True', 'primary_key': 'True'}),
'to_stream': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
},
'ietfworkflows.objectworkflowhistoryentry': {
'from_state': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'objecthistoryentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['ietfworkflows.ObjectHistoryEntry']", 'unique': 'True', 'primary_key': 'True'}),
'to_state': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'ietfworkflows.statedescription': {
'definition': ('django.db.models.fields.TextField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'order': ('django.db.models.fields.PositiveIntegerField', [], {}),
'state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['workflows.State']"})
},
'ietfworkflows.stateobjectrelationmetadata': {
'estimated_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'from_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'relation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['workflows.StateObjectRelation']"})
},
'ietfworkflows.stream': {
'document_group_attribute': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
'group_chair_attribute': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'workflow': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ietfworkflows.WGWorkflow']"})
},
'ietfworkflows.streamdelegate': {
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']"}),
'stream': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ietfworkflows.Stream']"})
},
'ietfworkflows.streamedid': {
'draft': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['idtracker.InternetDraft']", 'unique': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'stream': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ietfworkflows.Stream']", 'null': 'True', 'blank': 'True'})
},
'ietfworkflows.wgworkflow': {
'selected_states': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['workflows.State']", 'null': 'True', 'blank': 'True'}),
'selected_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['ietfworkflows.AnnotationTag']", 'null': 'True', 'blank': 'True'}),
'workflow_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['workflows.Workflow']", 'unique': 'True', 'primary_key': 'True'})
},
'permissions.permission': {
'codename': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
'content_types': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['contenttypes.ContentType']", 'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'})
},
'workflows.state': {
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'transitions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['workflows.Transition']", 'null': 'True', 'blank': 'True'}),
'workflow': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'states'", 'to': "orm['workflows.Workflow']"})
},
'workflows.stateobjectrelation': {
'Meta': {'unique_together': "(('content_type', 'content_id', 'state'),)"},
'content_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'state_object'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['workflows.State']"})
},
'workflows.transition': {
'condition': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'destination': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'destination_state'", 'null': 'True', 'to': "orm['workflows.State']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'permission': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['permissions.Permission']", 'null': 'True', 'blank': 'True'}),
'workflow': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'transitions'", 'to': "orm['workflows.Workflow']"})
},
'workflows.workflow': {
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'initial_state': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'workflow_state'", 'null': 'True', 'to': "orm['workflows.State']"}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['permissions.Permission']", 'symmetrical': 'False'})
}
}
complete_apps = ['ietfworkflows']

View file

@ -0,0 +1,234 @@
from south.db import db
from django.db import models
from ietf.ietfworkflows.models import *
class Migration:
no_dry_run = True
def forwards(self, orm):
# Remove all 'Published RFC' status
for state in orm['workflows.state'].objects.filter(name='Published RFC'):
state.delete()
def backwards(self, orm):
"Write your backwards migration here"
models = {
'contenttypes.contenttype': {
'Meta': {'unique_together': "(('app_label', 'model'),)", 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'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.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.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', ["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'})
},
'ietfworkflows.annotationtag': {
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'permission': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['permissions.Permission']", 'null': 'True', 'blank': 'True'}),
'workflow': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'annotation_tags'", 'to': "orm['workflows.Workflow']"})
},
'ietfworkflows.annotationtagobjectrelation': {
'annotation_tag': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ietfworkflows.AnnotationTag']"}),
'content_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'annotation_tags'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
},
'ietfworkflows.objectannotationtaghistoryentry': {
'objecthistoryentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['ietfworkflows.ObjectHistoryEntry']", 'unique': 'True', 'primary_key': 'True'}),
'setted': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'unsetted': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
},
'ietfworkflows.objecthistoryentry': {
'comment': ('django.db.models.fields.TextField', [], {}),
'content_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'workflow_history'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}),
'date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']"})
},
'ietfworkflows.objectstreamhistoryentry': {
'from_stream': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'objecthistoryentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['ietfworkflows.ObjectHistoryEntry']", 'unique': 'True', 'primary_key': 'True'}),
'to_stream': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
},
'ietfworkflows.objectworkflowhistoryentry': {
'from_state': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'objecthistoryentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['ietfworkflows.ObjectHistoryEntry']", 'unique': 'True', 'primary_key': 'True'}),
'to_state': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'ietfworkflows.statedescription': {
'definition': ('django.db.models.fields.TextField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'order': ('django.db.models.fields.PositiveIntegerField', [], {}),
'state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['workflows.State']"})
},
'ietfworkflows.stateobjectrelationmetadata': {
'estimated_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'from_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'relation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['workflows.StateObjectRelation']"})
},
'ietfworkflows.stream': {
'document_group_attribute': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
'group_chair_attribute': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'workflow': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ietfworkflows.WGWorkflow']"})
},
'ietfworkflows.streamdelegate': {
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['idtracker.PersonOrOrgInfo']"}),
'stream': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ietfworkflows.Stream']"})
},
'ietfworkflows.streamedid': {
'draft': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['idtracker.InternetDraft']", 'unique': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'stream': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ietfworkflows.Stream']", 'null': 'True', 'blank': 'True'})
},
'ietfworkflows.wgworkflow': {
'selected_states': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['workflows.State']", 'null': 'True', 'blank': 'True'}),
'selected_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['ietfworkflows.AnnotationTag']", 'null': 'True', 'blank': 'True'}),
'workflow_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['workflows.Workflow']", 'unique': 'True', 'primary_key': 'True'})
},
'permissions.permission': {
'codename': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
'content_types': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['contenttypes.ContentType']", 'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'})
},
'permissions.role': {
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'})
},
'workflows.state': {
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'transitions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['workflows.Transition']", 'null': 'True', 'blank': 'True'}),
'workflow': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'states'", 'to': "orm['workflows.Workflow']"})
},
'workflows.stateinheritanceblock': {
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'permission': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['permissions.Permission']"}),
'state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['workflows.State']"})
},
'workflows.stateobjectrelation': {
'Meta': {'unique_together': "(('content_type', 'content_id', 'state'),)"},
'content_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'state_object'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['workflows.State']"})
},
'workflows.statepermissionrelation': {
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'permission': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['permissions.Permission']"}),
'role': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['permissions.Role']"}),
'state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['workflows.State']"})
},
'workflows.transition': {
'condition': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'destination': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'destination_state'", 'null': 'True', 'to': "orm['workflows.State']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'permission': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['permissions.Permission']", 'null': 'True', 'blank': 'True'}),
'workflow': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'transitions'", 'to': "orm['workflows.Workflow']"})
},
'workflows.workflow': {
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'initial_state': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'workflow_state'", 'null': 'True', 'to': "orm['workflows.State']"}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['permissions.Permission']", 'symmetrical': 'False'})
},
'workflows.workflowmodelrelation': {
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']", 'unique': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'workflow': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'wmrs'", 'to': "orm['workflows.Workflow']"})
},
'workflows.workflowobjectrelation': {
'Meta': {'unique_together': "(('content_type', 'content_id'),)"},
'content_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'workflow_object'", 'null': 'True', 'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'workflow': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'wors'", 'to': "orm['workflows.Workflow']"})
},
'workflows.workflowpermissionrelation': {
'Meta': {'unique_together': "(('workflow', 'permission'),)"},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'permission': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'permissions'", 'to': "orm['permissions.Permission']"}),
'workflow': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['workflows.Workflow']"})
}
}
complete_apps = ['ietfworkflows', 'workflows']

View file

@ -3,7 +3,7 @@ from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.utils.translation import ugettext_lazy as _
from ietf.idtracker.models import PersonOrOrgInfo, InternetDraft
from ietf.idtracker.models import PersonOrOrgInfo, InternetDraft, Role, IRTF
from ietf.utils.admin import admin_link
from workflows.models import Workflow, State, StateObjectRelation
from permissions.models import Permission
@ -140,20 +140,122 @@ class WGWorkflow(Workflow):
class Stream(models.Model):
name = models.CharField(_(u"Name"), max_length=100)
with_groups = models.BooleanField(_(u'With groups'), default=False)
group_model = models.CharField(_(u'Group model'), max_length=100, blank=True, null=True)
group_chair_model = models.CharField(_(u'Group chair model'), max_length=100, blank=True, null=True)
document_group_attribute = models.CharField(_(u'Document group attribute'), max_length=255, blank=True, null=True)
group_chair_attribute = models.CharField(_(u'Group chair attribute'), max_length=255, blank=True, null=True)
workflow = models.ForeignKey(WGWorkflow)
def __unicode__(self):
return u'%s stream' % self.name
workflow_link = admin_link('workflow')
def _irtf_group(self, document):
filename = document.filename.split('-')
if len(filename) > 2 and filename[0] == 'draft' and filename[1] == 'irtf':
try:
return IRTF.objects.get(acronym=filename[2])
except IRTF.DoesNotExist:
return None
return None
def _irtf_chairs_for_document(self, document):
group = self._irtf_group(document)
if not group:
return []
chairs = [i.person for i in group.chairs()]
chairs.append(Role.objects.get(pk=Role.IRTF_CHAIR).person)
return chairs
def _ietf_delegates_for_document(self, document):
group = self.get_group_for_document(document)
if not group:
return False
return [i.person for i in group.wgdelegate_set.all()]
def get_group_for_document(self, document):
if hasattr(self, '_%s_group' % self.name.lower()):
return getattr(self, '_%s_group' % self.name.lower())(document)
if not self.document_group_attribute:
return None
attr = None
obj = document
for attr_name in self.document_group_attribute.split('.'):
attr = getattr(obj, attr_name, None)
if not attr:
return None
if callable(attr):
attr = attr()
obj = attr
return attr
def get_chairs_for_document(self, document):
if hasattr(self, '_%s_chairs_for_document' % self.name.lower()):
return getattr(self, '_%s_chairs_for_document' % self.name.lower())(document)
group = self.get_group_for_document(document)
if not group or not self.group_chair_attribute:
return []
attr = None
obj = group
for attr_name in self.group_chair_attribute.split('.'):
attr = getattr(obj, attr_name, None)
if not attr:
return None
if callable(attr):
attr = attr()
obj = attr
return attr
def get_delegates_for_document(self, document):
delegates = []
if hasattr(self, '_%s_delegates_for_document' % self.name.lower()):
delegates = getattr(self, '_%s_delegates_for_document' % self.name.lower())(document)
delegates += [i.person for i in self.streamdelegate_set.all()]
return delegates
def _ise_stream_chairs(self):
chairs = []
try:
chairs.append(Role.objects.get(role_name='ISE').person)
except Role.DoesNotExist:
pass
return chairs
def get_chairs(self):
chairs = []
if hasattr(self, '_%s_stream_chairs' % self.name.lower()):
chairs += list(getattr(self, '_%s_stream_chairs' % self.name.lower())())
role_key = getattr(Role, '%s_CHAIR' % self.name.upper(), None)
if role_key:
try:
chairs.append(Role.objects.get(pk=role_key).person)
except Role.DoesNotExist:
pass
return list(set(chairs))
def get_delegates(self):
delegates = []
if hasattr(self, '_%s_stream_delegates' % self.name.lower()):
delegates += list(getattr(self, '_%s_stream_delegates' % self.name.lower())())
delegates += [i.person for i in StreamDelegate.objects.filter(stream=self)]
return list(set(delegates))
def check_chair(self, person):
return person in self.get_chairs()
def check_delegate(self, person):
return person in self.get_delegates()
class StreamedID(models.Model):
draft = models.OneToOneField(InternetDraft)
stream = models.ForeignKey(Stream, blank=True, null=True)
content_type = models.ForeignKey(ContentType, verbose_name=_(u"Content type"), related_name="streamed_id", blank=True, null=True)
content_id = models.PositiveIntegerField(_(u"Content id"), blank=True, null=True)
group = generic.GenericForeignKey(ct_field="content_type", fk_field="content_id")
def get_group(self):
return self.stream.get_group_for_document(self.draft)
class StreamDelegate(models.Model):
stream = models.ForeignKey(Stream)
person = models.ForeignKey(PersonOrOrgInfo)

View file

@ -34,60 +34,12 @@ def get_stream_from_id(stream_id):
return None
def get_chair_model(stream):
model_str = stream.group_chair_model
if not model_str:
return None
try:
app, model = model_str.split('.', 1)
except ValueError:
return None
chair_model = models.get_model(app, model)
if not chair_model:
return
return chair_model
def _get_group_from_acronym(group_model_str, acronym):
try:
app, model = group_model_str.split('.', 1)
except ValueError:
return None
group_model = models.get_model(app, model)
if not group_model:
return
if 'acronym' in group_model._meta.get_all_field_names():
try:
return group_model._default_manager.get(acronym=acronym)
except group_model.DoesNotExist:
return None
elif 'group_acronym' in group_model._meta.get_all_field_names():
try:
return group_model._default_manager.get(group_acronym__acronym=acronym)
except group_model.DoesNotExist:
return None
else:
return None
def _set_stream_automatically(draft, stream):
(streamed, created) = StreamedID.objects.get_or_create(draft=draft)
if created:
streamed.stream = stream
streamed.save()
else:
return
if not stream or not stream.with_groups:
return
try:
draft_literal, stream_name, group_name, extra = draft.filename.split('-', 3)
if stream_name.lower() == stream.name.lower():
group = _get_group_from_acronym(stream.group_model, group_name)
if group:
streamed.group = group
streamed.save()
except ValueError:
return
return
def get_stream_from_wrapper(idrfc_wrapper):

View file

@ -6,7 +6,9 @@ from ietf.ietfworkflows.utils import (get_workflow_for_draft,
from ietf.wgchairs.accounts import (can_manage_shepherd_of_a_document,
can_manage_writeup_of_a_document)
from ietf.ietfworkflows.streams import get_stream_from_wrapper
from ietf.ietfworkflows.accounts import (can_edit_state, can_edit_stream)
from ietf.ietfworkflows.models import Stream
from ietf.ietfworkflows.accounts import (can_edit_state, can_edit_stream,
is_chair_of_stream)
register = template.Library()
@ -14,7 +16,6 @@ register = template.Library()
@register.inclusion_tag('ietfworkflows/stream_state.html', takes_context=True)
def stream_state(context, doc):
request = context.get('request', None)
data = {}
stream = get_stream_from_wrapper(doc)
data.update({'stream': stream})
@ -72,3 +73,33 @@ def edit_actions(context, wrapper):
'draft': draft,
'doc': wrapper,
}
class StreamListNode(template.Node):
def __init__(self, user, var_name):
self.user = user
self.var_name = var_name
def render(self, context):
user = self.user.resolve(context)
streams = []
for i in Stream.objects.all():
if is_chair_of_stream(user, i):
streams.append(i)
context.update({self.var_name: streams})
return ''
@register.tag
def get_user_managed_streams(parser, token):
firstbits = token.contents.split(None, 2)
if len(firstbits) != 3:
raise template.TemplateSyntaxError("'get_user_managed_streams' tag takes three arguments")
user = parser.compile_filter(firstbits[1])
lastbits_reversed = firstbits[2][::-1].split(None, 2)
if lastbits_reversed[1][::-1] != 'as':
raise template.TemplateSyntaxError("next-to-last argument to 'get_user_managed_stream' tag must"
" be 'as'")
var_name = lastbits_reversed[0][::-1]
return StreamListNode(user, var_name)

View file

@ -6,4 +6,5 @@ urlpatterns = patterns('ietf.ietfworkflows.views',
url(r'^(?P<name>[^/]+)/history/$', 'stream_history', name='stream_history'),
url(r'^(?P<name>[^/]+)/edit/state/$', 'edit_state', name='edit_state'),
url(r'^(?P<name>[^/]+)/edit/stream/$', 'edit_stream', name='edit_stream'),
url(r'^delegates/(?P<stream_name>[^/]+)/$', 'stream_delegates', name='stream_delegates'),
)

View file

@ -87,11 +87,12 @@ def get_workflow_for_draft(draft):
if not streamed_draft or not streamed_draft.stream:
return None
stream = streamed_draft.stream
if stream.with_groups:
if not streamed_draft.group:
if stream.document_group_attribute:
group = streamed_draft.get_group()
if not group:
return None
else:
workflow = get_workflow_for_wg(streamed_draft.group, streamed_draft.stream.workflow)
workflow = get_workflow_for_wg(group, streamed_draft.stream.workflow)
else:
workflow = stream.workflow
set_workflow_for_object(draft, workflow)

View file

@ -3,16 +3,19 @@ from django.shortcuts import get_object_or_404, render_to_response
from django.template import RequestContext
from ietf.idtracker.models import InternetDraft
from ietf.ietfworkflows.models import Stream, StreamDelegate
from ietf.ietfworkflows.forms import (DraftTagsStateForm,
DraftStreamForm,
NoWorkflowStateForm)
NoWorkflowStateForm,
StreamDelegatesForm)
from ietf.ietfworkflows.streams import (get_stream_from_draft,
get_streamed_draft)
from ietf.ietfworkflows.utils import (get_workflow_history_for_draft,
get_workflow_for_draft,
get_annotation_tags_for_draft,
get_state_for_draft)
from ietf.ietfworkflows.accounts import (can_edit_state, can_edit_stream)
from ietf.ietfworkflows.accounts import (can_edit_state, can_edit_stream,
is_chair_of_stream)
REDUCED_HISTORY_LEN = 20
@ -81,8 +84,34 @@ def edit_state(request, name):
return HttpResponseForbidden('You have no permission to access this view')
return _edit_draft_stream(request, draft, DraftTagsStateForm)
def edit_stream(request, name):
draft = get_object_or_404(InternetDraft, filename=name)
if not can_edit_stream(request.user, draft):
return HttpResponseForbidden('You have no permission to access this view')
return _edit_draft_stream(request, draft, DraftStreamForm)
def stream_delegates(request, stream_name):
stream = get_object_or_404(Stream, name=stream_name)
if not is_chair_of_stream(request.user, stream):
return HttpResponseForbidden('You have no permission to access this view')
chairs = stream.get_chairs()
form = StreamDelegatesForm(stream=stream)
if request.method == 'POST':
if request.POST.get('delete', False):
pk_list = request.POST.getlist('remove_delegate')
StreamDelegate.objects.filter(stream=stream, person__pk__in=pk_list).delete()
else:
form = StreamDelegatesForm(request.POST, stream=stream)
if form.is_valid():
form.save()
form = StreamDelegatesForm(stream=stream)
delegates = stream.get_delegates()
return render_to_response('ietfworkflows/stream_delegates.html',
{'stream': stream,
'chairs': chairs,
'delegates': delegates,
'form': form,
},
context_instance=RequestContext(request))

View file

@ -33,7 +33,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% endcomment %}
{% load wg_menu %}
{% load ietf_filters %}
{% load ietf_filters ietf_streams %}
<ul>
<li class="sect first">Accounts</li>
<li><a href="{% url account_index %}">New Account</a></li>
@ -49,6 +49,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<li><a href="{% url ietf.iesg.views.telechat_dates %}">Telechat Dates</a></li>
<li><a href="{% url iesg_working_group_actions %}">Working Groups</a></li>
{% endif %}
{% get_user_managed_streams user as stream_list %}
{% if stream_list %}
<li class="sect{% if not user|in_group:"Area_Director,Secretariat" %} first{% endif %}">Streams</li>
{% for stream in stream_list %}
<li{% if forloop.last %} style="margin-bottom: 2px;"{% endif %}><a href="{% url stream_delegates stream.name %}">{{ stream.name }} stream</a></li>
{% endfor %}
{% endif %}
<li class="sect{% if not user|in_group:"Area_Director,Secretariat" %} first{% endif %}">Working Groups</li>
<li style="padding-bottom:0;"><div id="wgs" class="yuimenu"><div class="bd" style="border:0;">

View file

@ -1,8 +1,10 @@
{% autoescape off %}From: The IESG <iesg-secretary@ietf.org>
To: RFC Editor <rfc-editor@rfc-editor.org>
Cc: The IESG <iesg@ietf.org>, <iana@iana.org>, <ietf-announce@ietf.org>
Subject: Re: {{ status }} to be: {{ doc.file_tag }}
{% filter wordwrap:73 %}{% if disapproved %}
Subject: Results of IETF-conflict review for {{ doc.file_tag }}
{% filter wordwrap:73 %}
The IESG has completed a review of <draft-foo> consistent with RFC5742. This review is applied to all non-IETF streams.
{% if disapproved %}
The IESG recommends that '{{ doc.title }}' {{ doc.file_tag|safe }} NOT be published as {{ full_status }}.
{% else %}
The IESG has no problem with the publication of '{{ doc.title }}' {{ doc.file_tag|safe }} as {{ full_status }}.

View file

@ -47,7 +47,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% with doc.replaces as r %}{% if r %}<br />Replaces {% filter urlize_ietf_docs %}{{ r|join:", "}}{% endfilter %}{% endif %}{% endwith %}
</td></tr>
<tr><td>Last updated:</td><td> {{ doc.publication_date|default:"(data missing)" }}</td></tr>
<tr><td>IETF WG State:</td><td>{{ stream_info.state.name }} ({{ stream_info.streamed.group }})
<tr><td>IETF WG state:</td><td>{{ stream_info.state.name }} ({{ stream_info.streamed.get_group }})
{% if stream_info.tags %}<br /><i>{% for tag in stream_info.tags %}{{ tag.name }}{% if not forloop.last %}, {% endif %}{% endfor %}{% endif %}
</td></tr>
<tr><td>Intended RFC status:</td><td>{% if doc.in_ietf_process %}{{ doc.ietf_process.intended_maturity_level|default:"-" }}{% else %}-{%endif%}</td></tr>

View file

@ -70,7 +70,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{% ifequal stream_info.stream.name "IETF" %}
<tr>
<td>IETF WG State:</td>
<td>{{ stream_info.state.name }} ({{ stream_info.streamed.group }})
<td>{{ stream_info.state.name }} ({{ stream_info.streamed.get_group }})
{% if stream_info.tags %}<br /><i>{% for tag in stream_info.tags %}{{ tag.name }}{% if not forloop.last %}, {% endif %}{% endfor %}{% endif %}
</td>
</tr>
@ -79,7 +79,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
<tr>
<td>{{ stream_info.stream.name }} status:</td>
<td>
{{ stream_info.state.name }} {% if stream_info.streamed.group %}({{ stream_info.streamed.group }}) {% endif %}
{{ stream_info.state.name }} {% if stream_info.streamed.get_group %}({{ stream_info.streamed.get_group }}) {% endif %}
{% if stream_info.tags %}<br /><i>{% for tag in stream_info.tags %}{{ tag.name }}{% if not forloop.last %}, {% endif %}{% endfor %}{% endif %}
</td>
</tr>

View file

@ -0,0 +1,41 @@
{% extends "base.html" %}
{% load ietf_streams ietf_filters %}
{% block content %}
<h1>Stream: {{ stream.name }}</h1>
{% if chairs %}
<h2>{{ stream.name }} stream chairs</h2>
<table class="ietf-table">
<tr><th>Name</th><th>Email</th></tr>
{% for chair in chairs %}
<tr class="{% cycle "oddrow" "evenrow" %}"><td>{{ chair }}</td><td>{{ chair.email.0 }} &lt;{{ chair.email.1 }}&gt;</td></tr>
{% endfor %}
</table>
{% endif %}
<h2>{{ stream.name }} stream delegates</h2>
<form action="" method="POST">
{% if delegates %}
<table class="ietf-table">
<tr><th></th><th>Name</th><th>Email</th></tr>
{% for delegate in delegates %}
<tr class="{% cycle "oddrow" "evenrow" %}"><td><input type="checkbox" name="remove_delegate" value="{{ delegate.pk }}" /></td><td>{{ delegate }}</td><td>{{ delegate.email.0 }} &lt;{{ delegate.email.1 }}&gt;</td></tr>
{% endfor %}
</table>
<p>
<input type="submit" value="Remove selected delegates" name="delete" />
</p>
{% else %}
<p>
No delegates for {{ stream.name }} stream asigned.
</p>
{% endif %}
<p>
Enter a valid e-mail address to add a new delegate.
</p>
{% if form.errors.email %}{{ form.errors.email }}{% endif %}
{{ form.email }}
<input type="submit" value="Add new delegate" />
</form>
{% endblock %}

View file

@ -1,6 +1,7 @@
from django import forms
from django.conf import settings
from django.core.mail import EmailMessage
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
@ -191,7 +192,10 @@ class AddDelegateForm(RelatedWGForm):
return self.next_form
def get_person(self, email):
persons = PersonOrOrgInfo.objects.filter(emailaddress__address=email).distinct()
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:
@ -244,7 +248,10 @@ class MultipleDelegateForm(AddDelegateForm):
if not self.email:
self.email = self.data.get('email', None)
self.fields['email'].initial = self.email
self.fields['persons'].choices = [(i.pk, unicode(i)) for i in PersonOrOrgInfo.objects.filter(emailaddress__address=self.email, iesglogin__isnull=False).distinct().order_by('first_name')]
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')