From 7f1c1e43f264ad132b624faec66f83b4930153d8 Mon Sep 17 00:00:00 2001 From: Henrik Levkowetz Date: Mon, 7 Nov 2016 18:21:34 +0000 Subject: [PATCH] Replaced the use of plain DocEvent for submission doc events with a SubmissionDocEvent that carries rev and a FK to submission. - Legacy-Id: 12275 --- .../doc/migrations/0015_auto_20161101_2313.py | 32 +++++++++++++++++++ ietf/doc/models.py | 6 ++++ ietf/doc/resources.py | 29 ++++++++++++++++- ietf/doc/utils.py | 12 +++---- ietf/submit/tests.py | 8 ++--- ietf/submit/utils.py | 22 +++++++------ 6 files changed, 89 insertions(+), 20 deletions(-) create mode 100644 ietf/doc/migrations/0015_auto_20161101_2313.py diff --git a/ietf/doc/migrations/0015_auto_20161101_2313.py b/ietf/doc/migrations/0015_auto_20161101_2313.py new file mode 100644 index 000000000..129a24495 --- /dev/null +++ b/ietf/doc/migrations/0015_auto_20161101_2313.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('submit', '0016_fix_duplicate_upload_docevents'), + ('doc', '0014_auto_20160524_2147'), + ] + + operations = [ + migrations.CreateModel( + name='SubmissionDocEvent', + fields=[ + ('docevent_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='doc.DocEvent')), + ('rev', models.CharField(max_length=16)), + ('submission', models.ForeignKey(to='submit.Submission')), + ], + options={ + }, + bases=('doc.docevent',), + ), + migrations.AlterField( + model_name='docevent', + name='type', + field=models.CharField(max_length=50, choices=[(b'new_revision', b'Added new revision'), (b'new_submission', b'Uploaded new revision'), (b'changed_document', b'Changed document metadata'), (b'added_comment', b'Added comment'), (b'added_message', b'Added message'), (b'deleted', b'Deleted document'), (b'changed_state', b'Changed state'), (b'changed_stream', b'Changed document stream'), (b'expired_document', b'Expired document'), (b'extended_expiry', b'Extended expiry of document'), (b'requested_resurrect', b'Requested resurrect'), (b'completed_resurrect', b'Completed resurrect'), (b'changed_consensus', b'Changed consensus'), (b'published_rfc', b'Published RFC'), (b'added_suggested_replaces', b'Added suggested replacement relationships'), (b'reviewed_suggested_replaces', b'Reviewed suggested replacement relationships'), (b'changed_group', b'Changed group'), (b'changed_protocol_writeup', b'Changed protocol writeup'), (b'changed_charter_milestone', b'Changed charter milestone'), (b'initial_review', b'Set initial review time'), (b'changed_review_announcement', b'Changed WG Review text'), (b'changed_action_announcement', b'Changed WG Action text'), (b'started_iesg_process', b'Started IESG process on document'), (b'created_ballot', b'Created ballot'), (b'closed_ballot', b'Closed ballot'), (b'sent_ballot_announcement', b'Sent ballot announcement'), (b'changed_ballot_position', b'Changed ballot position'), (b'changed_ballot_approval_text', b'Changed ballot approval text'), (b'changed_ballot_writeup_text', b'Changed ballot writeup text'), (b'changed_rfc_editor_note_text', b'Changed RFC Editor Note text'), (b'changed_last_call_text', b'Changed last call text'), (b'requested_last_call', b'Requested last call'), (b'sent_last_call', b'Sent last call'), (b'scheduled_for_telechat', b'Scheduled for telechat'), (b'iesg_approved', b'IESG approved document (no problem)'), (b'iesg_disapproved', b'IESG disapproved document (do not publish)'), (b'approved_in_minute', b'Approved in minute'), (b'iana_review', b'IANA review comment'), (b'rfc_in_iana_registry', b'RFC is in IANA registry'), (b'rfc_editor_received_announcement', b'Announcement was received by RFC Editor'), (b'requested_publication', b'Publication at RFC Editor requested'), (b'sync_from_rfc_editor', b'Received updated information from RFC Editor')]), + preserve_default=True, + ), + ] diff --git a/ietf/doc/models.py b/ietf/doc/models.py index 33f2ffef0..818e9cd87 100644 --- a/ietf/doc/models.py +++ b/ietf/doc/models.py @@ -663,6 +663,7 @@ class DocReminder(models.Model): EVENT_TYPES = [ # core events ("new_revision", "Added new revision"), + ("new_submission", "Uploaded new revision"), ("changed_document", "Changed document metadata"), ("added_comment", "Added comment"), ("added_message", "Added message"), @@ -865,6 +866,11 @@ class AddedMessageEvent(DocEvent): in_reply_to = models.ForeignKey(ietf.message.models.Message, null=True, blank=True,related_name='doc_irtomanual') +class SubmissionDocEvent(DocEvent): + import ietf.submit.models + rev = models.CharField(max_length=16) + submission = models.ForeignKey(ietf.submit.models.Submission) + # dumping store for removed events class DeletedEvent(models.Model): content_type = models.ForeignKey(ContentType) diff --git a/ietf/doc/resources.py b/ietf/doc/resources.py index 3df4ebd8d..1d76e222d 100644 --- a/ietf/doc/resources.py +++ b/ietf/doc/resources.py @@ -11,7 +11,7 @@ from ietf.doc.models import (BallotType, DeletedEvent, StateType, State, Documen DocumentAuthor, DocEvent, StateDocEvent, DocHistory, ConsensusDocEvent, DocAlias, TelechatDocEvent, DocReminder, LastCallDocEvent, NewRevisionDocEvent, WriteupDocEvent, InitialReviewDocEvent, DocHistoryAuthor, BallotDocEvent, RelatedDocument, - RelatedDocHistory, BallotPositionDocEvent, AddedMessageEvent) + RelatedDocHistory, BallotPositionDocEvent, AddedMessageEvent, SubmissionDocEvent) from ietf.name.resources import BallotPositionNameResource, DocTypeNameResource @@ -542,3 +542,30 @@ class AddedMessageEventResource(ModelResource): } api.doc.register(AddedMessageEventResource()) + + +from ietf.person.resources import PersonResource +from ietf.submit.resources import SubmissionResource +class SubmissionDocEventResource(ModelResource): + by = ToOneField(PersonResource, 'by') + doc = ToOneField(DocumentResource, 'doc') + docevent_ptr = ToOneField(DocEventResource, 'docevent_ptr') + submission = ToOneField(SubmissionResource, 'submission') + class Meta: + queryset = SubmissionDocEvent.objects.all() + serializer = api.Serializer() + cache = SimpleCache() + #resource_name = 'submissiondocevent' + filtering = { + "id": ALL, + "time": ALL, + "type": ALL, + "desc": ALL, + "rev": ALL, + "by": ALL_WITH_RELATIONS, + "doc": ALL_WITH_RELATIONS, + "docevent_ptr": ALL_WITH_RELATIONS, + "submission": ALL_WITH_RELATIONS, + } +api.doc.register(SubmissionDocEventResource()) + diff --git a/ietf/doc/utils.py b/ietf/doc/utils.py index 626a14dd2..7d4f95118 100644 --- a/ietf/doc/utils.py +++ b/ietf/doc/utils.py @@ -238,12 +238,12 @@ def augment_events_with_revision(doc, events): while event_revisions and (e.time, e.id) < (event_revisions[-1]["time"], event_revisions[-1]["id"]): event_revisions.pop() - if event_revisions: - cur_rev = event_revisions[-1]["rev"] - else: - cur_rev = "00" - - e.rev = cur_rev + if not hasattr(e, 'rev'): + if event_revisions: + cur_rev = event_revisions[-1]["rev"] + else: + cur_rev = "00" + e.rev = cur_rev def add_links_in_new_revision_events(doc, events, diff_revisions): """Add direct .txt links and diff links to new_revision events.""" diff --git a/ietf/submit/tests.py b/ietf/submit/tests.py index 8e599facc..d61411b9c 100644 --- a/ietf/submit/tests.py +++ b/ietf/submit/tests.py @@ -374,7 +374,7 @@ class SubmitTests(TestCase): self.assertEqual(r.status_code, 302) # check we have document events - doc_events = draft.docevent_set.filter(type="added_comment") + doc_events = draft.docevent_set.filter(type__in=["new_submission", "added_comment"]) edescs = '::'.join([x.desc for x in doc_events]) self.assertTrue('New version approved' in edescs) self.assertTrue('Uploaded new revision' in edescs) @@ -386,17 +386,17 @@ class SubmitTests(TestCase): docevents = list(draft.docevent_set.all().order_by("-time", "-id")) # Latest events are first (this is the default, but we make it explicit) # Assert event content in chronological order: - self.assertEqual(docevents[4].type, "added_comment") + self.assertEqual(docevents[4].type, "new_submission") self.assertIn("Uploaded new revision", docevents[4].desc) self.assertEqual(docevents[4].by.name, "Submitter Name") self.assertGreater(docevents[4].id, docevents[5].id) # - self.assertEqual(docevents[3].type, "added_comment") + self.assertEqual(docevents[3].type, "new_submission") self.assertIn("Request for posting confirmation", docevents[3].desc) self.assertEqual(docevents[3].by.name, "(System)") self.assertGreater(docevents[3].id, docevents[4].id) # - self.assertEqual(docevents[2].type, "added_comment") + self.assertEqual(docevents[2].type, "new_submission") self.assertIn("New version approved", docevents[2].desc) self.assertEqual(docevents[2].by.name, "(System)") self.assertGreater(docevents[2].id, docevents[3].id) diff --git a/ietf/submit/utils.py b/ietf/submit/utils.py index 5a1ba7b97..b3338fb1b 100644 --- a/ietf/submit/utils.py +++ b/ietf/submit/utils.py @@ -5,7 +5,7 @@ from django.conf import settings import debug # pyflakes:ignore -from ietf.doc.models import ( Document, State, DocAlias, DocEvent, +from ietf.doc.models import ( Document, State, DocAlias, DocEvent, SubmissionDocEvent, DocumentAuthor, AddedMessageEvent ) from ietf.doc.models import NewRevisionDocEvent from ietf.doc.models import RelatedDocument, DocRelationshipName @@ -129,11 +129,13 @@ def docevent_from_submission(request, submission, desc, who=None): else: by = system - e = DocEvent.objects.create( + e = SubmissionDocEvent.objects.create( doc=draft, by = by, - type = "added_comment", + type = "new_submission", desc = desc, + submission = submission, + rev = submission.rev, ) return e @@ -145,12 +147,12 @@ def post_rev00_submission_events(draft, submission, submitter): desc = subevent.desc if desc.startswith("Uploaded submission"): desc = "Uploaded new revision" - e = DocEvent(type="added_comment", doc=draft) + e = SubmissionDocEvent(type="new_submission", doc=draft, submission=submission, rev=submission.rev ) elif desc.startswith("Submission created"): - e = DocEvent(type="added_comment", doc=draft) + e = SubmissionDocEvent(type="new_submission", doc=draft, submission=submission, rev=submission.rev) elif desc.startswith("Set submitter to"): pos = subevent.desc.find("sent confirmation email") - e = DocEvent(type="added_comment", doc=draft) + e = SubmissionDocEvent(type="new_submission", doc=draft, submission=submission, rev=submission.rev) if pos > 0: desc = "Request for posting confirmation emailed %s" % (subevent.desc[pos + 23:]) else: @@ -224,11 +226,13 @@ def post_submission(request, submission, approvedDesc): events += post_rev00_submission_events(draft, submission, submitter) # Add an approval docevent - e = DocEvent.objects.create( - type="added_comment", + e = SubmissionDocEvent.objects.create( + type="new_submission", doc=draft, by=system, - desc=approvedDesc + desc=approvedDesc, + submission=submission, + rev=submission.rev, ) events.append(e)