Turn sessions into regular sessions and non-sessions into misc.

sessions in the UI and code to avoid ambiguity.

This doesn't change the data in the DB except for uses of
TimeSlotTypeName where 'session' is now 'regular'.
 - Legacy-Id: 17128
This commit is contained in:
Ole Laursen 2019-12-06 20:02:26 +00:00
parent 6920c179cd
commit 568670c060
36 changed files with 202 additions and 160 deletions

View file

@ -713,7 +713,7 @@ class DocTestCase(TestCase):
meeting = Meeting.objects.get(number='72'),
group = Group.objects.get(acronym='mars'),
modified = datetime.datetime.now(),
type_id = "session",
type_id = 'regular',
)
SchedulingEvent.objects.create(
session=session,

View file

@ -159,7 +159,7 @@ class GroupMaterialTests(TestCase):
meeting = Meeting.objects.get(number='42'),
group = Group.objects.get(acronym='mars'),
modified = datetime.datetime.now(),
type_id="session",
type_id='regular',
)
SchedulingEvent.objects.create(
session=session,

View file

@ -1346,7 +1346,7 @@ def all_presentations(request, name):
doc = get_object_or_404(Document, name=name)
sessions = add_event_info_to_session_qs(
doc.session_set.filter(type__in=['session','plenary','other'])
doc.session_set.filter(type__in=['regular','plenary','other'])
).filter(current_status__in=['sched','schedw','appr','canceled'])
status_names = {n.slug: n.name for n in SessionStatusName.objects.all()}

View file

@ -753,7 +753,7 @@ def meetings(request, acronym=None, group_type=None):
sessions = add_event_info_to_session_qs(
group.session_set.filter(
meeting__date__gt=four_years_ago,
type__in=['session','plenary','other']
type__in=['regular','plenary','other']
)
).filter(
current_status__in=['sched','schedw','appr','canceled'],

View file

@ -161,8 +161,8 @@ AddSlotForm = modelform_factory(TimeSlot, exclude=('meeting','name','location','
# no authorization required to list.
def timeslot_slotlist(request, mtg):
slots = mtg.timeslot_set.all()
# Restrict graphical editing to slots of type 'session' for now
slots = slots.filter(type__slug='session')
# Restrict graphical editing to slots of type 'regular' for now
slots = slots.filter(type__slug='regular')
json_array=[]
for slot in slots:
json_array.append(slot.json_dict(request.build_absolute_uri('/')))
@ -209,14 +209,14 @@ def timeslot_updslot(request, meeting, slotid):
slot.save()
# WORKAROUND: Right now, if there are sessions scheduled in this timeslot
# when it is marked unavailable (or any other value besides "session") they
# when it is marked unavailable (or any other value besides 'regular') they
# become unreachable from the editing screen. The session is listed in the
# "unscheduled" block incorrectly, and drag-dropping it onto the a new
# timeslot produces erroneous results. To avoid this, we will silently
# unschedule any sessions in the timeslot that has just been made
# unavailable.
if slot.type_id != 'session':
if slot.type_id != 'regular':
slot.sessionassignments.all().delete()
# ENDWORKAROUND

View file

@ -82,7 +82,7 @@ class SessionFactory(factory.DjangoModelFactory):
model = Session
meeting = factory.SubFactory(MeetingFactory)
type_id='session'
type_id='regular'
group = factory.SubFactory(GroupFactory)
@factory.post_generation
@ -139,7 +139,7 @@ class TimeSlotFactory(factory.DjangoModelFactory):
model = TimeSlot
meeting = factory.SubFactory(MeetingFactory)
type_id = 'session'
type_id = 'regular'
@factory.post_generation
def location(obj, create, extracted, **kwargs): # pylint: disable=no-self-argument

View file

@ -245,7 +245,7 @@ class InterimSessionModelForm(forms.ModelForm):
never gets called"""
session = super(InterimSessionModelForm, self).save(commit=kwargs.get('commit', True))
session.group = self.group
session.type_id = 'session'
session.type_id = 'regular'
return session
def save_agenda(self):

View file

@ -73,7 +73,7 @@ def get_areas():
# get list of areas that are referenced.
def get_area_list_from_sessions(assignments, num):
return assignments.filter(timeslot__type = 'Session',
return assignments.filter(timeslot__type = 'regular',
session__group__parent__isnull = False).order_by(
'session__group__parent__acronym').distinct().values_list(
'session__group__parent__acronym',flat=True)
@ -82,7 +82,7 @@ def build_all_agenda_slices(meeting):
time_slices = []
date_slices = {}
for ts in meeting.timeslot_set.filter(type__in=['session',]).order_by('time','name'):
for ts in meeting.timeslot_set.filter(type__in=['regular',]).order_by('time','name'):
ymd = ts.time.date()
if ymd not in date_slices and ts.location != None:
@ -98,7 +98,7 @@ def build_all_agenda_slices(meeting):
def get_all_assignments_from_schedule(schedule):
ss = schedule.assignments.filter(timeslot__location__isnull = False)
ss = ss.filter(session__type__slug='session')
ss = ss.filter(session__type__slug='regular')
ss = ss.order_by('timeslot__time','timeslot__name')
return ss
@ -107,7 +107,7 @@ def get_modified_from_assignments(assignments):
return assignments.aggregate(Max('timeslot__modified'))['timeslot__modified__max']
def get_wg_name_list(assignments):
return assignments.filter(timeslot__type = 'Session',
return assignments.filter(timeslot__type = 'regular',
session__group__isnull = False,
session__group__parent__isnull = False).order_by(
'session__group__acronym').distinct().values_list(
@ -631,7 +631,7 @@ def update_interim_session_assignment(form):
else:
slot = TimeSlot.objects.create(
meeting=session.meeting,
type_id="session",
type_id='regular',
duration=session.requested_duration,
time=time)
SchedTimeSessAssignment.objects.create(

View file

@ -0,0 +1,38 @@
# Copyright The IETF Trust 2019, All Rights Reserved
# -*- coding: utf-8 -*-
# Generated by Django 1.11.26 on 2019-12-06 11:13
from __future__ import unicode_literals
from django.db import migrations
def rename_session_to_request(apps, schema_editor):
Session = apps.get_model('meeting', 'Session')
TimeSlot = apps.get_model('meeting', 'TimeSlot')
Room = apps.get_model('meeting', 'Room')
TimeSlotTypeName = apps.get_model('name', 'TimeSlotTypeName')
TimeSlotTypeName.objects.create(
slug='regular',
name='Regular',
used=True,
order=0,
)
Session.objects.filter(type='session').update(type='regular')
TimeSlot.objects.filter(type='session').update(type='regular')
Room.session_types.through.objects.filter(timeslottypename='session').update(timeslottypename='regular')
TimeSlotTypeName.objects.filter(slug='session').delete()
def noop(apps, schema_editor):
pass
class Migration(migrations.Migration):
dependencies = [
('meeting', '0024_auto_20191204_1731'),
]
operations = [
migrations.RunPython(rename_session_to_request, noop),
]

View file

@ -794,7 +794,7 @@ class SchedTimeSessAssignment(models.Model):
components.append(g.acronym)
components.append(slugify(self.session.name))
if self.timeslot.type_id in ('session', 'plenary'):
if self.timeslot.type_id in ('regular', 'plenary'):
if self.timeslot.type_id == "plenary":
components.append("1plenary")
else:

View file

@ -28,11 +28,11 @@ def make_interim_meeting(group,date,status='sched'):
attendees=10,
requested_duration=datetime.timedelta(minutes=20),
remote_instructions='http://webex.com',
type_id="session")
type_id='regular')
SchedulingEvent.objects.create(session=session, status_id=status, by=system_person)
slot = TimeSlot.objects.create(
meeting=meeting,
type_id="session",
type_id='regular',
duration=session.requested_duration,
time=time)
SchedTimeSessAssignment.objects.create(
@ -85,7 +85,7 @@ def make_meeting_test_data(meeting=None):
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("session")
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))
@ -100,10 +100,10 @@ def make_meeting_test_data(meeting=None):
# slots
session_date = meeting.date + datetime.timedelta(days=1)
slot1 = TimeSlot.objects.create(meeting=meeting, type_id="session", location=room,
slot1 = TimeSlot.objects.create(meeting=meeting, type_id='regular', location=room,
duration=datetime.timedelta(minutes=30),
time=datetime.datetime.combine(session_date, datetime.time(9, 30)))
slot2 = TimeSlot.objects.create(meeting=meeting, type_id="session", location=room,
slot2 = TimeSlot.objects.create(meeting=meeting, type_id='regular', location=room,
duration=datetime.timedelta(minutes=30),
time=datetime.datetime.combine(session_date, datetime.time(10, 30)))
breakfast_slot = TimeSlot.objects.create(meeting=meeting, type_id="lead", location=breakfast_room,
@ -119,7 +119,7 @@ def make_meeting_test_data(meeting=None):
mars = Group.objects.get(acronym='mars')
mars_session = Session.objects.create(meeting=meeting, group=mars,
attendees=10, requested_duration=datetime.timedelta(minutes=20),
type_id="session")
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)
@ -128,7 +128,7 @@ def make_meeting_test_data(meeting=None):
ames_session = Session.objects.create(meeting=meeting, group=Group.objects.get(acronym="ames"),
attendees=10,
requested_duration=datetime.timedelta(minutes=20),
type_id="session")
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)

View file

@ -143,10 +143,10 @@ class ApiTests(TestCase):
def test_create_new_room(self):
meeting = make_meeting_test_data()
timeslots_before = meeting.timeslot_set.filter(type='session').count()
timeslots_before = meeting.timeslot_set.filter(type='regular').count()
url = urlreverse("ietf.meeting.ajax.timeslot_roomsurl", kwargs=dict(num=meeting.number))
post_data = { "name": "new room", "capacity": "50" , "resources": [], "session_types":["session"]}
post_data = { "name": "new room", "capacity": "50" , "resources": [], "session_types":['regular']}
# unauthorized post
r = self.client.post(url, post_data)
@ -159,7 +159,7 @@ class ApiTests(TestCase):
self.assertEqual(r.status_code, 302)
self.assertTrue(meeting.room_set.filter(name="new room"))
timeslots_after = meeting.timeslot_set.filter(type='session').count()
timeslots_after = meeting.timeslot_set.filter(type='regular').count()
# It's not clear that what that ajax function is doing is the right thing to do,
# but it currently makes a new timeslot for any existing timeslot.
# The condition tested below relies on the timeslots before this test all having different start and end times
@ -212,7 +212,7 @@ class ApiTests(TestCase):
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
info = r.json()
self.assertEqual(set([x['short_name'] for x in info]),set([s.session.short_name for s in meeting.schedule.assignments.filter(session__type_id='session')]))
self.assertEqual(set([x['short_name'] for x in info]),set([s.session.short_name for s in meeting.schedule.assignments.filter(session__type_id='regular')]))
schedule = meeting.schedule
url = urlreverse("ietf.meeting.ajax.assignments_json",
@ -466,7 +466,7 @@ class TimeSlotEditingApiTests(TestCase):
def test_manipulate_timeslot(self):
meeting = make_meeting_test_data()
slot = meeting.timeslot_set.all()[0]
self.assertEqual(TimeSlot.objects.get(pk=slot.pk).type.name,'Session')
self.assertEqual(TimeSlot.objects.get(pk=slot.pk).type_id,'regular')
url = urlreverse("ietf.meeting.ajax.timeslot_sloturl",
kwargs=dict(num=meeting.number, slotid=slot.pk))
@ -479,10 +479,12 @@ class TimeSlotEditingApiTests(TestCase):
self.client.login(username="plain", password="plain+password")
r = self.client.post(url, modify_post_data)
self.assertEqual(r.status_code, 403)
self.assertEqual(TimeSlot.objects.get(pk=slot.pk).type.name,'Session')
slot.refresh_from_db()
self.assertEqual(slot.type_id, 'regular')
# Successful change of purpose
self.client.login(username="secretary", password="secretary+password")
r = self.client.post(url, modify_post_data)
self.assertEqual(r.status_code, 200)
self.assertEqual(TimeSlot.objects.get(pk=slot.pk).type.name,'Plenary')
slot.refresh_from_db()
self.assertEqual(slot.type_id, 'plenary')

View file

@ -241,7 +241,7 @@ class MeetingTests(TestCase):
self.assertTrue(all([x in unicontent(r) for x in ['mars','Test Room',]]))
self.assertNotContains(r, 'IESG Breakfast')
url = urlreverse("ietf.meeting.views.agenda_by_type",kwargs=dict(num=meeting.number,type='session'))
url = urlreverse("ietf.meeting.views.agenda_by_type",kwargs=dict(num=meeting.number,type='regular'))
r = self.client.get(url)
self.assertTrue(all([x in unicontent(r) for x in ['mars','Test Room']]))
self.assertFalse(any([x in unicontent(r) for x in ['IESG Breakfast','Breakfast Room']]))
@ -576,7 +576,7 @@ class MeetingTests(TestCase):
self.assertEqual(response.get('Content-Type'), 'text/calendar')
def test_edit_slide_order(self):
session=SessionFactory(meeting__type_id='iestf',type_id='session')
session=SessionFactory(meeting__type_id='iestf',type_id='regular')
slides = DocumentFactory(type_id='slides')
session.sessionpresentation_set.create(document=slides,order=0)
url = urlreverse('ietf.meeting.views.set_slide_order',kwargs={'session_id':session.id,'num':session.meeting.number,'name':slides.name})

View file

@ -224,8 +224,8 @@ def add_event_info_to_session_qs(qs, current_status=True, requested_by=False, re
def only_sessions_that_can_meet(session_qs):
qs = add_event_info_to_session_qs(session_qs).exclude(current_status__in=['notmeet', 'disappr', 'deleted', 'apprw'])
# Restrict graphical scheduling to meeting requests (Sessions) of type 'session' for now
qs = qs.filter(type__slug='session')
# Restrict graphical scheduling to meeting requests (Sessions) of type 'regular' for now
qs = qs.filter(type__slug='regular')
return qs

View file

@ -146,11 +146,11 @@ def materials(request, num=None):
plenaries = sessions.filter(name__icontains='plenary')
ietf = sessions.filter(group__parent__type__slug = 'area').exclude(group__acronym='edu')
irtf = sessions.filter(group__parent__acronym = 'irtf')
training = sessions.filter(group__acronym__in=['edu','iaoc'], type_id__in=['session', 'other', ])
training = sessions.filter(group__acronym__in=['edu','iaoc'], type_id__in=['regular', 'other', ])
iab = sessions.filter(group__parent__acronym = 'iab')
session_pks = [s.pk for ss in [plenaries, ietf, irtf, training, iab] for s in ss]
other = sessions.filter(type_id__in=['session'], group__type__features__has_meetings=True).exclude(pk__in=session_pks)
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 event in topic:
@ -372,7 +372,7 @@ def edit_schedule(request, num=None, owner=None, name=None):
meeting_base_url = request.build_absolute_uri(meeting.base_url())
site_base_url = request.build_absolute_uri('/')[:-1] # skip the trailing slash
rooms = meeting.room_set.filter(session_types__slug='session').distinct().order_by("capacity")
rooms = meeting.room_set.filter(session_types__slug='regular').distinct().order_by("capacity")
saveas = SaveAsForm()
saveasurl=reverse(edit_schedule,
args=[meeting.number, schedule.owner_email(), schedule.name])
@ -615,7 +615,7 @@ def agenda_csv(schedule, filtered_assignments):
row.append(item.session.pk)
row.append(agenda_field(item))
row.append(slides_field(item))
elif item.timeslot.type_id == "session":
elif item.timeslot.type_id == 'regular':
row.append(item.timeslot.name)
row.append(item.timeslot.location.name if item.timeslot.location else "")
row.append(item.session.historic_group.historic_parent.acronym.upper() if item.session.historic_group.historic_parent else "")
@ -1083,7 +1083,7 @@ def meeting_requests(request, num=None):
sessions = add_event_info_to_session_qs(
Session.objects.filter(
meeting__number=meeting.number,
type__slug='session',
type__slug='regular',
group__parent__isnull=False
),
requested_by=True,
@ -1110,10 +1110,10 @@ def meeting_requests(request, num=None):
def get_sessions(num, acronym):
meeting = get_meeting(num=num,type_in=None)
sessions = Session.objects.filter(meeting=meeting,group__acronym=acronym,type__in=['session','plenary','other'])
sessions = Session.objects.filter(meeting=meeting,group__acronym=acronym,type__in=['regular','plenary','other'])
if not sessions:
sessions = Session.objects.filter(meeting=meeting,short=acronym,type__in=['session','plenary','other'])
sessions = Session.objects.filter(meeting=meeting,short=acronym,type__in=['regular','plenary','other'])
sessions = add_event_info_to_session_qs(sessions)
@ -1322,7 +1322,7 @@ def upload_session_minutes(request, session_id, num):
session_number = None
sessions = get_sessions(session.meeting.number,session.group.acronym)
show_apply_to_all_checkbox = len(sessions) > 1 if session.type_id == 'session' else False
show_apply_to_all_checkbox = len(sessions) > 1 if session.type_id == 'regular' else False
if len(sessions) > 1:
session_number = 1 + sessions.index(session)
@ -1333,7 +1333,7 @@ def upload_session_minutes(request, session_id, num):
if form.is_valid():
file = request.FILES['file']
_, ext = os.path.splitext(file.name)
apply_to_all = session.type_id == 'session'
apply_to_all = session.type_id == 'regular'
if show_apply_to_all_checkbox:
apply_to_all = form.cleaned_data['apply_to_all']
if minutes_sp:
@ -1422,7 +1422,7 @@ def upload_session_agenda(request, session_id, num):
session_number = None
sessions = get_sessions(session.meeting.number,session.group.acronym)
show_apply_to_all_checkbox = len(sessions) > 1 if session.type_id == 'session' else False
show_apply_to_all_checkbox = len(sessions) > 1 if session.type_id == 'regular' else False
if len(sessions) > 1:
session_number = 1 + sessions.index(session)
@ -1433,7 +1433,7 @@ def upload_session_agenda(request, session_id, num):
if form.is_valid():
file = request.FILES['file']
_, ext = os.path.splitext(file.name)
apply_to_all = session.type_id == 'session'
apply_to_all = session.type_id == 'regular'
if show_apply_to_all_checkbox:
apply_to_all = form.cleaned_data['apply_to_all']
if agenda_sp:
@ -1495,7 +1495,7 @@ def upload_session_agenda(request, session_id, num):
doc.save_with_history([e])
return redirect('ietf.meeting.views.session_details',num=num,acronym=session.group.acronym)
else:
form = UploadAgendaForm(show_apply_to_all_checkbox, initial={'apply_to_all':session.type_id=='session'})
form = UploadAgendaForm(show_apply_to_all_checkbox, initial={'apply_to_all':session.type_id=='regular'})
return render(request, "meeting/upload_session_agenda.html",
{'session': session,
@ -1533,7 +1533,7 @@ def upload_session_slides(request, session_id, num, name):
session_number = None
sessions = get_sessions(session.meeting.number,session.group.acronym)
show_apply_to_all_checkbox = len(sessions) > 1 if session.type_id == 'session' else False
show_apply_to_all_checkbox = len(sessions) > 1 if session.type_id == 'regular' else False
if len(sessions) > 1:
session_number = 1 + sessions.index(session)
@ -1550,7 +1550,7 @@ def upload_session_slides(request, session_id, num, name):
if form.is_valid():
file = request.FILES['file']
_, ext = os.path.splitext(file.name)
apply_to_all = session.type_id == 'session'
apply_to_all = session.type_id == 'regular'
if show_apply_to_all_checkbox:
apply_to_all = form.cleaned_data['apply_to_all']
if slides_sp:
@ -1627,7 +1627,7 @@ def propose_session_slides(request, session_id, num):
session_number = None
sessions = get_sessions(session.meeting.number,session.group.acronym)
show_apply_to_all_checkbox = len(sessions) > 1 if session.type_id == 'session' else False
show_apply_to_all_checkbox = len(sessions) > 1 if session.type_id == 'regular' else False
if len(sessions) > 1:
session_number = 1 + sessions.index(session)
@ -1637,7 +1637,7 @@ def propose_session_slides(request, session_id, num):
if form.is_valid():
file = request.FILES['file']
_, ext = os.path.splitext(file.name)
apply_to_all = session.type_id == 'session'
apply_to_all = session.type_id == 'regular'
if show_apply_to_all_checkbox:
apply_to_all = form.cleaned_data['apply_to_all']
title = form.cleaned_data['title']
@ -2244,7 +2244,7 @@ def proceedings(request, num=None):
plenaries = sessions.filter(name__icontains='plenary').exclude(current_status='notmeet')
ietf = sessions.filter(group__parent__type__slug = 'area').exclude(group__acronym='edu')
irtf = sessions.filter(group__parent__acronym = 'irtf')
training = sessions.filter(group__acronym__in=['edu','iaoc'], type_id__in=['session', 'other', ]).exclude(current_status='notmeet')
training = sessions.filter(group__acronym__in=['edu','iaoc'], type_id__in=['regular', 'other', ]).exclude(current_status='notmeet')
iab = sessions.filter(group__parent__acronym = 'iab').exclude(current_status='notmeet')
cache_version = Document.objects.filter(session__meeting__number=meeting.number).aggregate(Max('time'))["time__max"]
@ -2529,7 +2529,7 @@ def approve_proposed_slides(request, slidesubmission_id, num):
session_number = None
sessions = get_sessions(submission.session.meeting.number,submission.session.group.acronym)
show_apply_to_all_checkbox = len(sessions) > 1 if submission.session.type_id == 'session' else False
show_apply_to_all_checkbox = len(sessions) > 1 if submission.session.type_id == 'regular' else False
if len(sessions) > 1:
session_number = 1 + sessions.index(submission.session)
name, _ = os.path.splitext(submission.filename)
@ -2538,7 +2538,7 @@ def approve_proposed_slides(request, slidesubmission_id, num):
if request.method == 'POST':
form = ApproveSlidesForm(show_apply_to_all_checkbox, request.POST)
if form.is_valid():
apply_to_all = submission.session.type_id == 'session'
apply_to_all = submission.session.type_id == 'regular'
if show_apply_to_all_checkbox:
apply_to_all = form.cleaned_data['apply_to_all']
if request.POST.get('approve'):

View file

@ -11622,7 +11622,7 @@
"used": true
},
"model": "name.timeslottypename",
"pk": "session"
"pk": "regular"
},
{
"fields": {

View file

@ -68,7 +68,7 @@ class AgendaTypeName(NameModel):
class SessionStatusName(NameModel):
"""Waiting for Approval, Approved, Waiting for Scheduling, Scheduled, Cancelled, Disapproved"""
class TimeSlotTypeName(NameModel):
"""Session, Break, Registration, Other(Non-Session), Reserved, unavail"""
"""Session, Break, Registration, Other, Reserved, unavail"""
class ConstraintName(NameModel):
"""Conflict"""
penalty = models.IntegerField(default=0, help_text="The penalty for violating this kind of constraint; for instance 10 (small penalty) or 10000 (large penalty)")

View file

@ -49,7 +49,7 @@ def get_times(meeting,day):
The label is [start_time]-[end_time].
'''
# pick a random room
rooms = Room.objects.filter(meeting=meeting,session_types='session')
rooms = Room.objects.filter(meeting=meeting,session_types='regular')
if rooms:
room = rooms[0]
else:
@ -148,9 +148,9 @@ class TimeSlotForm(forms.Form):
raise forms.ValidationError('{} value has an invalid format. It must be in HH:MM format'.format(duration))
return self.cleaned_data['duration']
class NonSessionForm(TimeSlotForm):
class MiscSessionForm(TimeSlotForm):
short = forms.CharField(max_length=32,label='Short Name',help_text='Enter an abbreviated session name (used for material file names)',required=False)
type = forms.ModelChoiceField(queryset=TimeSlotTypeName.objects.filter(used=True).exclude(slug__in=('session',)),empty_label=None)
type = forms.ModelChoiceField(queryset=TimeSlotTypeName.objects.filter(used=True).exclude(slug__in=('regular',)),empty_label=None)
group = forms.ModelChoiceField(
queryset=Group.objects.filter(type__in=['ietf','team'],state='active'),
help_text='''Select a group to associate with this session. For example:<br>
@ -166,11 +166,11 @@ class NonSessionForm(TimeSlotForm):
self.meeting = kwargs.pop('meeting')
if 'session' in kwargs:
self.session = kwargs.pop('session')
super(NonSessionForm, self).__init__(*args,**kwargs)
super(MiscSessionForm, self).__init__(*args,**kwargs)
self.fields['location'].queryset = Room.objects.filter(meeting=self.meeting)
def clean(self):
super(NonSessionForm, self).clean()
super(MiscSessionForm, self).clean()
if any(self.errors):
return
cleaned_data = self.cleaned_data
@ -199,7 +199,7 @@ class UploadBlueSheetForm(forms.Form):
raise forms.ValidationError('Incorrect filename format')
return file
class SessionEditForm(forms.ModelForm):
class RegularSessionEditForm(forms.ModelForm):
class Meta:
model = Session
fields = ['agenda_note']

View file

@ -231,7 +231,7 @@ class SecrMeetingTestCase(TestCase):
def test_meetings_times_delete(self):
meeting = make_meeting_test_data()
qs = TimeSlot.objects.filter(meeting=meeting,type='session')
qs = TimeSlot.objects.filter(meeting=meeting,type='regular')
before = qs.count()
expected_deletion_count = qs.filter(time=qs.first().time).count()
url = reverse('ietf.secr.meetings.views.times_delete',kwargs={
@ -248,12 +248,12 @@ class SecrMeetingTestCase(TestCase):
self.assertEqual(response.status_code, 200)
response = self.client.post(url, {'post':'yes'})
self.assertRedirects(response, redirect_url)
after = TimeSlot.objects.filter(meeting=meeting,type='session').count()
after = TimeSlot.objects.filter(meeting=meeting,type='regular').count()
self.assertEqual(after,before - expected_deletion_count)
def test_meetings_times_edit(self):
meeting = make_meeting_test_data()
timeslot = TimeSlot.objects.filter(meeting=meeting,type='session').first()
timeslot = TimeSlot.objects.filter(meeting=meeting,type='regular').first()
url = reverse('ietf.secr.meetings.views.times_edit',kwargs={
'meeting_id':72,
'schedule_name':'test-schedule',
@ -269,18 +269,18 @@ class SecrMeetingTestCase(TestCase):
self.assertEqual(response.status_code, 302)
self.assertTrue(TimeSlot.objects.filter(meeting=meeting,name='Testing'))
def test_meetings_nonsession(self):
def test_meetings_misc_sessions(self):
make_meeting_test_data()
url = reverse('ietf.secr.meetings.views.non_session',kwargs={'meeting_id':72,'schedule_name':'test-schedule'})
url = reverse('ietf.secr.meetings.views.misc_sessions',kwargs={'meeting_id':72,'schedule_name':'test-schedule'})
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
def test_meetings_nonsession_add_valid(self):
def test_meetings_misc_session_add_valid(self):
meeting = make_meeting_test_data()
room = meeting.room_set.first()
group = Group.objects.get(acronym='secretariat')
url = reverse('ietf.secr.meetings.views.non_session',kwargs={'meeting_id':72,'schedule_name':'test-schedule'})
url = reverse('ietf.secr.meetings.views.misc_sessions',kwargs={'meeting_id':72,'schedule_name':'test-schedule'})
self.client.login(username="secretary", password="secretary+password")
response = self.client.post(url, {
'day':'1',
@ -298,10 +298,10 @@ class SecrMeetingTestCase(TestCase):
self.assertEqual(session.timeslotassignments.first().timeslot.location, room)
def test_meetings_nonsession_add_invalid(self):
def test_meetings_misc_session_add_invalid(self):
make_meeting_test_data()
group = Group.objects.get(acronym='secretariat')
url = reverse('ietf.secr.meetings.views.non_session',kwargs={'meeting_id':72,'schedule_name':'test-schedule'})
url = reverse('ietf.secr.meetings.views.misc_sessions',kwargs={'meeting_id':72,'schedule_name':'test-schedule'})
self.client.login(username="secretary", password="secretary+password")
response = self.client.post(url, {
'day':'1',
@ -315,12 +315,12 @@ class SecrMeetingTestCase(TestCase):
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'invalid format')
def test_meetings_nonsession_edit(self):
def test_meetings_misc_session_edit(self):
meeting = make_meeting_test_data()
session = meeting.session_set.exclude(name='').first() # get first non-session session
session = meeting.session_set.exclude(name='').first() # get first misc session
timeslot = session.official_timeslotassignment().timeslot
url = reverse('ietf.secr.meetings.views.non_session_edit',kwargs={'meeting_id':72,'schedule_name':meeting.schedule.name,'slot_id':timeslot.pk})
redirect_url = reverse('ietf.secr.meetings.views.non_session',kwargs={'meeting_id':72,'schedule_name':'test-schedule'})
url = reverse('ietf.secr.meetings.views.misc_session_edit',kwargs={'meeting_id':72,'schedule_name':meeting.schedule.name,'slot_id':timeslot.pk})
redirect_url = reverse('ietf.secr.meetings.views.misc_sessions',kwargs={'meeting_id':72,'schedule_name':'test-schedule'})
new_time = timeslot.time + datetime.timedelta(days=1)
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
@ -339,11 +339,11 @@ class SecrMeetingTestCase(TestCase):
timeslot = session.official_timeslotassignment().timeslot
self.assertEqual(timeslot.time,new_time)
def test_meetings_non_session_delete(self):
def test_meetings_misc_session_delete(self):
meeting = make_meeting_test_data()
slot = meeting.schedule.assignments.filter(timeslot__type='reg').first().timeslot
url = reverse('ietf.secr.meetings.views.non_session_delete', kwargs={'meeting_id':meeting.number,'schedule_name':meeting.schedule.name,'slot_id':slot.id})
target = reverse('ietf.secr.meetings.views.non_session', kwargs={'meeting_id':meeting.number,'schedule_name':meeting.schedule.name})
url = reverse('ietf.secr.meetings.views.misc_session_delete', kwargs={'meeting_id':meeting.number,'schedule_name':meeting.schedule.name,'slot_id':slot.id})
target = reverse('ietf.secr.meetings.views.misc_sessions', kwargs={'meeting_id':meeting.number,'schedule_name':meeting.schedule.name})
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
@ -351,11 +351,11 @@ class SecrMeetingTestCase(TestCase):
self.assertRedirects(response, target)
self.assertFalse(meeting.schedule.assignments.filter(timeslot=slot))
def test_meetings_non_session_cancel(self):
def test_meetings_misc_session_cancel(self):
meeting = make_meeting_test_data()
slot = meeting.schedule.assignments.filter(timeslot__type='reg').first().timeslot
url = reverse('ietf.secr.meetings.views.non_session_cancel', kwargs={'meeting_id':meeting.number,'schedule_name':meeting.schedule.name,'slot_id':slot.id})
redirect_url = reverse('ietf.secr.meetings.views.non_session', kwargs={'meeting_id':meeting.number,'schedule_name':meeting.schedule.name})
url = reverse('ietf.secr.meetings.views.misc_session_cancel', kwargs={'meeting_id':meeting.number,'schedule_name':meeting.schedule.name,'slot_id':slot.id})
redirect_url = reverse('ietf.secr.meetings.views.misc_sessions', kwargs={'meeting_id':meeting.number,'schedule_name':meeting.schedule.name})
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
@ -364,11 +364,11 @@ class SecrMeetingTestCase(TestCase):
session = slot.sessionassignments.filter(schedule=meeting.schedule).first().session
self.assertEqual(SchedulingEvent.objects.filter(session=session).order_by('-id')[0].status_id, 'canceled')
def test_meetings_session_edit(self):
def test_meetings_regular_session_edit(self):
meeting = make_meeting_test_data()
session = Session.objects.filter(meeting=meeting,group__acronym='mars').first()
url = reverse('ietf.secr.meetings.views.session_edit', kwargs={'meeting_id':meeting.number,'schedule_name':meeting.schedule.name,'session_id':session.id})
redirect_url = reverse('ietf.secr.meetings.views.sessions', kwargs={'meeting_id':meeting.number,'schedule_name':meeting.schedule.name})
url = reverse('ietf.secr.meetings.views.regular_session_edit', kwargs={'meeting_id':meeting.number,'schedule_name':meeting.schedule.name,'session_id':session.id})
redirect_url = reverse('ietf.secr.meetings.views.regular_sessions', kwargs={'meeting_id':meeting.number,'schedule_name':meeting.schedule.name})
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
@ -382,7 +382,7 @@ class SecrMeetingTestCase(TestCase):
# -----------------------
def test_get_times(self):
meeting = make_meeting_test_data()
timeslot = meeting.timeslot_set.filter(type='session').first()
timeslot = meeting.timeslot_set.filter(type='regular').first()
day = (timeslot.time.weekday() + 1) % 7 + 1 # fix up to match django __week_day filter
times = get_times(meeting,day)
values = [ x[0] for x in times ]

View file

@ -1,3 +1,4 @@
# Copyright The IETF Trust 2007-2019, All Rights Reserved
from ietf.secr.meetings import views
from ietf.utils.urls import url
@ -13,14 +14,14 @@ urlpatterns = [
url(r'^(?P<meeting_id>\d{1,6})/edit/$', views.edit_meeting),
url(r'^(?P<meeting_id>\d{1,6})/notifications/$', views.notifications),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/$', views.rooms),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/non_session/$', views.non_session),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/non_session/cancel/(?P<slot_id>\d{1,6})/$', views.non_session_cancel),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/non_session/edit/(?P<slot_id>\d{1,6})/$', views.non_session_edit),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/non_session/delete/(?P<slot_id>\d{1,6})/$', views.non_session_delete),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/miscsessions/$', views.misc_sessions),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/miscsessions/cancel/(?P<slot_id>\d{1,6})/$', views.misc_session_cancel),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/miscsessions/edit/(?P<slot_id>\d{1,6})/$', views.misc_session_edit),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/miscsessions/delete/(?P<slot_id>\d{1,6})/$', views.misc_session_delete),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/rooms/$', views.rooms),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/times/$', views.times),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/sessions/$', views.sessions),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/regularsessions/$', views.regular_sessions),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/times/delete/(?P<time>[0-9\:]+)/$', views.times_delete),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/times/edit/(?P<time>[0-9\:]+)/$', views.times_edit),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/(?P<session_id>\d{1,6})/edit/$', views.session_edit),
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/(?P<session_id>\d{1,6})/edit/$', views.regular_session_edit),
]

View file

@ -25,7 +25,7 @@ from ietf.group.models import Group, GroupEvent
from ietf.person.models import Person
from ietf.secr.meetings.blue_sheets import create_blue_sheets
from ietf.secr.meetings.forms import ( BaseMeetingRoomFormSet, MeetingModelForm, MeetingSelectForm,
MeetingRoomForm, NonSessionForm, TimeSlotForm, SessionEditForm,
MeetingRoomForm, MiscSessionForm, TimeSlotForm, RegularSessionEditForm,
UploadBlueSheetForm )
from ietf.secr.proceedings.utils import handle_upload_file
from ietf.secr.sreq.views import get_initial_session
@ -45,16 +45,16 @@ def build_timeslots(meeting,room=None):
If room is passed pre-create timeslots for the new room. Call this after saving new rooms
or adding a room.
'''
slots = meeting.timeslot_set.filter(type='session')
slots = meeting.timeslot_set.filter(type='regular')
# Don't do anything if the room is not capable of handling sessions
if room and not room.session_types.filter(slug='session'):
if room and not room.session_types.filter(slug='regular'):
return
if room:
rooms = [room]
else:
rooms = meeting.room_set.filter(session_types__slug='session')
rooms = meeting.room_set.filter(session_types__slug='regular')
if not slots or room:
# if we are just building timeslots for a new room, the room argument was passed,
# then we need to use current meeting times as a template, not the last meeting times
@ -66,23 +66,23 @@ def build_timeslots(meeting,room=None):
delta = meeting.date - source_meeting.date
timeslots = []
time_seen = set()
for t in source_meeting.timeslot_set.filter(type='session'):
for t in source_meeting.timeslot_set.filter(type='regular'):
if not t.time in time_seen:
time_seen.add(t.time)
timeslots.append(t)
for t in timeslots:
new_time = t.time + delta
for room in rooms:
TimeSlot.objects.create(type_id='session',
TimeSlot.objects.create(type_id='regular',
meeting=meeting,
name=t.name,
time=new_time,
location=room,
duration=t.duration)
def check_nonsession(meeting,schedule):
def check_misc_sessions(meeting,schedule):
'''
Ensure non-session timeslots exist and have appropriate SchedTimeSessAssignment objects
Ensure misc session timeslots exist and have appropriate SchedTimeSessAssignment objects
for the specified schedule.
'''
slots = TimeSlot.objects.filter(meeting=meeting,type__in=('break','reg','other','plenary','lead','offagenda'))
@ -370,21 +370,21 @@ def main(request):
)
@role_required('Secretariat')
def non_session(request, meeting_id, schedule_name):
def misc_sessions(request, meeting_id, schedule_name):
'''
Display and add "non-session" time slots, ie. registration, beverage and snack breaks
Display and add misc session time slots, e.g. registration, beverage and snack breaks
'''
meeting = get_object_or_404(Meeting, number=meeting_id)
schedule = get_object_or_404(Schedule, meeting=meeting, name=schedule_name)
check_nonsession(meeting,schedule)
check_misc_sessions(meeting,schedule)
non_session_types = ('break','reg','other','plenary','lead')
assignments = schedule.assignments.filter(timeslot__type__in=non_session_types)
misc_session_types = ['break','reg','other','plenary','lead']
assignments = schedule.assignments.filter(timeslot__type__in=misc_session_types)
assignments = assignments.order_by('-timeslot__type__name','timeslot__time')
if request.method == 'POST':
form = NonSessionForm(request.POST, meeting=meeting)
form = MiscSessionForm(request.POST, meeting=meeting)
if form.is_valid():
time = get_timeslot_time(form, meeting)
name = form.cleaned_data['name']
@ -424,13 +424,14 @@ def non_session(request, meeting_id, schedule_name):
session=session,
schedule=schedule)
messages.success(request, 'Non-Sessions updated successfully')
return redirect('ietf.secr.meetings.views.non_session', meeting_id=meeting_id, schedule_name=schedule_name)
messages.success(request, 'Misc. sessions updated successfully')
return redirect('ietf.secr.meetings.views.misc_sessions', meeting_id=meeting_id, schedule_name=schedule_name)
else:
form = NonSessionForm(initial={'show_location':True}, meeting=meeting)
form = MiscSessionForm(initial={'show_location':True}, meeting=meeting)
if TimeSlot.objects.filter(meeting=meeting,type='other',location__isnull=True):
messages.warning(request, 'There are non-session items which do not have a room assigned')
no_room = TimeSlot.objects.filter(meeting=meeting,type='other',location__isnull=True)
if no_room:
messages.warning(request, 'There are misc. session time slots which do not have a room assigned')
session_statuses = {
e.session_id: e.status_id
@ -440,18 +441,18 @@ def non_session(request, meeting_id, schedule_name):
for a in assignments:
a.current_session_status = session_statuses.get(a.session_id)
return render(request, 'meetings/non_session.html', {
return render(request, 'meetings/misc_sessions.html', {
'assignments': assignments,
'form': form,
'meeting': meeting,
'schedule': schedule,
'selected': 'non-sessions'},
'selected': 'misc-sessions'},
)
@role_required('Secretariat')
def non_session_cancel(request, meeting_id, schedule_name, slot_id):
def misc_session_cancel(request, meeting_id, schedule_name, slot_id):
'''
This function cancels the non-session TimeSlot. Check for uploaded
This function cancels the misc session TimeSlot. Check for uploaded
material first. SchedTimeSessAssignment objects get cancelled as well.
'''
slot = get_object_or_404(TimeSlot, id=slot_id)
@ -467,14 +468,14 @@ def non_session_cancel(request, meeting_id, schedule_name, slot_id):
)
messages.success(request, 'The session was cancelled successfully')
return redirect('ietf.secr.meetings.views.non_session', meeting_id=meeting_id, schedule_name=schedule_name)
return redirect('ietf.secr.meetings.views.misc_sessions', meeting_id=meeting_id, schedule_name=schedule_name)
return render(request, 'confirm_cancel.html', {'object': slot})
@role_required('Secretariat')
def non_session_delete(request, meeting_id, schedule_name, slot_id):
def misc_session_delete(request, meeting_id, schedule_name, slot_id):
'''
This function deletes the non-session TimeSlot. Check for uploaded
This function deletes the misc session TimeSlot. Check for uploaded
material first. SchedTimeSessAssignment objects get deleted as well.
'''
slot = get_object_or_404(TimeSlot, id=slot_id)
@ -486,7 +487,7 @@ def non_session_delete(request, meeting_id, schedule_name, slot_id):
for session in session_objects:
if session.materials.exclude(states__slug='deleted'):
messages.error(request, 'Materials have already been uploaded for "%s". You must delete those before deleting the timeslot.' % slot.name)
return redirect('ietf.secr.meetings.views.non_session', meeting_id=meeting_id, schedule_name=schedule_name)
return redirect('ietf.secr.meetings.views.misc_sessions', meeting_id=meeting_id, schedule_name=schedule_name)
# delete high order assignments, then sessions and slots
assignments.delete()
@ -494,14 +495,14 @@ def non_session_delete(request, meeting_id, schedule_name, slot_id):
slot.delete()
messages.success(request, 'The entry was deleted successfully')
return redirect('ietf.secr.meetings.views.non_session', meeting_id=meeting_id, schedule_name=schedule_name)
return redirect('ietf.secr.meetings.views.misc_sessions', meeting_id=meeting_id, schedule_name=schedule_name)
return render(request, 'confirm_delete.html', {'object': slot})
@role_required('Secretariat')
def non_session_edit(request, meeting_id, schedule_name, slot_id):
def misc_session_edit(request, meeting_id, schedule_name, slot_id):
'''
Allows the user to assign a location to this non-session timeslot
Allows the user to assign a location to this misc session timeslot
'''
meeting = get_object_or_404(Meeting, number=meeting_id)
slot = get_object_or_404(TimeSlot, id=slot_id)
@ -511,9 +512,9 @@ def non_session_edit(request, meeting_id, schedule_name, slot_id):
if request.method == 'POST':
button_text = request.POST.get('submit', '')
if button_text == 'Back':
return redirect('ietf.secr.meetings.views.non_session', meeting_id=meeting_id, schedule_name=schedule_name)
return redirect('ietf.secr.meetings.views.misc_sessions', meeting_id=meeting_id, schedule_name=schedule_name)
form = NonSessionForm(request.POST,meeting=meeting,session=session)
form = MiscSessionForm(request.POST,meeting=meeting,session=session)
if form.is_valid():
location = form.cleaned_data['location']
group = form.cleaned_data['group']
@ -537,7 +538,7 @@ def non_session_edit(request, meeting_id, schedule_name, slot_id):
session.save()
messages.success(request, 'Location saved')
return redirect('ietf.secr.meetings.views.non_session', meeting_id=meeting_id, schedule_name=schedule_name)
return redirect('ietf.secr.meetings.views.misc_sessions', meeting_id=meeting_id, schedule_name=schedule_name)
else:
# we need to pass the session to the form in order to disallow changing
@ -552,9 +553,9 @@ def non_session_edit(request, meeting_id, schedule_name, slot_id):
'duration':duration_string(slot.duration),
'show_location':slot.show_location,
'type':slot.type}
form = NonSessionForm(initial=initial, meeting=meeting, session=session)
form = MiscSessionForm(initial=initial, meeting=meeting, session=session)
return render(request, 'meetings/non_session_edit.html', {
return render(request, 'meetings/misc_session_edit.html', {
'meeting': meeting,
'form': form,
'schedule': schedule,
@ -570,7 +571,7 @@ def notifications(request, meeting_id):
meeting = get_object_or_404(Meeting, number=meeting_id)
last_notice = GroupEvent.objects.filter(type='sent_notification').first()
groups = set()
for ss in meeting.schedule.assignments.filter(timeslot__type='session'):
for ss in meeting.schedule.assignments.filter(timeslot__type='regular'):
last_notice = ss.session.group.latest_event(type='sent_notification')
if last_notice and ss.modified > last_notice.time:
groups.add(ss.session.group)
@ -643,7 +644,7 @@ def rooms(request, meeting_id, schedule_name):
)
@role_required('Secretariat')
def sessions(request, meeting_id, schedule_name):
def regular_sessions(request, meeting_id, schedule_name):
'''
Display and edit Session records for the specified meeting
'''
@ -675,11 +676,11 @@ def sessions(request, meeting_id, schedule_name):
'schedule': schedule,
'sessions': sessions,
'formset': None,
'selected': 'sessions',},
'selected': 'regular-sessions',},
)
@role_required('Secretariat')
def session_edit(request, meeting_id, schedule_name, session_id):
def regular_session_edit(request, meeting_id, schedule_name, session_id):
'''
Edit session details
'''
@ -689,21 +690,21 @@ def session_edit(request, meeting_id, schedule_name, session_id):
assignment = SchedTimeSessAssignment.objects.filter(schedule=schedule, session=session).first()
if request.method == 'POST':
form = SessionEditForm(request.POST, instance=session)
form = RegularSessionEditForm(request.POST, instance=session)
if form.is_valid():
form.save()
messages.success(request, 'Session saved')
return redirect('ietf.secr.meetings.views.sessions', meeting_id=meeting_id,schedule_name=schedule_name)
return redirect('ietf.secr.meetings.views.regular_sessions', meeting_id=meeting_id,schedule_name=schedule_name)
else:
form = SessionEditForm(instance=session)
form = RegularSessionEditForm(instance=session)
current_status_name = None
latest_event = SchedulingEvent.objects.filter(session=session).order_by('-time', '-id').first()
if latest_event:
current_status_name = latest_event.status.name
return render(request, 'meetings/session_edit.html', {
return render(request, 'meetings/regular_session_edit.html', {
'meeting': meeting,
'schedule': schedule,
'session': session,
@ -728,7 +729,7 @@ def times(request, meeting_id, schedule_name):
slots = []
timeslots = []
time_seen = set()
for t in meeting.timeslot_set.filter(type='session'):
for t in meeting.timeslot_set.filter(type='regular'):
if not t.time in time_seen:
time_seen.add(t.time)
timeslots.append(t)
@ -752,7 +753,7 @@ def times(request, meeting_id, schedule_name):
return redirect('ietf.secr.meetings.views.times', meeting_id=meeting_id,schedule_name=schedule_name)
for room in meeting.room_set.all():
TimeSlot.objects.create(type_id='session',
TimeSlot.objects.create(type_id='regular',
meeting=meeting,
name=name,
time=time,

View file

@ -28,7 +28,7 @@ class RecordingForm(forms.Form):
self.meeting = kwargs.pop('meeting')
super(RecordingForm, self).__init__(*args,**kwargs)
self.fields['session'].queryset = add_event_info_to_session_qs(
Session.objects.filter(meeting=self.meeting, type__in=('session','plenary','other'))
Session.objects.filter(meeting=self.meeting, type__in=['regular','plenary','other'])
).filter(current_status='sched').order_by('group__acronym')
class RecordingEditForm(forms.ModelForm):

View file

@ -96,7 +96,7 @@ def get_extras(meeting):
sessions = Session.objects.filter(meeting=meeting).exclude(group__parent__type__in=('area','irtf'))
for session in sessions:
timeslot = get_timeslot(session)
if timeslot and timeslot.type.slug == 'session' and session.materials.all():
if timeslot and timeslot.type_id == 'regular' and session.materials.all():
groups.append(session.group)
return groups

View file

@ -401,7 +401,7 @@ def edit(request, acronym, num=None):
attendees=form.cleaned_data['attendees'],
requested_duration=duration,
comments=form.cleaned_data['comments'],
type_id='session',
type_id='regular',
)
SchedulingEvent.objects.create(
session=new_session,
@ -427,7 +427,7 @@ def edit(request, acronym, num=None):
attendees=form.cleaned_data['attendees'],
requested_duration=duration,
comments=form.cleaned_data['comments'],
type_id='session',
type_id='regular',
)
SchedulingEvent.objects.create(
session=new_session,
@ -638,7 +638,7 @@ def no_session(request, acronym):
group=group,
meeting=meeting,
requested_duration=datetime.timedelta(0),
type_id='session',
type_id='regular',
)
SchedulingEvent.objects.create(
session=session,

View file

@ -461,7 +461,7 @@ input.draft-file-input {
Meeting Tool
========================================================================== */
#non-session-edit-form input[type="text"] {
#misc-session-edit-form input[type="text"] {
width: 30em;
}

View file

@ -23,8 +23,8 @@
<ul class="list-nav">
<li id="nav-room" class="leftmost{% if selected == 'rooms' %} selected{% endif %}"><a href="{% url "ietf.secr.meetings.views.rooms" meeting_id=meeting.number schedule_name=schedule.name %}">Rooms</a></li>
<li id="nav-time" class="{% if selected == 'times' %}selected{% endif %}"><a href="{% url "ietf.secr.meetings.views.times" meeting_id=meeting.number schedule_name=schedule.name %}">Times</a></li>
<li id="nav-non-session" class="{% if selected == 'non-sessions' %}selected{% endif %}"><a href="{% url "ietf.secr.meetings.views.non_session" meeting_id=meeting.number schedule_name=schedule.name %}">Non-Session</a></li>
<li id="nav-session" class="{% if selected == 'sessions' %}selected{% endif %}"><a href="{% url "ietf.secr.meetings.views.sessions" meeting_id=meeting.number schedule_name=schedule.name %}">Sessions</a></li>
<li id="nav-misc-session" class="{% if selected == 'misc-sessions' %}selected{% endif %}"><a href="{% url "ietf.secr.meetings.views.misc_sessions" meeting_id=meeting.number schedule_name=schedule.name %}">Misc. Sessions</a></li>
<li id="nav-session" class="{% if selected == 'regular-sessions' %}selected{% endif %}"><a href="{% url "ietf.secr.meetings.views.regular_sessions" meeting_id=meeting.number schedule_name=schedule.name %}">Regular Sessions</a></li>
</ul>
</div>

View file

@ -5,7 +5,7 @@
<div class="module interim-container">
<h2>Meeting - {{ meeting }}</h2>
<p><h3>Session: {{ slot.name }}</h3></p>
<form id="non-session-edit-form" enctype="multipart/form-data" action="." method="post">{% csrf_token %}
<form id="misc-session-edit-form" enctype="multipart/form-data" action="." method="post">{% csrf_token %}
<table class="full-width amstable">
{{ form.as_table }}
</table>

View file

@ -6,7 +6,7 @@
<h2>TimeSlots</h2>
{% if assignments %}
<table id="nonsessions" class="full-width">
<table id="misc-sessions" class="full-width">
<thead>
<tr>
<th>Day</th>
@ -33,13 +33,13 @@
<td>{{ assignment.timeslot.location }}</td>
<td>{{ assignment.timeslot.show_location }}</td>
<td>{{ assignment.timeslot.type }}</td>
<td><a href="{% url "ietf.secr.meetings.views.non_session_edit" meeting_id=meeting.number schedule_name=schedule.name slot_id=assignment.timeslot.id %}">Edit</a></td>
<td><a href="{% url "ietf.secr.meetings.views.misc_session_edit" meeting_id=meeting.number schedule_name=schedule.name slot_id=assignment.timeslot.id %}">Edit</a></td>
<td>
{% if not assignment.session.type.slug == "break" %}
<a href="{% url "ietf.secr.meetings.views.non_session_cancel" meeting_id=meeting.number schedule_name=schedule.name slot_id=assignment.timeslot.id %}">Cancel</a>
<a href="{% url "ietf.secr.meetings.views.misc_session_cancel" meeting_id=meeting.number schedule_name=schedule.name slot_id=assignment.timeslot.id %}">Cancel</a>
{% endif %}
</td>
<td><a href="{% url "ietf.secr.meetings.views.non_session_delete" meeting_id=meeting.number schedule_name=schedule.name slot_id=assignment.timeslot.id %}">Delete</a></td>
<td><a href="{% url "ietf.secr.meetings.views.misc_session_delete" meeting_id=meeting.number schedule_name=schedule.name slot_id=assignment.timeslot.id %}">Delete</a></td>
</tr>
{% endfor %}
</tbody>

View file

@ -45,7 +45,7 @@
<div class="button-group">
<ul>
<li><button type="submit" name="submit" value="Save">Save</button></li>
<li><button type="button" onclick="window.location='{% url "ietf.secr.meetings.views.sessions" meeting_id=meeting.number schedule_name=schedule.name %}'">Back</button></li>
<li><button type="button" onclick="window.location='{% url "ietf.secr.meetings.views.regular_sessions" meeting_id=meeting.number schedule_name=schedule.name %}'">Back</button></li>
</ul>
</div> <!-- button-group -->

View file

@ -34,7 +34,7 @@
</td>
<td>{{ session.agenda_note }}</td>
<td>{{ session.current_status_name }}</td>
<td><a href="{% url 'ietf.secr.meetings.views.session_edit' meeting_id=meeting.number schedule_name=schedule.name session_id=session.id %}">Edit</a></td>
<td><a href="{% url 'ietf.secr.meetings.views.regular_session_edit' meeting_id=meeting.number schedule_name=schedule.name session_id=session.id %}">Edit</a></td>
<td>
<form method="post">
{% csrf_token %}

View file

@ -378,7 +378,7 @@ function calculate_room_select_box() {
html=html+"' id='info_location_select_option_";
html=html+value.timeslot_id+"'>";
html=html+value.short_string;
if(value.roomtype != "session") {
if(value.roomtype != "regular") {
html = html+ "(" + value.roomtype + ")";
}
html=html+"</option>";

View file

@ -252,7 +252,7 @@ function build_select_box(roomtype, domid, slot_id, select_id) {
roomtypeclass="";
roomtypeunavailable="";
if(roomtype == "session") {
if(roomtype == "regular") {
roomtypesession="selected";
roomtypeclass="agenda_slot_session";
} else if(roomtype == "other") {
@ -270,8 +270,8 @@ function build_select_box(roomtype, domid, slot_id, select_id) {
}
html = "<form action=\"/some/place\" method=\"post\"><select id='"+select_id+"'>";
html = html + "<option value='session' "+roomtypesession+" id='option_"+domid+"_session'>session</option>";
html = html + "<option value='other' "+roomtypeother+" id='option_"+domid+"_other'>non-session</option>";
html = html + "<option value='regular' "+roomtypesession+" id='option_"+domid+"_session'>regular session</option>";
html = html + "<option value='other' "+roomtypeother+" id='option_"+domid+"_other'>misc</option>";
html = html + "<option value='reserved' "+roomtypereserved+" id='option_"+domid+"_reserved'>reserved</option>";
html = html + "<option value='plenary' "+roomtypeplenary+" id='option_"+domid+"_plenary'>plenary</option>";
html = html + "<option value='unavail' "+roomtypeunavailable+" id='option_"+domid+"_unavail'>unavailable</option>";

View file

@ -168,7 +168,7 @@
</tr>
{% endifchanged %}
{% if item.timeslot.type.slug == 'session' %}
{% if item.timeslot.type_id == 'regular' %}
{% ifchanged %}
<tr class="info">
<th class="text-nowrap text-right">
@ -248,7 +248,7 @@
</tr>
{% endif %}
{% if item.timeslot.type.slug == 'session' or item.timeslot.type.slug == 'plenary' %}
{% if item.timeslot.type_id == 'regular' or item.timeslot.type.slug == 'plenary' %}
{% if item.session.historic_group %}
<tr id="row-{{item.slug}}" data-ske="row-{{ item.slug }}" {% if item.timeslot.type.slug == 'plenary' %}class="{{item.timeslot.type.slug}}danger"{% endif %}>
{% if item.timeslot.type.slug == 'plenary' %}

View file

@ -19,7 +19,7 @@
{{ item.timeslot.time_desc }} {{ item.session.name }} - {{ item.timeslot.location.name }}
{{ item.session.agenda_text.strip|indent:"3" }}
{% endif %}{% if item.timeslot.type.slug == "session" %}{% if item.session.historic_group %}{% ifchanged %}
{% endif %}{% if item.timeslot.type_id == 'regular' %}{% if item.session.historic_group %}{% ifchanged %}
{{ item.timeslot.time_desc }} {{ item.timeslot.name }}
{% endifchanged %}{{ item.timeslot.location.name|ljust:14 }} {{ item.session.historic_group.historic_parent.acronym|upper|ljust:4 }} {{ item.session.historic_group.acronym|ljust:10 }} {{ item.session.historic_group.name }} {% if item.session.historic_group.state_id == "bof" %}BOF{% elif item.session.historic_group.type_id == "wg" %}WG{% endif %}{% if item.session.agenda_note %} - {{ item.session.agenda_note }}{% endif %}{% if item.session.current_status == 'canceled' %} *** CANCELLED ***{% endif %}

View file

@ -45,7 +45,7 @@ li.daylistentry { margin-left:2em; font-weight: 400; }
<td>{{ss.timeslot.time|date:"H:i"}}-{{ss.timeslot.end_time|date:"H:i"}}</td>
<td>{{ss.timeslot.get_hidden_location}}</td>
<td class="type-{{ss.session.type.slug}}">{{ss.session.short_name}} </td>
<td>{% if ss.session.type_id == 'session' or ss.session.type_id == 'plenary' or ss.session.type_id == 'other' %} <a href="{% url 'ietf.meeting.views.session_details' num=ss.session.meeting.number acronym=ss.session.group.acronym %}">Materials</a>{% else %}&nbsp;{% endif %}</td>
<td>{% if ss.session.type_id == 'regular' or ss.session.type_id == 'plenary' or ss.session.type_id == 'other' %} <a href="{% url 'ietf.meeting.views.session_details' num=ss.session.meeting.number acronym=ss.session.group.acronym %}">Materials</a>{% else %}&nbsp;{% endif %}</td>
</tr>
{% endfor %}
</table>

View file

@ -57,7 +57,7 @@
<span class="label label-warning">No minutes</span>
{% endif %}
{% endif %}
{% if session.type.slug == 'session' and show_agenda == "True" %}
{% if session.type_id == 'regular' and show_agenda == "True" %}
{% if session.all_meeting_bluesheets %}
{% if session.all_meeting_bluesheets|length == 1 %}
<a href="{{ session.all_meeting_bluesheets.0|meeting_href:session.meeting }}">Bluesheets</a><br>