assignments on the base schedule are shown in the pages for the schedule, read-only. This allows managing things like breaks and misc sessions separately from the regular WG sessions. Base schedules are not allowed to be the base of other base schedules (the hierarchy can only be one level deep) to simplify the mental model and the code. Add link for creating new schedules instead of relying on copying Empty-Schedule and change the meeting creation code to no longer create the special Empty-Schedule. Instead a "base" schedule is created and a first schedule with the name and permissions of the user creating the meeting, using "base" as base. Speed up a couple of the Secretariat/AD agenda views by adding prefetches. - Legacy-Id: 18355
203 lines
11 KiB
Python
203 lines
11 KiB
Python
# Copyright The IETF Trust 2013-2020, All Rights Reserved
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
import datetime
|
|
|
|
from django.utils.text import slugify
|
|
|
|
import debug # pyflakes:ignore
|
|
|
|
|
|
from ietf.doc.factories import DocumentFactory
|
|
from ietf.group.models import Group
|
|
from ietf.meeting.models import (Meeting, Room, TimeSlot, Session, Schedule, SchedTimeSessAssignment,
|
|
ResourceAssociation, SessionPresentation, UrlResource, SchedulingEvent)
|
|
from ietf.meeting.helpers import create_interim_meeting
|
|
from ietf.name.models import RoomResourceName
|
|
from ietf.person.models import Person
|
|
from ietf.utils.test_data import make_test_data
|
|
|
|
def make_interim_meeting(group,date,status='sched'):
|
|
system_person = Person.objects.get(name="(System)")
|
|
time = datetime.datetime.combine(date, datetime.time(9))
|
|
meeting = create_interim_meeting(group=group,date=date)
|
|
session = Session.objects.create(meeting=meeting, group=group,
|
|
attendees=10,
|
|
requested_duration=datetime.timedelta(minutes=20),
|
|
remote_instructions='http://webex.com',
|
|
type_id='regular')
|
|
SchedulingEvent.objects.create(session=session, status_id=status, by=system_person)
|
|
slot = TimeSlot.objects.create(
|
|
meeting=meeting,
|
|
type_id='regular',
|
|
duration=session.requested_duration,
|
|
time=time)
|
|
SchedTimeSessAssignment.objects.create(
|
|
timeslot=slot,
|
|
session=session,
|
|
schedule=session.meeting.schedule)
|
|
# agenda
|
|
name = "agenda-%s-%s-%s" % (meeting.number, group.acronym, "01")
|
|
rev = '00'
|
|
file = "%s-%s.txt" % (name, rev)
|
|
doc = DocumentFactory.create(name=name, type_id='agenda', title="Agenda",
|
|
uploaded_filename=file, group=group, rev=rev, states=[('draft','active')])
|
|
pres = SessionPresentation.objects.create(session=session, document=doc, rev=doc.rev)
|
|
session.sessionpresentation_set.add(pres)
|
|
# minutes
|
|
name = "minutes-%s-%s" % (meeting.number, time.strftime("%Y%m%d%H%M"))
|
|
rev = '00'
|
|
file = "%s-%s.txt" % (name, rev)
|
|
doc = DocumentFactory.create(name=name, type_id='minutes', title="Minutes",
|
|
uploaded_filename=file, group=group, rev=rev, states=[('draft','active')])
|
|
pres = SessionPresentation.objects.create(session=session, document=doc, rev=doc.rev)
|
|
session.sessionpresentation_set.add(pres)
|
|
# slides
|
|
title = "Slideshow"
|
|
|
|
name = "slides-%s-sessa-%s" % (meeting.number, slugify(title))
|
|
rev = '00'
|
|
file = "%s-%s.txt" % (name, rev)
|
|
doc = DocumentFactory.create(name=name, type_id='slides', title=title,
|
|
uploaded_filename=file, group=group, rev=rev,
|
|
states=[('slides','active'), ('reuse_policy', 'single')])
|
|
pres = SessionPresentation.objects.create(session=session, document=doc, rev=doc.rev)
|
|
session.sessionpresentation_set.add(pres)
|
|
#
|
|
return meeting
|
|
|
|
def make_meeting_test_data(meeting=None):
|
|
if not Group.objects.filter(acronym='mars'):
|
|
make_test_data()
|
|
system_person = Person.objects.get(name="(System)")
|
|
plainman = Person.objects.get(user__username="plain")
|
|
#secretary = Person.objects.get(user__username="secretary") ## not used
|
|
|
|
if not meeting:
|
|
meeting = Meeting.objects.get(number="72", type="ietf")
|
|
base_schedule = Schedule.objects.create(meeting=meeting, owner=plainman, name="base", visible=True, public=True)
|
|
schedule = Schedule.objects.create(meeting=meeting, owner=plainman, name="test-schedule", visible=True, public=True, base=base_schedule)
|
|
unofficial_schedule = Schedule.objects.create(meeting=meeting, owner=plainman, name="test-unofficial-schedule", visible=True, public=True, base=base_schedule)
|
|
|
|
# test room
|
|
pname = RoomResourceName.objects.create(name='projector',slug='proj')
|
|
projector = ResourceAssociation.objects.create(name=pname,icon="notfound.png",desc="Basic projector")
|
|
room = Room.objects.create(meeting=meeting, name="Test Room", capacity=123, functional_name="Testing Ground")
|
|
room.session_types.add('regular')
|
|
room.resources.add(projector)
|
|
asname = RoomResourceName.objects.get(slug='audiostream')
|
|
UrlResource.objects.create(name=asname, room=room, url='http://ietf{number}streaming.dnsalias.net/ietf/ietf{number}1.m3u'.format(number=meeting.number))
|
|
|
|
# other rooms
|
|
breakfast_room = Room.objects.create(meeting=meeting, name="Breakfast Room", capacity=40)
|
|
breakfast_room.session_types.add("lead")
|
|
break_room = Room.objects.create(meeting=meeting, name="Break Area", capacity=500)
|
|
break_room.session_types.add("break")
|
|
reg_room = Room.objects.create(meeting=meeting, name="Registration Area", capacity=500)
|
|
reg_room.session_types.add("reg")
|
|
|
|
# slots
|
|
session_date = meeting.date + datetime.timedelta(days=1)
|
|
slot1 = TimeSlot.objects.create(meeting=meeting, type_id='regular', location=room,
|
|
duration=datetime.timedelta(minutes=60),
|
|
time=datetime.datetime.combine(session_date, datetime.time(9, 30)))
|
|
slot2 = TimeSlot.objects.create(meeting=meeting, type_id='regular', location=room,
|
|
duration=datetime.timedelta(minutes=60),
|
|
time=datetime.datetime.combine(session_date, datetime.time(10, 50)))
|
|
breakfast_slot = TimeSlot.objects.create(meeting=meeting, type_id="lead", location=breakfast_room,
|
|
duration=datetime.timedelta(minutes=90),
|
|
time=datetime.datetime.combine(session_date, datetime.time(7,0)))
|
|
reg_slot = TimeSlot.objects.create(meeting=meeting, type_id="reg", location=reg_room,
|
|
duration=datetime.timedelta(minutes=480),
|
|
time=datetime.datetime.combine(session_date, datetime.time(9,0)))
|
|
break_slot = TimeSlot.objects.create(meeting=meeting, type_id="break", location=break_room,
|
|
duration=datetime.timedelta(minutes=90),
|
|
time=datetime.datetime.combine(session_date, datetime.time(7,0)))
|
|
# mars WG
|
|
mars = Group.objects.get(acronym='mars')
|
|
mars_session = Session.objects.create(meeting=meeting, group=mars,
|
|
attendees=10, requested_duration=datetime.timedelta(minutes=50),
|
|
type_id='regular')
|
|
SchedulingEvent.objects.create(session=mars_session, status_id='schedw', by=system_person)
|
|
SchedTimeSessAssignment.objects.create(timeslot=slot1, session=mars_session, schedule=schedule)
|
|
SchedTimeSessAssignment.objects.create(timeslot=slot2, session=mars_session, schedule=unofficial_schedule)
|
|
|
|
# ames WG
|
|
ames_session = Session.objects.create(meeting=meeting, group=Group.objects.get(acronym="ames"),
|
|
attendees=10,
|
|
requested_duration=datetime.timedelta(minutes=60),
|
|
type_id='regular')
|
|
SchedulingEvent.objects.create(session=ames_session, status_id='schedw', by=system_person)
|
|
SchedTimeSessAssignment.objects.create(timeslot=slot2, session=ames_session, schedule=schedule)
|
|
SchedTimeSessAssignment.objects.create(timeslot=slot1, session=ames_session, schedule=unofficial_schedule)
|
|
|
|
# IESG breakfast
|
|
iesg_session = Session.objects.create(meeting=meeting, group=Group.objects.get(acronym="iesg"),
|
|
name="IESG Breakfast", attendees=25,
|
|
requested_duration=datetime.timedelta(minutes=60),
|
|
type_id="lead")
|
|
SchedulingEvent.objects.create(session=iesg_session, status_id='schedw', by=system_person)
|
|
SchedTimeSessAssignment.objects.create(timeslot=breakfast_slot, session=iesg_session, schedule=schedule)
|
|
# No breakfast on unofficial schedule
|
|
|
|
# Registration
|
|
reg_session = Session.objects.create(meeting=meeting, group=Group.objects.get(acronym="secretariat"),
|
|
name="Registration", attendees=250,
|
|
requested_duration=datetime.timedelta(minutes=480),
|
|
type_id="reg")
|
|
SchedulingEvent.objects.create(session=reg_session, status_id='schedw', by=system_person)
|
|
SchedTimeSessAssignment.objects.create(timeslot=reg_slot, session=reg_session, schedule=base_schedule)
|
|
|
|
# Break
|
|
break_session = Session.objects.create(meeting=meeting, group=Group.objects.get(acronym="secretariat"),
|
|
name="Morning Break", attendees=250,
|
|
requested_duration=datetime.timedelta(minutes=30),
|
|
type_id="break")
|
|
SchedulingEvent.objects.create(session=break_session, status_id='schedw', by=system_person)
|
|
SchedTimeSessAssignment.objects.create(timeslot=break_slot, session=break_session, schedule=base_schedule)
|
|
|
|
meeting.schedule = schedule
|
|
meeting.save()
|
|
|
|
# Convenience for the tests
|
|
meeting.unofficial_schedule = unofficial_schedule
|
|
|
|
|
|
doc = DocumentFactory.create(name='agenda-72-mars', type_id='agenda', title="Agenda",
|
|
uploaded_filename="agenda-72-mars.txt", group=mars, rev='00', states=[('agenda','active')])
|
|
pres = SessionPresentation.objects.create(session=mars_session,document=doc,rev=doc.rev)
|
|
mars_session.sessionpresentation_set.add(pres) #
|
|
|
|
doc = DocumentFactory.create(name='minutes-72-mars', type_id='minutes', title="Minutes",
|
|
uploaded_filename="minutes-72-mars.md", group=mars, rev='00', states=[('minutes','active')])
|
|
pres = SessionPresentation.objects.create(session=mars_session,document=doc,rev=doc.rev)
|
|
mars_session.sessionpresentation_set.add(pres)
|
|
|
|
doc = DocumentFactory.create(name='slides-72-mars-1-active', type_id='slides', title="Slideshow",
|
|
uploaded_filename="slides-72-mars.txt", group=mars, rev='00',
|
|
states=[('slides','active'), ('reuse_policy', 'single')])
|
|
pres = SessionPresentation.objects.create(session=mars_session,document=doc,rev=doc.rev)
|
|
mars_session.sessionpresentation_set.add(pres)
|
|
|
|
doc = DocumentFactory.create(name='slides-72-mars-2-deleted', type_id='slides',
|
|
title="Bad Slideshow", uploaded_filename="slides-72-mars-2-deleted.txt", group=mars, rev='00',
|
|
states=[('slides','deleted'), ('reuse_policy', 'single')])
|
|
pres = SessionPresentation.objects.create(session=mars_session,document=doc,rev=doc.rev)
|
|
mars_session.sessionpresentation_set.add(pres)
|
|
|
|
# Future Interim Meetings
|
|
date = datetime.date.today() + datetime.timedelta(days=365)
|
|
date2 = datetime.date.today() + datetime.timedelta(days=1000)
|
|
ames = Group.objects.get(acronym="ames")
|
|
|
|
make_interim_meeting(group=mars,date=date,status='sched')
|
|
make_interim_meeting(group=mars,date=date2,status='apprw')
|
|
make_interim_meeting(group=ames,date=date,status='canceled')
|
|
make_interim_meeting(group=ames,date=date2,status='apprw')
|
|
|
|
return meeting
|
|
|
|
|
|
|