Skip to content

Commit b77e617

Browse files
chore: merge main to release
2 parents 432aa3b + 24b05cc commit b77e617

14 files changed

Lines changed: 102 additions & 167 deletions

ietf/doc/tests_ballot.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44

55
import datetime
6-
from unittest import mock
76

87
from pyquery import PyQuery
98

@@ -716,11 +715,8 @@ def verify_can_see(username, url):
716715
verify_can_see(username, url)
717716

718717
class ApproveBallotTests(TestCase):
719-
@mock.patch('ietf.sync.rfceditor.requests.post', autospec=True)
720-
def test_approve_ballot(self, mock_urlopen):
721-
mock_urlopen.return_value.text = b'OK'
722-
mock_urlopen.return_value.status_code = 200
723-
#
718+
def test_approve_ballot(self):
719+
724720
ad = Person.objects.get(name="Areað Irector")
725721
draft = IndividualDraftFactory(ad=ad, intended_std_level_id='ps')
726722
draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="iesg-eva")) # make sure it's approvable

ietf/doc/tests_draft.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import os
77
import datetime
88
import io
9-
from unittest import mock
109

1110
from collections import Counter
1211
from pathlib import Path
@@ -1549,11 +1548,8 @@ def test_confirm_submission_no_doc_ad(self):
15491548

15501549

15511550
class RequestPublicationTests(TestCase):
1552-
@mock.patch('ietf.sync.rfceditor.requests.post', autospec=True)
1553-
def test_request_publication(self, mockobj):
1554-
mockobj.return_value.text = b'OK'
1555-
mockobj.return_value.status_code = 200
1556-
#
1551+
def test_request_publication(self):
1552+
15571553
draft = IndividualDraftFactory(stream_id='iab',group__acronym='iab',intended_std_level_id='inf',states=[('draft-stream-iab','approved')])
15581554

15591555
url = urlreverse('ietf.doc.views_draft.request_publication', kwargs=dict(name=draft.name))

ietf/doc/views_ballot.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -939,16 +939,6 @@ def approve_ballot(request, name):
939939
if ballot_writeup_event.pk == None:
940940
ballot_writeup_event.save()
941941

942-
if new_state.slug == "ann" and new_state.slug != prev_state.slug:
943-
# start by notifying the RFC Editor
944-
import ietf.sync.rfceditor
945-
response, error = ietf.sync.rfceditor.post_approved_draft(settings.RFC_EDITOR_SYNC_NOTIFICATION_URL, doc.name)
946-
if error:
947-
return render(request, 'doc/draft/rfceditor_post_approved_draft_failed.html',
948-
dict(name=doc.name,
949-
response=response,
950-
error=error))
951-
952942
doc.set_state(new_state)
953943
doc.tags.remove(*prev_tags)
954944

ietf/doc/views_draft.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1276,15 +1276,6 @@ class PublicationForm(forms.Form):
12761276
if form.is_valid():
12771277
events = []
12781278

1279-
# start by notifying the RFC Editor
1280-
import ietf.sync.rfceditor
1281-
response, error = ietf.sync.rfceditor.post_approved_draft(settings.RFC_EDITOR_SYNC_NOTIFICATION_URL, doc.name)
1282-
if error:
1283-
return render(request, 'doc/draft/rfceditor_post_approved_draft_failed.html',
1284-
dict(name=doc.name,
1285-
response=response,
1286-
error=error))
1287-
12881279
m.subject = form.cleaned_data["subject"]
12891280
m.body = form.cleaned_data["body"]
12901281
m.save()

ietf/settings.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -893,10 +893,7 @@ def skip_unreadable_post(record):
893893
IANA_SYNC_CHANGES_URL = "https://datatracker.iana.org:4443/data-tracker/changes"
894894
IANA_SYNC_PROTOCOLS_URL = "https://www.iana.org/protocols/"
895895

896-
RFC_EDITOR_SYNC_PASSWORD="secret"
897-
RFC_EDITOR_SYNC_NOTIFICATION_URL = "https://www.rfc-editor.org/parser/parser.php"
898896
RFC_EDITOR_GROUP_NOTIFICATION_EMAIL = "webmaster@rfc-editor.org"
899-
#RFC_EDITOR_GROUP_NOTIFICATION_URL = "https://www.rfc-editor.org/notification/group.php"
900897
RFC_EDITOR_QUEUE_URL = "https://www.rfc-editor.org/queue2.xml"
901898
RFC_EDITOR_INDEX_URL = "https://www.rfc-editor.org/rfc/rfc-index.xml"
902899
RFC_EDITOR_ERRATA_JSON_URL = "https://www.rfc-editor.org/errata.json"

ietf/stats/tests.py

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
1-
# Copyright The IETF Trust 2016-2020, All Rights Reserved
2-
# -*- coding: utf-8 -*-
3-
1+
# Copyright The IETF Trust 2016-2026, All Rights Reserved
42

53
import calendar
64
import json
75
import datetime
86

7+
from django.http import Http404
98
from pyquery import PyQuery
109

1110
import debug # pyflakes:ignore
1211

12+
from django.test import RequestFactory
1313
from django.urls import reverse as urlreverse
1414
from django.utils import timezone
1515

16+
from ietf.meeting.models import Meeting
1617
from ietf.utils.test_utils import login_testing_unauthorized, TestCase
1718
import ietf.stats.views
1819

@@ -87,7 +88,29 @@ def test_meeting_stats(self):
8788
self.assertContains(r, "/stats/meeting/124/country")
8889
self.assertContains(r, "/stats/meeting/125/country")
8990
self.assertContains(r, "This page provides a timeline of meeting registrations.")
90-
91+
92+
def test_meeting_stats_for_bad_meeting(self):
93+
self.assertFalse(Meeting.objects.filter(number=676767).exists())
94+
for stats_type in ["affiliation", "country"]:
95+
r = self.client.get(
96+
urlreverse(
97+
"ietf.stats.views.meeting_stats",
98+
kwargs={"meeting_number": 676767, "stats_type": stats_type},
99+
)
100+
)
101+
self.assertEqual(r.status_code, 404)
102+
103+
# We don't have a URL for an interim, but make sure the view will 404 if
104+
# somehow a non-interim gets selected...
105+
interim_num = MeetingFactory(type_id="interim").number
106+
request_factory = RequestFactory()
107+
with self.assertRaises(Http404):
108+
ietf.stats.views.meeting_stats(
109+
request_factory.get(f"/stats/meeting/{interim_num}/{stats_type}"),
110+
meeting_number=interim_num,
111+
stats_type=stats_type,
112+
)
113+
91114
def test_known_country_list(self):
92115
# check redirect
93116
url = urlreverse(ietf.stats.views.known_countries_list)

ietf/stats/views.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from django.contrib.auth.decorators import login_required
1414
from django.core.cache import cache
1515
from django.http import HttpResponseRedirect
16-
from django.shortcuts import render
16+
from django.shortcuts import render, get_object_or_404
1717
from django.urls import reverse as urlreverse
1818
from django.db.models import Count
1919

@@ -27,11 +27,11 @@
2727
from ietf.group.models import Role, Group
2828
from ietf.person.models import Person
2929
from ietf.name.models import ReviewResultName, CountryName, ReviewAssignmentStateName
30-
from ietf.meeting.models import Registration
30+
from ietf.meeting.models import Registration, Meeting
3131
from ietf.ietfauth.utils import has_role
3232
from ietf.utils.response import permission_denied
3333
from ietf.utils.timezone import date_today, DEADLINE_TZINFO
34-
from ietf.meeting.helpers import get_current_ietf_meeting_num, get_ietf_meeting
34+
from ietf.meeting.helpers import get_current_ietf_meeting_num
3535

3636
# Color palette for lines
3737
colors = [
@@ -568,12 +568,12 @@ def meeting_stats(request, meeting_number=None, stats_type='country'):
568568
Returns:
569569
Rendered response for the meeting stats template.
570570
"""
571-
572-
current_meeting = get_current_ietf_meeting_num()
571+
current_meeting_number = get_current_ietf_meeting_num()
573572
if meeting_number is None:
574-
meeting_number = current_meeting
575-
576-
this_meeting = get_ietf_meeting(meeting_number)
573+
meeting_number = current_meeting_number
574+
this_meeting = get_object_or_404(
575+
Meeting.objects.filter(type_id="ietf"), number=meeting_number
576+
)
577577

578578
if stats_type == 'affiliation':
579579
minimum_required = 4
@@ -616,7 +616,7 @@ def meeting_stats(request, meeting_number=None, stats_type='country'):
616616
if int(meeting_number) > 72: # No registration data before IETF-72
617617
possible_meeting_numbers.append((int(meeting_number)-1, urlreverse(meeting_stats, kwargs={'meeting_number': int(meeting_number)-1, 'stats_type': stats_type})))
618618
possible_meeting_numbers.append((meeting_number, urlreverse(meeting_stats, kwargs={'meeting_number': meeting_number, 'stats_type': stats_type})))
619-
if int(meeting_number) <= int(current_meeting): # Allow current meeting +1
619+
if int(meeting_number) <= int(current_meeting_number): # Allow current meeting +1
620620
possible_meeting_numbers.append((int(meeting_number)+1, urlreverse(meeting_stats, kwargs={'meeting_number': int(meeting_number)+1, 'stats_type': stats_type})))
621621

622622
return render(request, "stats/meeting_stats.html", {

ietf/sync/rfceditor.py

Lines changed: 0 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,15 @@
22
# -*- coding: utf-8 -*-
33

44

5-
import base64
65
import datetime
76
import re
8-
import requests
97

108
from typing import Iterator, Optional, Union
11-
from urllib.parse import urlencode
129
from xml.dom import pulldom, Node
1310

14-
from django.conf import settings
1511
from django.db import transaction
1612
from django.db.models import Subquery, OuterRef, F, Q
1713
from django.utils import timezone
18-
from django.utils.encoding import smart_bytes, force_str
1914

2015
import debug # pyflakes:ignore
2116

@@ -847,50 +842,4 @@ def parse_relation_list(rel_list: list[str]) -> list[Document]:
847842
).update(document=F("subseries_target"))
848843

849844

850-
def post_approved_draft(url, name):
851-
"""Post an approved draft to the RFC Editor so they can retrieve
852-
the data from the Datatracker and start processing it. Returns
853-
response and error (empty string if no error)."""
854-
855-
if settings.SERVER_MODE != "production":
856-
log(f"In production, would have posted RFC-Editor notification of approved I-D '{name}' to '{url}'")
857-
return "", ""
858-
859-
# HTTP basic auth
860-
username = "dtracksync"
861-
password = settings.RFC_EDITOR_SYNC_PASSWORD
862-
headers = {
863-
"Content-type": "application/x-www-form-urlencoded",
864-
"Accept": "text/plain",
865-
"Authorization": "Basic %s" % force_str(base64.encodebytes(smart_bytes("%s:%s" % (username, password)))).replace("\n", ""),
866-
}
867-
868-
log("Posting RFC-Editor notification of approved Internet-Draft '%s' to '%s'" % (name, url))
869-
text = error = ""
870-
871-
try:
872-
r = requests.post(
873-
url,
874-
headers=headers,
875-
data=smart_bytes(urlencode({ 'draft': name })),
876-
timeout=settings.DEFAULT_REQUESTS_TIMEOUT,
877-
)
878-
879-
log("RFC-Editor notification result for Internet-Draft '%s': %s:'%s'" % (name, r.status_code, r.text))
880-
881-
if r.status_code != 200:
882-
raise RuntimeError("Status code is not 200 OK (it's %s)." % r.status_code)
883-
884-
if force_str(r.text) != "OK":
885-
raise RuntimeError('Response is not "OK" (it\'s "%s").' % r.text)
886-
887-
except Exception as e:
888-
# catch everything so we don't leak exceptions, convert them
889-
# into string instead
890-
msg = "Exception on RFC-Editor notification for Internet-Draft '%s': %s: %s" % (name, type(e), str(e))
891-
log(msg)
892-
if settings.SERVER_MODE == 'test':
893-
debug.say(msg)
894-
error = str(e)
895845

896-
return text, error

ietf/sync/tests.py

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -795,30 +795,6 @@ def test_update_draft_auth48_url(self):
795795
auth48_docurl = draft.documenturl_set.filter(tag_id='auth48').first()
796796
self.assertIsNone(auth48_docurl)
797797

798-
def test_post_approved_draft_in_production_only(self):
799-
self.requests_mock.post("https://rfceditor.example.com/", status_code=200, text="OK")
800-
801-
# be careful playing with SERVER_MODE!
802-
with override_settings(SERVER_MODE="test"):
803-
self.assertEqual(
804-
rfceditor.post_approved_draft("https://rfceditor.example.com/", "some-draft"),
805-
("", "")
806-
)
807-
self.assertFalse(self.requests_mock.called)
808-
with override_settings(SERVER_MODE="development"):
809-
self.assertEqual(
810-
rfceditor.post_approved_draft("https://rfceditor.example.com/", "some-draft"),
811-
("", "")
812-
)
813-
self.assertFalse(self.requests_mock.called)
814-
with override_settings(SERVER_MODE="production"):
815-
self.assertEqual(
816-
rfceditor.post_approved_draft("https://rfceditor.example.com/", "some-draft"),
817-
("", "")
818-
)
819-
self.assertTrue(self.requests_mock.called)
820-
821-
822798
class DiscrepanciesTests(TestCase):
823799
def test_discrepancies(self):
824800

ietf/templates/doc/draft/rfceditor_post_approved_draft_failed.html

Lines changed: 0 additions & 26 deletions
This file was deleted.

0 commit comments

Comments
 (0)