A Ballot view which is good enough to deploy, I believe. The major
difference is that current ADs are not shown as part of old ballots. - Legacy-Id: 178
This commit is contained in:
parent
e38f1dc967
commit
380546ac46
|
@ -377,6 +377,9 @@ class BallotInfo(models.Model): # Added by Michael Lee
|
||||||
return "Ballot for %s" % self.drafts.filter(primary_flag=1)
|
return "Ballot for %s" % self.drafts.filter(primary_flag=1)
|
||||||
except IDInternal.DoesNotExist:
|
except IDInternal.DoesNotExist:
|
||||||
return "Ballot ID %d (no I-D?)" % (self.ballot)
|
return "Ballot ID %d (no I-D?)" % (self.ballot)
|
||||||
|
def remarks(self):
|
||||||
|
remarks = list(self.discusses.all()) + list(self.comments.all())
|
||||||
|
return remarks
|
||||||
class Meta:
|
class Meta:
|
||||||
db_table = 'ballot_info'
|
db_table = 'ballot_info'
|
||||||
class Admin:
|
class Admin:
|
||||||
|
@ -500,13 +503,10 @@ class Position(models.Model):
|
||||||
return "Position for %s on %s" % ( self.ad, self.ballot )
|
return "Position for %s on %s" % ( self.ad, self.ballot )
|
||||||
def abstain_ind(self):
|
def abstain_ind(self):
|
||||||
if self.recuse:
|
if self.recuse:
|
||||||
log('R: %s' % self.ad)
|
|
||||||
return 'R'
|
return 'R'
|
||||||
if self.abstain:
|
if self.abstain:
|
||||||
log('X: %s' % self.ad)
|
|
||||||
return 'X'
|
return 'X'
|
||||||
else:
|
else:
|
||||||
log('_: %s' % self.ad)
|
|
||||||
return ' '
|
return ' '
|
||||||
class Meta:
|
class Meta:
|
||||||
db_table = 'ballots'
|
db_table = 'ballots'
|
||||||
|
@ -517,12 +517,14 @@ class Position(models.Model):
|
||||||
class IESGComment(models.Model):
|
class IESGComment(models.Model):
|
||||||
ballot = models.ForeignKey(BallotInfo, raw_id_admin=True, related_name="comments")
|
ballot = models.ForeignKey(BallotInfo, raw_id_admin=True, related_name="comments")
|
||||||
ad = models.ForeignKey(IESGLogin, raw_id_admin=True)
|
ad = models.ForeignKey(IESGLogin, raw_id_admin=True)
|
||||||
comment_date = models.DateField()
|
date = models.DateField(db_column="comment_date")
|
||||||
revision = models.CharField(maxlength=2)
|
revision = models.CharField(maxlength=2)
|
||||||
active = models.IntegerField()
|
active = models.IntegerField()
|
||||||
comment_text = models.TextField(blank=True)
|
text = models.TextField(blank=True, db_column="comment_text")
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "Comment text by %s on %s" % ( self.ad, self.ballot )
|
return "Comment text by %s on %s" % ( self.ad, self.ballot )
|
||||||
|
def is_comment(self):
|
||||||
|
return True
|
||||||
class Meta:
|
class Meta:
|
||||||
db_table = 'ballots_comment'
|
db_table = 'ballots_comment'
|
||||||
unique_together = (('ballot', 'ad'), )
|
unique_together = (('ballot', 'ad'), )
|
||||||
|
@ -534,12 +536,14 @@ class IESGComment(models.Model):
|
||||||
class IESGDiscuss(models.Model):
|
class IESGDiscuss(models.Model):
|
||||||
ballot = models.ForeignKey(BallotInfo, raw_id_admin=True, related_name="discusses")
|
ballot = models.ForeignKey(BallotInfo, raw_id_admin=True, related_name="discusses")
|
||||||
ad = models.ForeignKey(IESGLogin, raw_id_admin=True)
|
ad = models.ForeignKey(IESGLogin, raw_id_admin=True)
|
||||||
discuss_date = models.DateField()
|
date = models.DateField(db_column="discuss_date")
|
||||||
revision = models.CharField(maxlength=2)
|
revision = models.CharField(maxlength=2)
|
||||||
active = models.IntegerField()
|
active = models.IntegerField()
|
||||||
discuss_text = models.TextField(blank=True)
|
text = models.TextField(blank=True, db_column="discuss_text")
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "Discuss text by %s on %s" % ( self.ad, self.ballot )
|
return "Discuss text by %s on %s" % ( self.ad, self.ballot )
|
||||||
|
def is_discuss(self):
|
||||||
|
return True
|
||||||
class Meta:
|
class Meta:
|
||||||
db_table = 'ballots_discuss'
|
db_table = 'ballots_discuss'
|
||||||
unique_together = (('ballot', 'ad'), )
|
unique_together = (('ballot', 'ad'), )
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import textwrap
|
||||||
from django import template
|
from django import template
|
||||||
from django.utils.html import escape, fix_ampersands, linebreaks
|
from django.utils.html import escape, fix_ampersands, linebreaks
|
||||||
from django.template.defaultfilters import linebreaksbr
|
from django.template.defaultfilters import linebreaksbr
|
||||||
|
@ -6,6 +7,7 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
from email import Utils as emailutils
|
from email import Utils as emailutils
|
||||||
import re
|
import re
|
||||||
|
from ietf.utils import log
|
||||||
|
|
||||||
register = template.Library()
|
register = template.Library()
|
||||||
|
|
||||||
|
@ -94,7 +96,27 @@ def square_brackets(value):
|
||||||
"""Adds square brackets around text."""
|
"""Adds square brackets around text."""
|
||||||
if type(value) == type(""):
|
if type(value) == type(""):
|
||||||
return "[ %s ]" % value
|
return "[ %s ]" % value
|
||||||
elif value:
|
elif value > 0:
|
||||||
return "[ X ]"
|
return "[ X ]"
|
||||||
|
elif value < 0:
|
||||||
|
return "[ . ]"
|
||||||
else:
|
else:
|
||||||
return "[ ]"
|
return "[ ]"
|
||||||
|
|
||||||
|
@register.filter(name='fill')
|
||||||
|
def fill(text, width):
|
||||||
|
"""Wraps the single paragraph in text (a string) so every line
|
||||||
|
is at most width characters long, and returns a single string
|
||||||
|
containing the wrapped paragraph.
|
||||||
|
"""
|
||||||
|
width = int(width)
|
||||||
|
paras = text.replace("\r\n","\n").replace("\r","\n").split("\n\n")
|
||||||
|
wrapped = []
|
||||||
|
for para in paras:
|
||||||
|
if para:
|
||||||
|
lines = para.split("\n")
|
||||||
|
maxlen = max([len(line) for line in lines])
|
||||||
|
if maxlen > width:
|
||||||
|
para = textwrap.fill(para, width, replace_whitespace=False)
|
||||||
|
wrapped.append(para)
|
||||||
|
return "\n\n".join(wrapped)
|
||||||
|
|
|
@ -8,11 +8,12 @@
|
||||||
To: Internet Engineering Steering Group <iesg@ietf.org>
|
To: Internet Engineering Steering Group <iesg@ietf.org>
|
||||||
From: IESG Secretary <iesg-secretary@ietf.org>
|
From: IESG Secretary <iesg-secretary@ietf.org>
|
||||||
Reply-To: IESG Secretary <iesg-secretary@ietf.org>
|
Reply-To: IESG Secretary <iesg-secretary@ietf.org>
|
||||||
Subject: Evaluation:{% for id in object.drafts.all %} {{ id.draft.filename }}-{{ id.draft.revision }}.txt to {{ id.draft.intended_status }} {% endfor %}
|
Subject: Evaluation: {% for id in object.drafts.all %}{{ id.draft.filename }}-{{ id.draft.revision }}.txt to {{ id.draft.intended_status }}
|
||||||
|
{% endfor %}
|
||||||
--------
|
--------
|
||||||
|
|
||||||
Evaluation for:{% for id in object.drafts.all %} {{ id.draft.filename }}-{{ id.draft.revision }}.txt
|
Evaluation for{% for id in object.drafts.all %} {{ id.draft.filename }}-{{ id.draft.revision }}.txt {% endfor %}can be found at
|
||||||
{% endfor %}can be found at http://datatracker.ietf.org/idtracker/ballot/{{ object.ballot }}/ <!-- FIXME: hardcoded URL -->
|
http://datatracker.ietf.org/idtracker/ballot/{{ object.ballot }}/ <!-- FIXME: hardcoded URL -->
|
||||||
{% if object.drafts.all.0.draft.lc_expiration_date %}
|
{% if object.drafts.all.0.draft.lc_expiration_date %}
|
||||||
Last Call to expire on: {{ object.drafts.all.0.draft.lc_expiration_date|escape }}
|
Last Call to expire on: {{ object.drafts.all.0.draft.lc_expiration_date|escape }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -27,15 +28,20 @@ with no "Discuss" positions, are needed for approval.
|
||||||
|
|
||||||
DISCUSSES AND COMMENTS:
|
DISCUSSES AND COMMENTS:
|
||||||
======================
|
======================
|
||||||
{% for item in object.discusses.all %}{{ item.ad }}:
|
{% for position in object.positions.all|dictsort:"ad.last_name" %}{% ifequal position.discuss 1 %}{{ position.ad }}:{% for item in object.discusses.all %}{% ifequal position.ad item.ad %}
|
||||||
{{ item }}
|
|
||||||
|
|
||||||
{% endfor %}
|
Discuss [{{ item.date }}]:
|
||||||
{% for item in object.comments.all %}{{ item.ad }}:
|
{{ item.text|fill:"80"|escape }}
|
||||||
{{ item }}
|
|
||||||
|
|
||||||
{% endfor %}
|
{% endifequal %}{% endfor %}{% endifequal %}{% for item in object.comments.all %}{% ifequal position.ad item.ad %}{% ifnotequal position.discuss 1 %}{{ position.ad }}:
|
||||||
|
|
||||||
|
{% endifnotequal %}Comment [{{ item.date }}]:
|
||||||
|
{{ item.text|fill:"80"|escape }}
|
||||||
|
|
||||||
|
{% endifequal %}{% endfor %}{% endfor %}
|
||||||
|
|
||||||
|
|
||||||
|
^L
|
||||||
---- following is a DRAFT of message to be sent AFTER approval ---
|
---- following is a DRAFT of message to be sent AFTER approval ---
|
||||||
{{ object.approval_text|escape|urlize }}
|
{{ object.approval_text|escape|urlize }}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue