Skip to content

Commit 7b35c09

Browse files
Eliminate the officehours timeslot type, update/renumber migrations, mark offagenda/reserved TimeSlotTypeNames as not used, add a 'none' SessionPurposeName and disallow null, update agenda filter keywords/filter helpers, fix broken tests and general debugging
- Legacy-Id: 19550
1 parent 3dfce7b commit 7b35c09

38 files changed

Lines changed: 1012 additions & 478 deletions

ietf/doc/tests.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
from ietf.group.models import Group
4141
from ietf.group.factories import GroupFactory, RoleFactory
4242
from ietf.ipr.factories import HolderIprDisclosureFactory
43-
from ietf.meeting.models import Meeting, Session, SessionPresentation, SchedulingEvent
43+
from ietf.meeting.models import Meeting, SessionPresentation, SchedulingEvent
4444
from ietf.meeting.factories import ( MeetingFactory, SessionFactory, SessionPresentationFactory,
4545
ProceedingsMaterialFactory )
4646

@@ -1473,12 +1473,12 @@ def test_document_material(self):
14731473
)
14741474
doc.set_state(State.objects.get(type="slides", slug="active"))
14751475

1476-
session = Session.objects.create(
1476+
session = SessionFactory(
14771477
name = "session-72-mars-1",
14781478
meeting = Meeting.objects.get(number='72'),
14791479
group = Group.objects.get(acronym='mars'),
14801480
modified = datetime.datetime.now(),
1481-
type_id = 'regular',
1481+
add_to_schedule=False,
14821482
)
14831483
SchedulingEvent.objects.create(
14841484
session=session,

ietf/doc/tests_material.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
from ietf.doc.models import Document, State, DocAlias, NewRevisionDocEvent
1818
from ietf.group.factories import RoleFactory
1919
from ietf.group.models import Group
20-
from ietf.meeting.factories import MeetingFactory
21-
from ietf.meeting.models import Meeting, Session, SessionPresentation, SchedulingEvent
20+
from ietf.meeting.factories import MeetingFactory, SessionFactory
21+
from ietf.meeting.models import Meeting, SessionPresentation, SchedulingEvent
2222
from ietf.name.models import SessionStatusName
2323
from ietf.person.models import Person
2424
from ietf.utils.test_utils import TestCase, login_testing_unauthorized
@@ -152,12 +152,11 @@ def test_edit_title(self):
152152
def test_revise(self):
153153
doc = self.create_slides()
154154

155-
session = Session.objects.create(
155+
session = SessionFactory(
156156
name = "session-42-mars-1",
157157
meeting = Meeting.objects.get(number='42'),
158158
group = Group.objects.get(acronym='mars'),
159159
modified = datetime.datetime.now(),
160-
type_id='regular',
161160
)
162161
SchedulingEvent.objects.create(
163162
session=session,

ietf/group/migrations/0051_groupfeatures_session_purposes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class Migration(migrations.Migration):
1212

1313
dependencies = [
1414
('group', '0050_populate_groupfeatures_agenda_filter_type'),
15-
('name', '0035_sessionpurposename'),
15+
('name', '0034_sessionpurposename'),
1616
]
1717

1818
operations = [

ietf/group/migrations/0052_populate_groupfeatures_session_purposes.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,23 @@
77

88
default_purposes = dict(
99
adhoc=['presentation'],
10-
adm=['closed_meeting', 'office_hours'],
10+
adm=['closed_meeting', 'officehours'],
1111
ag=['regular'],
1212
area=['regular'],
1313
dir=['open_meeting', 'presentation', 'regular', 'social', 'tutorial'],
1414
iab=['closed_meeting', 'regular'],
15-
iabasg=['closed_meeting', 'open_meeting'],
16-
iana=['office_hours'],
15+
iabasg=['closed_meeting', 'officehours', 'open_meeting'],
16+
iana=['officehours'],
1717
iesg=['closed_meeting', 'open_meeting'],
1818
ietf=['admin', 'plenary', 'presentation', 'social'],
1919
irtf=[],
20-
ise=['office_hours'],
21-
isoc=['office_hours', 'open_meeting', 'presentation'],
22-
nomcom=['closed_meeting', 'office_hours'],
20+
ise=['officehours'],
21+
isoc=['officehours', 'open_meeting', 'presentation'],
22+
nomcom=['closed_meeting', 'officehours'],
2323
program=['regular', 'tutorial'],
2424
rag=['regular'],
2525
review=['open_meeting', 'social'],
26-
rfcedtyp=['office_hours'],
26+
rfcedtyp=['officehours'],
2727
rg=['regular'],
2828
team=['coding', 'presentation', 'social', 'tutorial'],
2929
wg=['regular'],
@@ -55,7 +55,7 @@ class Migration(migrations.Migration):
5555

5656
dependencies = [
5757
('group', '0051_groupfeatures_session_purposes'),
58-
('name', '0036_populate_sessionpurposename'),
58+
('name', '0035_populate_sessionpurposename'),
5959

6060
]
6161

ietf/meeting/ajax.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from ietf.ietfauth.utils import role_required, has_role
1111
from ietf.meeting.helpers import get_meeting, get_schedule, schedule_permissions, get_person_by_email, get_schedule_by_name
1212
from ietf.meeting.models import TimeSlot, Session, Schedule, Room, Constraint, SchedTimeSessAssignment, ResourceAssociation
13-
from ietf.meeting.views import edit_timeslots, edit_schedule
13+
from ietf.meeting.views import edit_timeslots, edit_meeting_schedule
1414

1515
import debug # pyflakes:ignore
1616

@@ -286,7 +286,7 @@ def schedule_add(request, meeting):
286286
if "HTTP_ACCEPT" in request.META and "application/json" in request.META['HTTP_ACCEPT']:
287287
return redirect(schedule_infourl, meeting.number, newschedule.owner_email(), newschedule.name)
288288
else:
289-
return redirect(edit_schedule, meeting.number, newschedule.owner_email(), newschedule.name)
289+
return redirect(edit_meeting_schedule, meeting.number, newschedule.owner_email(), newschedule.name)
290290

291291
@require_POST
292292
def schedule_update(request, meeting, schedule):
@@ -325,7 +325,7 @@ def schedule_update(request, meeting, schedule):
325325
return HttpResponse(json.dumps(schedule.json_dict(request.build_absolute_uri('/'))),
326326
content_type="application/json")
327327
else:
328-
return redirect(edit_schedule, meeting.number, schedule.owner_email(), schedule.name)
328+
return redirect(edit_meeting_schedule, meeting.number, schedule.owner_email(), schedule.name)
329329

330330
@role_required('Secretariat')
331331
def schedule_del(request, meeting, schedule):

ietf/meeting/factories.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
from ietf.meeting.models import (Meeting, Session, SchedulingEvent, Schedule,
1313
TimeSlot, SessionPresentation, FloorPlan, Room, SlideSubmission, Constraint,
1414
MeetingHost, ProceedingsMaterial)
15-
from ietf.name.models import ConstraintName, SessionStatusName, ProceedingsMaterialTypeName, TimerangeName
15+
from ietf.name.models import (ConstraintName, SessionStatusName, ProceedingsMaterialTypeName,
16+
TimerangeName, SessionPurposeName)
1617
from ietf.doc.factories import ProceedingsMaterialDocFactory
1718
from ietf.group.factories import GroupFactory
1819
from ietf.person.factories import PersonFactory
@@ -104,9 +105,11 @@ class Meta:
104105
model = Session
105106

106107
meeting = factory.SubFactory(MeetingFactory)
107-
type_id='regular'
108+
purpose_id = 'regular'
109+
type_id = 'regular'
108110
group = factory.SubFactory(GroupFactory)
109111
requested_duration = datetime.timedelta(hours=1)
112+
on_agenda = factory.lazy_attribute(lambda obj: SessionPurposeName.objects.get(pk=obj.purpose_id).on_agenda)
110113

111114
@factory.post_generation
112115
def status_id(obj, create, extracted, **kwargs):
@@ -128,7 +131,7 @@ def status_id(obj, create, extracted, **kwargs):
128131
status=SessionStatusName.objects.get(slug=extracted),
129132
by=PersonFactory(),
130133
)
131-
134+
132135
@factory.post_generation
133136
def add_to_schedule(obj, create, extracted, **kwargs): # pylint: disable=no-self-argument
134137
'''

ietf/meeting/fields.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
from ietf.name.models import SessionPurposeName, TimeSlotTypeName
77

8-
import debug
8+
import debug # pyflakes: ignore
99

1010
class SessionPurposeAndTypeWidget(forms.MultiWidget):
1111
css_class = 'session_purpose_widget' # class to apply to all widgets

ietf/meeting/helpers.py

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ def _session_name_keyword(self, session):
310310

311311
@property
312312
def filterable_purposes(self):
313-
return SessionPurposeName.objects.exclude(slug='regular').order_by('name')
313+
return SessionPurposeName.objects.exclude(slug='none').order_by('name')
314314

315315

316316
class AgendaFilterOrganizer(AgendaKeywordTool):
@@ -336,7 +336,7 @@ class AgendaFilterOrganizer(AgendaKeywordTool):
336336
# group acronyms in this list will never be used as filter buttons
337337
exclude_acronyms = ('iesg', 'ietf', 'secretariat')
338338
# extra keywords to include in the no-heading column if they apply to any sessions
339-
extra_labels = ('BoF', 'Plenary')
339+
extra_labels = ('BoF',)
340340
# group types whose acronyms should be word-capitalized
341341
capitalized_group_types = ('team',)
342342
# group types whose acronyms should be all-caps
@@ -352,6 +352,8 @@ def __init__(self, *, single_category=False, **kwargs):
352352
# filled in when _organize_filters() is called
353353
self.filter_categories = None
354354
self.special_filters = None
355+
if self._use_legacy_keywords():
356+
self.extra_labels += ('Plenary',) # need this when not using session purpose
355357

356358
def get_non_area_keywords(self):
357359
"""Get list of any 'non-area' (aka 'special') keywords
@@ -465,11 +467,14 @@ def _non_group_filters(self):
465467

466468
# Call legacy version for older meetings
467469
if self._use_legacy_keywords():
468-
return self._legacy_non_group_filters()
470+
return self._legacy_non_group_filters(sessions)
469471

470472
# Not using legacy version
471473
filter_cols = []
472474
for purpose in self.filterable_purposes:
475+
if purpose.slug == 'regular':
476+
continue
477+
473478
# Map label to its keyword, discarding duplicate labels.
474479
# This does what we want as long as sessions with the same
475480
# name and purpose belong to the same group.
@@ -497,19 +502,16 @@ def _non_group_filters(self):
497502

498503
return filter_cols
499504

500-
def _legacy_non_group_filters(self):
505+
def _legacy_non_group_filters(self, sessions):
501506
"""Get list of non-group filters for older meetings
502507
503508
Returns a list of filter columns
504509
"""
505-
if self.assignments is None:
506-
return [] # can only use timeslot type when we have assignments
507-
508510
office_hours_items = set()
509511
suffix = ' office hours'
510-
for a in self.assignments:
511-
if a.session.name.lower().endswith(suffix):
512-
office_hours_items.add((a.session.name[:-len(suffix)].strip(), a.session.group))
512+
for s in sessions:
513+
if s.name.lower().endswith(suffix):
514+
office_hours_items.add((s.name[:-len(suffix)].strip(), s.group))
513515

514516
headings = []
515517
# currently we only do office hours
@@ -640,8 +642,7 @@ def _tag_assignments_with_filter_keywords(self):
640642
Keywords are all lower case.
641643
"""
642644
for a in self.assignments:
643-
a.filter_keywords = {a.slot_type().slug.lower()}
644-
a.filter_keywords.update(self._filter_keywords_for_assignment(a))
645+
a.filter_keywords = self._filter_keywords_for_assignment(a)
645646
a.filter_keywords = sorted(list(a.filter_keywords))
646647

647648
def _tag_sessions_with_filter_keywords(self):
@@ -652,14 +653,17 @@ def _tag_sessions_with_filter_keywords(self):
652653
@staticmethod
653654
def _legacy_extra_session_keywords(session):
654655
"""Get extra keywords for a session at a legacy meeting"""
656+
extra = []
657+
if session.type_id == 'plenary':
658+
extra.append('plenary')
655659
office_hours_match = re.match(r'^ *\w+(?: +\w+)* +office hours *$', session.name, re.IGNORECASE)
656660
if office_hours_match is not None:
657661
suffix = 'officehours'
658-
return [
662+
extra.extend([
659663
'officehours',
660664
session.name.lower().replace(' ', '')[:-len(suffix)] + '-officehours',
661-
]
662-
return []
665+
])
666+
return extra
663667

664668
def _filter_keywords_for_session(self, session):
665669
keywords = set()

ietf/meeting/migrations/0050_populate_session_on_agenda.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ def forward(apps, schema_editor):
1515
),
1616
timeslot__type__private=True,
1717
)
18-
Session.objects.filter(timeslotassignments__in=private_assignments).update(on_agenda=False)
18+
for pa in private_assignments:
19+
pa.session.on_agenda = False
20+
pa.session.save()
1921
# Also update any sessions to match their purpose's default setting (this intentionally
2022
# overrides the timeslot settings above, but that is unlikely to matter because the
2123
# purposes will roll out at the same time as the on_agenda field)

ietf/meeting/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1162,7 +1162,7 @@ class Session(models.Model):
11621162
meeting = ForeignKey(Meeting)
11631163
name = models.CharField(blank=True, max_length=255, help_text="Name of session, in case the session has a purpose rather than just being a group meeting.")
11641164
short = models.CharField(blank=True, max_length=32, help_text="Short version of 'name' above, for use in filenames.")
1165-
purpose = ForeignKey(SessionPurposeName, null=True, help_text='Purpose of the session')
1165+
purpose = ForeignKey(SessionPurposeName, null=False, help_text='Purpose of the session')
11661166
type = ForeignKey(TimeSlotTypeName)
11671167
group = ForeignKey(Group) # The group type historically determined the session type. BOFs also need to be added as a group. Note that not all meeting requests have a natural group to associate with.
11681168
joint_with_groups = models.ManyToManyField(Group, related_name='sessions_joint_in',blank=True)

0 commit comments

Comments
 (0)