Skip to content

Commit 6da7ec1

Browse files
committed
Merged in personal/henrik/6.7.2.dev0-schemafix [10297] from henrik@levkowetz.com:
Renamed class ScheduledSession to the more correct (but unfortunately also cumbersome) SchedTimeSessAssignment, and renamed reverse relationships involving this class appropriately. Accompanying changes in javascript and templates. Migrations to match. - Legacy-Id: 10299 Note: SVN reference [10297] has been migrated to Git commit 71dec7a
2 parents 61ca4d2 + 71dec7a commit 6da7ec1

32 files changed

Lines changed: 385 additions & 278 deletions

ietf/doc/tests_material.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ def test_material_presentations(self):
188188
r = self.client.get(url)
189189
self.assertEqual(r.status_code, 200)
190190

191-
when = meeting.agenda.scheduledsession_set.filter(session__group__acronym='testteam').first().timeslot.time
191+
when = meeting.agenda.assignments.filter(session__group__acronym='testteam').first().timeslot.time
192192
mdw = when.date().isoformat()
193193
dow = ['mon','tue','wed','thu','fri','sat','sun'][when.weekday()]
194194

@@ -212,7 +212,7 @@ def test_edit_material_presentations(self):
212212
meeting = make_meeting_test_data()
213213
meeting.session_set.filter(group__acronym='mars').update(group=doc.group)
214214

215-
session = meeting.agenda.scheduledsession_set.filter(session__group__acronym='testteam').first().session
215+
session = meeting.agenda.assignments.filter(session__group__acronym='testteam').first().session
216216

217217
url = urlreverse(edit_material_presentations,kwargs=dict(name=doc.name,acronym='testteam',seq=1))
218218
login_testing_unauthorized(self, "secretary", url)

ietf/doc/views_material.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -197,18 +197,18 @@ def get_upcoming_manageable_sessions(user, doc, acronym=None, date=None, seq=Non
197197
if date:
198198
if len(date)==15:
199199
start = datetime.datetime.strptime(date,"%Y-%m-%d-%H%M")
200-
refined_candidates = [ sess for sess in refined_candidates if sess.scheduledsession_set.filter(schedule=sess.meeting.agenda,timeslot__time=start) ]
200+
refined_candidates = [ sess for sess in refined_candidates if sess.timeslotassignments.filter(schedule=sess.meeting.agenda,timeslot__time=start) ]
201201
else:
202202
start = datetime.datetime.strptime(date,"%Y-%m-%d").date()
203203
end = start+datetime.timedelta(days=1)
204-
refined_candidates = [ sess for sess in refined_candidates if sess.scheduledsession_set.filter(schedule=sess.meeting.agenda,timeslot__time__range=(start,end)) ]
204+
refined_candidates = [ sess for sess in refined_candidates if sess.timeslotassignments.filter(schedule=sess.meeting.agenda,timeslot__time__range=(start,end)) ]
205205

206206
if week_day:
207207
try:
208208
dow = ['sun','mon','tue','wed','thu','fri','sat'].index(week_day.lower()[:3]) + 1
209209
except ValueError:
210210
raise Http404
211-
refined_candidates = [ sess for sess in refined_candidates if sess.scheduledsession_set.filter(schedule=sess.meeting.agenda,timeslot__time__week_day=dow) ]
211+
refined_candidates = [ sess for sess in refined_candidates if sess.timeslotassignments.filter(schedule=sess.meeting.agenda,timeslot__time__week_day=dow) ]
212212

213213
changeable_sessions = [ sess for sess in refined_candidates if can_manage_materials(user, sess.group) ]
214214

@@ -226,7 +226,7 @@ def get_upcoming_manageable_sessions(user, doc, acronym=None, date=None, seq=Non
226226
# scheduled).
227227

228228
def time_sort_key(session):
229-
official_sessions = session.scheduledsession_set.filter(schedule=session.meeting.agenda)
229+
official_sessions = session.timeslotassignments.filter(schedule=session.meeting.agenda)
230230
if official_sessions:
231231
return official_sessions.first().timeslot.time
232232
else:

ietf/meeting/admin.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from django.contrib import admin
22

3-
from ietf.meeting.models import Meeting, Room, Session, TimeSlot, Constraint, Schedule, ScheduledSession, ResourceAssociation
3+
from ietf.meeting.models import Meeting, Room, Session, TimeSlot, Constraint, Schedule, SchedTimeSessAssignment, ResourceAssociation
44

55
class RoomAdmin(admin.ModelAdmin):
66
list_display = ["id", "meeting", "name", "capacity", ]
@@ -87,11 +87,11 @@ class ScheduleAdmin(admin.ModelAdmin):
8787
admin.site.register(Schedule, ScheduleAdmin)
8888

8989

90-
class ScheduledSessionAdmin(admin.ModelAdmin):
90+
class SchedTimeSessAssignmentAdmin(admin.ModelAdmin):
9191
list_display = ["id", "schedule", "timeslot", "session", "modified"]
9292
list_filter = ["timeslot__meeting", "schedule"]
9393

94-
admin.site.register(ScheduledSession, ScheduledSessionAdmin)
94+
admin.site.register(SchedTimeSessAssignment, SchedTimeSessAssignmentAdmin)
9595

9696

9797
class ResourceAssociationAdmin(admin.ModelAdmin):

ietf/meeting/ajax.py

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

99
from ietf.ietfauth.utils import role_required, has_role
1010
from ietf.meeting.helpers import get_meeting, get_schedule, agenda_permissions, get_person_by_email, get_schedule_by_name
11-
from ietf.meeting.models import TimeSlot, Session, Schedule, Room, Constraint, ScheduledSession, ResourceAssociation
11+
from ietf.meeting.models import TimeSlot, Session, Schedule, Room, Constraint, SchedTimeSessAssignment, ResourceAssociation
1212
from ietf.meeting.views import edit_timeslots, edit_agenda
1313

1414
import debug # pyflakes:ignore
@@ -151,7 +151,7 @@ def timeslot_roomurl(request, num=None, roomid=None):
151151

152152
#############################################################################
153153
## DAY/SLOT API
154-
## -- this creates groups of timeslots, and associated scheduledsessions.
154+
## -- this creates groups of timeslots, and associated schedtimesessassignments.
155155
#############################################################################
156156
AddSlotForm = modelform_factory(TimeSlot, exclude=('meeting','name','location','sessions', 'modified'))
157157

@@ -319,7 +319,7 @@ def agenda_update(request, meeting, schedule):
319319

320320
@role_required('Secretariat')
321321
def agenda_del(request, meeting, schedule):
322-
schedule.delete_scheduledsessions()
322+
schedule.delete_assignments()
323323
#debug.log("deleting meeting: %s agenda: %s" % (meeting, meeting.agenda))
324324
if meeting.agenda == schedule:
325325
meeting.agenda = None
@@ -431,8 +431,8 @@ def sessions_json(request, num):
431431
## Scheduledsesion
432432
#############################################################################
433433

434-
# this creates an entirely *NEW* scheduledsession
435-
def scheduledsessions_post(request, meeting, schedule):
434+
# this creates an entirely *NEW* schedtimesessassignment
435+
def assignments_post(request, meeting, schedule):
436436
cansee,canedit,secretariat = agenda_permissions(meeting, schedule, request.user)
437437
if not canedit:
438438
return HttpResponse(json.dumps({'error':'no permission to modify this agenda'}),
@@ -446,15 +446,15 @@ def scheduledsessions_post(request, meeting, schedule):
446446
status = 406,
447447
content_type="application/json")
448448

449-
ss1 = ScheduledSession(schedule = schedule,
449+
ss1 = SchedTimeSessAssignment(schedule = schedule,
450450
session_id = newvalues["session_id"],
451451
timeslot_id = newvalues["timeslot_id"])
452452
if("extendedfrom_id" in newvalues):
453453
val = int(newvalues["extendedfrom_id"])
454454
try:
455-
ss2 = schedule.scheduledsession_set.get(pk = val)
455+
ss2 = schedule.assignments.get(pk = val)
456456
ss1.extendedfrom = ss2
457-
except ScheduledSession.DoesNotExist:
457+
except SchedTimeSessAssignment.DoesNotExist:
458458
return HttpResponse(json.dumps({'error':'invalid extendedfrom value: %u' % val}),
459459
status = 406,
460460
content_type="application/json")
@@ -467,28 +467,28 @@ def scheduledsessions_post(request, meeting, schedule):
467467
response['Location'] = ss1_dict["href"],
468468
return response
469469

470-
def scheduledsessions_get(request, num, schedule):
471-
scheduledsessions = schedule.scheduledsession_set.all()
470+
def assignments_get(request, num, schedule):
471+
assignments = schedule.assignments.all()
472472

473-
sess1_dict = [ x.json_dict(request.build_absolute_uri('/')) for x in scheduledsessions ]
473+
sess1_dict = [ x.json_dict(request.build_absolute_uri('/')) for x in assignments ]
474474
return HttpResponse(json.dumps(sess1_dict, sort_keys=True, indent=2),
475475
content_type="application/json")
476476

477477
# this returns the list of scheduled sessions for the given named agenda
478-
def scheduledsessions_json(request, num, owner, name):
478+
def assignments_json(request, num, owner, name):
479479
meeting, person, schedule = get_meeting_schedule(num, owner, name)
480480

481481
if request.method == 'GET':
482-
return scheduledsessions_get(request, meeting, schedule)
482+
return assignments_get(request, meeting, schedule)
483483
elif request.method == 'POST':
484-
return scheduledsessions_post(request, meeting, schedule)
484+
return assignments_post(request, meeting, schedule)
485485
else:
486486
return HttpResponse(json.dumps({'error':'inappropriate action: %s' % (request.method)}),
487487
status = 406,
488488
content_type="application/json")
489489

490490
# accepts both POST and PUT in order to implement Postel Doctrine.
491-
def scheduledsession_update(request, meeting, schedule, ss):
491+
def assignment_update(request, meeting, schedule, ss):
492492
cansee,canedit,secretariat = agenda_permissions(meeting, schedule, request.user)
493493
if not canedit:
494494
return HttpResponse(json.dumps({'error':'no permission to update this agenda'}),
@@ -506,29 +506,29 @@ def scheduledsession_update(request, meeting, schedule, ss):
506506
return HttpResponse(json.dumps({'message':'valid'}),
507507
content_type="application/json")
508508

509-
def scheduledsession_delete(request, meeting, schedule, ss):
509+
def assignment_delete(request, meeting, schedule, ss):
510510
cansee,canedit,secretariat = agenda_permissions(meeting, schedule, request.user)
511511
if not canedit:
512512
return HttpResponse(json.dumps({'error':'no permission to update this agenda'}),
513513
status = 403,
514514
content_type="application/json")
515515

516516
# in case there is, somehow, more than one item with the same pk.. XXX
517-
scheduledsessions = schedule.scheduledsession_set.filter(pk = ss.pk)
518-
if len(scheduledsessions) == 0:
517+
assignments = schedule.assignments.filter(pk = ss.pk)
518+
if len(assignments) == 0:
519519
return HttpResponse(json.dumps({'error':'no such object'}),
520520
status = 404,
521521
content_type="application/json")
522522
count=0
523-
for ss in scheduledsessions:
523+
for ss in assignments:
524524
ss.delete()
525525
count += 1
526526

527527
return HttpResponse(json.dumps({'result':"%u objects deleted"%(count)}),
528528
status = 200,
529529
content_type="application/json")
530530

531-
def scheduledsession_get(request, meeting, schedule, ss):
531+
def assignment_get(request, meeting, schedule, ss):
532532
cansee,canedit,secretariat = agenda_permissions(meeting, schedule, request.user)
533533

534534
if not cansee:
@@ -541,22 +541,22 @@ def scheduledsession_get(request, meeting, schedule, ss):
541541
content_type="application/json")
542542

543543
# this return a specific session, updates a session or deletes a SPECIFIC scheduled session
544-
def scheduledsession_json(request, num, owner, name, scheduledsession_id):
544+
def assignment_json(request, num, owner, name, assignment_id):
545545
meeting, person, schedule = get_meeting_schedule(num, owner, name)
546546

547-
scheduledsessions = schedule.scheduledsession_set.filter(pk = scheduledsession_id)
548-
if len(scheduledsessions) == 0:
549-
return HttpResponse(json.dumps({'error' : 'invalid scheduledsession'}),
547+
assignments = schedule.assignments.filter(pk = assignment_id)
548+
if len(assignments) == 0:
549+
return HttpResponse(json.dumps({'error' : 'invalid assignment'}),
550550
content_type="application/json",
551551
status=404);
552-
ss = scheduledsessions[0]
552+
ss = assignments[0]
553553

554554
if request.method == 'GET':
555-
return scheduledsession_get(request, meeting, schedule, ss)
555+
return assignment_get(request, meeting, schedule, ss)
556556
elif request.method == 'PUT' or request.method=='POST':
557-
return scheduledsession_update(request, meeting, schedule, ss)
557+
return assignment_update(request, meeting, schedule, ss)
558558
elif request.method == 'DELETE':
559-
return scheduledsession_delete(request, meeting, schedule, ss)
559+
return assignment_delete(request, meeting, schedule, ss)
560560

561561
#############################################################################
562562
## Constraints API

ietf/meeting/helpers.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ def get_areas():
6161
Q(state="active", type="area")).order_by('acronym')
6262

6363
# get list of areas that are referenced.
64-
def get_area_list_from_sessions(scheduledsessions, num):
65-
return scheduledsessions.filter(timeslot__type = 'Session',
64+
def get_area_list_from_sessions(assignments, num):
65+
return assignments.filter(timeslot__type = 'Session',
6666
session__group__parent__isnull = False).order_by(
6767
'session__group__parent__acronym').distinct().values_list(
6868
'session__group__parent__acronym',flat=True)
@@ -85,25 +85,25 @@ def build_all_agenda_slices(meeting):
8585
time_slices.sort()
8686
return time_slices,date_slices
8787

88-
def get_all_scheduledsessions_from_schedule(schedule):
89-
ss = schedule.scheduledsession_set.filter(timeslot__location__isnull = False)
88+
def get_all_assignments_from_schedule(schedule):
89+
ss = schedule.assignments.filter(timeslot__location__isnull = False)
9090
ss = ss.filter(session__type__slug='session')
9191
ss = ss.order_by('timeslot__time','timeslot__name')
9292

9393
return ss
9494

95-
def get_modified_from_scheduledsessions(scheduledsessions):
96-
return scheduledsessions.aggregate(Max('timeslot__modified'))['timeslot__modified__max']
95+
def get_modified_from_assignments(assignments):
96+
return assignments.aggregate(Max('timeslot__modified'))['timeslot__modified__max']
9797

98-
def get_wg_name_list(scheduledsessions):
99-
return scheduledsessions.filter(timeslot__type = 'Session',
98+
def get_wg_name_list(assignments):
99+
return assignments.filter(timeslot__type = 'Session',
100100
session__group__isnull = False,
101101
session__group__parent__isnull = False).order_by(
102102
'session__group__acronym').distinct().values_list(
103103
'session__group__acronym',flat=True)
104104

105-
def get_wg_list(scheduledsessions):
106-
wg_name_list = get_wg_name_list(scheduledsessions)
105+
def get_wg_list(assignments):
106+
wg_name_list = get_wg_name_list(assignments)
107107
return Group.objects.filter(acronym__in = set(wg_name_list)).order_by('parent__acronym','acronym')
108108

109109

ietf/meeting/management/commands/schedwrite.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,15 @@ def handle(self, *labels, **options):
2727
meeting = get_meeting(meetingname)
2828
schedule = get_schedule(meeting, schedname)
2929

30-
scheduledsessions = schedule.scheduledsession_set.all()
30+
assignments = schedule.assignments.all()
3131

3232
# cribbed from django/core/management/commands/dumpdata.py
3333
# Check that the serialization format exists; this is a shortcut to
3434
# avoid collating all the objects and _then_ failing.
3535
if format not in serializers.get_public_serializer_formats():
3636
raise CommandError("Unknown serialization format: %s" % format)
3737

38-
return serializers.serialize(format, scheduledsessions, indent=indent,
38+
return serializers.serialize(format, assignments, indent=indent,
3939
use_natural_keys=True)
4040

4141

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals
3+
4+
from django.db import models, migrations
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('meeting', '0011_ietf92_meetings'),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name='scheduledsession',
16+
name='session',
17+
field=models.ForeignKey(related_name='timeslotassignments', default=None, to='meeting.Session', help_text='Scheduled session.', null=True),
18+
preserve_default=True,
19+
),
20+
migrations.AlterField(
21+
model_name='scheduledsession',
22+
name='timeslot',
23+
field=models.ForeignKey(related_name='sessionassignments', to='meeting.TimeSlot'),
24+
preserve_default=True,
25+
),
26+
]
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals
3+
4+
from django.db import models, migrations
5+
import datetime
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('meeting', '0012_auto_20151026_1406'),
12+
]
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name='Dummy',
17+
fields=[
18+
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
19+
('modified', models.DateTimeField(default=datetime.datetime.now)),
20+
('notes', models.TextField(blank=True)),
21+
('badness', models.IntegerField(default=0, null=True, blank=True)),
22+
('pinned', models.BooleanField(default=False, help_text=b'Do not move session during automatic placement.')),
23+
('extendedfrom', models.ForeignKey(default=None, to='self', help_text='Timeslot this session is an extension of.', null=True)),
24+
('schedule', models.ForeignKey(related_name='assignments', to='meeting.Schedule')),
25+
('session', models.ForeignKey(related_name='timeslotassignments', default=None, to='meeting.Session', help_text='Scheduled session.', null=True)),
26+
('timeslot', models.ForeignKey(related_name='sessionassignments', to='meeting.TimeSlot')),
27+
],
28+
options={
29+
'ordering': ['timeslot__time', 'timeslot__type__slug', 'session__group__parent__name', 'session__group__acronym', 'session__name'],
30+
},
31+
bases=(models.Model,),
32+
),
33+
migrations.AlterField(
34+
model_name='timeslot',
35+
name='sessions',
36+
field=models.ManyToManyField(related_name='slots', to='meeting.Session', through='meeting.Dummy', blank=True, help_text='Scheduled session, if any.', null=True),
37+
preserve_default=True,
38+
),
39+
]

0 commit comments

Comments
 (0)