datatracker/ietf/wgcharter/mails.py
2012-06-19 17:06:56 +00:00

176 lines
6.8 KiB
Python

# generation of mails
import textwrap, datetime
from django.template.loader import render_to_string
from django.utils.html import strip_tags
from django.conf import settings
from django.core.urlresolvers import reverse as urlreverse
from ietf.utils.mail import send_mail, send_mail_text
from ietf.ipr.search import iprs_from_docs
from ietf.doc.models import WriteupDocEvent, DocAlias, BallotPositionDocEvent
from ietf.person.models import Person
from ietf.wgcharter.utils import *
def email_secretariat(request, wg, type, text):
to = ["iesg-secretary@ietf.org"]
types = {}
types['state'] = "State changed"
types['state-notrev'] = "State changed to Not currently under review"
types['state-infrev'] = "State changed to Informal review"
types['state-intrev'] = "State changed to Internal review"
types['state-extrev'] = "State changed to External review"
types['state-iesgrev'] = "State changed to IESG review"
types['state-approved'] = "Charter approved"
types['conclude'] = "Request closing of WG"
subject = u"Regarding WG %s: %s" % (wg.acronym, types[type])
text = strip_tags(text)
send_mail(request, to, None, subject,
"wgcharter/email_secretariat.txt",
dict(text=text,
wg_url=settings.IDTRACKER_BASE_URL + urlreverse('wg_charter', kwargs=dict(acronym=wg.acronym)),
charter_url=settings.IDTRACKER_BASE_URL + urlreverse('doc_view', kwargs=dict(name=wg.charter.name)),
)
)
def email_state_changed(request, doc, text):
to = [e.strip() for e in doc.notify.replace(';', ',').split(',')]
if not to:
return
text = strip_tags(text)
text += "\n\n"
text += "URL: %s" % (settings.IDTRACKER_BASE_URL + doc.get_absolute_url())
send_mail_text(request, to, None,
"State changed: %s-%s" % (doc.canonical_name(), doc.rev),
text)
def generate_ballot_writeup(request, doc):
e = WriteupDocEvent()
e.type = "changed_ballot_writeup_text"
e.by = request.user.get_profile()
e.doc = doc
e.desc = u"Ballot writeup was generated"
e.text = unicode(render_to_string("wgcharter/ballot_writeup.txt"))
e.save()
return e
def default_action_text(wg, charter, user):
if next_approved_revision(wg.charter.rev) == "01":
action = "Formed"
else:
action = "Rechartered"
e = WriteupDocEvent(doc=charter, by=user)
e.by = user
e.type = "changed_action_announcement"
e.desc = "WG action text was changed"
e.text = render_to_string("wgcharter/action_text.txt",
dict(wg=wg,
charter_url=settings.IDTRACKER_BASE_URL + charter.get_absolute_url(),
charter_text=read_charter_text(charter),
chairs=wg.role_set.filter(name="chair"),
secr=wg.role_set.filter(name="secr"),
techadv=wg.role_set.filter(name="techadv"),
milestones=wg.groupmilestone_set.all(),
ad_email=wg.ad.role_email("ad") if wg.ad else None,
action_type=action,
))
e.save()
return e
def default_review_text(wg, charter, user):
e = WriteupDocEvent(doc=charter, by=user)
e.by = user
e.type = "changed_review_announcement"
e.desc = "WG review text was changed"
e.text = render_to_string("wgcharter/review_text.txt",
dict(wg=wg,
charter_url=settings.IDTRACKER_BASE_URL + charter.get_absolute_url(),
charter_text=read_charter_text(charter),
chairs=wg.role_set.filter(name="chair"),
secr=wg.role_set.filter(name="secr"),
techadv=wg.role_set.filter(name="techadv"),
milestones=wg.groupmilestone_set.all(),
ad_email=wg.ad.role_email("ad") if wg.ad else None,
review_date=(datetime.date.today() + datetime.timedelta(weeks=1)).isoformat(),
review_type="new" if wg.state_id == "proposed" else "recharter",
)
)
e.save()
return e
def generate_issue_ballot_mail(request, doc, ballot):
active_ads = Person.objects.filter(email__role__name="ad", email__role__group__state="active").distinct()
seen = []
positions = []
for p in BallotPositionDocEvent.objects.filter(doc=doc, type="changed_ballot_position", ballot=ballot).order_by("-time", '-id').select_related('ad'):
if p.ad not in seen:
positions.append(p)
seen.append(p.ad)
# format positions and setup blocking and non-blocking comments
ad_feedback = []
seen = set()
active_ad_positions = []
inactive_ad_positions = []
for p in positions:
if p.ad in seen:
continue
seen.add(p.ad)
def formatted(val):
if val:
return "[ X ]"
else:
return "[ ]"
fmt = u"%-21s%-6s%-6s%-8s%-7s" % (
p.ad.plain_name(),
formatted(p.pos_id == "yes"),
formatted(p.pos_id == "no"),
formatted(p.pos_id == "block"),
formatted(p.pos_id == "abstain"),
)
if p.ad in active_ads:
active_ad_positions.append(fmt)
if not p.pos or not p.pos.blocking:
p.discuss = ""
if p.comment or p.discuss:
ad_feedback.append(p)
else:
inactive_ad_positions.append(fmt)
active_ad_positions.sort()
inactive_ad_positions.sort()
ad_feedback.sort(key=lambda p: p.ad.plain_name())
e = doc.latest_event(WriteupDocEvent, type="changed_action_announcement")
approval_text = e.text if e else ""
e = doc.latest_event(WriteupDocEvent, type="changed_ballot_writeup_text")
ballot_writeup = e.text if e else ""
return render_to_string("wgcharter/issue_ballot_mail.txt",
dict(doc=doc,
doc_url=settings.IDTRACKER_BASE_URL + doc.get_absolute_url(),
active_ad_positions=active_ad_positions,
inactive_ad_positions=inactive_ad_positions,
ad_feedback=ad_feedback,
approval_text=approval_text,
ballot_writeup=ballot_writeup,
)
)