Skip to content

Commit 3957743

Browse files
committed
Move Session.status, .requested, and .requested_by to a new SchedulingEvent
- Legacy-Id: 17122
1 parent 0555879 commit 3957743

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1140
-671
lines changed

ietf/api/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def get(self, request):
6969
person = get_object_or_404(self.model, user=request.user)
7070
expand = ['searchrule', 'documentauthor', 'ad_document_set', 'ad_dochistory_set', 'docevent',
7171
'ballotpositiondocevent', 'deletedevent', 'email_set', 'groupevent', 'role', 'rolehistory', 'iprdisclosurebase',
72-
'iprevent', 'liaisonstatementevent', 'whitelisted', 'schedule', 'constraint', 'session', 'message',
72+
'iprevent', 'liaisonstatementevent', 'whitelisted', 'schedule', 'constraint', 'schedulingevent', 'message',
7373
'sendqueue', 'nominee', 'topicfeedbacklastseen', 'alias', 'email', 'apikeys', 'personevent',
7474
'reviewersettings', 'reviewsecretarysettings', 'unavailableperiod', 'reviewwish',
7575
'nextreviewerinteam', 'reviewrequest', 'meetingregistration', 'submissionevent', 'preapproval',

ietf/doc/tests.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
from ietf.group.models import Group
4040
from ietf.group.factories import GroupFactory, RoleFactory
4141
from ietf.ipr.factories import HolderIprDisclosureFactory
42-
from ietf.meeting.models import Meeting, Session, SessionPresentation
42+
from ietf.meeting.models import Meeting, Session, SessionPresentation, SchedulingEvent
4343
from ietf.meeting.factories import MeetingFactory, SessionFactory
4444
from ietf.name.models import SessionStatusName, BallotPositionName
4545
from ietf.person.models import Person
@@ -712,11 +712,14 @@ def test_document_material(self):
712712
name = "session-72-mars-1",
713713
meeting = Meeting.objects.get(number='72'),
714714
group = Group.objects.get(acronym='mars'),
715-
status = SessionStatusName.objects.create(slug='scheduled', name='Scheduled'),
716715
modified = datetime.datetime.now(),
717-
requested_by = Person.objects.get(user__username="marschairman"),
718716
type_id = "session",
719-
)
717+
)
718+
SchedulingEvent.objects.create(
719+
session=session,
720+
status=SessionStatusName.objects.create(slug='scheduled'),
721+
by = Person.objects.get(user__username="marschairman"),
722+
)
720723
SessionPresentation.objects.create(session=session, document=doc, rev=doc.rev)
721724

722725
r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=doc.name)))

ietf/doc/tests_material.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from ietf.group.factories import RoleFactory
2121
from ietf.group.models import Group
2222
from ietf.meeting.factories import MeetingFactory
23-
from ietf.meeting.models import Meeting, Session, SessionPresentation
23+
from ietf.meeting.models import Meeting, Session, SessionPresentation, SchedulingEvent
2424
from ietf.name.models import SessionStatusName
2525
from ietf.person.models import Person
2626
from ietf.utils.test_utils import TestCase, login_testing_unauthorized
@@ -158,11 +158,14 @@ def test_revise(self):
158158
name = "session-42-mars-1",
159159
meeting = Meeting.objects.get(number='42'),
160160
group = Group.objects.get(acronym='mars'),
161-
status = SessionStatusName.objects.create(slug='scheduled', name='Scheduled'),
162161
modified = datetime.datetime.now(),
163-
requested_by = Person.objects.get(user__username="marschairman"),
164162
type_id="session",
165-
)
163+
)
164+
SchedulingEvent.objects.create(
165+
session=session,
166+
status=SessionStatusName.objects.create(slug='scheduled'),
167+
by = Person.objects.get(user__username="marschairman"),
168+
)
166169
SessionPresentation.objects.create(session=session, document=doc, rev=doc.rev)
167170

168171
url = urlreverse('ietf.doc.views_material.edit_material', kwargs=dict(name=doc.name, action="revise"))

ietf/doc/views_doc.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,13 @@
6868
from ietf.group.utils import can_manage_group_type, can_manage_materials, group_features_role_filter
6969
from ietf.ietfauth.utils import ( has_role, is_authorized_in_doc_stream, user_is_person,
7070
role_required, is_individual_draft_author)
71-
from ietf.name.models import StreamName, BallotPositionName
71+
from ietf.name.models import StreamName, BallotPositionName, SessionStatusName
7272
from ietf.utils.history import find_history_active_at
7373
from ietf.doc.forms import TelechatForm, NotifyForm
7474
from ietf.doc.mails import email_comment
7575
from ietf.mailtrigger.utils import gather_relevant_expansions
7676
from ietf.meeting.models import Session
77-
from ietf.meeting.utils import group_sessions, get_upcoming_manageable_sessions, sort_sessions
77+
from ietf.meeting.utils import group_sessions, get_upcoming_manageable_sessions, sort_sessions, add_event_info_to_session_qs
7878
from ietf.review.models import ReviewAssignment
7979
from ietf.review.utils import can_request_review_of_doc, review_assignments_to_list_for_docs
8080
from ietf.review.utils import no_review_from_teams_on_doc
@@ -1345,9 +1345,13 @@ def add_sessionpresentation(request,name):
13451345
def all_presentations(request, name):
13461346
doc = get_object_or_404(Document, name=name)
13471347

1348+
sessions = add_event_info_to_session_qs(
1349+
doc.session_set.filter(type__in=['session','plenary','other'])
1350+
).filter(current_status__in=['sched','schedw','appr','canceled'])
13481351

1349-
sessions = doc.session_set.filter(status__in=['sched','schedw','appr','canceled'],
1350-
type__in=['session','plenary','other'])
1352+
status_names = {n.slug: n.name for n in SessionStatusName.objects.all()}
1353+
for session in sessions:
1354+
session.current_status_name = status_names.get(session.current_status, session.current_status)
13511355

13521356
future, in_progress, past = group_sessions(sessions)
13531357

ietf/group/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def interim_approval_roles(self):
7070
return list(set([ role for role in self.parent.role_set.filter(name__in=['ad', 'chair']) ]))
7171

7272
def is_bof(self):
73-
return (self.state.slug in ["bof", "bof-conc"])
73+
return self.state_id in ["bof", "bof-conc"]
7474

7575
class Meta:
7676
abstract = True

ietf/group/views.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@
8888
from ietf.ietfauth.utils import has_role, is_authorized_in_group
8989
from ietf.mailtrigger.utils import gather_relevant_expansions
9090
from ietf.meeting.helpers import get_meeting
91-
from ietf.meeting.utils import group_sessions
91+
from ietf.meeting.utils import group_sessions, add_event_info_to_session_qs
9292
from ietf.name.models import GroupTypeName, StreamName
9393
from ietf.person.models import Email
9494
from ietf.review.models import ReviewRequest, ReviewAssignment, ReviewerSettings, ReviewSecretarySettings
@@ -750,9 +750,14 @@ def meetings(request, acronym=None, group_type=None):
750750

751751
four_years_ago = datetime.datetime.now()-datetime.timedelta(days=4*365)
752752

753-
sessions = group.session_set.filter(status__in=['sched','schedw','appr','canceled'],
754-
meeting__date__gt=four_years_ago,
755-
type__in=['session','plenary','other'])
753+
sessions = add_event_info_to_session_qs(
754+
group.session_set.filter(
755+
meeting__date__gt=four_years_ago,
756+
type__in=['session','plenary','other']
757+
)
758+
).filter(
759+
current_status__in=['sched','schedw','appr','canceled'],
760+
)
756761

757762
future, in_progress, past = group_sessions(sessions)
758763

ietf/mailtrigger/models.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,10 @@ def gather_session_requester(self, **kwargs):
355355
addrs=[]
356356
if 'session' in kwargs:
357357
session = kwargs['session']
358-
addrs.append(session.requested_by.role_email('chair').address)
358+
from ietf.meeting.models import SchedulingEvent
359+
first_event = SchedulingEvent.objects.filter(session=session).select_related('by').order_by('time', 'id').first()
360+
if first_event and first_event.status_id in ['appw', 'schedw']:
361+
addrs.append(first_event.by.role_email('chair').address)
359362
return addrs
360363

361364
def gather_review_team_ads(self, **kwargs):

ietf/meeting/admin.py

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
from ietf.meeting.models import (Meeting, Room, Session, TimeSlot, Constraint, Schedule,
1010
SchedTimeSessAssignment, ResourceAssociation, FloorPlan, UrlResource,
11-
SessionPresentation, ImportantDate, SlideSubmission, )
11+
SessionPresentation, ImportantDate, SlideSubmission, SchedulingEvent)
1212

1313

1414
class UrlResourceAdmin(admin.ModelAdmin):
@@ -80,20 +80,51 @@ def name_lower(self, instance):
8080

8181
admin.site.register(Constraint, ConstraintAdmin)
8282

83+
class SchedulingEventInline(admin.TabularInline):
84+
model = SchedulingEvent
85+
raw_id_fields = ["by"]
86+
8387
class SessionAdmin(admin.ModelAdmin):
84-
list_display = ["meeting", "name", "group", "attendees", "requested", "status"]
88+
list_display = ["meeting", "name", "group", "attendees", "requested", "current_status"]
8589
list_filter = ["meeting", ]
86-
raw_id_fields = ["meeting", "group", "requested_by", "materials"]
90+
raw_id_fields = ["meeting", "group", "materials"]
8791
search_fields = ["meeting__number", "name", "group__name", "group__acronym", ]
88-
ordering = ["-requested"]
89-
92+
ordering = ["-id"]
93+
inlines = [SchedulingEventInline]
94+
95+
96+
def get_queryset(self, request):
97+
qs = super(SessionAdmin, self).get_queryset(request)
98+
return qs.prefetch_related('schedulingevent_set')
99+
100+
def current_status(self, instance):
101+
events = sorted(instance.schedulingevent_set.all(), key=lambda e: (e.time, e.id))
102+
if events:
103+
return events[-1].time
104+
else:
105+
return None
106+
107+
def requested(self, instance):
108+
events = sorted(instance.schedulingevent_set.all(), key=lambda e: (e.time, e.id))
109+
if events:
110+
return events[0].time
111+
else:
112+
return None
113+
90114
def name_lower(self, instance):
91115
return instance.name.name.lower()
92116

93117
name_lower.short_description = "constraint name" # type: ignore # https://github.com/python/mypy/issues/2087
94118

95119
admin.site.register(Session, SessionAdmin)
96120

121+
class SchedulingEventAdmin(admin.ModelAdmin):
122+
list_display = ["session", "status", "time", "by"]
123+
raw_id_fields = ["session", "by"]
124+
ordering = ["-id"]
125+
126+
admin.site.register(SchedulingEvent, SchedulingEventAdmin)
127+
97128
class ScheduleAdmin(admin.ModelAdmin):
98129
list_display = ["name", "meeting", "owner", "visible", "public", "badness"]
99130
list_filter = ["meeting", ]

ietf/meeting/ajax.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
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_schedule
14+
from ietf.meeting.utils import only_sessions_that_can_meet
15+
from ietf.meeting.utils import add_event_info_to_session_qs
1416

1517
import debug # pyflakes:ignore
1618

@@ -431,7 +433,11 @@ def session_json(request, num, sessionid):
431433
def sessions_json(request, num):
432434
meeting = get_meeting(num)
433435

434-
sessions = meeting.sessions_that_can_meet.all()
436+
sessions = add_event_info_to_session_qs(
437+
only_sessions_that_can_meet(meeting.session_set),
438+
requested_time=True,
439+
requested_by=True,
440+
)
435441

436442
sess1_dict = [ x.json_dict(request.build_absolute_uri('/')) for x in sessions ]
437443
return HttpResponse(json.dumps(sess1_dict, sort_keys=True, indent=2),

ietf/meeting/factories.py

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

1111
from django.core.files.base import ContentFile
1212

13-
from ietf.meeting.models import Meeting, Session, Schedule, TimeSlot, SessionPresentation, FloorPlan, Room, SlideSubmission
13+
from ietf.meeting.models import Meeting, Session, SchedulingEvent, Schedule, TimeSlot, SessionPresentation, FloorPlan, Room, SlideSubmission
14+
from ietf.name.models import SessionStatusName
1415
from ietf.group.factories import GroupFactory
1516
from ietf.person.factories import PersonFactory
1617

@@ -83,9 +84,28 @@ class Meta:
8384
meeting = factory.SubFactory(MeetingFactory)
8485
type_id='session'
8586
group = factory.SubFactory(GroupFactory)
86-
requested_by = factory.SubFactory(PersonFactory)
87-
status_id='sched'
8887

88+
@factory.post_generation
89+
def status_id(obj, create, extracted, **kwargs):
90+
if create:
91+
if not extracted:
92+
extracted = 'sched'
93+
94+
if extracted not in ['apprw', 'schedw']:
95+
# requested event
96+
SchedulingEvent.objects.create(
97+
session=obj,
98+
status=SessionStatusName.objects.get(slug='schedw'),
99+
by=PersonFactory(),
100+
)
101+
102+
# actual state event
103+
SchedulingEvent.objects.create(
104+
session=obj,
105+
status=SessionStatusName.objects.get(slug=extracted),
106+
by=PersonFactory(),
107+
)
108+
89109
@factory.post_generation
90110
def add_to_schedule(obj, create, extracted, **kwargs): # pylint: disable=no-self-argument
91111
'''

0 commit comments

Comments
 (0)