Added DocEvent rev= parameter througout the code.

- Legacy-Id: 12978
This commit is contained in:
Henrik Levkowetz 2017-03-06 15:08:21 +00:00
parent ff31644ccf
commit 4daf66d11c
44 changed files with 360 additions and 171 deletions

11
PLAN
View file

@ -7,13 +7,10 @@ Updated: $Date$
Planned work in rough order
===========================
* Add a 'rev' field to DocEvent, migrate 'rev' information from New
Revision and Submit DocEvents, and infer 'rev' information for others
* Break out the htmlzation code used on tools in a library, and use that
in the datatracker rendering, replacing the simpler code currently in use.
This is also going to require some fancy caching, to avoid re-building the
html if not needed, as it takes quite some time.
* Break out the htmlzation code used on tools.ietf.org in a library, and use
that in the datatracker rendering, replacing the simpler code currently in
use. This is also going to require some fancy caching, to avoid re-building
the html if not needed, as it takes quite some time.
* Use the htmlization lib to improve the rendering of draft text in the
datatracker's /doc/draft-foo-bar/ pages.

View file

@ -143,7 +143,7 @@ def expire_draft(doc):
if e:
events.append(e)
events.append(DocEvent.objects.create(doc=doc, by=system, type="expired_document", desc="Document has expired"))
events.append(DocEvent.objects.create(doc=doc, rev=doc.rev, by=system, type="expired_document", desc="Document has expired"))
doc.set_state(State.objects.get(used=True, type="draft", slug="expired"))
doc.save_with_history(events)

View file

@ -79,6 +79,10 @@ class DocEventFactory(factory.DjangoModelFactory):
doc = factory.SubFactory(DocumentFactory)
desc = factory.Faker('sentence',nb_words=6)
@factory.lazy_attribute
def rev(self):
return self.doc.rev
class NewRevisionDocEventFactory(DocEventFactory):
class Meta:
model = NewRevisionDocEvent

View file

@ -28,6 +28,7 @@ def request_last_call(request, doc):
e.type = "requested_last_call"
e.by = request.user.person
e.doc = doc
e.rev = doc.rev
e.desc = "Last call was requested"
e.save()

View file

@ -112,6 +112,7 @@ def generate_ballot_writeup(request, doc):
e.type = "changed_ballot_writeup_text"
e.by = request.user.person
e.doc = doc
e.rev = doc.rev
e.desc = u"Ballot writeup was generated"
e.text = unicode(render_to_string("doc/mail/ballot_writeup.txt", {'iana': iana}))
@ -123,6 +124,7 @@ def generate_ballot_rfceditornote(request, doc):
e.type = "changed_ballot_rfceditornote_text"
e.by = request.user.person
e.doc = doc
e.rev = doc.rev
e.desc = u"RFC Editor Note for ballot was generated"
e.text = unicode(render_to_string("doc/mail/ballot_rfceditornote.txt"))
e.save()
@ -167,6 +169,7 @@ def generate_last_call_announcement(request, doc):
e.type = "changed_last_call_text"
e.by = request.user.person
e.doc = doc
e.rev = doc.rev
e.desc = u"Last call announcement was generated"
e.text = unicode(mail)
@ -186,6 +189,7 @@ def generate_approval_mail(request, doc):
e.type = "changed_ballot_approval_text"
e.by = request.user.person
e.doc = doc
e.rev = doc.rev
e.desc = u"Ballot approval text was generated"
e.text = unicode(mail)

View file

@ -17,6 +17,7 @@ from ietf.group.models import Group
from ietf.name.models import ( DocTypeName, DocTagName, StreamName, IntendedStdLevelName, StdLevelName,
DocRelationshipName, DocReminderTypeName, BallotPositionName, ReviewRequestStateName )
from ietf.person.models import Email, Person
from ietf.utils import log
from ietf.utils.admin import admin_link
from ietf.utils.validators import validate_no_control_chars
@ -760,7 +761,7 @@ class DocEvent(models.Model):
type = models.CharField(max_length=50, choices=EVENT_TYPES)
by = models.ForeignKey(Person)
doc = models.ForeignKey('doc.Document')
rev = models.CharField(verbose_name="revision", max_length=16, blank=True)
rev = models.CharField(verbose_name="revision", max_length=16, null=True, blank=True)
desc = models.TextField()
def for_current_revision(self):
@ -773,6 +774,10 @@ class DocEvent(models.Model):
def __unicode__(self):
return u"%s %s by %s at %s" % (self.doc.name, self.get_type_display().lower(), self.by.plain_name(), self.time)
def save(self, *args, **kwargs):
super(DocEvent, self).save(*args, **kwargs)
log.assertion('self.rev != None')
class Meta:
ordering = ['-time', '-id']
@ -854,7 +859,7 @@ class BallotDocEvent(DocEvent):
norecord = BallotPositionName.objects.get(slug="norecord")
for ad in active_ads:
if ad not in seen:
e = BallotPositionDocEvent(type="changed_ballot_position", doc=self.doc, ad=ad)
e = BallotPositionDocEvent(type="changed_ballot_position", doc=self.doc, rev=self.doc.rev, ad=ad)
e.by = ad
e.pos = norecord
e.old_ad = False

View file

@ -162,6 +162,7 @@ class DocEventResource(ModelResource):
"id": ALL,
"time": ALL,
"type": ALL,
"rev": ALL,
"desc": ALL,
"by": ALL_WITH_RELATIONS,
"doc": ALL_WITH_RELATIONS,
@ -184,6 +185,7 @@ class StateDocEventResource(ModelResource):
"id": ALL,
"time": ALL,
"type": ALL,
"rev": ALL,
"desc": ALL,
"by": ALL_WITH_RELATIONS,
"doc": ALL_WITH_RELATIONS,
@ -255,6 +257,7 @@ class ConsensusDocEventResource(ModelResource):
"id": ALL,
"time": ALL,
"type": ALL,
"rev": ALL,
"desc": ALL,
"consensus": ALL,
"by": ALL_WITH_RELATIONS,
@ -290,6 +293,7 @@ class TelechatDocEventResource(ModelResource):
"id": ALL,
"time": ALL,
"type": ALL,
"rev": ALL,
"desc": ALL,
"telechat_date": ALL,
"returning_item": ALL,
@ -331,6 +335,7 @@ class LastCallDocEventResource(ModelResource):
"id": ALL,
"time": ALL,
"type": ALL,
"rev": ALL,
"desc": ALL,
"expires": ALL,
"by": ALL_WITH_RELATIONS,
@ -375,6 +380,7 @@ class WriteupDocEventResource(ModelResource):
"id": ALL,
"time": ALL,
"type": ALL,
"rev": ALL,
"desc": ALL,
"text": ALL,
"by": ALL_WITH_RELATIONS,
@ -397,6 +403,7 @@ class InitialReviewDocEventResource(ModelResource):
"id": ALL,
"time": ALL,
"type": ALL,
"rev": ALL,
"desc": ALL,
"expires": ALL,
"by": ALL_WITH_RELATIONS,
@ -437,6 +444,7 @@ class BallotDocEventResource(ModelResource):
"id": ALL,
"time": ALL,
"type": ALL,
"rev": ALL,
"desc": ALL,
"by": ALL_WITH_RELATIONS,
"doc": ALL_WITH_RELATIONS,
@ -499,6 +507,7 @@ class BallotPositionDocEventResource(ModelResource):
"id": ALL,
"time": ALL,
"type": ALL,
"rev": ALL,
"desc": ALL,
"discuss": ALL,
"discuss_time": ALL,
@ -530,6 +539,7 @@ class AddedMessageEventResource(ModelResource):
"id": ALL,
"time": ALL,
"type": ALL,
"rev": ALL,
"desc": ALL,
"msgtype": ALL,
"by": ALL_WITH_RELATIONS,
@ -582,6 +592,7 @@ class ReviewRequestDocEventResource(ModelResource):
"id": ALL,
"time": ALL,
"type": ALL,
"rev": ALL,
"desc": ALL,
"by": ALL_WITH_RELATIONS,
"doc": ALL_WITH_RELATIONS,

View file

@ -119,11 +119,11 @@ class SearchTests(TestCase):
def test_search_for_name(self):
draft = make_test_data()
make_meeting_test_data()
draft.save_with_history([DocEvent.objects.create(doc=draft, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
prev_rev = draft.rev
draft.rev = "%02d" % (int(prev_rev) + 1)
draft.save_with_history([DocEvent.objects.create(doc=draft, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
# exact match
r = self.client.get(urlreverse('ietf.doc.views_search.search_for_name', kwargs=dict(name=draft.name)))
@ -526,7 +526,7 @@ Man Expires September 22, 2015 [Page 3]
# draft published as RFC
draft.set_state(State.objects.get(type="draft", slug="rfc"))
draft.std_level_id = "bcp"
draft.save_with_history([DocEvent.objects.create(doc=draft, type="published_rfc", by=Person.objects.get(name="(System)"))])
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="published_rfc", by=Person.objects.get(name="(System)"))])
rfc_alias = DocAlias.objects.create(name="rfc123456", document=draft)
@ -577,10 +577,10 @@ Man Expires September 22, 2015 [Page 3]
]:
doc = Document.objects.get(name=docname)
# give it some history
doc.save_with_history([DocEvent.objects.create(doc=doc, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
doc.save_with_history([DocEvent.objects.create(doc=doc, rev=doc.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
doc.rev = "01"
doc.save_with_history([DocEvent.objects.create(doc=doc, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
doc.save_with_history([DocEvent.objects.create(doc=doc, rev=doc.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=doc.name)))
self.assertEqual(r.status_code, 200)
@ -638,10 +638,11 @@ class DocTestCase(TestCase):
ballot = doc.active_ballot()
# make sure we have some history
doc.save_with_history([DocEvent.objects.create(doc=doc, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
doc.save_with_history([DocEvent.objects.create(doc=doc, rev=doc.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
pos = BallotPositionDocEvent.objects.create(
doc=doc,
rev=doc.rev,
ballot=ballot,
type="changed_ballot_position",
pos_id="yes",
@ -715,6 +716,7 @@ class DocTestCase(TestCase):
appr = WriteupDocEvent.objects.create(
doc=doc,
rev=doc.rev,
desc="Changed text",
type="changed_ballot_approval_text",
text="This is ballot approval text.",
@ -722,6 +724,7 @@ class DocTestCase(TestCase):
notes = WriteupDocEvent.objects.create(
doc=doc,
rev=doc.rev,
desc="Changed text",
type="changed_ballot_writeup_text",
text="This is ballot writeup notes.",
@ -729,6 +732,7 @@ class DocTestCase(TestCase):
rfced_note = WriteupDocEvent.objects.create(
doc=doc,
rev=doc.rev,
desc="Changed text",
type="changed_rfc_editor_note_text",
text="This is a note for the RFC Editor.",
@ -746,6 +750,7 @@ class DocTestCase(TestCase):
e = DocEvent.objects.create(
doc=doc,
rev=doc.rev,
desc="Something happened.",
type="added_comment",
by=Person.objects.get(name="(System)"))
@ -760,6 +765,7 @@ class DocTestCase(TestCase):
e = DocEvent.objects.create(
doc=doc,
rev=doc.rev,
desc="Something happened.",
type="added_comment",
by=Person.objects.get(name="(System)"))
@ -775,6 +781,7 @@ class DocTestCase(TestCase):
LastCallDocEvent.objects.create(
doc=doc,
rev=doc.rev,
desc="Last call",
type="sent_last_call",
by=Person.objects.get(user__username="secretary"),

View file

@ -127,14 +127,14 @@ class EditPositionTests(TestCase):
def test_send_ballot_comment(self):
draft = make_test_data()
draft.notify = "somebody@example.com"
draft.save_with_history([DocEvent.objects.create(doc=draft, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
ad = Person.objects.get(name="Areað Irector")
ballot = draft.latest_event(BallotDocEvent, type="created_ballot")
BallotPositionDocEvent.objects.create(
doc=draft, type="changed_ballot_position",
doc=draft, rev=draft.rev, type="changed_ballot_position",
by=ad, ad=ad, ballot=ballot, pos=BallotPositionName.objects.get(slug="discuss"),
discuss="This draft seems to be lacking a clearer title?",
discuss_time=datetime.datetime.now(),
@ -257,6 +257,7 @@ class BallotWriteupsTests(TestCase):
draft.set_state(State.objects.get(used=True, type="draft-iana-review", slug="not-ok"))
DocEvent.objects.create(type="iana_review",
doc=draft,
rev=draft.rev,
by=Person.objects.get(user__username="iana"),
desc="IANA does not approve of this document, it does not make sense.",
)
@ -285,6 +286,7 @@ class BallotWriteupsTests(TestCase):
# add a note to the RFC Editor
WriteupDocEvent.objects.create(
doc=draft,
rev=draft.rev,
desc="Changed text",
type="changed_rfc_editor_note_text",
text="This is a note for the RFC Editor.",
@ -374,7 +376,7 @@ class BallotWriteupsTests(TestCase):
draft.group = Group.objects.get(type="individ")
draft.stream_id = "irtf"
draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="iesg-eva"))
draft.save_with_history([DocEvent.objects.create(doc=draft, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
r = self.client.post(url, dict(regenerate_approval_text="1"))
self.assertEqual(r.status_code, 200)
@ -403,6 +405,7 @@ class BallotWriteupsTests(TestCase):
e.type = "changed_ballot_approval_text"
e.by = Person.objects.get(name="(System)")
e.doc = draft
e.rev = draft.rev
e.desc = u"Ballot approval text was generated"
e.text = u"Test approval text."
e.save()
@ -412,6 +415,7 @@ class BallotWriteupsTests(TestCase):
e.type = "changed_ballot_writeup_text"
e.by = Person.objects.get(name="(System)")
e.doc = draft
e.rev = draft.rev
e.desc = u"Ballot writeup was generated"
e.text = u"Test ballot writeup text."
e.save()
@ -421,6 +425,7 @@ class BallotWriteupsTests(TestCase):
e.type = "changed_ballot_rfceditornote_text"
e.by = Person.objects.get(name="(System)")
e.doc = draft
e.rev = draft.rev
e.desc = u"RFC Editor Note for ballot was generated"
e.text = u"Test note to the RFC Editor text."
e.save()
@ -448,7 +453,7 @@ class BallotWriteupsTests(TestCase):
verify_can_see(username, url)
# RFC Editor Notes for documents in the IRTF Stream
e = DocEvent(doc=draft,by=Person.objects.get(name="(System)"),type='changed_stream')
e = DocEvent(doc=draft, rev=draft.rev, by=Person.objects.get(name="(System)"), type='changed_stream')
e.desc = u"Changed stream to <b>%s</b>" % 'irtf'
e.save()
@ -463,7 +468,7 @@ class BallotWriteupsTests(TestCase):
verify_can_see(username, url)
# RFC Editor Notes for documents in the IAB Stream
e = DocEvent(doc=draft,by=Person.objects.get(name="(System)"),type='changed_stream')
e = DocEvent(doc=draft, rev=draft.rev, by=Person.objects.get(name="(System)"), type='changed_stream')
e.desc = u"Changed stream to <b>%s</b>" % 'ise'
e.save()
@ -496,6 +501,7 @@ class ApproveBallotTests(TestCase):
# add a note to the RFC Editor
WriteupDocEvent.objects.create(
doc=draft,
rev=draft.rev,
desc="Changed text",
type="changed_rfc_editor_note_text",
text="This is a note for the RFC Editor.",
@ -606,6 +612,7 @@ class DeferUndeferTestCase(TestCase):
e = TelechatDocEvent(type="scheduled_for_telechat",
doc = doc,
rev = doc.rev,
by = Person.objects.get(name="Areað Irector"),
telechat_date = first_date,
returning_item = False,
@ -662,6 +669,7 @@ class DeferUndeferTestCase(TestCase):
e = TelechatDocEvent(type="scheduled_for_telechat",
doc = doc,
rev = doc.rev,
by = Person.objects.get(name="Areað Irector"),
telechat_date = second_date,
returning_item = True,

View file

@ -206,12 +206,12 @@ class EditCharterTests(TestCase):
# Make it so that the charter has been through internal review, and passed its external review
# ballot on a previous telechat
last_week = datetime.date.today()-datetime.timedelta(days=7)
BallotDocEvent.objects.create(type='created_ballot',by=login,doc=charter,
BallotDocEvent.objects.create(type='created_ballot',by=login,doc=charter, rev=charter.rev,
ballot_type=BallotType.objects.get(doc_type=charter.type,slug='r-extrev'),
time=last_week)
TelechatDocEvent.objects.create(type='scheduled_for_telechat',doc=charter,by=login,telechat_date=last_week,returning_item=False)
BallotDocEvent.objects.create(type='created_ballot',by=login,doc=charter,
ballot_type=BallotType.objects.get(doc_type=charter.type,slug='approve'))
TelechatDocEvent.objects.create(type='scheduled_for_telechat', doc=charter, rev=charter.rev, by=login, telechat_date=last_week, returning_item=False)
BallotDocEvent.objects.create(type='created_ballot', by=login, doc=charter, rev=charter.rev,
ballot_type=BallotType.objects.get(doc_type=charter.type, slug='approve'))
# Put the charter onto a future telechat and verify returning item is not set
telechat_date = TelechatDate.objects.active()[1].date
@ -459,6 +459,7 @@ class EditCharterTests(TestCase):
ballot_type=BallotType.objects.get(doc_type="charter", slug="approve"),
by=by,
doc=charter,
rev=charter.rev,
desc="Created ballot",
)
@ -507,6 +508,7 @@ class EditCharterTests(TestCase):
ballot_type=BallotType.objects.get(doc_type="charter", slug="approve"),
by=p,
doc=charter,
rev=charter.rev,
desc="Created ballot",
)

View file

@ -34,7 +34,7 @@ class ConflictReviewTests(TestCase):
self.assertEqual(r.status_code, 404)
doc.stream = StreamName.objects.get(slug='ise')
doc.save_with_history([DocEvent.objects.create(doc=doc, type="changed_stream", by=Person.objects.get(user__username="secretary"), desc="Test")])
doc.save_with_history([DocEvent.objects.create(doc=doc, rev=doc.rev, type="changed_stream", by=Person.objects.get(user__username="secretary"), desc="Test")])
# normal get should succeed and get a reasonable form
r = self.client.get(url)
@ -91,13 +91,13 @@ class ConflictReviewTests(TestCase):
# can't start conflict reviews on documents in some other stream
doc.stream = StreamName.objects.get(slug='irtf')
doc.save_with_history([DocEvent.objects.create(doc=doc, type="changed_stream", by=Person.objects.get(user__username="secretary"), desc="Test")])
doc.save_with_history([DocEvent.objects.create(doc=doc, rev=doc.rev, type="changed_stream", by=Person.objects.get(user__username="secretary"), desc="Test")])
r = self.client.get(url)
self.assertEquals(r.status_code, 404)
# successful get
doc.stream = StreamName.objects.get(slug='ise')
doc.save_with_history([DocEvent.objects.create(doc=doc, type="changed_stream", by=Person.objects.get(user__username="secretary"), desc="Test")])
doc.save_with_history([DocEvent.objects.create(doc=doc, rev=doc.rev, type="changed_stream", by=Person.objects.get(user__username="secretary"), desc="Test")])
r = self.client.get(url)
self.assertEquals(r.status_code, 200)
q = PyQuery(r.content)

View file

@ -423,7 +423,7 @@ class EditInfoTests(TestCase):
draft.unset_state('draft-iesg')
draft.set_state(State.objects.get(type='draft-stream-ietf',slug='writeupw'))
draft.stream = StreamName.objects.get(slug='ietf')
draft.save_with_history([DocEvent.objects.create(doc=draft, type="changed_stream", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_stream", by=Person.objects.get(user__username="secretary"), desc="Test")])
r = self.client.post(url,
dict(intended_std_level=str(draft.intended_std_level_id),
ad=ad.pk,
@ -455,7 +455,7 @@ class EditInfoTests(TestCase):
self.assertEqual(draft.latest_event(ConsensusDocEvent, type="changed_consensus").consensus, True)
# reset
e = DocEvent(doc=draft,by=Person.objects.get(name="(System)"),type='changed_document')
e = DocEvent(doc=draft, rev=draft.rev, by=Person.objects.get(name="(System)"), type='changed_document')
e.desc = u"Intended Status changed to <b>%s</b> from %s"% (draft.intended_std_level_id, 'bcp')
e.save()
@ -464,7 +464,7 @@ class EditInfoTests(TestCase):
r = self.client.post(url, dict(consensus="Unknown"))
self.assertEqual(r.status_code, 403) # BCPs must have a consensus
e = DocEvent(doc=draft,by=Person.objects.get(name="(System)"),type='changed_document')
e = DocEvent(doc=draft, rev=draft.rev, by=Person.objects.get(name="(System)"), type='changed_document')
e.desc = u"Intended Status changed to <b>%s</b> from %s"% (draft.intended_std_level_id, 'inf')
e.save()
@ -513,7 +513,7 @@ class ResurrectTests(TestCase):
draft = make_test_data()
draft.set_state(State.objects.get(used=True, type="draft", slug="expired"))
DocEvent.objects.create(doc=draft,
DocEvent.objects.create(doc=draft, rev=draft.rev,
type="requested_resurrect",
by=Person.objects.get(name="Areað Irector"))
@ -598,7 +598,7 @@ class ExpireIDsTests(TestCase):
# hack into expirable state
draft.unset_state("draft-iesg")
draft.expires = datetime.datetime.now() + datetime.timedelta(days=10)
draft.save_with_history([DocEvent.objects.create(doc=draft, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
self.assertEqual(len(list(get_soon_to_expire_drafts(14))), 1)
@ -622,7 +622,7 @@ class ExpireIDsTests(TestCase):
# hack into expirable state
draft.unset_state("draft-iesg")
draft.expires = datetime.datetime.now()
draft.save_with_history([DocEvent.objects.create(doc=draft, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
self.assertEqual(len(list(get_expired_drafts())), 1)
@ -702,14 +702,11 @@ class ExpireIDsTests(TestCase):
# expire draft
draft.set_state(State.objects.get(used=True, type="draft", slug="expired"))
draft.expires = datetime.datetime.now() - datetime.timedelta(days=1)
draft.save_with_history([DocEvent.objects.create(doc=draft, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
e = DocEvent()
e.doc = draft
e.by = Person.objects.get(name="(System)")
e.type = "expired_document"
e.text = "Document has expired"
e.time = draft.expires
e = DocEvent(doc=draft, rev=draft.rev, type= "expired_document", time=draft.expires,
by=Person.objects.get(name="(System)"))
e.text="Document has expired"
e.save()
txt = "%s-%s.txt" % (draft.name, draft.rev)
@ -734,10 +731,7 @@ class ExpireLastCallTests(TestCase):
self.assertEqual(len(list(get_expired_last_calls())), 0)
e = LastCallDocEvent()
e.doc = draft
e.by = secretary
e.type = "sent_last_call"
e = LastCallDocEvent(doc=draft, rev=draft.rev, type="sent_last_call", by=secretary)
e.text = "Last call sent"
e.expires = datetime.datetime.now() + datetime.timedelta(days=14)
e.save()
@ -745,10 +739,7 @@ class ExpireLastCallTests(TestCase):
self.assertEqual(len(list(get_expired_last_calls())), 0)
# test expired
e = LastCallDocEvent()
e.doc = draft
e.by = secretary
e.type = "sent_last_call"
e = LastCallDocEvent(doc=draft, rev=draft.rev, type="sent_last_call", by=secretary)
e.text = "Last call sent"
e.expires = datetime.datetime.now()
e.save()
@ -922,7 +913,7 @@ class IndividualInfoFormsTests(TestCase):
def test_doc_change_shepherd(self):
self.doc.shepherd = None
self.doc.save_with_history([DocEvent.objects.create(doc=self.doc, type="changed_shepherd", by=Person.objects.get(user__username="secretary"), desc="Test")])
self.doc.save_with_history([DocEvent.objects.create(doc=self.doc, rev=self.doc.rev, type="changed_shepherd", by=Person.objects.get(user__username="secretary"), desc="Test")])
url = urlreverse('ietf.doc.views_draft.edit_shepherd',kwargs=dict(name=self.docname))
@ -974,19 +965,19 @@ class IndividualInfoFormsTests(TestCase):
def test_doc_change_shepherd_email(self):
self.doc.shepherd = None
self.doc.save_with_history([DocEvent.objects.create(doc=self.doc, type="changed_shepherd", by=Person.objects.get(user__username="secretary"), desc="Test")])
self.doc.save_with_history([DocEvent.objects.create(doc=self.doc, rev=self.doc.rev, type="changed_shepherd", by=Person.objects.get(user__username="secretary"), desc="Test")])
url = urlreverse('ietf.doc.views_draft.change_shepherd_email',kwargs=dict(name=self.docname))
r = self.client.get(url)
self.assertEqual(r.status_code, 404)
self.doc.shepherd = Email.objects.get(person__user__username="ad1")
self.doc.save_with_history([DocEvent.objects.create(doc=self.doc, type="changed_shepherd", by=Person.objects.get(user__username="secretary"), desc="Test")])
self.doc.save_with_history([DocEvent.objects.create(doc=self.doc, rev=self.doc.rev, type="changed_shepherd", by=Person.objects.get(user__username="secretary"), desc="Test")])
login_testing_unauthorized(self, "plain", url)
self.doc.shepherd = Email.objects.get(person__user__username="plain")
self.doc.save_with_history([DocEvent.objects.create(doc=self.doc, type="changed_shepherd", by=Person.objects.get(user__username="secretary"), desc="Test")])
self.doc.save_with_history([DocEvent.objects.create(doc=self.doc, rev=self.doc.rev, type="changed_shepherd", by=Person.objects.get(user__username="secretary"), desc="Test")])
new_email = Email.objects.create(address="anotheremail@example.com", person=self.doc.shepherd.person)
@ -1021,7 +1012,7 @@ class IndividualInfoFormsTests(TestCase):
# Try again when no longer a shepherd.
self.doc.shepherd = None
self.doc.save_with_history([DocEvent.objects.create(doc=self.doc, type="changed_shepherd", by=Person.objects.get(user__username="secretary"), desc="Test")])
self.doc.save_with_history([DocEvent.objects.create(doc=self.doc, rev=self.doc.rev, type="changed_shepherd", by=Person.objects.get(user__username="secretary"), desc="Test")])
r = self.client.get(url)
self.assertEqual(r.status_code,200)
q = PyQuery(r.content)
@ -1130,7 +1121,7 @@ class RequestPublicationTests(TestCase):
draft.stream = StreamName.objects.get(slug="iab")
draft.group = Group.objects.get(acronym="iab")
draft.intended_std_level = IntendedStdLevelName.objects.get(slug="inf")
draft.save_with_history([DocEvent.objects.create(doc=draft, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.set_state(State.objects.get(used=True, type="draft-stream-iab", slug="approved"))
url = urlreverse('ietf.doc.views_draft.request_publication', kwargs=dict(name=draft.name))
@ -1171,7 +1162,7 @@ class AdoptDraftTests(TestCase):
draft.stream = None
draft.group = Group.objects.get(type="individ")
draft.unset_state("draft-stream-ietf")
draft.save_with_history([DocEvent.objects.create(doc=draft, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
url = urlreverse('ietf.doc.views_draft.adopt_draft', kwargs=dict(name=draft.name))
login_testing_unauthorized(self, "marschairman", url)

View file

@ -268,7 +268,7 @@ class ReviewTests(TestCase):
document=doc,
)
doc.rev = "10"
doc.save_with_history([DocEvent.objects.create(doc=doc, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
doc.save_with_history([DocEvent.objects.create(doc=doc, rev=doc.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
# previous review
ReviewRequest.objects.create(

View file

@ -105,7 +105,7 @@ class StatusChangeTests(TestCase):
# successful change to Last Call Requested
messages_before = len(outbox)
doc.ad = Person.objects.get(user__username='ad')
doc.save_with_history([DocEvent.objects.create(doc=doc, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
doc.save_with_history([DocEvent.objects.create(doc=doc, rev=doc.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
lc_req_pk = str(State.objects.get(slug='lc-req',type__slug='statchg').pk)
r = self.client.post(url,dict(new_state=lc_req_pk))
self.assertEquals(r.status_code, 200)
@ -253,7 +253,7 @@ class StatusChangeTests(TestCase):
doc.relateddocument_set.create(target=DocAlias.objects.get(name='rfc9999'),relationship_id='tois')
doc.relateddocument_set.create(target=DocAlias.objects.get(name='rfc9998'),relationship_id='tohist')
doc.ad = Person.objects.get(name='Ad No2')
doc.save_with_history([DocEvent.objects.create(doc=doc, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
doc.save_with_history([DocEvent.objects.create(doc=doc, rev=doc.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
# get
r = self.client.get(url)

View file

@ -172,16 +172,16 @@ def needed_ballot_positions(doc, active_positions):
def create_ballot_if_not_open(doc, by, ballot_slug, time=None):
if not doc.ballot_open(ballot_slug):
if time:
e = BallotDocEvent(type="created_ballot", by=by, doc=doc, time=time)
e = BallotDocEvent(type="created_ballot", by=by, doc=doc, rev=doc.rev, time=time)
else:
e = BallotDocEvent(type="created_ballot", by=by, doc=doc)
e = BallotDocEvent(type="created_ballot", by=by, doc=doc, rev=doc.rev)
e.ballot_type = BallotType.objects.get(doc_type=doc.type, slug=ballot_slug)
e.desc = u'Created "%s" ballot' % e.ballot_type.name
e.save()
def close_ballot(doc, by, ballot_slug):
if doc.ballot_open(ballot_slug):
e = BallotDocEvent(type="closed_ballot", doc=doc, by=by)
e = BallotDocEvent(type="closed_ballot", doc=doc, rev=doc.rev, by=by)
e.ballot_type = BallotType.objects.get(doc_type=doc.type,slug=ballot_slug)
e.desc = 'Closed "%s" ballot' % e.ballot_type.name
e.save()
@ -331,7 +331,7 @@ def add_state_change_event(doc, by, prev_state, new_state, prev_tags=[], new_tag
def tags_suffix(tags):
return (u"::" + u"::".join(t.name for t in tags)) if tags else u""
e = StateDocEvent(doc=doc, by=by)
e = StateDocEvent(doc=doc, rev=doc.rev, by=by)
e.type = "changed_state"
e.state_type = (prev_state or new_state).type
e.state = new_state
@ -414,7 +414,7 @@ def make_notify_changed_event(request, doc, by, new_notify, time=None):
else:
event_type = 'added_comment'
e = DocEvent(type=event_type, doc=doc, by=by)
e = DocEvent(type=event_type, doc=doc, rev=doc.rev, by=by)
e.desc = "Notification list changed to %s" % (escape(new_notify) or "none")
if doc.notify:
e.desc += " from %s" % escape(doc.notify)
@ -455,6 +455,7 @@ def update_telechat(request, doc, by, new_telechat_date, new_returning_item=None
e.type = "scheduled_for_telechat"
e.by = by
e.doc = doc
e.rev = doc.rev
e.returning_item = returning
e.telechat_date = new_telechat_date
@ -536,7 +537,7 @@ def set_replaces_for_document(request, doc, new_replaces, by, email_subject, com
events = []
e = DocEvent(doc=doc, by=by, type='changed_document')
e = DocEvent(doc=doc, rev=doc.rev, by=by, type='changed_document')
new_replaces_names = u", ".join(d.name for d in new_replaces) or u"None"
old_replaces_names = u", ".join(d.name for d in old_replaces) or u"None"
e.desc = u"This document now replaces <b>%s</b> instead of %s" % (new_replaces_names, old_replaces_names)
@ -545,7 +546,7 @@ def set_replaces_for_document(request, doc, new_replaces, by, email_subject, com
events.append(e)
if comment:
events.append(DocEvent.objects.create(doc=doc, by=by, type="added_comment", desc=comment))
events.append(DocEvent.objects.create(doc=doc, rev=doc.rev, by=by, type="added_comment", desc=comment))
for d in old_replaces:
if d not in new_replaces:

View file

@ -138,6 +138,7 @@ def generate_ballot_writeup(request, doc):
e.type = "changed_ballot_writeup_text"
e.by = request.user.person
e.doc = doc
e.rev = doc.rev,
e.desc = u"Ballot writeup was generated"
e.text = unicode(render_to_string("doc/charter/ballot_writeup.txt"))
@ -151,7 +152,7 @@ def default_action_text(group, charter, by):
action = "Rechartered"
addrs = gather_address_lists('ballot_approved_charter',doc=charter,group=group).as_strings(compact=False)
e = WriteupDocEvent(doc=charter, by=by)
e = WriteupDocEvent(doc=charter, rev=charter.rev, by=by)
e.by = by
e.type = "changed_action_announcement"
e.desc = "%s action text was changed" % group.type.name
@ -189,7 +190,7 @@ def default_review_text(group, charter, by):
now = datetime.datetime.now()
addrs = gather_address_lists('charter_external_review',group=group).as_strings(compact=False)
e1 = WriteupDocEvent(doc=charter, by=by)
e1 = WriteupDocEvent(doc=charter, rev=charter.rev, by=by)
e1.by = by
e1.type = "changed_review_announcement"
e1.desc = "%s review text was changed" % group.type.name
@ -212,7 +213,7 @@ def default_review_text(group, charter, by):
)
e1.time = now
e2 = WriteupDocEvent(doc=charter, by=by)
e2 = WriteupDocEvent(doc=charter, rev=charter.rev, by=by)
e2.by = by
e2.type = "changed_new_work_text"
e2.desc = "%s review text was changed" % group.type.name

View file

@ -137,7 +137,7 @@ def edit_position(request, name, ballot_id):
# save the vote
clean = form.cleaned_data
pos = BallotPositionDocEvent(doc=doc, by=login)
pos = BallotPositionDocEvent(doc=doc, rev=doc.rev, by=login)
pos.type = "changed_ballot_position"
pos.ballot = ballot
pos.ad = ad
@ -159,7 +159,7 @@ def edit_position(request, name, ballot_id):
changes.append("comment")
if pos.comment:
e = DocEvent(doc=doc)
e = DocEvent(doc=doc, rev=doc.rev)
e.by = ad # otherwise we can't see who's saying it
e.type = "added_comment"
e.desc = "[Ballot comment]\n" + pos.comment
@ -171,7 +171,7 @@ def edit_position(request, name, ballot_id):
changes.append("discuss")
if pos.pos.blocking:
e = DocEvent(doc=doc, by=login)
e = DocEvent(doc=doc, rev=doc.rev, by=login)
e.by = ad # otherwise we can't see who's saying it
e.type = "added_comment"
e.desc = "[Ballot %s]\n" % pos.pos.name.lower()
@ -446,7 +446,7 @@ def lastcalltext(request, name):
if form.is_valid():
t = form.cleaned_data['last_call_text']
if t != existing.text:
e = WriteupDocEvent(doc=doc, by=login)
e = WriteupDocEvent(doc=doc, rev=doc.rev, by=login)
e.by = login
e.type = "changed_last_call_text"
e.desc = "Last call announcement was changed"
@ -523,7 +523,7 @@ def ballot_writeupnotes(request, name):
if form.is_valid():
t = form.cleaned_data["ballot_writeup"]
if t != existing.text:
e = WriteupDocEvent(doc=doc, by=login)
e = WriteupDocEvent(doc=doc, rev=doc.rev, by=login)
e.by = login
e.type = "changed_ballot_writeup_text"
e.desc = "Ballot writeup was changed"
@ -538,7 +538,7 @@ def ballot_writeupnotes(request, name):
if has_role(request.user, "Area Director") and not doc.latest_event(BallotPositionDocEvent, ad=login, ballot=ballot):
# sending the ballot counts as a yes
pos = BallotPositionDocEvent(doc=doc, by=login)
pos = BallotPositionDocEvent(doc=doc, rev=doc.rev, by=login)
pos.ballot = ballot
pos.type = "changed_ballot_position"
pos.ad = login
@ -568,7 +568,7 @@ def ballot_writeupnotes(request, name):
send_mail_preformatted(request, msg, extra=extra_automation_headers(doc),
override={ "To": "IANA <%s>"%settings.IANA_EVAL_EMAIL, "CC": None, "Bcc": None , "Reply-To": None})
e = DocEvent(doc=doc, by=login)
e = DocEvent(doc=doc, rev=doc.rev, by=login)
e.by = login
e.type = "sent_ballot_announcement"
e.desc = "Ballot has been issued"
@ -618,7 +618,7 @@ def ballot_rfceditornote(request, name):
if form.is_valid():
t = form.cleaned_data["rfc_editor_note"]
if t != existing.text:
e = WriteupDocEvent(doc=doc, by=login)
e = WriteupDocEvent(doc=doc, rev=doc.rev, by=login)
e.by = login
e.type = "changed_rfc_editor_note_text"
e.desc = "RFC Editor Note was changed"
@ -626,7 +626,7 @@ def ballot_rfceditornote(request, name):
e.save()
if request.method == 'POST' and "clear_ballot_rfceditornote" in request.POST:
e = WriteupDocEvent(doc=doc, by=login)
e = WriteupDocEvent(doc=doc, rev=doc.rev, by=login)
e.by = login
e.type = "changed_rfc_editor_note_text"
e.desc = "RFC Editor Note was cleared"
@ -669,7 +669,7 @@ def ballot_approvaltext(request, name):
if form.is_valid():
t = form.cleaned_data['approval_text']
if t != existing.text:
e = WriteupDocEvent(doc=doc, by=login)
e = WriteupDocEvent(doc=doc, rev=doc.rev, by=login)
e.by = login
e.type = "changed_ballot_approval_text"
e.desc = "Ballot approval text was changed"
@ -771,7 +771,7 @@ def approve_ballot(request, name):
# fixup document
close_open_ballots(doc, login)
e = DocEvent(doc=doc, by=login)
e = DocEvent(doc=doc, rev=doc.rev, by=login)
if action == "do_not_publish":
e.type = "iesg_disapproved"
e.desc = "Do Not Publish note has been sent to the RFC Editor"
@ -865,7 +865,7 @@ def make_last_call(request, name):
e = add_state_change_event(doc, login, prev_state, new_state, prev_tags=prev_tags, new_tags=new_tags)
if e:
events.append(e)
e = LastCallDocEvent(doc=doc, by=login)
e = LastCallDocEvent(doc=doc, rev=doc.rev, by=login)
e.type = "sent_last_call"
e.desc = "The following Last Call announcement was sent out:<br><br>"
e.desc += announcement

View file

@ -131,13 +131,13 @@ def change_state(request, name, option=None):
close_open_ballots(charter, by)
# Special log for abandoned efforts
e = DocEvent(type="changed_document", doc=charter, by=by)
e = DocEvent(type="changed_document", doc=charter, rev=charter.rev, by=by)
e.desc = "Chartering effort abandoned"
e.save()
events.append(e)
if comment:
events.append(DocEvent.objects.create(type="added_comment", doc=charter, by=by, desc=comment))
events.append(DocEvent.objects.create(type="added_comment", doc=charter, rev=charter.rev, by=by, desc=comment))
charter.save_with_history(events)
@ -167,7 +167,7 @@ def change_state(request, name, option=None):
fix_charter_revision_after_approval(charter, by)
if charter_state.slug == "infrev" and clean["initial_time"] and clean["initial_time"] != 0:
e = InitialReviewDocEvent(type="initial_review", by=by, doc=charter)
e = InitialReviewDocEvent(type="initial_review", by=by, doc=charter, rev=charter.rev)
e.expires = datetime.datetime.now() + datetime.timedelta(weeks=clean["initial_time"])
e.desc = "Initial review time expires %s" % e.expires.strftime("%Y-%m-%d")
e.save()
@ -266,7 +266,7 @@ def change_title(request, name, option=None):
if not comment:
comment = "Changed charter title from '%s' to '%s'." % (prev_title, new_title)
e = DocEvent(type="added_comment", doc=charter, by=by)
e = DocEvent(type="added_comment", doc=charter, rev=charter.rev, by=by)
e.desc = comment
e.save()
events.append(e)
@ -312,7 +312,7 @@ def edit_ad(request, name):
new_ad = form.cleaned_data['ad']
if new_ad != charter.ad:
events = []
e = DocEvent(doc=charter, by=by)
e = DocEvent(doc=charter, rev=charter.rev, by=by)
e.desc = "Responsible AD changed to %s" % new_ad.plain_name()
if charter.ad:
e.desc += " from %s" % charter.ad.plain_name()
@ -486,7 +486,7 @@ def review_announcement_text(request, name):
raise Http404
if not existing_new_work:
existing_new_work = WriteupDocEvent(doc=charter)
existing_new_work = WriteupDocEvent(doc=charter, rev=charter.rev)
existing_new_work.by = by
existing_new_work.type = "changed_new_work_text"
existing_new_work.desc = "%s review text was changed" % group.type.name
@ -504,7 +504,7 @@ def review_announcement_text(request, name):
t = form.cleaned_data['announcement_text']
if t != existing.text:
e = WriteupDocEvent(doc=charter)
e = WriteupDocEvent(doc=charter, rev=charter.rev)
e.by = by
e.type = "changed_review_announcement"
e.desc = "%s review text was changed" % (group.type.name)
@ -518,7 +518,7 @@ def review_announcement_text(request, name):
t = form.cleaned_data['new_work_text']
if t != existing_new_work.text:
e = WriteupDocEvent(doc=charter)
e = WriteupDocEvent(doc=charter, rev=charter.rev)
e.by = by
e.type = "changed_new_work_text"
e.desc = "%s new work message text was changed" % (group.type.name)
@ -581,7 +581,7 @@ def action_announcement_text(request, name):
if "save_text" in request.POST and form.is_valid():
t = form.cleaned_data['announcement_text']
if t != existing.text:
e = WriteupDocEvent(doc=charter)
e = WriteupDocEvent(doc=charter, rev=charter.rev)
e.by = by
e.type = "changed_action_announcement"
e.desc = "%s action text was changed" % group.type.name
@ -643,7 +643,7 @@ def ballot_writeupnotes(request, name):
if form.is_valid():
t = form.cleaned_data["ballot_writeup"]
if t != existing.text:
e = WriteupDocEvent(doc=charter, by=by)
e = WriteupDocEvent(doc=charter, rev=charter.rev, by=by)
e.type = "changed_ballot_writeup_text"
e.desc = "Ballot writeup was changed"
e.text = t
@ -656,7 +656,7 @@ def ballot_writeupnotes(request, name):
if "send_ballot" in request.POST and approval:
if has_role(request.user, "Area Director") and not charter.latest_event(BallotPositionDocEvent, type="changed_ballot_position", ad=by, ballot=ballot):
# sending the ballot counts as a yes
pos = BallotPositionDocEvent(doc=charter, by=by)
pos = BallotPositionDocEvent(doc=charter, rev=charter.rev, by=by)
pos.type = "changed_ballot_position"
pos.ad = by
pos.pos_id = "yes"
@ -667,7 +667,7 @@ def ballot_writeupnotes(request, name):
msg = generate_issue_ballot_mail(request, charter, ballot)
send_mail_preformatted(request, msg)
e = DocEvent(doc=charter, by=by)
e = DocEvent(doc=charter, rev=charter.rev, by=by)
e.by = by
e.type = "sent_ballot_announcement"
e.desc = "Ballot has been sent"
@ -709,7 +709,7 @@ def approve(request, name):
events = []
# approve
e = DocEvent(doc=charter, by=by)
e = DocEvent(doc=charter, rev=charter.rev, by=by)
e.type = "iesg_approved"
e.desc = "IESG has approved the charter"
e.save()

View file

@ -41,7 +41,7 @@ def change_state(request, name, option=None):
comment = clean['comment'].rstrip()
if comment:
c = DocEvent(type="added_comment", doc=review, by=login)
c = DocEvent(type="added_comment", doc=review, rev=review.rev, by=login)
c.desc = comment
c.save()
@ -60,7 +60,7 @@ def change_state(request, name, option=None):
if has_role(request.user, "Area Director") and not review.latest_event(BallotPositionDocEvent, ad=login, ballot=ballot, type="changed_ballot_position"):
# The AD putting a conflict review into iesgeval who doesn't already have a position is saying "yes"
pos = BallotPositionDocEvent(doc=review, by=login)
pos = BallotPositionDocEvent(doc=review, rev=review.rev, by=login)
pos.ballot = ballot
pos.type = "changed_ballot_position"
pos.ad = login
@ -225,7 +225,7 @@ def edit_ad(request, name):
if form.is_valid():
review.ad = form.cleaned_data['ad']
c = DocEvent(type="added_comment", doc=review, by=request.user.person)
c = DocEvent(type="added_comment", doc=review, rev=review.rev, by=request.user.person)
c.desc = "Shepherding AD changed to "+review.ad.name
c.save()
@ -305,7 +305,7 @@ def approve(request, name):
close_open_ballots(review, login)
e = DocEvent(doc=review, by=login)
e = DocEvent(doc=review, rev=review.rev, by=login)
e.type = "iesg_approved"
e.desc = "IESG has approved the conflict review response"
e.save()
@ -316,7 +316,7 @@ def approve(request, name):
# send announcement
send_mail_preformatted(request, form.cleaned_data['announcement_text'])
c = DocEvent(type="added_comment", doc=review, by=login)
c = DocEvent(type="added_comment", doc=review, rev=review.rev, by=login)
c.desc = "The following approval message was sent\n"+form.cleaned_data['announcement_text']
c.save()
@ -406,11 +406,11 @@ def build_conflict_review_document(login, doc_to_review, ad, notify, create_in_s
conflict_review.relateddocument_set.create(target=DocAlias.objects.get(name=doc_to_review.name),relationship_id='conflrev')
c = DocEvent(type="added_comment", doc=conflict_review, by=login)
c = DocEvent(type="added_comment", doc=conflict_review, rev=conflict_review.rev, by=login)
c.desc = "IETF conflict review requested"
c.save()
c = DocEvent(type="added_comment", doc=doc_to_review, by=login)
c = DocEvent(type="added_comment", doc=doc_to_review, rev=doc_to_review.rev, by=login)
# Is it really OK to put html tags into comment text?
c.desc = 'IETF conflict review initiated - see <a href="%s">%s</a>' % (reverse('ietf.doc.views_doc.document_main', kwargs={'name':conflict_review.name}),conflict_review.name)
c.save()

View file

@ -997,7 +997,7 @@ def add_comment(request, name):
if form.is_valid():
c = form.cleaned_data['comment']
e = DocEvent(doc=doc, by=login)
e = DocEvent(doc=doc, rev=doc.rev, by=login)
e.type = "added_comment"
e.desc = c
e.save()
@ -1145,7 +1145,7 @@ def edit_sessionpresentation(request,name,session_id):
new_selection = form.cleaned_data['version']
if initial['version'] != new_selection:
doc.sessionpresentation_set.filter(pk=sp.pk).update(rev=None if new_selection=='current' else new_selection)
c = DocEvent(type="added_comment", doc=doc, by=request.user.person)
c = DocEvent(type="added_comment", doc=doc, rev=doc.rev, by=request.user.person)
c.desc = "Revision for session %s changed to %s" % (sp.session,new_selection)
c.save()
return redirect('ietf.doc.views_doc.all_presentations', name=name)
@ -1166,7 +1166,7 @@ def remove_sessionpresentation(request,name,session_id):
if request.method == 'POST':
doc.sessionpresentation_set.filter(pk=sp.pk).delete()
c = DocEvent(type="added_comment", doc=doc, by=request.user.person)
c = DocEvent(type="added_comment", doc=doc, rev=doc.rev, by=request.user.person)
c.desc = "Removed from session: %s" % (sp.session)
c.save()
return redirect('ietf.doc.views_doc.all_presentations', name=name)
@ -1203,7 +1203,7 @@ def add_sessionpresentation(request,name):
version = version_form.cleaned_data['version']
rev = None if version=='current' else version
doc.sessionpresentation_set.create(session_id=session_id,rev=rev)
c = DocEvent(type="added_comment", doc=doc, by=request.user.person)
c = DocEvent(type="added_comment", doc=doc, rev=doc.rev, by=request.user.person)
c.desc = "%s to session: %s" % ('Added -%s'%rev if rev else 'Added', Session.objects.get(pk=session_id))
c.save()
return redirect('ietf.doc.views_doc.all_presentations', name=name)

View file

@ -106,6 +106,7 @@ def change_state(request, name):
if comment:
c = DocEvent(type="added_comment")
c.doc = doc
c.rev = doc.rev
c.by = login
c.desc = comment
c.save()
@ -248,14 +249,14 @@ def change_stream(request, name):
events = []
e = DocEvent(doc=doc,by=login,type='changed_document')
e = DocEvent(doc=doc, rev=doc.rev, by=login, type='changed_document')
e.desc = u"Stream changed to <b>%s</b> from %s"% (new_stream, old_stream or "None")
e.save()
events.append(e)
if comment:
c = DocEvent(doc=doc,by=login,type="added_comment")
c = DocEvent(doc=doc, rev=doc.rev, by=login, type="added_comment")
c.desc = comment
c.save()
events.append(c)
@ -379,7 +380,7 @@ def review_possibly_replaces(request, name):
events = []
# all suggestions reviewed, so get rid of them
events.append(DocEvent.objects.create(doc=doc, by=by, type="reviewed_suggested_replaces",
events.append(DocEvent.objects.create(doc=doc, rev=doc.rev, by=by, type="reviewed_suggested_replaces",
desc="Reviewed suggested replacement relationships: %s" % ", ".join(d.name for d in suggested)))
RelatedDocument.objects.filter(source=doc, target__in=suggested,relationship__slug='possibly-replaces').delete()
@ -389,7 +390,7 @@ def review_possibly_replaces(request, name):
comment=comment))
if comment:
events.append(DocEvent.objects.create(doc=doc, by=by, type="added_comment", desc=comment))
events.append(DocEvent.objects.create(doc=doc, rev=doc.rev, by=by, type="added_comment", desc=comment))
doc.save_with_history(events)
@ -431,13 +432,13 @@ def change_intention(request, name):
doc.intended_std_level = new_level
events = []
e = DocEvent(doc=doc,by=login,type='changed_document')
e = DocEvent(doc=doc, rev=doc.rev, by=login, type='changed_document')
e.desc = u"Intended Status changed to <b>%s</b> from %s"% (new_level,old_level)
e.save()
events.append(e)
if comment:
c = DocEvent(doc=doc,by=login,type="added_comment")
c = DocEvent(doc=doc, rev=doc.rev, by=login, type="added_comment")
c.desc = comment
c.save()
events.append(c)
@ -445,7 +446,7 @@ def change_intention(request, name):
de = doc.latest_event(ConsensusDocEvent, type="changed_consensus")
prev_consensus = de and de.consensus
if not prev_consensus and doc.intended_std_level_id in ("std", "ds", "ps", "bcp"):
ce = ConsensusDocEvent(doc=doc, by=login, type="changed_consensus")
ce = ConsensusDocEvent(doc=doc, rev=doc.rev, by=login, type="changed_consensus")
ce.consensus = True
ce.desc = "Changed consensus to <b>%s</b> from %s" % (nice_consensus(True),
nice_consensus(prev_consensus))
@ -553,6 +554,7 @@ def to_iesg(request,name):
e.type = "started_iesg_process"
e.by = by
e.doc = doc
e.rev = doc.rev
e.desc = "IESG process started in state <b>%s</b>" % target_state['iesg'].name
e.save()
events.append(e)
@ -578,7 +580,7 @@ def to_iesg(request,name):
changes.append(previous_writeup.text)
for c in changes:
e = DocEvent(doc=doc, by=by)
e = DocEvent(doc=doc, rev=doc.rev, by=by)
e.desc = c
e.type = "changed_document"
e.save()
@ -648,6 +650,7 @@ def edit_info(request, name):
e.type = "changed_document"
e.by = by
e.doc = doc
e.rev = doc.rev
e.desc = "Working group state set to %s" % submitted_state.name
e.save()
events.append(e)
@ -660,6 +663,7 @@ def edit_info(request, name):
e.type = "added_comment"
e.by = Person.objects.get(name="(System)")
e.doc = doc
e.rev = doc.rev
e.desc = "Earlier history may be found in the Comment Log for <a href=\"%s\">%s</a>" % (replaces[0], replaces[0].get_absolute_url())
e.save()
events.append(e)
@ -668,6 +672,7 @@ def edit_info(request, name):
e.type = "started_iesg_process"
e.by = by
e.doc = doc
e.rev = doc.rev
e.desc = "IESG process started in state <b>%s</b>" % doc.get_state("draft-iesg").name
e.save()
events.append(e)
@ -716,7 +721,7 @@ def edit_info(request, name):
doc.group = r["area"]
for c in changes:
events.append(DocEvent.objects.create(doc=doc, by=by, desc=c, type="changed_document"))
events.append(DocEvent.objects.create(doc=doc, rev=doc.rev, by=by, desc=c, type="changed_document"))
# Todo - chase this
e = update_telechat(request, doc, by,
@ -767,7 +772,7 @@ def request_resurrect(request, name):
email_resurrect_requested(request, doc, by)
e = DocEvent(doc=doc, by=by)
e = DocEvent(doc=doc, rev=doc.rev, by=by)
e.type = "requested_resurrect"
e.desc = "Resurrection was requested"
e.save()
@ -795,7 +800,7 @@ def resurrect(request, name):
email_resurrection_completed(request, doc, requester=resurrect_requested_by)
events = []
e = DocEvent(doc=doc, by=request.user.person)
e = DocEvent(doc=doc, rev=doc.rev, by=request.user.person)
e.type = "completed_resurrect"
e.desc = "Resurrection was completed"
e.save()
@ -842,7 +847,7 @@ def edit_iesg_note(request, name):
else:
log_message = "Note added '%s'" % new_note
c = DocEvent(type="added_comment", doc=doc, by=login)
c = DocEvent(type="added_comment", doc=doc, rev=doc.rev, by=login)
c.desc = log_message
c.save()
@ -893,7 +898,7 @@ def edit_shepherd_writeup(request, name):
writeup = from_file
else:
writeup = form.cleaned_data['content']
e = WriteupDocEvent(doc=doc, by=login, type="changed_protocol_writeup")
e = WriteupDocEvent(doc=doc, rev=doc.rev, by=login, type="changed_protocol_writeup")
# Add the shepherd writeup to description if the document is in submitted for publication state
stream_state = doc.get_state("draft-stream-%s" % doc.stream_id)
@ -958,7 +963,7 @@ def edit_shepherd(request, name):
doc.shepherd = form.cleaned_data['shepherd']
c = DocEvent(type="added_comment", doc=doc, by=request.user.person)
c = DocEvent(type="added_comment", doc=doc, rev=doc.rev, by=request.user.person)
c.desc = "Document shepherd changed to "+ (doc.shepherd.person.name if doc.shepherd else "(None)")
c.save()
events.append(c)
@ -1013,7 +1018,7 @@ def change_shepherd_email(request, name):
doc.shepherd = form.cleaned_data['shepherd']
events = []
c = DocEvent(type="added_comment", doc=doc, by=request.user.person)
c = DocEvent(type="added_comment", doc=doc, rev=doc.rev, by=request.user.person)
c.desc = "Document shepherd email changed"
c.save()
events.append(c)
@ -1056,7 +1061,7 @@ def edit_ad(request, name):
if form.is_valid():
doc.ad = form.cleaned_data['ad']
c = DocEvent(type="added_comment", doc=doc, by=request.user.person)
c = DocEvent(type="added_comment", doc=doc, rev=doc.rev, by=request.user.person)
c.desc = "Shepherding AD changed to "+doc.ad.name
c.save()
@ -1094,7 +1099,7 @@ def edit_consensus(request, name):
form = ConsensusForm(request.POST)
if form.is_valid():
if form.cleaned_data["consensus"] != prev_consensus:
e = ConsensusDocEvent(doc=doc, type="changed_consensus", by=request.user.person)
e = ConsensusDocEvent(doc=doc, rev=doc.rev, type="changed_consensus", by=request.user.person)
e.consensus = {"Unknown":None,"Yes":True,"No":False}[form.cleaned_data["consensus"]]
if not e.consensus and doc.intended_std_level_id in ("std", "ds", "ps", "bcp"):
return HttpResponseForbidden("BCPs and Standards Track documents must include the consensus boilerplate")
@ -1166,7 +1171,7 @@ def request_publication(request, name):
(m.to, m.cc) = gather_address_lists('pubreq_rfced_iana',doc=doc)
send_mail_message(request, m, extra=extra_automation_headers(doc))
e = DocEvent(doc=doc, type="requested_publication", by=request.user.person)
e = DocEvent(doc=doc, type="requested_publication", rev=doc.rev, by=request.user.person)
e.desc = "Sent request for publication to the RFC Editor"
e.save()
events.append(e)
@ -1272,7 +1277,7 @@ def adopt_draft(request, name):
# stream
if doc.stream != new_stream:
e = DocEvent(type="changed_stream", by=by, doc=doc)
e = DocEvent(type="changed_stream", doc=doc, rev=doc.rev, by=by)
e.desc = u"Changed stream to <b>%s</b>" % new_stream.name
if doc.stream:
e.desc += u" from %s" % doc.stream.name
@ -1285,7 +1290,7 @@ def adopt_draft(request, name):
# group
if group != doc.group:
e = DocEvent(type="changed_group", by=by, doc=doc)
e = DocEvent(type="changed_group", doc=doc, rev=doc.rev, by=by)
e.desc = u"Changed group to <b>%s (%s)</b>" % (group.name, group.acronym.upper())
if doc.group.type_id != "individ":
e.desc += " from %s (%s)" % (doc.group.name, doc.group.acronym.upper())
@ -1316,7 +1321,7 @@ def adopt_draft(request, name):
# comment
if comment:
e = DocEvent(type="added_comment", by=by, doc=doc)
e = DocEvent(type="added_comment", doc=doc, rev=doc.rev, by=by)
e.desc = comment
e.save()
events.append(e)
@ -1438,7 +1443,7 @@ def change_stream_state(request, name, state_type):
if existing_tags != new_tags:
doc.tags = new_tags
e = DocEvent(type="changed_document", by=by, doc=doc)
e = DocEvent(type="changed_document", doc=doc, rev=doc.rev, by=by)
added_tags = new_tags - existing_tags
removed_tags = existing_tags - new_tags
l = []
@ -1454,7 +1459,7 @@ def change_stream_state(request, name, state_type):
# comment
if comment:
e = DocEvent(type="added_comment", by=by, doc=doc)
e = DocEvent(type="added_comment", doc=doc, rev=doc.rev, by=by)
e.desc = comment
e.save()
events.append(e)

View file

@ -151,7 +151,7 @@ def edit_material(request, name=None, acronym=None, action=None, doc_type=None):
events.append(e)
if prev_title != doc.title:
e = DocEvent(doc=doc, by=request.user.person, type='changed_document')
e = DocEvent(doc=doc, rev=doc.rev, by=request.user.person, type='changed_document')
e.desc = u"Changed title to <b>%s</b>" % doc.title
if prev_title:
e.desc += u" from %s" % prev_title

View file

@ -121,6 +121,7 @@ def request_review(request, name):
ReviewRequestDocEvent.objects.create(
type="requested_review",
doc=doc,
rev=doc.rev,
by=request.user.person,
desc="Requested {} review by {}".format(review_req.type.name, review_req.team.acronym.upper()),
time=review_req.time,
@ -313,6 +314,7 @@ def reject_reviewer_assignment(request, name, request_id):
ReviewRequestDocEvent.objects.create(
type="closed_review_request",
doc=review_req.doc,
rev=review_req.doc.rev,
by=request.user.person,
desc="Assignment of request for {} review by {} to {} was rejected".format(
review_req.type.name,
@ -530,6 +532,7 @@ def complete_review(request, name, request_id):
close_event = ReviewRequestDocEvent(type="closed_review_request", review_request=review_req)
close_event.doc = review_req.doc
close_event.rev = review_req.doc.rev
close_event.by = request.user.person
close_event.desc = desc
close_event.state = review_req.state

View file

@ -43,7 +43,7 @@ def change_state(request, name, option=None):
comment = clean['comment'].rstrip()
if comment:
c = DocEvent(type="added_comment", doc=status_change, by=login)
c = DocEvent(type="added_comment", doc=status_change, rev=status_change.rev, by=login)
c.desc = comment
c.save()
@ -60,7 +60,7 @@ def change_state(request, name, option=None):
if has_role(request.user, "Area Director") and not status_change.latest_event(BallotPositionDocEvent, ad=login, ballot=ballot, type="changed_ballot_position"):
# The AD putting a status change into iesgeval who doesn't already have a position is saying "yes"
pos = BallotPositionDocEvent(doc=status_change, by=login)
pos = BallotPositionDocEvent(doc=status_change, rev=status_change.rev, by=login)
pos.ballot = ballot
pos.type = "changed_ballot_position"
pos.ad = login
@ -210,7 +210,7 @@ def edit_title(request, name):
status_change.title = form.cleaned_data['title']
c = DocEvent(type="added_comment", doc=status_change, by=request.user.person)
c = DocEvent(type="added_comment", doc=status_change, rev=status_change.rev, by=request.user.person)
c.desc = "Title changed to '%s'"%status_change.title
c.save()
@ -241,7 +241,7 @@ def edit_ad(request, name):
if form.is_valid():
status_change.ad = form.cleaned_data['ad']
c = DocEvent(type="added_comment", doc=status_change, by=request.user.person)
c = DocEvent(type="added_comment", doc=status_change, rev=status_change.rev, by=request.user.person)
c.desc = "Shepherding AD changed to "+status_change.ad.name
c.save()
@ -339,7 +339,7 @@ def approve(request, name):
close_open_ballots(status_change, login)
e = DocEvent(doc=status_change, by=login)
e = DocEvent(doc=status_change, rev=status_change.rev, by=login)
e.type = "iesg_approved"
e.desc = "IESG has approved the status change"
e.save()
@ -352,13 +352,13 @@ def approve(request, name):
send_mail_preformatted(request,form.cleaned_data['announcement_text'])
c = DocEvent(type="added_comment", doc=status_change, by=login)
c = DocEvent(type="added_comment", doc=status_change, rev=status_change.rev, by=login)
c.desc = "The following approval message was sent\n"+form.cleaned_data['announcement_text']
c.save()
for rel in status_change.relateddocument_set.filter(relationship__slug__in=STATUSCHANGE_RELATIONS):
# Add a document event to each target
c = DocEvent(type="added_comment", doc=rel.target.document, by=login)
c = DocEvent(type="added_comment", doc=rel.target.document, rev=rel.target.document.rev, by=login)
c.desc = "New status of %s approved by the IESG\n%s%s" % (newstatus(rel), settings.IDTRACKER_BASE_URL,reverse('ietf.doc.views_doc.document_main', kwargs={'name': status_change.name}))
c.save()
@ -575,7 +575,7 @@ def edit_relations(request, name):
for key in new_relations:
status_change.relateddocument_set.create(target=DocAlias.objects.get(name=key),
relationship_id=new_relations[key])
c = DocEvent(type="added_comment", doc=status_change, by=login)
c = DocEvent(type="added_comment", doc=status_change, rev=status_change.rev, by=login)
c.desc = "Affected RFC list changed.\nOLD:"
for relname,relslug in (set(old_relations.items())-set(new_relations.items())):
c.desc += "\n "+relname+": "+DocRelationshipName.objects.get(slug=relslug).name
@ -627,6 +627,7 @@ def generate_last_call_text(request, doc):
e.type = 'changed_last_call_text'
e.by = request.user.person
e.doc = doc
e.rev = doc.rev
e.desc = 'Last call announcement was generated'
e.text = unicode(new_text)
e.save()
@ -655,7 +656,7 @@ def last_call(request, name):
t = form.cleaned_data['last_call_text']
if t != last_call_event.text:
e = WriteupDocEvent(doc=status_change, by=login)
e = WriteupDocEvent(doc=status_change, rev=status_change.rev, by=login)
e.by = login
e.type = "changed_last_call_text"
e.desc = "Last call announcement was changed"

View file

@ -287,7 +287,7 @@ def edit_milestones(request, acronym, group_type=None, milestone_set="current"):
continue
if milestone_set == "charter":
DocEvent.objects.create(doc=group.charter, type="changed_charter_milestone",
DocEvent.objects.create(doc=group.charter, rev=group.charter.rev, type="changed_charter_milestone",
by=request.user.person, desc=change)
else:
MilestoneGroupEvent.objects.create(group=group, type="changed_milestone",
@ -353,6 +353,7 @@ def reset_charter_milestones(request, group_type, acronym):
DocEvent.objects.create(type="changed_charter_milestone",
doc=group.charter,
rev=group.charter.rev,
desc='Deleted milestone "%s"' % m.desc,
by=request.user.person,
)
@ -369,6 +370,7 @@ def reset_charter_milestones(request, group_type, acronym):
DocEvent.objects.create(type="changed_charter_milestone",
doc=group.charter,
rev=group.charter.rev,
desc='Added milestone "%s", due %s, from current group milestones' % (new.desc, new.due.strftime("%B %Y")),
by=request.user.person,
)

View file

@ -43,7 +43,7 @@ class StreamTests(TestCase):
def test_stream_documents(self):
draft = make_test_data()
draft.stream_id = "iab"
draft.save_with_history([DocEvent.objects.create(doc=draft, type="changed_stream", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_stream", by=Person.objects.get(user__username="secretary"), desc="Test")])
r = self.client.get(urlreverse("ietf.group.views_stream.stream_documents", kwargs=dict(acronym="iab")))
self.assertEqual(r.status_code, 200)

View file

@ -378,6 +378,7 @@ class GroupPagesTests(TestCase):
de = DocEvent.objects.create(
doc=group.charter,
rev=group.charter.rev,
desc="Something else happened.",
type="added_comment",
by=Person.objects.get(name="(System)"))

View file

@ -57,6 +57,7 @@ class ReviewTests(TestCase):
type="scheduled_for_telechat",
by=Person.objects.get(name="(System)"),
doc=doc,
rev=doc.rev,
telechat_date=TelechatDate.objects.all().first().date,
)
doc.rev = "10"

View file

@ -78,7 +78,7 @@ class IndexTests(TestCase):
draft.set_state(State.objects.get(type="draft", slug="active"))
draft.set_state(State.objects.get(type="draft-iesg", slug="review-e"))
NewRevisionDocEvent.objects.create(doc=draft, type="new_revision", rev=draft.rev, by=draft.ad)
NewRevisionDocEvent.objects.create(doc=draft, rev=draft.rev, type="new_revision", by=draft.ad)
self.write_draft_file("%s-%s.txt" % (draft.name, draft.rev), 5000)
self.write_draft_file("%s-%s.pdf" % (draft.name, draft.rev), 5000)
@ -124,7 +124,7 @@ class IndexTests(TestCase):
draft.set_state(State.objects.get(type="draft", slug="active"))
draft.set_state(State.objects.get(type="draft-iesg", slug="lc"))
e = LastCallDocEvent.objects.create(doc=draft, type="sent_last_call", expires=datetime.datetime.now() + datetime.timedelta(days=14), by=draft.ad)
e = LastCallDocEvent.objects.create(doc=draft, rev=draft.rev, type="sent_last_call", expires=datetime.datetime.now() + datetime.timedelta(days=14), by=draft.ad)
t = get_fields(all_id2_txt())
self.assertEqual(t[11], e.expires.strftime("%Y-%m-%d"))

View file

@ -29,6 +29,7 @@ class IESGTests(TestCase):
pos.pos_id = "discuss"
pos.type = "changed_ballot_position"
pos.doc = draft
pos.rev = draft.rev
pos.ad = pos.by = Person.objects.get(user__username="ad")
pos.save()
@ -57,6 +58,7 @@ class IESGTests(TestCase):
e = DocEvent(type="iesg_approved")
e.doc = draft
e.rev = draft.rev
e.by = Person.objects.get(name="Areað Irector")
e.save()
@ -80,7 +82,7 @@ class IESGAgendaTests(TestCase):
ise_draft = Document.objects.get(name="draft-imaginary-independent-submission")
ise_draft.stream = StreamName.objects.get(slug="ise")
ise_draft.save_with_history([DocEvent(doc=ise_draft, type="changed_stream", by=Person.objects.get(user__username="secretary"), desc="Test")])
ise_draft.save_with_history([DocEvent(doc=ise_draft, rev=ise_draft.rev, type="changed_stream", by=Person.objects.get(user__username="secretary"), desc="Test")])
self.telechat_docs = {
"ietf_draft": Document.objects.get(name="draft-ietf-mars-test"),
@ -102,6 +104,7 @@ class IESGAgendaTests(TestCase):
for d in self.telechat_docs.values():
TelechatDocEvent.objects.create(type="scheduled_for_telechat",
doc=d,
rev=d.rev,
by=by,
telechat_date=date,
returning_item=True)
@ -123,6 +126,7 @@ class IESGAgendaTests(TestCase):
telechat_event = TelechatDocEvent.objects.create(
type="scheduled_for_telechat",
doc=draft,
rev=draft.rev,
by=Person.objects.get(name="Areað Irector"),
telechat_date=date,
returning_item=False)
@ -131,7 +135,7 @@ class IESGAgendaTests(TestCase):
# 2.1 protocol WG submissions
draft.intended_std_level_id = "ps"
draft.group = Group.objects.get(acronym="mars")
draft.save_with_history([DocEvent.objects.create(doc=draft, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.set_state(State.objects.get(type="draft-iesg", slug="iesg-eva"))
self.assertTrue(draft in agenda_data(date_str)["sections"]["2.1.1"]["docs"])
@ -146,7 +150,7 @@ class IESGAgendaTests(TestCase):
# 2.2 protocol individual submissions
draft.group = Group.objects.get(type="individ")
draft.save_with_history([DocEvent.objects.create(doc=draft, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.set_state(State.objects.get(type="draft-iesg", slug="iesg-eva"))
self.assertTrue(draft in agenda_data(date_str)["sections"]["2.2.1"]["docs"])
@ -162,7 +166,7 @@ class IESGAgendaTests(TestCase):
# 3.1 document WG submissions
draft.intended_std_level_id = "inf"
draft.group = Group.objects.get(acronym="mars")
draft.save_with_history([DocEvent.objects.create(doc=draft, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.set_state(State.objects.get(type="draft-iesg", slug="iesg-eva"))
self.assertTrue(draft in agenda_data(date_str)["sections"]["3.1.1"]["docs"])
@ -177,7 +181,7 @@ class IESGAgendaTests(TestCase):
# 3.2 document individual submissions
draft.group = Group.objects.get(type="individ")
draft.save_with_history([DocEvent.objects.create(doc=draft, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.set_state(State.objects.get(type="draft-iesg", slug="iesg-eva"))
self.assertTrue(draft in agenda_data(date_str)["sections"]["3.2.1"]["docs"])
@ -200,7 +204,7 @@ class IESGAgendaTests(TestCase):
relationship_id="tohist")
statchg.group = Group.objects.get(acronym="mars")
statchg.save_with_history([DocEvent.objects.create(doc=statchg, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
statchg.save_with_history([DocEvent.objects.create(doc=statchg, rev=statchg.rev, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
statchg.set_state(State.objects.get(type="statchg", slug="iesgeval"))
self.assertTrue(statchg in agenda_data(date_str)["sections"]["2.3.1"]["docs"])
@ -218,7 +222,7 @@ class IESGAgendaTests(TestCase):
relation.save()
statchg.group = Group.objects.get(acronym="mars")
statchg.save_with_history([DocEvent.objects.create(doc=statchg, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
statchg.save_with_history([DocEvent.objects.create(doc=statchg, rev=statchg.rev, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
statchg.set_state(State.objects.get(type="statchg", slug="iesgeval"))
self.assertTrue(statchg in agenda_data(date_str)["sections"]["3.3.1"]["docs"])
@ -236,7 +240,7 @@ class IESGAgendaTests(TestCase):
telechat_event.save()
conflrev.group = Group.objects.get(acronym="mars")
conflrev.save_with_history([DocEvent.objects.create(doc=conflrev, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
conflrev.save_with_history([DocEvent.objects.create(doc=conflrev, rev=conflrev.rev, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
conflrev.set_state(State.objects.get(type="conflrev", slug="iesgeval"))
self.assertTrue(conflrev in agenda_data(date_str)["sections"]["3.4.1"]["docs"])
@ -255,7 +259,7 @@ class IESGAgendaTests(TestCase):
telechat_event.save()
charter.group = Group.objects.get(acronym="mars")
charter.save_with_history([DocEvent.objects.create(doc=charter, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
charter.save_with_history([DocEvent.objects.create(doc=charter, rev=charter.rev, type="changed_group", by=Person.objects.get(user__username="secretary"), desc="Test")])
charter.group.state_id = "bof"
charter.group.save()
@ -413,6 +417,7 @@ class RescheduleOnAgendaTests(TestCase):
# add to schedule
e = TelechatDocEvent(type="scheduled_for_telechat")
e.doc = draft
e.rev = draft.rev
e.by = Person.objects.get(name="Areað Irector")
e.telechat_date = TelechatDate.objects.active()[0].date
e.returning_item = True

View file

@ -1125,7 +1125,7 @@ def add_session_drafts(request, session_id, num):
if form.is_valid():
for draft in form.cleaned_data['drafts']:
session.sessionpresentation_set.create(document=draft,rev=None)
c = DocEvent(type="added_comment", doc=draft, by=request.user.person)
c = DocEvent(type="added_comment", doc=draft, rev=draft.rev, by=request.user.person)
c.desc = "Added to session: %s" % session
c.save()
return redirect('ietf.meeting.views.session_details', num=session.meeting.number, acronym=session.group.acronym)
@ -1189,7 +1189,7 @@ def upload_session_bluesheets(request, session_id, num):
session.sessionpresentation_set.create(document=doc,rev='00')
filename = '%s-%s%s'% ( doc.name, doc.rev, ext)
doc.external_url = filename
e = NewRevisionDocEvent.objects.create(doc=doc,by=request.user.person,type='new_revision',desc='New revision available: %s'%doc.rev,rev=doc.rev)
e = NewRevisionDocEvent.objects.create(doc=doc, rev=doc.rev, by=request.user.person, type='new_revision', desc='New revision available: %s'%doc.rev)
doc.save_with_history([e])
handle_upload_file(file, filename, session.meeting, 'bluesheets')
return redirect('ietf.meeting.views.session_details',num=num,acronym=session.group.acronym)
@ -1284,7 +1284,7 @@ def upload_session_minutes(request, session_id, num):
other_session.sessionpresentation_set.create(document=doc,rev=doc.rev)
filename = '%s-%s%s'% ( doc.name, doc.rev, ext)
doc.external_url = filename
e = NewRevisionDocEvent.objects.create(doc=doc,time=doc.time,by=request.user.person,type='new_revision',desc='New revision available: %s'%doc.rev,rev=doc.rev)
e = NewRevisionDocEvent.objects.create(doc=doc, time=doc.time, by=request.user.person, type='new_revision', desc='New revision available: %s'%doc.rev, rev=doc.rev)
doc.save_with_history([e])
# The way this function builds the filename it will never trigger the file delete in handle_file_upload.
handle_upload_file(file, filename, session.meeting, 'minutes')
@ -1531,7 +1531,7 @@ def remove_sessionpresentation(request, session_id, num, name):
return HttpResponseForbidden("The materials cutoff for this session has passed. Contact the secretariat for further action.")
if request.method == 'POST':
session.sessionpresentation_set.filter(pk=sp.pk).delete()
c = DocEvent(type="added_comment", doc=sp.document, by=request.user.person)
c = DocEvent(type="added_comment", doc=sp.document, rev=sp.document.rev, by=request.user.person)
c.desc = "Removed from session: %s" % (session)
c.save()
return redirect('ietf.meeting.views.session_details', num=session.meeting.number, acronym=session.group.acronym)

View file

@ -599,7 +599,7 @@ with db_con.cursor() as c:
e = ReviewRequestDocEvent.objects.filter(type="closed_review_request", doc=review_req.doc, review_request=review_req).first()
if not e:
e = ReviewRequestDocEvent(type="closed_review_request", doc=review_req.doc, review_request=review_req)
e = ReviewRequestDocEvent(type="closed_review_request", doc=review_req.doc, rev=review_req.doc.rev, review_request=review_req)
e.time = parse_timestamp(timestamp)
e.by = by
e.state = states.get(state) if state else None
@ -647,7 +647,7 @@ with db_con.cursor() as c:
e = ReviewRequestDocEvent.objects.filter(type="requested_review", doc=review_req.doc, review_request=review_req).first()
if not e:
e = ReviewRequestDocEvent(type="requested_review", doc=review_req.doc, review_request=review_req)
e = ReviewRequestDocEvent(type="requested_review", doc=review_req.doc, rev=review_req.doc.rev, review_request=review_req)
e.time = request_time
e.by = by
e.desc = "Requested {} review by {}".format(review_req.type.name, review_req.team.acronym.upper())
@ -659,7 +659,7 @@ with db_con.cursor() as c:
elif key == "assigned":
e = ReviewRequestDocEvent.objects.filter(type="assigned_review_request", doc=review_req.doc, review_request=review_req).first()
if not e:
e = ReviewRequestDocEvent(type="assigned_review_request", doc=review_req.doc, review_request=review_req)
e = ReviewRequestDocEvent(type="assigned_review_request", doc=review_req.doc, rev=review_req.doc.rev, review_request=review_req)
e.time = parse_timestamp(timestamp)
e.by = by
e.desc = "Request for {} review by {} is assigned to {}".format(
@ -675,7 +675,7 @@ with db_con.cursor() as c:
elif key == "closed" and review_req.state_id not in ("requested", "accepted"):
e = ReviewRequestDocEvent.objects.filter(type="closed_review_request", doc=review_req.doc, review_request=review_req).first()
if not e:
e = ReviewRequestDocEvent(type="closed_review_request", doc=review_req.doc, review_request=review_req)
e = ReviewRequestDocEvent(type="closed_review_request", doc=review_req.doc, rev=review_req.doc.rev, review_request=review_req)
e.time = parse_timestamp(timestamp)
e.by = by
e.state = states.get(state) if state else None
@ -765,7 +765,7 @@ with db_con.cursor() as c:
if "closed" not in event_collection and "assigned" in event_collection:
e = ReviewRequestDocEvent.objects.filter(type="closed_review_request", doc=review_req.doc, review_request=review_req).first()
if not e:
e = ReviewRequestDocEvent(type="closed_review_request", doc=review_req.doc, review_request=review_req)
e = ReviewRequestDocEvent(type="closed_review_request", doc=review_req.doc, rev=review_req.doc.rev, review_request=review_req)
e.time = donetime or datetime.datetime.now()
e.by = by
e.state = review_req.state

View file

@ -440,6 +440,7 @@ def assign_review_request_to_reviewer(request, review_req, reviewer, add_skip=Fa
ReviewRequestDocEvent.objects.create(
type="assigned_review_request",
doc=review_req.doc,
rev=review_req.doc.rev,
by=request.user.person,
desc="Request for {} review by {} is assigned to {}".format(
review_req.type.name,
@ -513,6 +514,7 @@ def close_review_request(request, review_req, close_state):
ReviewRequestDocEvent.objects.create(
type="closed_review_request",
doc=review_req.doc,
rev=review_req.doc.rev,
by=request.user.person,
desc="Closed request for {} review by {} with state '{}'".format(
review_req.type.name, review_req.team.acronym.upper(), close_state.name),

View file

@ -82,6 +82,7 @@ def handle_substate(doc):
system = Person.objects.get(name="(system)")
DocEvent.objects.create(type="changed_document",
doc=doc,
rev=doc.rev,
desc="Sub state has been changed to <b>AD Followup</b> from <b>Revised ID Needed</b>",
by=system)
@ -173,6 +174,7 @@ def do_extend(draft, request):
type='changed_document',
by=request.user.person,
doc=draft,
rev=draft.rev,
time=draft.time,
desc='Extended expiry',
)
@ -203,6 +205,7 @@ def do_replace(draft, request):
type='changed_document',
by=request.user.person,
doc=replaced_by,
rev=replaced_by.rev,
time=draft.time,
desc='This document now replaces <b>%s</b>' % request.session['data']['replaced'],
)
@ -689,6 +692,7 @@ def edit(request, id):
e = DocEvent.objects.create(type='changed_document',
by=request.user.person,
doc=draft,
rev=draft.rev,
desc='Changed field(s): %s' % ','.join(form.changed_data))
# see EditModelForm.save() for detailed logic
form.save(commit=False)
@ -824,6 +828,7 @@ def makerfc(request, id):
e = DocEvent.objects.create(type='published_rfc',
by=request.user.person,
doc=rfc,
rev=draft.rev,
desc="Published RFC")
# change state

View file

@ -604,6 +604,7 @@ def post_process(doc):
type='changed_document',
by=Person.objects.get(name="(System)"),
doc=doc,
rev=doc.rev,
desc='Converted document to PDF',
)
doc.save_with_history([e])

View file

@ -251,6 +251,7 @@ def process_pdfs(request, meeting_num):
type='changed_document',
by=Person.objects.get(name="(System)"),
doc=doc,
rev=doc.rev,
desc='Set URL to PDF version',
)
doc.save_with_history([e])
@ -336,6 +337,7 @@ def recording_edit(request, meeting_num, name):
type='changed_document',
by=request.user.person,
doc=recording,
rev=recording.rev,
desc=u'Changed URL to %s' % recording.external_url,
)
recording.save_with_history([e])

View file

@ -219,7 +219,7 @@ def doc_detail(request, date, name):
# create new BallotPositionDocEvent
clean = form.cleaned_data
ad = Person.objects.get(id=clean['id'])
pos = BallotPositionDocEvent(doc=doc,by=login)
pos = BallotPositionDocEvent(doc=doc, rev=doc.rev, by=login)
pos.type = "changed_ballot_position"
pos.ad = ad
pos.ballot = doc.latest_event(BallotDocEvent, type="created_ballot")

View file

@ -0,0 +1,125 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.5 on 2017-03-04 11:59
from __future__ import unicode_literals
import datetime
import sys
from tqdm import tqdm
from django.db import migrations
import debug # pyflakes:ignore
rev_fix_desc = [
"Uploaded new revision",
"Request for posting confirmation",
"New version approved",
"Posted submission manually",
]
time_fix_desc = rev_fix_desc + [
"New version available",
]
untouchable_type = ['new_revision', ]
untouchable_desc = [
"IANA Action state changed",
"IANA Review state changed",
"RFC Editor state changed",
]
name_shown = False
def ename(event):
return u"event #%d %s %s by %s at %s" % (event.pk, event.doc.name, event.get_type_display().lower(), event.by.name, event.time)
def change_rev(e, r):
global name_shown
if not name_shown:
#debug.say("")
#debug.show('e.doc.name')
name_shown = True
#debug.say('Changing rev %s -> %s for %s' % (e.rev, r.rev, ename(e)))
e.rev = r.rev
e.save()
def forwards(apps, schema_editor):
global name_shown
DocEvent = apps.get_model('doc', 'DocEvent')
events = DocEvent.objects.filter(time__gt='2016-09-10', time__lt='2016-10-04', doc__type='draft').order_by('id')
#debug.say('')
#debug.show('events.count()')
docs = set()
for e in events:
docs.add(e.doc)
sys.stdout.write('\n')
for doc in tqdm(docs):
name_shown = False
if events.filter(doc=doc, type='new_revision').exists():
# first scan from past towards present and fix up time:
docevents = DocEvent.objects.filter(doc=doc).order_by('id')
prev = docevents.first()
for event in docevents:
# review_request-related events may have out-of-order times
# because of import of historical data:
if event.time < prev.time and not 'review_request' in event.type:
for desc_start in time_fix_desc:
if event.desc.startswith(desc_start):
if not name_shown:
#debug.say("")
#debug.show('doc.name')
name_shown = True
#debug.say("Fixing up time -> %s for %s" % (prev.time, ename(event)))
event.time = prev.time
event.save()
break
else:
if event.type in untouchable_type:
break
for desc_start in untouchable_desc:
if event.desc.startswith(desc_start):
break
else:
#debug.say("** Out of order time for event %s" % (ename(event),))
pass
prev = event
#
# then scan from present towards past and fix up revision:
docevents = DocEvent.objects.filter(doc=doc).order_by('-id')
seen = None
for event in docevents:
if event.type == 'new_revision':
if seen and event.rev == seen.rev:
if (seen.time - event.time) < datetime.timedelta(seconds=60):
#debug.say("Two new_revision events with the same rev: %s on %s and %s. Deleting the first." % (event.rev, seen.time, event.time))
event.delete()
else:
#debug.say("** Two new_revision events with the same rev: %s on %s and %s. Differnt time, not deleting." % (event.rev, seen.time, event.time))
pass
else:
seen = event
else:
pass
for desc_start in rev_fix_desc:
if event.desc.startswith(desc_start) and seen and event.rev != seen.rev:
if (seen.time-event.time) < datetime.timedelta(hours=2): # 2 hours is a bit arbitrary
change_rev(event, seen)
break
elif name_shown:
#debug.say('Skipping change %s -> %s (at %s) for %s ' % (event.rev, seen.rev, seen.time, ename(event), ))
pass
else:
pass
def backwards(apps, schema_editor):
pass
class Migration(migrations.Migration):
dependencies = [
('submit', '0017_auto_20161207_1046'),
]
operations = [
migrations.RunPython(forwards, backwards),
]

View file

@ -284,7 +284,7 @@ class SubmitTests(TestCase):
draft.group.save()
if not stream_type=='ietf':
draft.stream_id=stream_type
draft.save_with_history([DocEvent.objects.create(doc=draft, type="added_comment", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="added_comment", by=Person.objects.get(user__username="secretary"), desc="Test")])
if not change_authors:
draft.documentauthor_set.all().delete()
ensure_person_email_info_exists('Author Name','author@example.com')
@ -300,7 +300,7 @@ class SubmitTests(TestCase):
draft.set_state(State.objects.get(used=True, type="draft-iana-review", slug="not-ok"))
# pretend it was approved to check that we notify the RFC Editor
e = DocEvent(type="iesg_approved", doc=draft)
e = DocEvent(type="iesg_approved", doc=draft, rev=draft.rev)
e.time = draft.time
e.by = Person.objects.get(name="(System)")
e.desc = "The IESG approved the document"
@ -312,6 +312,7 @@ class SubmitTests(TestCase):
ballot_position.pos_id = "discuss"
ballot_position.type = "changed_ballot_position"
ballot_position.doc = draft
ballot_position.rev = draft.rev
ballot_position.ad = ballot_position.by = Person.objects.get(user__username="ad2")
ballot_position.save()
@ -520,7 +521,7 @@ class SubmitTests(TestCase):
def test_submit_update_individual(self):
draft = make_test_data()
draft.group = None
draft.save_with_history([DocEvent.objects.create(doc=draft, type="added_comment", by=Person.objects.get(user__username="secretary"), desc="Test")])
draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="added_comment", by=Person.objects.get(user__username="secretary"), desc="Test")])
replaces_count = draft.relateddocument_set.filter(relationship_id='replaces').count()
name = draft.name
rev = '%02d'%(int(draft.rev)+1)

View file

@ -280,7 +280,7 @@ def post_submission(request, submission, approvedDesc):
draft.tags.remove("need-rev")
draft.tags.add("ad-f-up")
e = DocEvent(type="changed_document", doc=draft)
e = DocEvent(type="changed_document", doc=draft, rev=draft.rev)
e.desc = "Sub state has been changed to <b>AD Followup</b> from <b>Revised ID Needed</b>"
e.by = system
e.save()
@ -366,7 +366,7 @@ def update_replaces_from_submission(request, submission, draft):
for r in suggested:
RelatedDocument.objects.create(source=draft, target=r, relationship=possibly_replaces)
DocEvent.objects.create(doc=draft, by=by, type="added_suggested_replaces",
DocEvent.objects.create(doc=draft, rev=draft.rev, by=by, type="added_suggested_replaces",
desc="Added suggested replacement relationships: %s" % ", ".join(d.name for d in suggested))
return approved, suggested

View file

@ -48,7 +48,7 @@ def update_rfc_log_from_protocol_page(rfc_names, rfc_must_published_later_than):
).distinct()
for d in docs:
e = DocEvent(doc=d)
e = DocEvent(doc=d, rev=d.rev)
e.by = system
e.type = "rfc_in_iana_registry"
e.desc = "IANA registries were updated to include %s" % d.display_name()
@ -296,7 +296,7 @@ def add_review_comment(doc_name, review_time, by, comment):
e = DocEvent.objects.get(doc__name=doc_name, time=review_time, type="iana_review")
except DocEvent.DoesNotExist:
doc = Document.objects.get(name=doc_name)
e = DocEvent(doc=doc, time=review_time, type="iana_review")
e = DocEvent(doc=doc, rev=doc.rev, time=review_time, type="iana_review")
e.desc = comment
e.by = by

View file

@ -163,7 +163,7 @@ def update_drafts_from_queue(drafts):
# check if we've noted it's been received
if d.get_state_slug("draft-iesg") == "ann" and not prev_state and not d.latest_event(DocEvent, type="rfc_editor_received_announcement"):
e = DocEvent(doc=d, by=system, type="rfc_editor_received_announcement")
e = DocEvent(doc=d, rev=d.rev, by=system, type="rfc_editor_received_announcement")
e.desc = "Announcement was received by RFC Editor"
e.save()
send_mail_text(None, "iesg-secretary@ietf.org", None,
@ -409,7 +409,7 @@ def update_docs_from_rfc_index(data, skip_older_than_date=None):
doc.group = Group.objects.get(type="individ") # fallback for newly created doc
if not doc.latest_event(type="published_rfc"):
e = DocEvent(doc=doc, type="published_rfc")
e = DocEvent(doc=doc, rev=doc.rev, type="published_rfc")
# unfortunately, rfc_published_date doesn't include the correct day
# at the moment because the data only has month/year, so
# try to deduce it
@ -481,6 +481,7 @@ def update_docs_from_rfc_index(data, skip_older_than_date=None):
if changes:
events.append(DocEvent.objects.create(
doc=doc,
rev=doc.rev,
by=system,
type="sync_from_rfc_editor",
desc=u"Received changes through RFC Editor sync (%s)" % u", ".join(changes),

View file

@ -22,7 +22,7 @@ class IANASyncTests(TestCase):
def test_protocol_page_sync(self):
draft = make_test_data()
DocAlias.objects.create(name="rfc1234", document=draft)
DocEvent.objects.create(doc=draft, type="published_rfc", by=Person.objects.get(name="(System)"))
DocEvent.objects.create(doc=draft, rev=draft.rev, type="published_rfc", by=Person.objects.get(name="(System)"))
rfc_names = iana.parse_protocol_page('<html><a href="/go/rfc1234/">RFC 1234</a></html>')
self.assertEqual(len(rfc_names), 1)

View file

@ -298,6 +298,7 @@ def make_test_data():
type="started_iesg_process",
by=ad,
doc=draft,
rev=draft.rev,
desc="Started IESG process",
)
@ -314,6 +315,7 @@ def make_test_data():
ballot_type=BallotType.objects.get(doc_type="draft", slug="approve"),
by=ad,
doc=draft,
rev=draft.rev,
desc="Created ballot",
)