From e86bf0194b93b99b203382277616839c96aded59 Mon Sep 17 00:00:00 2001 From: Henrik Levkowetz Date: Wed, 9 Sep 2020 14:09:43 +0000 Subject: [PATCH] Added an assertion to catch an unexpected document state (no IESG state set). Updated the log.assertion() function to accept a "note" argument, for more informative assertion messages. - Legacy-Id: 18479 --- ietf/doc/factories.py | 3 +++ ietf/doc/views_doc.py | 3 ++- ietf/utils/log.py | 12 +++++++++--- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/ietf/doc/factories.py b/ietf/doc/factories.py index a773029bc..1e8359f14 100644 --- a/ietf/doc/factories.py +++ b/ietf/doc/factories.py @@ -205,9 +205,12 @@ class RgRfcFactory(RgDraftFactory): obj.set_state(State.objects.get(type_id=state_type_id,slug=state_slug)) if not obj.get_state('draft-stream-irtf'): obj.set_state(State.objects.get(type_id='draft-stream-irtf', slug='pub')) + if not obj.get_state('draft-iesg'): + obj.set_state(State.objects.get(type_id='draft-iesg',slug='idexists')) else: obj.set_state(State.objects.get(type_id='draft',slug='rfc')) obj.set_state(State.objects.get(type_id='draft-stream-irtf', slug='pub')) + obj.set_state(State.objects.get(type_id='draft-iesg',slug='idexists')) class CharterFactory(BaseDocumentFactory): diff --git a/ietf/doc/views_doc.py b/ietf/doc/views_doc.py index ae0cf09a9..2310488ce 100644 --- a/ietf/doc/views_doc.py +++ b/ietf/doc/views_doc.py @@ -76,7 +76,7 @@ from ietf.meeting.utils import group_sessions, get_upcoming_manageable_sessions, from ietf.review.models import ReviewAssignment from ietf.review.utils import can_request_review_of_doc, review_assignments_to_list_for_docs from ietf.review.utils import no_review_from_teams_on_doc -from ietf.utils import markup_txt +from ietf.utils import markup_txt, log from ietf.utils.response import permission_denied from ietf.utils.text import maybe_split @@ -174,6 +174,7 @@ def document_main(request, name, rev=None): split_content = not ( request.GET.get('include_text') or request.COOKIES.get("full_draft", settings.USER_PREFERENCE_DEFAULTS["full_draft"]) == "on" ) iesg_state = doc.get_state("draft-iesg") + log.assertion('iesg_state', note="A document's 'draft-iesg' state should never be unset'. Failed for %s"%doc.name) iesg_state_slug = iesg_state.slug if iesg_state else None iesg_state_summary = doc.friendly_state() irsg_state = doc.get_state("draft-stream-irtf") diff --git a/ietf/utils/log.py b/ietf/utils/log.py index c6d8ebc88..b2aca86b8 100644 --- a/ietf/utils/log.py +++ b/ietf/utils/log.py @@ -119,7 +119,7 @@ def build_traceback(stack): break return tb -def assertion(statement, state=True): +def assertion(statement, state=True, note=None): """ This acts like an assertion. It uses the django logger in order to send the failed assertion and a backtrace as for an internal server error. @@ -128,7 +128,10 @@ def assertion(statement, state=True): value = eval(statement, frame.f_globals, frame.f_locals) if bool(value) != bool(state): if (settings.DEBUG is True) or (settings.SERVER_MODE == 'test') : - raise AssertionError("Assertion failed: '%s': %s != %s." % (statement, repr(value), state)) + if note: + raise AssertionError("Assertion failed: '%s': %s != %s (%s)." % (statement, repr(value), state, note)) + else: + raise AssertionError("Assertion failed: '%s': %s != %s." % (statement, repr(value), state)) else: # build a simulated traceback object tb = build_traceback(inspect.stack()[1:]) @@ -137,7 +140,10 @@ def assertion(statement, state=True): for key in [ 'request', 'status_code', ]: if key in frame.f_locals: extra[key] = frame.f_locals[key] - logger.error("Assertion failed: '%s': %s != %s", statement, repr(value), state, exc_info=(AssertionError, None, tb), extra=extra) + if note: + logger.error("Assertion failed: '%s': %s != %s (%s)", statement, repr(value), state, note, exc_info=(AssertionError, None, tb), extra=extra) + else: + logger.error("Assertion failed: '%s': %s != %s", statement, repr(value), state, exc_info=(AssertionError, None, tb), extra=extra) def unreachable(date="(unknown)"): "Raises an assertion or sends traceback to admins if executed."