From ea1d21a45cc777906c4751c9d0fce056e693324d Mon Sep 17 00:00:00 2001 From: Henrik Levkowetz Date: Thu, 19 Mar 2020 22:44:08 +0000 Subject: [PATCH] Added another check to the check_draft_event_revision_integrity management command, and refined it somewhat. - Legacy-Id: 17469 --- .../check_draft_event_revision_integrity.py | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/ietf/utils/management/commands/check_draft_event_revision_integrity.py b/ietf/utils/management/commands/check_draft_event_revision_integrity.py index 6f0719334..b92b01c27 100644 --- a/ietf/utils/management/commands/check_draft_event_revision_integrity.py +++ b/ietf/utils/management/commands/check_draft_event_revision_integrity.py @@ -7,6 +7,7 @@ from __future__ import absolute_import, print_function, unicode_literals import collections import datetime +import pprint import django django.setup() @@ -15,7 +16,7 @@ from django.core.management.base import BaseCommand #, CommandError import debug # pyflakes:ignore -from ietf.doc.models import NewRevisionDocEvent +from ietf.doc.models import DocHistory, NewRevisionDocEvent from ietf.submit.models import Submission, SubmissionEvent RevInfo = collections.namedtuple('RevInfo', ['doc', 'event', 'rev']) @@ -39,17 +40,33 @@ class Command(BaseCommand): def check_objects(self, queryset, timeattr, docattr): revs = {} self.stdout.write(" Checking %s ..." % queryset.model.__name__) + def to_dict(instance): + from itertools import chain + opts = instance._meta + data = {} + for f in chain(opts.concrete_fields, opts.private_fields): + data[f.name] = f.value_from_object(instance) + for f in opts.many_to_many: + data[f.name] = [i.pk for i in f.value_from_object(instance)] + return data for obj in queryset: doc = getattr(obj, docattr) time = getattr(obj, timeattr) if not obj.rev: - self.stdout.write("Bad revision number: %s %-52s: '%s'" % (time, doc.name, obj.rev)) + if not doc.is_rfc(): + self.stdout.write("Bad revision number: %-52s: '%s'" % (doc.name, obj.rev)) continue rev = int(obj.rev.lstrip('0') or '0') #self.stdout.write("%s %-52s %02s" % (time, doc.name, obj.rev)) if doc.name in revs: - if rev <= revs[doc.name].rev: - self.stderr.write("%s %-50s %02d -> %02d" % (time, doc.name, revs[doc.name].rev, rev)) + prev = revs[doc.name] + if rev <= prev.rev: + docd = to_dict(doc) + prevd = to_dict(prev.doc) + if prevd != docd: + self.stderr.write("%s %-50s %02d -> %02d" % (time, doc.name, prev.rev, rev)) + self.stderr.write(pprint.pformat(prevd)) + self.stderr.write(pprint.pformat(docd)) revs[doc.name] = RevInfo(doc, obj, rev) for doc, obj, rev in revs.values(): if not doc.rev == obj.rev: @@ -64,6 +81,7 @@ class Command(BaseCommand): for model, timeattr, docattr in [ (NewRevisionDocEvent, 'time', 'doc'), (Submission, 'submission_date', 'draft'), + (DocHistory, 'time', 'doc'), ]: filter = { '%s__gte'%timeattr: options['from'],