Rename derived event models to be more self-explanatory, fixed a couple of bugs

- Legacy-Id: 2872
This commit is contained in:
Ole Laursen 2011-03-02 14:59:07 +00:00
parent dd72649d3d
commit 3ecd539f7b
11 changed files with 162 additions and 161 deletions

View file

@ -638,8 +638,8 @@ class BallotWrapper:
positions = []
seen = {}
from doc.models import BallotPosition
for pos in BallotPosition.objects.filter(doc=self.ballot, type="changed_ballot_position", time__gte=self.ballot.process_start, time__lte=self.ballot.process_end).select_related('ad').order_by("-time", '-id'):
from doc.models import BallotPositionEvent
for pos in BallotPositionEvent.objects.filter(doc=self.ballot, type="changed_ballot_position", time__gte=self.ballot.process_start, time__lte=self.ballot.process_end).select_related('ad').order_by("-time", '-id'):
if pos.ad not in seen:
p = dict(ad_name=pos.ad.get_name(),
ad_username=pos.ad.pk, # ought to rename this in doc_ballot_list
@ -676,7 +676,7 @@ class BallotWrapper:
for ad in active_ads:
if ad not in seen:
d = dict(ad_name=ad.get_name(),
ad_username=pos.ad.pk,
ad_username=ad.pk,
position="No Record",
)
positions.append(d)

View file

@ -9,7 +9,7 @@ from django.conf import settings
from ietf.utils.mail import send_mail, send_mail_text
from ietf.idtracker.models import *
from doc.models import Text, BallotPosition, Expiration
from doc.models import WriteupEvent, BallotPositionEvent, LastCallEvent
from person.models import Email
def email_state_changed(request, doc, text):
@ -86,12 +86,12 @@ def full_intended_status(intended_status):
return "a %s" % s
def generate_ballot_writeup(request, doc):
e = Text()
e = WriteupEvent()
e.type = "changed_ballot_writeup_text"
e.by = request.user.get_profile().email()
e.doc = doc
e.desc = u"Ballot writeup was generated by %s" % e.by.get_name()
e.content = unicode(render_to_string("idrfc/ballot_writeup.txt"))
e.text = unicode(render_to_string("idrfc/ballot_writeup.txt"))
e.save()
return e
@ -158,12 +158,12 @@ def generate_last_call_announcementREDESIGN(request, doc):
)
)
e = Text()
e = WriteupEvent()
e.type = "changed_last_call_text"
e.by = request.user.get_profile().email()
e.doc = doc
e.desc = u"Last call announcement was generated by %s" % e.by.get_name()
e.content = unicode(mail)
e.text = unicode(mail)
e.save()
return e
@ -253,12 +253,12 @@ def generate_approval_mailREDESIGN(request, doc):
else:
mail = generate_approval_mail_approved(request, doc)
e = Text()
e = WriteupEvent()
e.type = "changed_ballot_approval_text"
e.by = request.user.get_profile().email()
e.doc = doc
e.desc = u"Ballot approval text was generated by %s" % e.by.get_name()
e.content = unicode(mail)
e.text = unicode(mail)
e.save()
return e
@ -479,7 +479,7 @@ def generate_issue_ballot_mailREDESIGN(request, doc):
active_ads = Email.objects.filter(role__name="ad", role__group__state="active")
e = doc.latest_event(type="started_iesg_process")
positions = BallotPosition.objects.filter(doc=doc, type="changed_ballot_position", time__gte=e.time).order_by("-time", '-id').select_related('ad')
positions = BallotPositionEvent.objects.filter(doc=doc, type="changed_ballot_position", time__gte=e.time).order_by("-time", '-id').select_related('ad')
# format positions and setup discusses and comments
ad_feedback = []
@ -519,14 +519,14 @@ def generate_issue_ballot_mailREDESIGN(request, doc):
inactive_ad_positions.sort()
ad_feedback.sort(key=lambda p: p.ad.get_name())
e = doc.latest_event(Expiration, type="sent_last_call")
e = doc.latest_event(LastCallEvent, type="sent_last_call")
last_call_expires = e.expires if e else None
e = doc.latest_event(Text, type="changed_ballot_approval_text")
approval_text = e.content if e else ""
e = doc.latest_event(WriteupEvent, type="changed_ballot_approval_text")
approval_text = e.text if e else ""
e = doc.latest_event(Text, type="changed_ballot_writeup_text")
ballot_writeup = e.content if e else ""
e = doc.latest_event(WriteupEvent, type="changed_ballot_writeup_text")
ballot_writeup = e.text if e else ""
return render_to_string("idrfc/issue_ballot_mailREDESIGN.txt",
dict(doc=doc,

View file

@ -274,30 +274,30 @@ class ChangeStateTestCase(django.test.TestCase):
self.assertContains(r, "Your request to issue the Last Call")
# last call text
e = draft.latest_event(Text, type="changed_last_call_text")
e = draft.latest_event(WriteupEvent, type="changed_last_call_text")
self.assertTrue(e)
self.assertTrue("The IESG has received" in e.content)
self.assertTrue(draft.title in e.content)
self.assertTrue(draft.get_absolute_url() in e.content)
self.assertTrue("The IESG has received" in e.text)
self.assertTrue(draft.title in e.text)
self.assertTrue(draft.get_absolute_url() in e.text)
# approval text
e = draft.latest_event(Text, type="changed_ballot_approval_text")
e = draft.latest_event(WriteupEvent, type="changed_ballot_approval_text")
self.assertTrue(e)
self.assertTrue("The IESG has approved" in e.content)
self.assertTrue(draft.title in e.content)
self.assertTrue(draft.get_absolute_url() in e.content)
self.assertTrue("The IESG has approved" in e.text)
self.assertTrue(draft.title in e.text)
self.assertTrue(draft.get_absolute_url() in e.text)
# ballot writeup
e = draft.latest_event(Text, type="changed_ballot_writeup_text")
e = draft.latest_event(WriteupEvent, type="changed_ballot_writeup_text")
self.assertTrue(e)
self.assertTrue("Technical Summary" in e.content)
self.assertTrue("Technical Summary" in e.text)
# mail notice
self.assertTrue(len(mail_outbox) > mailbox_before)
self.assertTrue("Last Call:" in mail_outbox[-1]['Subject'])
# comment
self.assertTrue("Last call was requested" in draft.event_set.all()[0].desc)
self.assertTrue("Last call was requested" in draft.latest_event().desc)
class EditInfoTestCase(django.test.TestCase):
@ -345,7 +345,7 @@ class EditInfoTestCase(django.test.TestCase):
self.assertTrue(draft.tags.filter(slug="via-rfc"))
self.assertEquals(draft.ad, new_ad)
self.assertEquals(draft.note, "New note")
self.assertTrue(not draft.latest_event(Telechat, type="telechat_date"))
self.assertTrue(not draft.latest_event(TelechatEvent, type="telechat_date"))
self.assertEquals(draft.event_set.count(), events_before + 4)
self.assertEquals(len(mail_outbox), mailbox_before + 1)
self.assertTrue(draft.name in mail_outbox[-1]['Subject'])
@ -367,14 +367,14 @@ class EditInfoTestCase(django.test.TestCase):
from ietf.iesg.models import TelechatDates
# add to telechat
self.assertTrue(not draft.latest_event(Telechat, "scheduled_for_telechat"))
self.assertTrue(not draft.latest_event(TelechatEvent, "scheduled_for_telechat"))
data["telechat_date"] = TelechatDates.objects.all()[0].date1.isoformat()
r = self.client.post(url, data)
self.assertEquals(r.status_code, 302)
draft = Document.objects.get(name=draft.name)
self.assertTrue(draft.latest_event(Telechat, "scheduled_for_telechat"))
self.assertEquals(draft.latest_event(Telechat, "scheduled_for_telechat").telechat_date, TelechatDates.objects.all()[0].date1)
self.assertTrue(draft.latest_event(TelechatEvent, "scheduled_for_telechat"))
self.assertEquals(draft.latest_event(TelechatEvent, "scheduled_for_telechat").telechat_date, TelechatDates.objects.all()[0].date1)
# change telechat
data["telechat_date"] = TelechatDates.objects.all()[0].date2.isoformat()
@ -382,7 +382,7 @@ class EditInfoTestCase(django.test.TestCase):
self.assertEquals(r.status_code, 302)
draft = Document.objects.get(name=draft.name)
self.assertEquals(draft.latest_event(Telechat, "scheduled_for_telechat").telechat_date, TelechatDates.objects.all()[0].date2)
self.assertEquals(draft.latest_event(TelechatEvent, "scheduled_for_telechat").telechat_date, TelechatDates.objects.all()[0].date2)
# remove from agenda
data["telechat_date"] = ""
@ -390,7 +390,7 @@ class EditInfoTestCase(django.test.TestCase):
self.assertEquals(r.status_code, 302)
draft = Document.objects.get(name=draft.name)
self.assertTrue(not draft.latest_event(Telechat, "scheduled_for_telechat").telechat_date)
self.assertTrue(not draft.latest_event(TelechatEvent, "scheduled_for_telechat").telechat_date)
def test_start_iesg_process_on_draft(self):
draft = make_test_data()
@ -411,6 +411,7 @@ class EditInfoTestCase(django.test.TestCase):
self.assertTrue('@' in q('form input[name=notify]')[0].get('value'))
# add
events_before = draft.event_set.count()
mailbox_before = len(mail_outbox)
ad = Email.objects.get(address="aread@ietf.org")
@ -430,9 +431,10 @@ class EditInfoTestCase(django.test.TestCase):
self.assertTrue(draft.tags.filter(slug="via-rfc"))
self.assertEquals(draft.ad, ad)
self.assertEquals(draft.note, "This is a note")
self.assertTrue(not draft.latest_event(Telechat, type="scheduled_for_telechat"))
self.assertEquals(draft.event_set.count(), 4)
self.assertEquals(draft.event_set.order_by('time', '-id')[0].type, "started_iesg_process")
self.assertTrue(not draft.latest_event(TelechatEvent, type="scheduled_for_telechat"))
self.assertEquals(draft.event_set.count(), events_before + 4)
events = list(draft.event_set.order_by('time', 'id'))
self.assertEquals(events[-4].type, "started_iesg_process")
self.assertEquals(len(mail_outbox), mailbox_before)
@ -555,7 +557,7 @@ class EditPositionTestCase(django.test.TestCase):
comment="This is a test."))
self.assertEquals(r.status_code, 302)
pos = draft.latest_event(BallotPosition, ad=ad)
pos = draft.latest_event(BallotPositionEvent, ad=ad)
self.assertEquals(pos.pos.slug, "discuss")
self.assertTrue("This is a discussion test." in pos.discuss)
self.assertTrue(pos.discuss_time != None)
@ -569,7 +571,7 @@ class EditPositionTestCase(django.test.TestCase):
r = self.client.post(url, dict(position="noobj"))
self.assertEquals(r.status_code, 302)
pos = draft.latest_event(BallotPosition, ad=ad)
pos = draft.latest_event(BallotPositionEvent, ad=ad)
self.assertEquals(pos.pos.slug, "noobj")
self.assertEquals(draft.event_set.count(), events_before + 1)
self.assertTrue("Position for" in pos.desc)
@ -579,7 +581,7 @@ class EditPositionTestCase(django.test.TestCase):
r = self.client.post(url, dict(position="norecord"))
self.assertEquals(r.status_code, 302)
pos = draft.latest_event(BallotPosition, ad=ad)
pos = draft.latest_event(BallotPositionEvent, ad=ad)
self.assertEquals(pos.pos.slug, "norecord")
self.assertEquals(draft.event_set.count(), events_before + 1)
self.assertTrue("Position for" in pos.desc)
@ -589,7 +591,7 @@ class EditPositionTestCase(django.test.TestCase):
r = self.client.post(url, dict(position="norecord", comment="New comment."))
self.assertEquals(r.status_code, 302)
pos = draft.latest_event(BallotPosition, ad=ad)
pos = draft.latest_event(BallotPositionEvent, ad=ad)
self.assertEquals(pos.pos.slug, "norecord")
self.assertEquals(draft.event_set.count(), events_before + 2)
self.assertTrue("Ballot comment text updated" in pos.desc)
@ -612,7 +614,7 @@ class EditPositionTestCase(django.test.TestCase):
r = self.client.post(url, dict(position="discuss"))
self.assertEquals(r.status_code, 302)
pos = draft.latest_event(BallotPosition, ad=ad)
pos = draft.latest_event(BallotPositionEvent, ad=ad)
self.assertEquals(pos.pos.slug, "discuss")
self.assertTrue("New position" in pos.desc)
self.assertTrue("by Sec" in pos.desc)
@ -624,7 +626,7 @@ class EditPositionTestCase(django.test.TestCase):
ad = Email.objects.get(address="aread@ietf.org")
BallotPosition.objects.create(doc=draft, type="changed_ballot_position",
BallotPositionEvent.objects.create(doc=draft, type="changed_ballot_position",
by=ad, ad=ad, pos=BallotPositionName.objects.get(slug="yes"),
comment="Test!",
comment_time=datetime.datetime.now())
@ -730,7 +732,7 @@ class BallotWriteupsTestCase(django.test.TestCase):
save_last_call_text="1"))
self.assertEquals(r.status_code, 200)
draft = Document.objects.get(name=draft.name)
self.assertTrue("This is a simple test" in draft.latest_event(Text, type="changed_last_call_text").content)
self.assertTrue("This is a simple test" in draft.latest_event(WriteupEvent, type="changed_last_call_text").text)
# test regenerate
r = self.client.post(url, dict(
@ -739,7 +741,7 @@ class BallotWriteupsTestCase(django.test.TestCase):
self.assertEquals(r.status_code, 200)
q = PyQuery(r.content)
draft = Document.objects.get(name=draft.name)
self.assertTrue("Subject: Last Call" in draft.latest_event(Text, type="changed_last_call_text").content)
self.assertTrue("Subject: Last Call" in draft.latest_event(WriteupEvent, type="changed_last_call_text").text)
def test_request_last_call(self):
@ -755,7 +757,7 @@ class BallotWriteupsTestCase(django.test.TestCase):
# send
r = self.client.post(url, dict(
last_call_text=draft.latest_event(Text, type="changed_last_call_text").content,
last_call_text=draft.latest_event(WriteupEvent, type="changed_last_call_text").text,
send_last_call_request="1"))
draft = Document.objects.get(name=draft.name)
self.assertEquals(draft.iesg_state_id, "lc-req")
@ -781,7 +783,7 @@ class BallotWriteupsTestCase(django.test.TestCase):
save_ballot_writeup="1"))
self.assertEquals(r.status_code, 200)
draft = Document.objects.get(name=draft.name)
self.assertTrue("This is a simple test" in draft.latest_event(Text, type="changed_ballot_writeup_text").content)
self.assertTrue("This is a simple test" in draft.latest_event(WriteupEvent, type="changed_ballot_writeup_text").text)
def test_issue_ballot(self):
draft = make_test_data()
@ -790,7 +792,7 @@ class BallotWriteupsTestCase(django.test.TestCase):
def create_pos(num, vote, comment="", discuss=""):
ad = Email.objects.get(address="ad%s@ietf.org" % num)
e = BallotPosition()
e = BallotPositionEvent()
e.doc = draft
e.by = ad
e.ad = ad
@ -815,11 +817,11 @@ class BallotWriteupsTestCase(django.test.TestCase):
create_pos(9, "yes")
# we need approval text to be able to submit
e = Text()
e = WriteupEvent()
e.doc = draft
e.by = Email.objects.get(address="aread@ietf.org")
e.type = "changed_ballot_approval_text"
e.content = "The document has been approved."
e.text = "The document has been approved."
e.save()
mailbox_before = len(mail_outbox)
@ -859,13 +861,13 @@ class BallotWriteupsTestCase(django.test.TestCase):
save_approval_text="1"))
self.assertEquals(r.status_code, 200)
draft = Document.objects.get(name=draft.name)
self.assertTrue("This is a simple test" in draft.latest_event(Text, type="changed_ballot_approval_text").content)
self.assertTrue("This is a simple test" in draft.latest_event(WriteupEvent, type="changed_ballot_approval_text").text)
# test regenerate
r = self.client.post(url, dict(regenerate_approval_text="1"))
self.assertEquals(r.status_code, 200)
draft = Document.objects.get(name=draft.name)
self.assertTrue("Subject: Protocol Action" in draft.latest_event(Text, type="changed_ballot_approval_text").content)
self.assertTrue("Subject: Protocol Action" in draft.latest_event(WriteupEvent, type="changed_ballot_approval_text").text)
# test regenerate when it's a disapprove
draft.iesg_state_id = "nopubadw"
@ -874,7 +876,7 @@ class BallotWriteupsTestCase(django.test.TestCase):
r = self.client.post(url, dict(regenerate_approval_text="1"))
self.assertEquals(r.status_code, 200)
draft = Document.objects.get(name=draft.name)
self.assertTrue("NOT be published" in draft.latest_event(Text, type="changed_ballot_approval_text").content)
self.assertTrue("NOT be published" in draft.latest_event(WriteupEvent, type="changed_ballot_approval_text").text)
class ApproveBallotTestCase(django.test.TestCase):
fixtures = ['names']
@ -955,7 +957,7 @@ class MakeLastCallTestCase(django.test.TestCase):
draft = Document.objects.get(name=draft.name)
self.assertEquals(draft.iesg_state.slug, "lc")
self.assertEquals(draft.latest_event(Expiration, "sent_last_call").expires.strftime("%Y-%m-%d"), expire_date)
self.assertEquals(draft.latest_event(LastCallEvent, "sent_last_call").expires.strftime("%Y-%m-%d"), expire_date)
self.assertEquals(len(mail_outbox), mailbox_before + 4)
self.assertTrue("Last Call" in mail_outbox[-4]['Subject'])

View file

@ -3,7 +3,7 @@ from django.conf import settings
from ietf.idtracker.models import InternetDraft, DocumentComment, BallotInfo, IESGLogin
from ietf.idrfc.mails import *
from doc.models import Telechat, Event
from doc.models import Event, TelechatEvent
def add_document_comment(request, doc, text, include_by=True, ballot=None):
if request:
@ -114,7 +114,7 @@ def update_telechat(request, idinternal, new_telechat_date, new_returning_item=N
def update_telechatREDESIGN(request, doc, by, new_telechat_date, new_returning_item=None):
on_agenda = bool(new_telechat_date)
prev = doc.latest_event(Telechat, type="scheduled_for_telechat")
prev = doc.latest_event(TelechatEvent, type="scheduled_for_telechat")
prev_returning = bool(prev and prev.returning_item)
prev_telechat = prev.telechat_date if prev else None
prev_agenda = bool(prev_telechat)
@ -135,7 +135,7 @@ def update_telechatREDESIGN(request, doc, by, new_telechat_date, new_returning_i
and new_telechat_date != prev_telechat):
returning = True
e = Telechat()
e = TelechatEvent()
e.type = "scheduled_for_telechat"
e.by = by
e.doc = doc

View file

@ -22,7 +22,7 @@ from ietf.idrfc.mails import *
from ietf.idrfc.utils import *
from ietf.idrfc.lastcall import request_last_call
from doc.models import Document, Event, BallotPosition, save_document_in_history
from doc.models import Document, Event, BallotPositionEvent, LastCallEvent, save_document_in_history
from name.models import BallotPositionName, IesgDocStateName
BALLOT_CHOICES = (("yes", "Yes"),
@ -219,7 +219,7 @@ def edit_positionREDESIGN(request, name):
raise Http404()
ad = get_object_or_404(Email, pk=ad_id)
old_pos = doc.latest_event(BallotPosition, type="changed_ballot_position", ad=ad, time__gte=started_process.time)
old_pos = doc.latest_event(BallotPositionEvent, type="changed_ballot_position", ad=ad, time__gte=started_process.time)
if request.method == 'POST':
form = EditPositionForm(request.POST)
@ -231,7 +231,7 @@ def edit_positionREDESIGN(request, name):
if clean['return_to_url']:
return_to_url = clean['return_to_url']
pos = BallotPosition(doc=doc, by=login)
pos = BallotPositionEvent(doc=doc, by=login)
pos.type = "changed_ballot_position"
pos.ad = ad
pos.pos = clean["position"]
@ -417,7 +417,7 @@ def send_ballot_commentREDESIGN(request, name):
raise Http404()
ad = get_object_or_404(Email, pk=ad_id)
pos = doc.latest_event(BallotPosition, type="changed_ballot_position", ad=ad, time__gte=started_process.time)
pos = doc.latest_event(BallotPositionEvent, type="changed_ballot_position", ad=ad, time__gte=started_process.time)
if not pos:
raise Http404()
@ -704,23 +704,23 @@ def lastcalltextREDESIGN(request, name):
login = request.user.get_profile().email()
existing = doc.latest_event(Text, type="changed_last_call_text")
existing = doc.latest_event(WriteupEvent, type="changed_last_call_text")
if not existing:
existing = generate_last_call_announcement(request, doc)
form = LastCallTextForm(initial=dict(last_call_text=existing.content))
form = LastCallTextForm(initial=dict(last_call_text=existing.text))
if request.method == 'POST':
if "save_last_call_text" in request.POST or "send_last_call_request" in request.POST:
form = LastCallTextForm(request.POST)
if form.is_valid():
t = form.cleaned_data['last_call_text']
if t != existing.content:
e = Text(doc=doc, by=login)
if t != existing.text:
e = WriteupEvent(doc=doc, by=login)
e.by = login
e.type = "changed_last_call_text"
e.desc = "Last call announcement was changed by %s" % login.get_name()
e.content = t
e.text = t
e.save()
doc.time = e.time
@ -752,7 +752,7 @@ def lastcalltextREDESIGN(request, name):
doc.save()
# make sure form has the updated text
form = LastCallTextForm(initial=dict(last_call_text=e.content))
form = LastCallTextForm(initial=dict(last_call_text=e.text))
can_request_last_call = doc.iesg_state.order < 27
@ -863,38 +863,39 @@ class BallotWriteupFormREDESIGN(forms.Form):
def ballot_writeupnotesREDESIGN(request, name):
"""Editing of ballot write-up and notes"""
doc = get_object_or_404(Document, docalias__name=name)
if not doc.iesg_state:
started_process = doc.latest_event(type="started_iesg_process")
if not started_process:
raise Http404()
login = request.user.get_profile().email()
approval = doc.latest_event(Text, type="changed_ballot_approval_text")
approval = doc.latest_event(WriteupEvent, type="changed_ballot_approval_text")
existing = doc.latest_event(Text, type="changed_ballot_writeup_text")
existing = doc.latest_event(WriteupEvent, type="changed_ballot_writeup_text")
if not existing:
existing = generate_ballot_writeup(request, doc)
form = BallotWriteupForm(initial=dict(ballot_writeup=existing.content))
form = BallotWriteupForm(initial=dict(ballot_writeup=existing.text))
if request.method == 'POST' and "save_ballot_writeup" in request.POST or "issue_ballot" in request.POST:
form = BallotWriteupForm(request.POST)
if form.is_valid():
t = form.cleaned_data["ballot_writeup"]
if t != existing.content:
e = Text(doc=doc, by=login)
if t != existing.text:
e = WriteupEvent(doc=doc, by=login)
e.by = login
e.type = "changed_ballot_writeup_text"
e.desc = "Ballot writeup was changed by %s" % login.get_name()
e.content = t
e.text = t
e.save()
doc.time = e.time
doc.save()
if "issue_ballot" in request.POST and approval:
if in_group(request.user, "Area_Director") and not doc.latest_event(BallotPosition, ad=login):
if in_group(request.user, "Area_Director") and not doc.latest_event(BallotPositionEvent, ad=login, time__gte=started_process.time):
# sending the ballot counts as a yes
pos = BallotPosition(doc=doc, by=login)
pos = BallotPositionEvent(doc=doc, by=login)
pos.type = "changed_ballot_position"
pos.ad = login
pos.pos_id = "yes"
@ -1003,23 +1004,23 @@ def ballot_approvaltextREDESIGN(request, name):
login = request.user.get_profile().email()
existing = doc.latest_event(Text, type="changed_ballot_approval_text")
existing = doc.latest_event(WriteupEvent, type="changed_ballot_approval_text")
if not existing:
existing = generate_approval_mail(request, doc)
form = ApprovalTextForm(initial=dict(approval_text=existing.content))
form = ApprovalTextForm(initial=dict(approval_text=existing.text))
if request.method == 'POST':
if "save_approval_text" in request.POST:
form = ApprovalTextForm(request.POST)
if form.is_valid():
t = form.cleaned_data['approval_text']
if t != existing.content:
e = Text(doc=doc, by=login)
if t != existing.text:
e = WriteupEvent(doc=doc, by=login)
e.by = login
e.type = "changed_ballot_approval_text"
e.desc = "Ballot approval text was changed by %s" % login.get_name()
e.content = t
e.text = t
e.save()
doc.time = e.time
@ -1032,7 +1033,7 @@ def ballot_approvaltextREDESIGN(request, name):
doc.save()
# make sure form has the updated text
form = ApprovalTextForm(initial=dict(approval_text=existing.content))
form = ApprovalTextForm(initial=dict(approval_text=existing.text))
can_announce = doc.iesg_state.order > 19
need_intended_status = ""
@ -1132,15 +1133,15 @@ def approve_ballotREDESIGN(request, name):
login = request.user.get_profile().email()
e = doc.latest_event(Text, type="changed_ballot_approval_text")
e = doc.latest_event(WriteupEvent, type="changed_ballot_approval_text")
if not e:
e = generate_approval_mail(request, doc)
approval_text = e.content
approval_text = e.text
e = doc.latest_event(Text, type="changed_ballot_writeup_text")
e = doc.latest_event(WriteupEvent, type="changed_ballot_writeup_text")
if not e:
e = generate_ballot_writeup(request, doc)
ballot_writeup = e.content
ballot_writeup = e.text
if "NOT be published" in approval_text:
action = "do_not_publish"
@ -1282,10 +1283,10 @@ def make_last_callREDESIGN(request, name):
login = request.user.get_profile().email()
e = doc.latest_event(Text, type="changed_last_call_text")
e = doc.latest_event(WriteupEvent, type="changed_last_call_text")
if not e:
e = generate_last_call_announcement(request, doc)
announcement = e.content
announcement = e.text
# why cut -4 off name? a better question is probably why these
# tables aren't linked together properly
@ -1322,7 +1323,7 @@ def make_last_callREDESIGN(request, name):
email_state_changed(request, doc, change_description)
email_owner(request, doc, doc.ad, login, change_description)
e = Expiration(doc=doc, by=login)
e = LastCallEvent(doc=doc, by=login)
e.type = "sent_last_call"
e.desc = "Last call sent by %s" % login.get_name()
if form.cleaned_data['last_call_sent_date'] != e.time.date():

View file

@ -155,10 +155,10 @@ def _get_history(doc, versions):
for e in event_holder.event_set.all().select_related('by').order_by('-time', 'id'):
info = {}
if e.type == "new_revision":
filename = u"%s-%s" % (e.doc.name, e.newrevision.rev)
filename = u"%s-%s" % (e.doc.name, e.newrevisionevent.rev)
e.desc = 'New version available: <a href="http://tools.ietf.org/id/%s.txt">%s</a>' % (filename, filename)
if int(e.newrevision.rev) != 0:
e.desc += ' (<a href="http://tools.ietf.org/rfcdiff?url2=%s">diff from -%02d</a>)' % (filename, int(e.newrevision.rev) - 1)
if int(e.newrevisionevent.rev) != 0:
e.desc += ' (<a href="http://tools.ietf.org/rfcdiff?url2=%s">diff from -%02d</a>)' % (filename, int(e.newrevisionevent.rev) - 1)
info["dontmolest"] = True
multiset_ballot_text = "This was part of a ballot set with: "
@ -181,7 +181,7 @@ def _get_history(doc, versions):
for o in results:
e = o["comment"]
if e.type == "new_revision":
e.version = e.newrevision.rev
e.version = e.newrevisionevent.rev
else:
e.version = prev_rev
prev_rev = e.version

View file

@ -22,7 +22,7 @@ from ietf.idrfc.mails import *
from ietf.idrfc.utils import *
from ietf.idrfc.lastcall import request_last_call
from doc.models import Document, Event, Status, Telechat, save_document_in_history, DocHistory
from doc.models import Document, Event, StatusDateEvent, TelechatEvent, save_document_in_history, DocHistory
from name.models import IesgDocStateName, IntendedStdLevelName, DocInfoTagName, get_next_iesg_states, DocStateName
class ChangeStateForm(forms.Form):
@ -463,7 +463,7 @@ def edit_infoREDESIGN(request, name):
doc.iesg_state = IesgDocStateName.objects.get(slug="pub-req")
doc.notify = get_initial_notify(doc)
e = doc.latest_event(Telechat, type="scheduled_for_telechat")
e = doc.latest_event(TelechatEvent, type="scheduled_for_telechat")
initial_telechat_date = e.telechat_date if e else None
initial_returning_item = bool(e and e.returning_item)
@ -541,10 +541,10 @@ def edit_infoREDESIGN(request, name):
update_telechat(request, doc, login,
r['telechat_date'], r['returning_item'])
e = doc.latest_event(Status, type="changed_status_date")
e = doc.latest_event(StatusDateEvent, type="changed_status_date")
status_date = e.date if e else None
if r["status_date"] != status_date:
e = Status(doc=doc, by=login)
e = StatusDateEvent(doc=doc, by=login)
e.type ="changed_status_date"
d = desc("Status date", r["status_date"], status_date)
changes.append(d)
@ -567,7 +567,7 @@ def edit_infoREDESIGN(request, name):
doc.save()
return HttpResponseRedirect(doc.get_absolute_url())
else:
e = doc.latest_event(Status)
e = doc.latest_event(StatusDateEvent)
status = e.date if e else None
init = dict(intended_std_level=doc.intended_std_level,
status_date=status,

View file

@ -39,14 +39,14 @@ class EventAdmin(admin.ModelAdmin):
admin.site.register(Event, EventAdmin)
admin.site.register(Message, EventAdmin)
admin.site.register(Text, EventAdmin)
admin.site.register(NewRevision, EventAdmin)
admin.site.register(Status, EventAdmin)
admin.site.register(Expiration, EventAdmin)
admin.site.register(Telechat, EventAdmin)
admin.site.register(NewRevisionEvent, EventAdmin)
admin.site.register(WriteupEvent, EventAdmin)
admin.site.register(StatusDateEvent, EventAdmin)
admin.site.register(LastCallEvent, EventAdmin)
admin.site.register(TelechatEvent, EventAdmin)
class BallotPositionAdmin(EventAdmin):
class BallotPositionEventAdmin(EventAdmin):
raw_id_fields = ["doc", "by", "ad"]
admin.site.register(BallotPosition, BallotPositionAdmin)
admin.site.register(BallotPositionEvent, BallotPositionEventAdmin)

View file

@ -45,8 +45,8 @@ class DocumentInfo(models.Model):
def latest_event(self, *args, **filter_args):
"""Get latest event of optional Python type and with filter
arguments, e.g. d.latest_event(type="xyz") returns an Event
while d.latest_event(Status, type="xyz") returns a Status
event."""
while d.latest_event(WriteupEvent, type="xyz") returns a
WriteupEvent event."""
model = args[0] if args else Event
e = model.objects.filter(doc=self).filter(**filter_args).order_by('-time', '-id')[:1]
return e[0] if e else None
@ -231,7 +231,7 @@ EVENT_TYPES = [
]
class Event(models.Model):
"""An occurrence in connection with a document."""
"""An occurrence for a document, used for tracking who, when and what."""
time = models.DateTimeField(default=datetime.datetime.now, help_text="When the event happened")
type = models.CharField(max_length=50, choices=EVENT_TYPES)
by = models.ForeignKey(Email, blank=True, null=True) # FIXME: make NOT NULL?
@ -248,14 +248,11 @@ class Message(Event):
subj = models.CharField(max_length=255)
body = models.TextField()
class Text(Event):
content = models.TextField(blank=True)
class NewRevision(Event):
class NewRevisionEvent(Event):
rev = models.CharField(max_length=16)
# IESG events
class BallotPosition(Event):
class BallotPositionEvent(Event):
ad = models.ForeignKey(Email)
pos = models.ForeignKey(BallotPositionName, verbose_name="position", default="norecord")
discuss = models.TextField(help_text="Discuss text if position is discuss", blank=True)
@ -263,15 +260,16 @@ class BallotPosition(Event):
comment = models.TextField(help_text="Optional comment", blank=True)
comment_time = models.DateTimeField(help_text="Time optional comment was written", blank=True, null=True)
class Status(Event):
class WriteupEvent(Event):
text = models.TextField(blank=True)
class StatusDateEvent(Event):
date = models.DateField(blank=True, null=True)
class Expiration(Event):
class LastCallEvent(Event):
expires = models.DateTimeField(blank=True, null=True)
class Telechat(Event):
class TelechatEvent(Event):
telechat_date = models.DateField(blank=True, null=True)
returning_item = models.BooleanField(default=False)

View file

@ -1,4 +1,4 @@
from models import *
from redesign.doc.models import *
from redesign.person.models import Email
from redesign.proxy_utils import TranslatingManager
@ -71,7 +71,7 @@ class InternetDraft(Document):
#start_date = models.DateField()
@property
def start_date(self):
e = NewRevision.objects.filter(doc=self).order_by("time")[:1]
e = NewRevisionEvent.objects.filter(doc=self).order_by("time")[:1]
return e[0].time.date() if e else None
#expiration_date = models.DateField()
@property
@ -106,7 +106,7 @@ class InternetDraft(Document):
#lc_expiration_date = models.DateField(null=True, blank=True)
@property
def lc_expiration_date(self):
e = self.latest_event(Expiration, type="sent_last_call")
e = self.latest_event(LastCallEvent, type="sent_last_call")
return e.expires if e else None
#b_sent_date = models.DateField(null=True, blank=True)
@ -312,7 +312,7 @@ class InternetDraft(Document):
#status_date = models.DateField(blank=True,null=True)
@property
def status_date(self):
e = self.latest_event(Status, type="changed_status_date")
e = self.latest_event(StatusDateEvent, type="changed_status_date")
return e.date if e else None
#email_display = models.CharField(blank=True, max_length=50) # unused
@ -391,14 +391,14 @@ class InternetDraft(Document):
#returning_item = models.IntegerField(null=True, blank=True)
@property
def returning_item(self):
e = self.latest_event(type="scheduled_for_telechat")
return e.telechat.returning_item if e else None
e = self.latest_event(TelechatEvent, type="scheduled_for_telechat")
return e.returning_item if e else None
#telechat_date = models.DateField(null=True, blank=True)
@property
def telechat_date(self):
e = self.latest_event(type="scheduled_for_telechat")
return e.telechat.telechat_date if e else None
e = self.latest_event(TelechatEvent, type="scheduled_for_telechat")
return e.telechat_date if e else None
#via_rfc_editor = models.IntegerField(null=True, blank=True)
@property
@ -515,20 +515,20 @@ class InternetDraft(Document):
#approval_text = models.TextField(blank=True)
@property
def approval_text(self):
e = self.latest_event(Text, type="changed_ballot_approval_text")
return e.content if e else ""
e = self.latest_event(WriteupEvent, type="changed_ballot_approval_text")
return e.text if e else ""
#last_call_text = models.TextField(blank=True)
@property
def last_call_text(self):
e = self.latest_event(Text, type="changed_last_call_text")
return e.content if e else ""
e = self.latest_event(WriteupEvent, type="changed_last_call_text")
return e.text if e else ""
#ballot_writeup = models.TextField(blank=True)
@property
def ballot_writeup(self):
e = self.latest_event(Text, type="changed_ballot_writeup_text")
return e.content if e else ""
e = self.latest_event(WriteupEvent, type="changed_ballot_writeup_text")
return e.text if e else ""
#ballot_issued = models.IntegerField(null=True, blank=True)
@property
@ -548,7 +548,7 @@ class InternetDraft(Document):
res.append(dict(ad=IESGLoginProxy(ad), pos=Position(pos) if pos else None))
found = set()
for pos in BallotPosition.objects.filter(doc=self, type="changed_ballot_position", ad__in=active_ads).select_related('ad').order_by("-time", "-id"):
for pos in BallotPositionEvent.objects.filter(doc=self, type="changed_ballot_position", ad__in=active_ads).select_related('ad').order_by("-time", "-id"):
if pos.ad not in found:
found.add(pos.ad)
add(pos.ad, pos)
@ -753,7 +753,7 @@ class DocumentComment(Event):
proxy = True
class Position(BallotPosition):
class Position(BallotPositionEvent):
def __init__(self, base):
for f in base._meta.fields:
if not f.name in ('discuss',): # don't overwrite properties

View file

@ -272,7 +272,7 @@ def import_from_idinternal(d, idinternal):
# telechat agenda schedulings
match = re_telechat_agenda.search(c.comment_text) or re_telechat_changed.search(c.comment_text)
if match:
e = Telechat()
e = TelechatEvent()
e.type = "scheduled_for_telechat"
e.telechat_date = date_in_match(match) if "Placed on" in c.comment_text else None
# can't extract this from history so we just take the latest value
@ -289,10 +289,10 @@ def import_from_idinternal(d, idinternal):
handled = True
ad = iesg_login_to_email(c.created_by)
last_pos = d.latest_event(BallotPosition, type="changed_ballot_position", ad=ad)
last_pos = d.latest_event(BallotPositionEvent, type="changed_ballot_position", ad=ad)
if not last_pos and not iesg_login_is_secretary(c.created_by):
# when you issue a ballot, you also vote yes; add that vote
e = BallotPosition()
e = BallotPositionEvent()
e.type = "changed_ballot_position"
e.ad = ad
e.desc = "[Ballot Position Update] New position, Yes, has been recorded by %s" % e.ad.get_name()
@ -354,10 +354,10 @@ def import_from_idinternal(d, idinternal):
print "BALLOT BY SECRETARIAT", login
e = BallotPosition()
e = BallotPositionEvent()
e.type = "changed_ballot_position"
e.ad = iesg_login_to_email(login)
last_pos = d.latest_event(BallotPosition, type="changed_ballot_position", ad=e.ad)
last_pos = d.latest_event(BallotPositionEvent, type="changed_ballot_position", ad=e.ad)
e.pos = position
e.discuss = last_pos.discuss if last_pos else ""
e.discuss_time = last_pos.discuss_time if last_pos else None
@ -372,10 +372,10 @@ def import_from_idinternal(d, idinternal):
# ballot discusses/comments
if c.ballot in (DocumentComment.BALLOT_DISCUSS, DocumentComment.BALLOT_COMMENT):
e = BallotPosition()
e = BallotPositionEvent()
e.type = "changed_ballot_position"
e.ad = iesg_login_to_email(c.created_by)
last_pos = d.latest_event(BallotPosition, type="changed_ballot_position", ad=e.ad)
last_pos = d.latest_event(BallotPositionEvent, type="changed_ballot_position", ad=e.ad)
e.pos = last_pos.pos if last_pos else ballot_position_mapping[None]
c.comment_text = re_comment_discuss_by_tag.sub("", c.comment_text)
if c.ballot == DocumentComment.BALLOT_DISCUSS:
@ -443,7 +443,7 @@ def import_from_idinternal(d, idinternal):
# new version
if c.comment_text == "New version available":
e = NewRevision(type="new_revision", rev=c.version)
e = NewRevisionEvent(type="new_revision", rev=c.version)
save_event(d, e, c)
handled = True
@ -492,7 +492,7 @@ def import_from_idinternal(d, idinternal):
# status date changed
match = re_status_date_changed.search(line)
if match:
e = Status(type="changed_status_date", date=date_in_match(match))
e = StatusDateEvent(type="changed_status_date", date=date_in_match(match))
e.desc = line
save_event(d, e, c)
handled = True
@ -581,25 +581,25 @@ def import_from_idinternal(d, idinternal):
made_up_date = d.time
made_up_date += datetime.timedelta(seconds=1)
e = d.latest_event(Status, type="changed_status_date")
e = d.latest_event(StatusDateEvent, type="changed_status_date")
status_date = e.date if e else None
if idinternal.status_date != status_date:
e = Status(type="changed_status_date", date=idinternal.status_date)
e = StatusDateEvent(type="changed_status_date", date=idinternal.status_date)
e.time = made_up_date
e.by = system_email
e.doc = d
e.desc = "Status date has been changed to <b>%s</b> from <b>%s</b>" % (idinternal.status_date, status_date)
e.save()
e = d.latest_event(Telechat, type="scheduled_for_telechat")
e = d.latest_event(TelechatEvent, type="scheduled_for_telechat")
telechat_date = e.telechat_date if e else None
if not idinternal.agenda:
idinternal.telechat_date = None # normalize
if telechat_date != idinternal.telechat_date:
e = Telechat(type="scheduled_for_telechat",
telechat_date=idinternal.telechat_date,
returning_item=bool(idinternal.returning_item))
e = TelechatEvent(type="scheduled_for_telechat",
telechat_date=idinternal.telechat_date,
returning_item=bool(idinternal.returning_item))
# a common case is that it has been removed from the
# agenda automatically by a script without a notice in the
# comments, in that case the time is simply the day after
@ -625,7 +625,7 @@ def import_from_idinternal(d, idinternal):
position_date = made_up_date
# make sure we got all the positions
existing = BallotPosition.objects.filter(doc=d, type="changed_ballot_position").order_by("-time", '-id')
existing = BallotPositionEvent.objects.filter(doc=d, type="changed_ballot_position").order_by("-time", '-id')
for p in Position.objects.filter(ballot=ballot):
# there are some bogus ones
@ -653,13 +653,13 @@ def import_from_idinternal(d, idinternal):
break
if not found:
e = BallotPosition()
e = BallotPositionEvent()
e.type = "changed_ballot_position"
e.doc = d
e.time = position_date
e.by = system_email
e.ad = ad
last_pos = d.latest_event(BallotPosition, type="changed_ballot_position", ad=e.ad)
last_pos = d.latest_event(BallotPositionEvent, type="changed_ballot_position", ad=e.ad)
e.pos = pos
e.discuss = last_pos.discuss if last_pos else ""
e.discuss_time = last_pos.discuss_time if last_pos else None
@ -692,7 +692,7 @@ def import_from_idinternal(d, idinternal):
e.save()
# make sure the comments and discusses are updated
positions = list(BallotPosition.objects.filter(doc=d).order_by("-time", '-id'))
positions = list(BallotPositionEvent.objects.filter(doc=d).order_by("-time", '-id'))
for c in IESGComment.objects.filter(ballot=ballot):
ad = iesg_login_to_email(c.ad)
for p in positions:
@ -722,24 +722,24 @@ def import_from_idinternal(d, idinternal):
text_date = made_up_date
if idinternal.ballot.approval_text:
e, _ = Text.objects.get_or_create(type="changed_ballot_approval_text", doc=d)
e.content = idinternal.ballot.approval_text
e, _ = WriteupEvent.objects.get_or_create(type="changed_ballot_approval_text", doc=d)
e.text = idinternal.ballot.approval_text
e.time = text_date
e.by = system_email
e.desc = "Ballot approval text was added"
e.save()
if idinternal.ballot.last_call_text:
e, _ = Text.objects.get_or_create(type="changed_last_call_text", doc=d)
e.content = idinternal.ballot.last_call_text
e, _ = WriteupEvent.objects.get_or_create(type="changed_last_call_text", doc=d)
e.text = idinternal.ballot.last_call_text
e.time = text_date
e.by = system_email
e.desc = "Last call text was added"
e.save()
if idinternal.ballot.ballot_writeup:
e, _ = Text.objects.get_or_create(type="changed_ballot_writeup_text", doc=d)
e.content = idinternal.ballot.ballot_writeup
e, _ = WriteupEvent.objects.get_or_create(type="changed_ballot_writeup_text", doc=d)
e.text = idinternal.ballot.ballot_writeup
e.time = text_date
e.by = system_email
e.desc = "Ballot writeup text was added"
@ -836,13 +836,13 @@ for index, o in enumerate(all_drafts.iterator()):
import_from_idinternal(d, o.idinternal)
# import missing revision changes from DraftVersions
known_revisions = set(e.newrevision.rev for e in d.event_set.filter(type="new_revision").select_related('newrevision'))
known_revisions = set(e.rev for e in NewRevisionEvent.objects.filter(doc=d, type="new_revision"))
draft_versions = list(DraftVersions.objects.filter(filename=d.name).order_by("revision"))
# DraftVersions is not entirely accurate, make sure we got the current one
draft_versions.insert(0, DraftVersions(filename=d.name, revision=o.revision_display(), revision_date=o.revision_date))
for v in draft_versions:
if v.revision not in known_revisions:
e = NewRevision(type="new_revision")
e = NewRevisionEvent(type="new_revision")
e.rev = v.revision
# we don't have time information in this source, so
# hack the seconds to include the revision to ensure
@ -871,7 +871,7 @@ for index, o in enumerate(all_drafts.iterator()):
e.save()
if o.lc_expiration_date:
e = Expiration(type="sent_last_call", expires=o.lc_expiration_date)
e = LastCallEvent(type="sent_last_call", expires=o.lc_expiration_date)
# let's try to find the actual change
events = d.event_set.filter(type="changed_document", desc__contains=" to <b>In Last Call</b>").order_by('-time')[:1]
# event time is more accurate with actual time instead of just