Repository: ietf-tools/datatracker

Issue:
Add editorial stream to meeting materials view
### Description

With #6027, `rsab` and `rswg` are listed under **Editorial stream** but at the moment meeting materials view lists the `rsab` and `rswg` under [**Other Miscellaneous other sessions**](https://datatracker.ietf.org/meeting/117/materials/#other).

### Code of Conduct

- [X] I agree to follow the [IETF's Code of Conduct](https://github.com/ietf-tools/.github/blob/main/CODE_OF_CONDUCT.md)


Discussion:

Resolving patch:
diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py
--- a/ietf/meeting/views.py
+++ b/ietf/meeting/views.py
@@ -159,18 +159,19 @@ def materials(request, num=None):
     irtf      = sessions.filter(group__parent__acronym = 'irtf')
     training  = sessions.filter(group__acronym__in=['edu','iaoc'], type_id__in=['regular', 'other', ])
     iab       = sessions.filter(group__parent__acronym = 'iab')
+    editorial      = sessions.filter(group__acronym__in=['rsab','rswg'])
 
-    session_pks = [s.pk for ss in [plenaries, ietf, irtf, training, iab] for s in ss]
+    session_pks = [s.pk for ss in [plenaries, ietf, irtf, training, iab, editorial] for s in ss]
     other     = sessions.filter(type__in=['regular'], group__type__features__has_meetings=True).exclude(pk__in=session_pks)
 
-    for topic in [plenaries, ietf, training, irtf, iab]:
+    for topic in [plenaries, ietf, training, irtf, iab, editorial]:
         for event in topic:
             date_list = []
             for slide_event in event.all_meeting_slides(): date_list.append(slide_event.time)
             for agenda_event in event.all_meeting_agendas(): date_list.append(agenda_event.time)
             if date_list: setattr(event, 'last_update', sorted(date_list, reverse=True)[0])
 
-    for session_list in [plenaries, ietf, training, irtf, iab, other]:
+    for session_list in [plenaries, ietf, training, irtf, iab, editorial, other]:
         for session in session_list:
             session.past_cutoff_date = past_cutoff_date
 
@@ -183,6 +184,7 @@ def materials(request, num=None):
     irtf, _ = organize_proceedings_sessions(irtf)
     training, _ = organize_proceedings_sessions(training)
     iab, _ = organize_proceedings_sessions(iab)
+    editorial, _ = organize_proceedings_sessions(editorial)
     other, _ = organize_proceedings_sessions(other)
 
     ietf_areas = []
@@ -202,6 +204,7 @@ def materials(request, num=None):
             'training': training,
             'irtf': irtf,
             'iab': iab,
+            'editorial': editorial,
             'other': other,
             'cut_off_date': cut_off_date,
             'cor_cut_off_date': cor_cut_off_date,


Test patch:
diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py
--- a/ietf/meeting/tests_views.py
+++ b/ietf/meeting/tests_views.py
@@ -648,6 +648,20 @@ def do_test_materials(self, meeting, session):
             self.assertFalse(row.find("a:contains(\"Bad Slideshow\")"))
 
             # test with no meeting number in url
+            # Add various group sessions
+            groups = []
+            parent_groups = [
+                    GroupFactory.create(type_id="area", acronym="gen"),
+                    GroupFactory.create(acronym="iab"),
+                    GroupFactory.create(acronym="irtf"),
+                    ]
+            for parent in parent_groups:
+                groups.append(GroupFactory.create(parent=parent))
+            for acronym in ["rsab", "edu"]:
+                groups.append(GroupFactory.create(acronym=acronym))
+            for group in groups:
+                SessionFactory(meeting=meeting, group=group)
+            self.write_materials_files(meeting, session)
             url = urlreverse("ietf.meeting.views.materials", kwargs=dict())
             r = self.client.get(url)
             self.assertEqual(r.status_code, 200)
@@ -657,6 +671,10 @@ def do_test_materials(self, meeting, session):
             self.assertTrue(row.find('a:contains("Minutes")'))
             self.assertTrue(row.find('a:contains("Slideshow")'))
             self.assertFalse(row.find("a:contains(\"Bad Slideshow\")"))
+            # test for different sections
+            sections = ["plenaries", "gen", "iab", "editorial", "irtf", "training"]
+            for section in sections:
+                self.assertEqual(len(q(f"#{section}")), 1, f"{section} section should exists in proceedings")
 
             # test with a loggged-in wg chair
             self.client.login(username="marschairman", password="marschairman+password")