From 568670c06092d70cc708489902b3a023ddac757c Mon Sep 17 00:00:00 2001 From: Ole Laursen Date: Fri, 6 Dec 2019 20:02:26 +0000 Subject: [PATCH] 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 --- ietf/doc/tests.py | 2 +- ietf/doc/tests_material.py | 2 +- ietf/doc/views_doc.py | 2 +- ietf/group/views.py | 2 +- ietf/meeting/ajax.py | 8 +- ietf/meeting/factories.py | 4 +- ietf/meeting/forms.py | 2 +- ietf/meeting/helpers.py | 10 +- .../0025_rename_type_session_to_regular.py | 38 ++++++++ ietf/meeting/models.py | 2 +- ietf/meeting/test_data.py | 14 +-- ietf/meeting/tests_api.py | 16 ++-- ietf/meeting/tests_views.py | 4 +- ietf/meeting/utils.py | 4 +- ietf/meeting/views.py | 38 ++++---- ietf/name/fixtures/names.json | 2 +- ietf/name/models.py | 2 +- ietf/secr/meetings/forms.py | 12 +-- ietf/secr/meetings/tests.py | 46 +++++----- ietf/secr/meetings/urls.py | 13 +-- ietf/secr/meetings/views.py | 91 ++++++++++--------- ietf/secr/proceedings/forms.py | 2 +- ietf/secr/proceedings/views.py | 2 +- ietf/secr/sreq/views.py | 6 +- ietf/secr/static/secr/css/custom.css | 2 +- .../templates/meetings/base_rooms_times.html | 4 +- ...ssion_edit.html => misc_session_edit.html} | 2 +- .../{non_session.html => misc_sessions.html} | 8 +- ...on_edit.html => regular_session_edit.html} | 2 +- ietf/secr/templates/meetings/sessions.html | 2 +- ietf/static/ietf/js/agenda/agenda_helpers.js | 2 +- ietf/static/ietf/js/agenda/timeslot_edit.js | 6 +- ietf/templates/meeting/agenda.html | 4 +- ietf/templates/meeting/agenda.txt | 2 +- ietf/templates/meeting/agenda_by_type.html | 2 +- ietf/templates/meeting/group_materials.html | 2 +- 36 files changed, 202 insertions(+), 160 deletions(-) create mode 100644 ietf/meeting/migrations/0025_rename_type_session_to_regular.py rename ietf/secr/templates/meetings/{non_session_edit.html => misc_session_edit.html} (84%) rename ietf/secr/templates/meetings/{non_session.html => misc_sessions.html} (78%) rename ietf/secr/templates/meetings/{session_edit.html => regular_session_edit.html} (93%) diff --git a/ietf/doc/tests.py b/ietf/doc/tests.py index 0f5a29736..7005cd6ba 100644 --- a/ietf/doc/tests.py +++ b/ietf/doc/tests.py @@ -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, diff --git a/ietf/doc/tests_material.py b/ietf/doc/tests_material.py index c67525cdd..4c1d1978a 100644 --- a/ietf/doc/tests_material.py +++ b/ietf/doc/tests_material.py @@ -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, diff --git a/ietf/doc/views_doc.py b/ietf/doc/views_doc.py index f14b963c0..6578d1571 100644 --- a/ietf/doc/views_doc.py +++ b/ietf/doc/views_doc.py @@ -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()} diff --git a/ietf/group/views.py b/ietf/group/views.py index a93d71930..cba3df21e 100644 --- a/ietf/group/views.py +++ b/ietf/group/views.py @@ -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'], diff --git a/ietf/meeting/ajax.py b/ietf/meeting/ajax.py index 1ad694423..44e838deb 100644 --- a/ietf/meeting/ajax.py +++ b/ietf/meeting/ajax.py @@ -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 diff --git a/ietf/meeting/factories.py b/ietf/meeting/factories.py index e72303151..20bbf8530 100644 --- a/ietf/meeting/factories.py +++ b/ietf/meeting/factories.py @@ -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 diff --git a/ietf/meeting/forms.py b/ietf/meeting/forms.py index c30e72560..9028a3eaa 100644 --- a/ietf/meeting/forms.py +++ b/ietf/meeting/forms.py @@ -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): diff --git a/ietf/meeting/helpers.py b/ietf/meeting/helpers.py index 0206ac355..a329ac371 100644 --- a/ietf/meeting/helpers.py +++ b/ietf/meeting/helpers.py @@ -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( diff --git a/ietf/meeting/migrations/0025_rename_type_session_to_regular.py b/ietf/meeting/migrations/0025_rename_type_session_to_regular.py new file mode 100644 index 000000000..5b2c04918 --- /dev/null +++ b/ietf/meeting/migrations/0025_rename_type_session_to_regular.py @@ -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), + ] diff --git a/ietf/meeting/models.py b/ietf/meeting/models.py index c962438fb..b94592a22 100644 --- a/ietf/meeting/models.py +++ b/ietf/meeting/models.py @@ -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: diff --git a/ietf/meeting/test_data.py b/ietf/meeting/test_data.py index d8508567a..84a754003 100644 --- a/ietf/meeting/test_data.py +++ b/ietf/meeting/test_data.py @@ -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) diff --git a/ietf/meeting/tests_api.py b/ietf/meeting/tests_api.py index 06f267da3..5840e5ea7 100644 --- a/ietf/meeting/tests_api.py +++ b/ietf/meeting/tests_api.py @@ -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') diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index f27216250..6cc9e54e2 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -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}) diff --git a/ietf/meeting/utils.py b/ietf/meeting/utils.py index 5b1944fd0..286f043b9 100644 --- a/ietf/meeting/utils.py +++ b/ietf/meeting/utils.py @@ -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 diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index 8f0bf5f67..bd2f8d108 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -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'): diff --git a/ietf/name/fixtures/names.json b/ietf/name/fixtures/names.json index 86592b5f1..4e9b0560f 100644 --- a/ietf/name/fixtures/names.json +++ b/ietf/name/fixtures/names.json @@ -11622,7 +11622,7 @@ "used": true }, "model": "name.timeslottypename", - "pk": "session" + "pk": "regular" }, { "fields": { diff --git a/ietf/name/models.py b/ietf/name/models.py index 453b7042e..f950d71a9 100644 --- a/ietf/name/models.py +++ b/ietf/name/models.py @@ -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)") diff --git a/ietf/secr/meetings/forms.py b/ietf/secr/meetings/forms.py index 242118df4..4aa1dd36b 100644 --- a/ietf/secr/meetings/forms.py +++ b/ietf/secr/meetings/forms.py @@ -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:
@@ -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'] diff --git a/ietf/secr/meetings/tests.py b/ietf/secr/meetings/tests.py index f826be015..91ad389e2 100644 --- a/ietf/secr/meetings/tests.py +++ b/ietf/secr/meetings/tests.py @@ -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 ] diff --git a/ietf/secr/meetings/urls.py b/ietf/secr/meetings/urls.py index 7aa9a473a..96c61d47b 100644 --- a/ietf/secr/meetings/urls.py +++ b/ietf/secr/meetings/urls.py @@ -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\d{1,6})/edit/$', views.edit_meeting), url(r'^(?P\d{1,6})/notifications/$', views.notifications), url(r'^(?P\d{1,6})/(?P[A-Za-z0-9_\-]+)/$', views.rooms), - url(r'^(?P\d{1,6})/(?P[A-Za-z0-9_\-]+)/non_session/$', views.non_session), - url(r'^(?P\d{1,6})/(?P[A-Za-z0-9_\-]+)/non_session/cancel/(?P\d{1,6})/$', views.non_session_cancel), - url(r'^(?P\d{1,6})/(?P[A-Za-z0-9_\-]+)/non_session/edit/(?P\d{1,6})/$', views.non_session_edit), - url(r'^(?P\d{1,6})/(?P[A-Za-z0-9_\-]+)/non_session/delete/(?P\d{1,6})/$', views.non_session_delete), + url(r'^(?P\d{1,6})/(?P[A-Za-z0-9_\-]+)/miscsessions/$', views.misc_sessions), + url(r'^(?P\d{1,6})/(?P[A-Za-z0-9_\-]+)/miscsessions/cancel/(?P\d{1,6})/$', views.misc_session_cancel), + url(r'^(?P\d{1,6})/(?P[A-Za-z0-9_\-]+)/miscsessions/edit/(?P\d{1,6})/$', views.misc_session_edit), + url(r'^(?P\d{1,6})/(?P[A-Za-z0-9_\-]+)/miscsessions/delete/(?P\d{1,6})/$', views.misc_session_delete), url(r'^(?P\d{1,6})/(?P[A-Za-z0-9_\-]+)/rooms/$', views.rooms), url(r'^(?P\d{1,6})/(?P[A-Za-z0-9_\-]+)/times/$', views.times), - url(r'^(?P\d{1,6})/(?P[A-Za-z0-9_\-]+)/sessions/$', views.sessions), + url(r'^(?P\d{1,6})/(?P[A-Za-z0-9_\-]+)/regularsessions/$', views.regular_sessions), url(r'^(?P\d{1,6})/(?P[A-Za-z0-9_\-]+)/times/delete/(?P