[\w-]+)/$' % settings.URL_REGEXPS, views_ballot.clear_ballot),
url(r'^%(name)s/edit/deferballot/$' % settings.URL_REGEXPS, views_ballot.defer_ballot),
diff --git a/ietf/doc/views_statement.py b/ietf/doc/views_statement.py
index 9dc8c8ad697..4b85c81d838 100644
--- a/ietf/doc/views_statement.py
+++ b/ietf/doc/views_statement.py
@@ -1,4 +1,5 @@
-# Copyright The IETF Trust 2023, All Rights Reserved
+# Copyright The IETF Trust 2023-2025, All Rights Reserved
+from django.contrib import messages
import debug # pyflakes: ignore
@@ -6,10 +7,13 @@
from django import forms
from django.conf import settings
-from django.http import FileResponse, Http404
+from django.http import FileResponse, Http404, HttpResponseRedirect
from django.views.decorators.cache import cache_control
from django.shortcuts import get_object_or_404, render, redirect
from django.template.loader import render_to_string
+
+from ietf.doc.forms import ChangeStatementStateForm
+from ietf.doc.utils import add_state_change_event
from ietf.utils import markdown
from django.utils.html import escape
@@ -278,3 +282,40 @@ def new_statement(request):
}
form = NewStatementForm(initial=init)
return render(request, "doc/statement/new_statement.html", {"form": form})
+
+
+@role_required("Secretariat")
+def change_statement_state(request, name):
+ """Change state of a statement Document"""
+ statement = get_object_or_404(
+ Document.objects.filter(type_id="statement"),
+ name=name,
+ )
+ if request.method == "POST":
+ form = ChangeStatementStateForm(request.POST)
+ if form.is_valid():
+ new_state = form.cleaned_data["state"]
+ prev_state = statement.get_state()
+ if new_state == prev_state:
+ messages.info(request, f"State not changed, remains {prev_state}.")
+ else:
+ statement.set_state(new_state)
+ e = add_state_change_event(
+ statement,
+ request.user.person,
+ prev_state,
+ new_state,
+ )
+ statement.save_with_history([e])
+ messages.success(request, f"State changed to {new_state}.")
+ return HttpResponseRedirect(statement.get_absolute_url())
+ else:
+ form = ChangeStatementStateForm(initial={"state": statement.get_state()})
+ return render(
+ request,
+ "doc/statement/change_statement_state.html",
+ {
+ "form": form,
+ "statement": statement,
+ },
+ )
diff --git a/ietf/templates/doc/document_statement.html b/ietf/templates/doc/document_statement.html
index 7b9759c3e95..cc3ea5a44c4 100644
--- a/ietf/templates/doc/document_statement.html
+++ b/ietf/templates/doc/document_statement.html
@@ -1,5 +1,5 @@
{% extends "base.html" %}
-{# Copyright The IETF Trust 2023, All Rights Reserved #}
+{# Copyright The IETF Trust 2023-2025, All Rights Reserved #}
{% load origin %}
{% load static %}
{% load ietf_filters %}
@@ -49,7 +49,12 @@
|
State
|
- |
+ {% if can_manage %}
+
+ Edit
+
+ {% endif %} |
{% if doc.get_state %}
{{ doc.get_state.name }}
diff --git a/ietf/templates/doc/statement/change_statement_state.html b/ietf/templates/doc/statement/change_statement_state.html
new file mode 100644
index 00000000000..aa5cb934e84
--- /dev/null
+++ b/ietf/templates/doc/statement/change_statement_state.html
@@ -0,0 +1,22 @@
+{# Copyright The IETF Trust 2025, All Rights Reserved #}
+{% extends "base.html" %}
+{% load origin %}
+{% load django_bootstrap5 %}
+{% block title %}Change state for {{ statement }}{% endblock %}
+{% block content %}
+ {% origin %}
+
+ Change state
+
+ {{ statement }}
+
+
+{% endblock %}
\ No newline at end of file
|