Skip to content

Commit 8732dcb

Browse files
committed
fix: bring tests up current. add subseries names to rfc view. fix html.
1 parent 48cb06d commit 8732dcb

7 files changed

Lines changed: 172 additions & 12 deletions

File tree

ietf/doc/factories.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,3 +517,31 @@ def states(obj, create, extracted, **kwargs):
517517
obj.set_state(State.objects.get(type_id=state_type_id, slug=state_slug))
518518
else:
519519
obj.set_state(State.objects.get(type_id="statement", slug="active"))
520+
521+
class SubseriesFactory(factory.django.DjangoModelFactory):
522+
class Meta:
523+
model = Document
524+
skip_postgeneration_save = True
525+
526+
@factory.lazy_attribute_sequence
527+
def name(self, n):
528+
return f"{self.type_id}{n}"
529+
530+
@factory.post_generation
531+
def contains(obj, create, extracted, **kwargs):
532+
if not create:
533+
return
534+
if extracted:
535+
for doc in extracted:
536+
obj.relateddocument_set.create(relationship_id="contains",target=doc)
537+
else:
538+
obj.relateddocument_set.create(relationship_id="contains", target=RfcFactory())
539+
540+
class BcpFactory(SubseriesFactory):
541+
type_id="bcp"
542+
543+
class StdFactory(SubseriesFactory):
544+
type_id="std"
545+
546+
class FyiFactory(SubseriesFactory):
547+
type_id="fyi"

ietf/doc/tests_subseries.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# Copyright The IETF Trust 2023, All Rights Reserved
2+
# -*- coding: utf-8 -*-
3+
4+
import debug # pyflakes:ignore
5+
6+
from pyquery import PyQuery
7+
8+
from django.urls import reverse as urlreverse
9+
10+
from ietf.doc.factories import SubseriesFactory, RfcFactory
11+
from ietf.doc.models import Document
12+
from ietf.utils.test_utils import TestCase
13+
14+
class SubseriesTests(TestCase):
15+
16+
def test_index_and_view(self):
17+
types = ["bcp", "std", "fyi"]
18+
for type_id in types:
19+
doc = SubseriesFactory(type_id=type_id)
20+
self.assertEqual(len(doc.contains()), 1)
21+
rfc = doc.contains()[0]
22+
# Index
23+
url = urlreverse("ietf.doc.views_search.index_subseries", kwargs=dict(type_id=type_id))
24+
r = self.client.get(url)
25+
self.assertEqual(r.status_code, 200)
26+
q = PyQuery(r.content)
27+
self.assertIsNotNone(q(f"#{doc.name}"))
28+
self.assertIn(rfc.name,q(f"#{doc.name}").text())
29+
# Subseries document view
30+
url = urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=doc.name))
31+
r = self.client.get(url)
32+
self.assertEqual(r.status_code, 200)
33+
q = PyQuery(r.content)
34+
self.assertIn(f"{doc.type_id.upper()} {doc.name[3:]} consists of:",q("h2").text())
35+
self.assertIn(f"RFC {rfc.name[3:]}", q("div.row p a").text())
36+
# RFC view
37+
url = urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=rfc.name))
38+
r = self.client.get(url)
39+
q = PyQuery(r.content)
40+
self.assertIn(f"RFC {rfc.name[3:]} also known as {type_id.upper()} {doc.name[3:]}", q("h1").text())
41+
bcp = Document.objects.filter(type_id="bcp").last()
42+
bcp.relateddocument_set.create(relationship_id="contains", target=RfcFactory())
43+
for rfc in bcp.contains():
44+
url = urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=rfc.name))
45+
r = self.client.get(url)
46+
q = PyQuery(r.content)
47+
self.assertIn(f"RFC {rfc.name[3:]} part of BCP {bcp.name[3:]}", q("h1").text())
48+
49+

ietf/name/fixtures/names.json

Lines changed: 70 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2585,6 +2585,13 @@
25852585
"model": "doc.statetype",
25862586
"pk": "agenda"
25872587
},
2588+
{
2589+
"fields": {
2590+
"label": "bcp state"
2591+
},
2592+
"model": "doc.statetype",
2593+
"pk": "bcp"
2594+
},
25882595
{
25892596
"fields": {
25902597
"label": "State"
@@ -2704,6 +2711,13 @@
27042711
"model": "doc.statetype",
27052712
"pk": "draft-stream-ise"
27062713
},
2714+
{
2715+
"fields": {
2716+
"label": "fyi state"
2717+
},
2718+
"model": "doc.statetype",
2719+
"pk": "fyi"
2720+
},
27072721
{
27082722
"fields": {
27092723
"label": "State"
@@ -2795,6 +2809,13 @@
27952809
"model": "doc.statetype",
27962810
"pk": "statement"
27972811
},
2812+
{
2813+
"fields": {
2814+
"label": "std state"
2815+
},
2816+
"model": "doc.statetype",
2817+
"pk": "std"
2818+
},
27982819
{
27992820
"fields": {
28002821
"about_page": "ietf.group.views.group_about",
@@ -5869,7 +5890,7 @@
58695890
{
58705891
"fields": {
58715892
"desc": "The document's authors",
5872-
"template": "{% if doc.type_id == \"draft\" %}<{{doc.name}}@ietf.org>{% endif %}"
5893+
"template": "{% if doc.type_id == \"draft\" or doc.type_id == \"rfc\" %}<{{doc.name}}@ietf.org>{% endif %}"
58735894
},
58745895
"model": "mailtrigger.recipient",
58755896
"pk": "doc_authors"
@@ -10040,6 +10061,17 @@
1004010061
"model": "name.docrelationshipname",
1004110062
"pk": "conflrev"
1004210063
},
10064+
{
10065+
"fields": {
10066+
"desc": "This document contains other documents (e.g., STDs contain RFCs)",
10067+
"name": "Contains",
10068+
"order": 0,
10069+
"revname": "Is part of",
10070+
"used": true
10071+
},
10072+
"model": "name.docrelationshipname",
10073+
"pk": "contains"
10074+
},
1004310075
{
1004410076
"fields": {
1004510077
"desc": "Approval for downref",
@@ -10556,6 +10588,17 @@
1055610588
"model": "name.doctypename",
1055710589
"pk": "agenda"
1055810590
},
10591+
{
10592+
"fields": {
10593+
"desc": "",
10594+
"name": "Best Current Practice",
10595+
"order": 0,
10596+
"prefix": "bcp",
10597+
"used": true
10598+
},
10599+
"model": "name.doctypename",
10600+
"pk": "bcp"
10601+
},
1055910602
{
1056010603
"fields": {
1056110604
"desc": "",
@@ -10622,6 +10665,17 @@
1062210665
"model": "name.doctypename",
1062310666
"pk": "draft"
1062410667
},
10668+
{
10669+
"fields": {
10670+
"desc": "",
10671+
"name": "For Your Information",
10672+
"order": 0,
10673+
"prefix": "fyi",
10674+
"used": true
10675+
},
10676+
"model": "name.doctypename",
10677+
"pk": "fyi"
10678+
},
1062510679
{
1062610680
"fields": {
1062710681
"desc": "",
@@ -10754,6 +10808,17 @@
1075410808
"model": "name.doctypename",
1075510809
"pk": "statement"
1075610810
},
10811+
{
10812+
"fields": {
10813+
"desc": "",
10814+
"name": "Standard",
10815+
"order": 0,
10816+
"prefix": "std",
10817+
"used": true
10818+
},
10819+
"model": "name.doctypename",
10820+
"pk": "std"
10821+
},
1075710822
{
1075810823
"fields": {
1075910824
"desc": "",
@@ -16604,7 +16669,7 @@
1660416669
"fields": {
1660516670
"command": "xym",
1660616671
"switch": "--version",
16607-
"time": "2023-08-22T07:09:39.542Z",
16672+
"time": "2023-09-21T07:09:40.201Z",
1660816673
"used": true,
1660916674
"version": "xym 0.7.0"
1661016675
},
@@ -16615,7 +16680,7 @@
1661516680
"fields": {
1661616681
"command": "pyang",
1661716682
"switch": "--version",
16618-
"time": "2023-08-22T07:09:39.881Z",
16683+
"time": "2023-09-21T07:09:40.525Z",
1661916684
"used": true,
1662016685
"version": "pyang 2.5.3"
1662116686
},
@@ -16626,7 +16691,7 @@
1662616691
"fields": {
1662716692
"command": "yanglint",
1662816693
"switch": "--version",
16629-
"time": "2023-08-22T07:09:39.899Z",
16694+
"time": "2023-09-21T07:09:40.546Z",
1663016695
"used": true,
1663116696
"version": "yanglint SO 1.9.2"
1663216697
},
@@ -16637,7 +16702,7 @@
1663716702
"fields": {
1663816703
"command": "xml2rfc",
1663916704
"switch": "--version",
16640-
"time": "2023-08-22T07:09:40.791Z",
16705+
"time": "2023-09-21T07:09:41.465Z",
1664116706
"used": true,
1664216707
"version": "xml2rfc 3.18.0"
1664316708
},

ietf/sync/tests.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -371,10 +371,26 @@ def test_rfc_index(self):
371371
rfc_doc = Document.objects.filter(rfc_number=1234, type_id="rfc").first()
372372
self.assertIsNotNone(rfc_doc, "RFC document should have been created")
373373
rfc_events = rfc_doc.docevent_set.all()
374-
self.assertEqual(len(rfc_events), 2)
375-
self.assertEqual(rfc_events[0].type, "sync_from_rfc_editor")
376-
self.assertEqual(rfc_events[1].type, "published_rfc")
377-
self.assertEqual(rfc_events[1].time.astimezone(RPC_TZINFO).date(), today)
374+
self.assertEqual(len(rfc_events), 8)
375+
expected_events = [
376+
["sync_from_rfc_editor", f"Received changes through RFC Editor sync (created document RFC 1234, created became rfc relationship between {rfc_doc.came_from_draft().name} and RFC 1234, set title to 'A Testing RFC', set abstract to 'This is some interesting text.', set pages to 42, set standardization level to Proposed Standard, added RFC published event at 2023-09-22, created updates relation between RFC 1234 and RFC 123, added Errata tag)"],
377+
["sync_from_rfc_editor", "Added rfc1234 to std1"],
378+
["std_history_marker", "No history of STD1 is currently available in the datatracker before this point"],
379+
["sync_from_rfc_editor", "Added rfc1234 to fyi1"],
380+
["fyi_history_marker", "No history of FYI1 is currently available in the datatracker before this point"],
381+
["sync_from_rfc_editor", "Added rfc1234 to bcp1"],
382+
["bcp_history_marker", "No history of BCP1 is currently available in the datatracker before this point"],
383+
["published_rfc", "RFC published"]
384+
]
385+
for index, [event_type, desc] in enumerate(expected_events):
386+
self.assertEqual(rfc_events[index].type, event_type)
387+
self.assertEqual(rfc_events[index].desc, desc)
388+
self.assertEqual(rfc_events[7].time.astimezone(RPC_TZINFO).date(), today)
389+
for subseries_slug in ["bcp", "fyi", "std"]:
390+
sub = Document.objects.filter(type_id=subseries_slug,name=f"{subseries_slug}1").first()
391+
self.assertIsNotNone(sub, f"{subseries_slug}1 not created")
392+
self.assertTrue(rfc_doc in sub.contains())
393+
self.assertTrue(sub in rfc_doc.part_of())
378394
self.assertEqual(rfc_doc.get_state_slug(), "published")
379395
# Should have an "errata" tag because there is an errata-url in the index XML, but no "verified-errata" tag
380396
# because there is no verified item in the errata JSON with doc-id matching the RFC document.

ietf/templates/doc/document_subseries.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@
88
{{ top|safe }}
99
<h2>{{ doc.name|slice:":3"|upper }} {{ doc.name|slice:"3:"}} consists of:</h2>
1010
{% for rfc in doc.contains %}
11-
<p><a href="{% url 'ietf.doc.views_doc.document_main' name=rfc.name %}"">RFC {{rfc.name|slice:"3:"}}</a> : {{rfc.title}}</p>
11+
<p><a href="{% url 'ietf.doc.views_doc.document_main' name=rfc.name %}">RFC {{rfc.name|slice:"3:"}}</a> : {{rfc.title}}</p>
1212
{% endfor %}
1313
{% endblock %}

ietf/templates/doc/document_top.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
<h1>
66
{{ doc.title|default:"(Untitled)" }}
77
<br>
8-
<small class="text-body-secondary">{{ name }}</small>
8+
<small class="text-body-secondary">{{ name }}{% if doc.part_of %}
9+
{% for sub in doc.part_of %}{% if sub.contains|length_is:"1" %} also known as {% else %} part of {% endif %}<a href="{% url 'ietf.doc.views_doc.document_main' name=sub.name%}">{{sub.name|slice:":3"|upper}} {{sub.name|slice:"3:"}}</a>{% if not forloop.last %}, {%endif%}{% endfor %}
10+
{% endif %}</small>
911
</h1>
1012
<ul class="nav nav-tabs my-3">
1113
{% for name, t, url, active, tooltip in tabs %}

ietf/templates/doc/index_subseries.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
{% origin %}
88
<h1>{{type.name}}s</h1>
99
{% for doc in docs %}
10-
<div class="card mb-3" id={{doc.name}}>
10+
<div class="card mb-3" id="{{doc.name}}">
1111
<div class="card-header"><a href="{% url 'ietf.doc.views_doc.document_main' name=doc.name %}">{{doc.name}}</a></div>
1212
<div class="card-body">
1313
{% for rfc in doc.contains %}

0 commit comments

Comments
 (0)