From c10706286bdf138f20274da5fdf8b111829728e5 Mon Sep 17 00:00:00 2001 From: Henrik Levkowetz Date: Wed, 11 Mar 2020 22:02:30 +0000 Subject: [PATCH] Added a management command to check draft event revision numbers. To be extended for other checks. - Legacy-Id: 17423 --- .../check_draft_event_revision_integrity.py | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 ietf/utils/management/commands/check_draft_event_revision_integrity.py diff --git a/ietf/utils/management/commands/check_draft_event_revision_integrity.py b/ietf/utils/management/commands/check_draft_event_revision_integrity.py new file mode 100644 index 000000000..a066fcdaa --- /dev/null +++ b/ietf/utils/management/commands/check_draft_event_revision_integrity.py @@ -0,0 +1,60 @@ +# Copyright The IETF Trust 2015-2020, All Rights Reserved +# -*- coding: utf-8 -*- + + +from __future__ import absolute_import, print_function, unicode_literals + + +import collections +import datetime + +import django +django.setup() + +from django.core.management.base import BaseCommand #, CommandError + +import debug # pyflakes:ignore + +from ietf.doc.models import NewRevisionDocEvent + +RevInfo = collections.namedtuple('RevInfo', ['doc', 'event', 'rev']) + +class Command(BaseCommand): + help = """ + Check that new revision events for drafts have monotonically increasing + revision numbers and that the latest event revision number matches the + document revision number. + """ + + def add_arguments(self, parser): + default_start = datetime.datetime.now() - datetime.timedelta(days=60) + parser.add_argument( + '-d', '--from', type=str, default=default_start.strftime('%Y-%m-%d'), + help='Limit the list to messages saved after the given date (default %(default)s).', + ) + parser.add_argument('documents', nargs='*', + help="One or more files to process") + + def handle(self, *args, **options): + #verbosity = options.get("verbosity", 1) + + self.stdout.write("Checking submissions from %s" % options['from']) + + doc_rev = {} + events = NewRevisionDocEvent.objects.filter(time__gte=options['from'], doc__type_id='draft').order_by('time') + if options['documents']: + events = events.filter(doc__name__in=options['documents']) + for event in events: + if not event.rev: + self.stdout.write("Bad revision number: %s %-52s: '%s'" % (event.time, event.doc.name, event.rev)) + continue + rev = int(event.rev.lstrip('0') or '0') + doc = event.doc + #self.stdout.write("%s %-52s %02s" % (event.time, event.doc.name, event.rev)) + if doc.name in doc_rev: + if rev <= doc_rev[doc.name].rev: + self.stderr.write("%s %-50s %02d -> %02d" % (event.time, event.doc.name, doc_rev[doc.name].rev, rev)) + doc_rev[doc.name] = RevInfo(doc, event, rev) + for doc, event, rev in doc_rev.values(): + if not doc.rev == event.rev: + self.stderr.write("%-50s: doc.rev: %s != event.rev: %s" % (doc.name, doc.rev, event.rev))