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 71dec7a692
This commit is contained in:
commit
6da7ec17db
|
@ -188,7 +188,7 @@ class GroupMaterialTests(TestCase):
|
|||
r = self.client.get(url)
|
||||
self.assertEqual(r.status_code, 200)
|
||||
|
||||
when = meeting.agenda.scheduledsession_set.filter(session__group__acronym='testteam').first().timeslot.time
|
||||
when = meeting.agenda.assignments.filter(session__group__acronym='testteam').first().timeslot.time
|
||||
mdw = when.date().isoformat()
|
||||
dow = ['mon','tue','wed','thu','fri','sat','sun'][when.weekday()]
|
||||
|
||||
|
@ -212,7 +212,7 @@ class GroupMaterialTests(TestCase):
|
|||
meeting = make_meeting_test_data()
|
||||
meeting.session_set.filter(group__acronym='mars').update(group=doc.group)
|
||||
|
||||
session = meeting.agenda.scheduledsession_set.filter(session__group__acronym='testteam').first().session
|
||||
session = meeting.agenda.assignments.filter(session__group__acronym='testteam').first().session
|
||||
|
||||
url = urlreverse(edit_material_presentations,kwargs=dict(name=doc.name,acronym='testteam',seq=1))
|
||||
login_testing_unauthorized(self, "secretary", url)
|
||||
|
|
|
@ -197,18 +197,18 @@ def get_upcoming_manageable_sessions(user, doc, acronym=None, date=None, seq=Non
|
|||
if date:
|
||||
if len(date)==15:
|
||||
start = datetime.datetime.strptime(date,"%Y-%m-%d-%H%M")
|
||||
refined_candidates = [ sess for sess in refined_candidates if sess.scheduledsession_set.filter(schedule=sess.meeting.agenda,timeslot__time=start) ]
|
||||
refined_candidates = [ sess for sess in refined_candidates if sess.timeslotassignments.filter(schedule=sess.meeting.agenda,timeslot__time=start) ]
|
||||
else:
|
||||
start = datetime.datetime.strptime(date,"%Y-%m-%d").date()
|
||||
end = start+datetime.timedelta(days=1)
|
||||
refined_candidates = [ sess for sess in refined_candidates if sess.scheduledsession_set.filter(schedule=sess.meeting.agenda,timeslot__time__range=(start,end)) ]
|
||||
refined_candidates = [ sess for sess in refined_candidates if sess.timeslotassignments.filter(schedule=sess.meeting.agenda,timeslot__time__range=(start,end)) ]
|
||||
|
||||
if week_day:
|
||||
try:
|
||||
dow = ['sun','mon','tue','wed','thu','fri','sat'].index(week_day.lower()[:3]) + 1
|
||||
except ValueError:
|
||||
raise Http404
|
||||
refined_candidates = [ sess for sess in refined_candidates if sess.scheduledsession_set.filter(schedule=sess.meeting.agenda,timeslot__time__week_day=dow) ]
|
||||
refined_candidates = [ sess for sess in refined_candidates if sess.timeslotassignments.filter(schedule=sess.meeting.agenda,timeslot__time__week_day=dow) ]
|
||||
|
||||
changeable_sessions = [ sess for sess in refined_candidates if can_manage_materials(user, sess.group) ]
|
||||
|
||||
|
@ -226,7 +226,7 @@ def get_upcoming_manageable_sessions(user, doc, acronym=None, date=None, seq=Non
|
|||
# scheduled).
|
||||
|
||||
def time_sort_key(session):
|
||||
official_sessions = session.scheduledsession_set.filter(schedule=session.meeting.agenda)
|
||||
official_sessions = session.timeslotassignments.filter(schedule=session.meeting.agenda)
|
||||
if official_sessions:
|
||||
return official_sessions.first().timeslot.time
|
||||
else:
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from django.contrib import admin
|
||||
|
||||
from ietf.meeting.models import Meeting, Room, Session, TimeSlot, Constraint, Schedule, ScheduledSession, ResourceAssociation
|
||||
from ietf.meeting.models import Meeting, Room, Session, TimeSlot, Constraint, Schedule, SchedTimeSessAssignment, ResourceAssociation
|
||||
|
||||
class RoomAdmin(admin.ModelAdmin):
|
||||
list_display = ["id", "meeting", "name", "capacity", ]
|
||||
|
@ -87,11 +87,11 @@ class ScheduleAdmin(admin.ModelAdmin):
|
|||
admin.site.register(Schedule, ScheduleAdmin)
|
||||
|
||||
|
||||
class ScheduledSessionAdmin(admin.ModelAdmin):
|
||||
class SchedTimeSessAssignmentAdmin(admin.ModelAdmin):
|
||||
list_display = ["id", "schedule", "timeslot", "session", "modified"]
|
||||
list_filter = ["timeslot__meeting", "schedule"]
|
||||
|
||||
admin.site.register(ScheduledSession, ScheduledSessionAdmin)
|
||||
admin.site.register(SchedTimeSessAssignment, SchedTimeSessAssignmentAdmin)
|
||||
|
||||
|
||||
class ResourceAssociationAdmin(admin.ModelAdmin):
|
||||
|
|
|
@ -8,7 +8,7 @@ from django.views.decorators.http import require_POST
|
|||
|
||||
from ietf.ietfauth.utils import role_required, has_role
|
||||
from ietf.meeting.helpers import get_meeting, get_schedule, agenda_permissions, get_person_by_email, get_schedule_by_name
|
||||
from ietf.meeting.models import TimeSlot, Session, Schedule, Room, Constraint, ScheduledSession, ResourceAssociation
|
||||
from ietf.meeting.models import TimeSlot, Session, Schedule, Room, Constraint, SchedTimeSessAssignment, ResourceAssociation
|
||||
from ietf.meeting.views import edit_timeslots, edit_agenda
|
||||
|
||||
import debug # pyflakes:ignore
|
||||
|
@ -151,7 +151,7 @@ def timeslot_roomurl(request, num=None, roomid=None):
|
|||
|
||||
#############################################################################
|
||||
## DAY/SLOT API
|
||||
## -- this creates groups of timeslots, and associated scheduledsessions.
|
||||
## -- this creates groups of timeslots, and associated schedtimesessassignments.
|
||||
#############################################################################
|
||||
AddSlotForm = modelform_factory(TimeSlot, exclude=('meeting','name','location','sessions', 'modified'))
|
||||
|
||||
|
@ -319,7 +319,7 @@ def agenda_update(request, meeting, schedule):
|
|||
|
||||
@role_required('Secretariat')
|
||||
def agenda_del(request, meeting, schedule):
|
||||
schedule.delete_scheduledsessions()
|
||||
schedule.delete_assignments()
|
||||
#debug.log("deleting meeting: %s agenda: %s" % (meeting, meeting.agenda))
|
||||
if meeting.agenda == schedule:
|
||||
meeting.agenda = None
|
||||
|
@ -431,8 +431,8 @@ def sessions_json(request, num):
|
|||
## Scheduledsesion
|
||||
#############################################################################
|
||||
|
||||
# this creates an entirely *NEW* scheduledsession
|
||||
def scheduledsessions_post(request, meeting, schedule):
|
||||
# this creates an entirely *NEW* schedtimesessassignment
|
||||
def assignments_post(request, meeting, schedule):
|
||||
cansee,canedit,secretariat = agenda_permissions(meeting, schedule, request.user)
|
||||
if not canedit:
|
||||
return HttpResponse(json.dumps({'error':'no permission to modify this agenda'}),
|
||||
|
@ -446,15 +446,15 @@ def scheduledsessions_post(request, meeting, schedule):
|
|||
status = 406,
|
||||
content_type="application/json")
|
||||
|
||||
ss1 = ScheduledSession(schedule = schedule,
|
||||
ss1 = SchedTimeSessAssignment(schedule = schedule,
|
||||
session_id = newvalues["session_id"],
|
||||
timeslot_id = newvalues["timeslot_id"])
|
||||
if("extendedfrom_id" in newvalues):
|
||||
val = int(newvalues["extendedfrom_id"])
|
||||
try:
|
||||
ss2 = schedule.scheduledsession_set.get(pk = val)
|
||||
ss2 = schedule.assignments.get(pk = val)
|
||||
ss1.extendedfrom = ss2
|
||||
except ScheduledSession.DoesNotExist:
|
||||
except SchedTimeSessAssignment.DoesNotExist:
|
||||
return HttpResponse(json.dumps({'error':'invalid extendedfrom value: %u' % val}),
|
||||
status = 406,
|
||||
content_type="application/json")
|
||||
|
@ -467,28 +467,28 @@ def scheduledsessions_post(request, meeting, schedule):
|
|||
response['Location'] = ss1_dict["href"],
|
||||
return response
|
||||
|
||||
def scheduledsessions_get(request, num, schedule):
|
||||
scheduledsessions = schedule.scheduledsession_set.all()
|
||||
def assignments_get(request, num, schedule):
|
||||
assignments = schedule.assignments.all()
|
||||
|
||||
sess1_dict = [ x.json_dict(request.build_absolute_uri('/')) for x in scheduledsessions ]
|
||||
sess1_dict = [ x.json_dict(request.build_absolute_uri('/')) for x in assignments ]
|
||||
return HttpResponse(json.dumps(sess1_dict, sort_keys=True, indent=2),
|
||||
content_type="application/json")
|
||||
|
||||
# this returns the list of scheduled sessions for the given named agenda
|
||||
def scheduledsessions_json(request, num, owner, name):
|
||||
def assignments_json(request, num, owner, name):
|
||||
meeting, person, schedule = get_meeting_schedule(num, owner, name)
|
||||
|
||||
if request.method == 'GET':
|
||||
return scheduledsessions_get(request, meeting, schedule)
|
||||
return assignments_get(request, meeting, schedule)
|
||||
elif request.method == 'POST':
|
||||
return scheduledsessions_post(request, meeting, schedule)
|
||||
return assignments_post(request, meeting, schedule)
|
||||
else:
|
||||
return HttpResponse(json.dumps({'error':'inappropriate action: %s' % (request.method)}),
|
||||
status = 406,
|
||||
content_type="application/json")
|
||||
|
||||
# accepts both POST and PUT in order to implement Postel Doctrine.
|
||||
def scheduledsession_update(request, meeting, schedule, ss):
|
||||
def assignment_update(request, meeting, schedule, ss):
|
||||
cansee,canedit,secretariat = agenda_permissions(meeting, schedule, request.user)
|
||||
if not canedit:
|
||||
return HttpResponse(json.dumps({'error':'no permission to update this agenda'}),
|
||||
|
@ -506,7 +506,7 @@ def scheduledsession_update(request, meeting, schedule, ss):
|
|||
return HttpResponse(json.dumps({'message':'valid'}),
|
||||
content_type="application/json")
|
||||
|
||||
def scheduledsession_delete(request, meeting, schedule, ss):
|
||||
def assignment_delete(request, meeting, schedule, ss):
|
||||
cansee,canedit,secretariat = agenda_permissions(meeting, schedule, request.user)
|
||||
if not canedit:
|
||||
return HttpResponse(json.dumps({'error':'no permission to update this agenda'}),
|
||||
|
@ -514,13 +514,13 @@ def scheduledsession_delete(request, meeting, schedule, ss):
|
|||
content_type="application/json")
|
||||
|
||||
# in case there is, somehow, more than one item with the same pk.. XXX
|
||||
scheduledsessions = schedule.scheduledsession_set.filter(pk = ss.pk)
|
||||
if len(scheduledsessions) == 0:
|
||||
assignments = schedule.assignments.filter(pk = ss.pk)
|
||||
if len(assignments) == 0:
|
||||
return HttpResponse(json.dumps({'error':'no such object'}),
|
||||
status = 404,
|
||||
content_type="application/json")
|
||||
count=0
|
||||
for ss in scheduledsessions:
|
||||
for ss in assignments:
|
||||
ss.delete()
|
||||
count += 1
|
||||
|
||||
|
@ -528,7 +528,7 @@ def scheduledsession_delete(request, meeting, schedule, ss):
|
|||
status = 200,
|
||||
content_type="application/json")
|
||||
|
||||
def scheduledsession_get(request, meeting, schedule, ss):
|
||||
def assignment_get(request, meeting, schedule, ss):
|
||||
cansee,canedit,secretariat = agenda_permissions(meeting, schedule, request.user)
|
||||
|
||||
if not cansee:
|
||||
|
@ -541,22 +541,22 @@ def scheduledsession_get(request, meeting, schedule, ss):
|
|||
content_type="application/json")
|
||||
|
||||
# this return a specific session, updates a session or deletes a SPECIFIC scheduled session
|
||||
def scheduledsession_json(request, num, owner, name, scheduledsession_id):
|
||||
def assignment_json(request, num, owner, name, assignment_id):
|
||||
meeting, person, schedule = get_meeting_schedule(num, owner, name)
|
||||
|
||||
scheduledsessions = schedule.scheduledsession_set.filter(pk = scheduledsession_id)
|
||||
if len(scheduledsessions) == 0:
|
||||
return HttpResponse(json.dumps({'error' : 'invalid scheduledsession'}),
|
||||
assignments = schedule.assignments.filter(pk = assignment_id)
|
||||
if len(assignments) == 0:
|
||||
return HttpResponse(json.dumps({'error' : 'invalid assignment'}),
|
||||
content_type="application/json",
|
||||
status=404);
|
||||
ss = scheduledsessions[0]
|
||||
ss = assignments[0]
|
||||
|
||||
if request.method == 'GET':
|
||||
return scheduledsession_get(request, meeting, schedule, ss)
|
||||
return assignment_get(request, meeting, schedule, ss)
|
||||
elif request.method == 'PUT' or request.method=='POST':
|
||||
return scheduledsession_update(request, meeting, schedule, ss)
|
||||
return assignment_update(request, meeting, schedule, ss)
|
||||
elif request.method == 'DELETE':
|
||||
return scheduledsession_delete(request, meeting, schedule, ss)
|
||||
return assignment_delete(request, meeting, schedule, ss)
|
||||
|
||||
#############################################################################
|
||||
## Constraints API
|
||||
|
|
|
@ -61,8 +61,8 @@ def get_areas():
|
|||
Q(state="active", type="area")).order_by('acronym')
|
||||
|
||||
# get list of areas that are referenced.
|
||||
def get_area_list_from_sessions(scheduledsessions, num):
|
||||
return scheduledsessions.filter(timeslot__type = 'Session',
|
||||
def get_area_list_from_sessions(assignments, num):
|
||||
return assignments.filter(timeslot__type = 'Session',
|
||||
session__group__parent__isnull = False).order_by(
|
||||
'session__group__parent__acronym').distinct().values_list(
|
||||
'session__group__parent__acronym',flat=True)
|
||||
|
@ -85,25 +85,25 @@ def build_all_agenda_slices(meeting):
|
|||
time_slices.sort()
|
||||
return time_slices,date_slices
|
||||
|
||||
def get_all_scheduledsessions_from_schedule(schedule):
|
||||
ss = schedule.scheduledsession_set.filter(timeslot__location__isnull = False)
|
||||
def get_all_assignments_from_schedule(schedule):
|
||||
ss = schedule.assignments.filter(timeslot__location__isnull = False)
|
||||
ss = ss.filter(session__type__slug='session')
|
||||
ss = ss.order_by('timeslot__time','timeslot__name')
|
||||
|
||||
return ss
|
||||
|
||||
def get_modified_from_scheduledsessions(scheduledsessions):
|
||||
return scheduledsessions.aggregate(Max('timeslot__modified'))['timeslot__modified__max']
|
||||
def get_modified_from_assignments(assignments):
|
||||
return assignments.aggregate(Max('timeslot__modified'))['timeslot__modified__max']
|
||||
|
||||
def get_wg_name_list(scheduledsessions):
|
||||
return scheduledsessions.filter(timeslot__type = 'Session',
|
||||
def get_wg_name_list(assignments):
|
||||
return assignments.filter(timeslot__type = 'Session',
|
||||
session__group__isnull = False,
|
||||
session__group__parent__isnull = False).order_by(
|
||||
'session__group__acronym').distinct().values_list(
|
||||
'session__group__acronym',flat=True)
|
||||
|
||||
def get_wg_list(scheduledsessions):
|
||||
wg_name_list = get_wg_name_list(scheduledsessions)
|
||||
def get_wg_list(assignments):
|
||||
wg_name_list = get_wg_name_list(assignments)
|
||||
return Group.objects.filter(acronym__in = set(wg_name_list)).order_by('parent__acronym','acronym')
|
||||
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@ class Command(BaseCommand):
|
|||
meeting = get_meeting(meetingname)
|
||||
schedule = get_schedule(meeting, schedname)
|
||||
|
||||
scheduledsessions = schedule.scheduledsession_set.all()
|
||||
assignments = schedule.assignments.all()
|
||||
|
||||
# cribbed from django/core/management/commands/dumpdata.py
|
||||
# Check that the serialization format exists; this is a shortcut to
|
||||
|
@ -35,7 +35,7 @@ class Command(BaseCommand):
|
|||
if format not in serializers.get_public_serializer_formats():
|
||||
raise CommandError("Unknown serialization format: %s" % format)
|
||||
|
||||
return serializers.serialize(format, scheduledsessions, indent=indent,
|
||||
return serializers.serialize(format, assignments, indent=indent,
|
||||
use_natural_keys=True)
|
||||
|
||||
|
||||
|
|
26
ietf/meeting/migrations/0012_auto_20151026_1406.py
Normal file
26
ietf/meeting/migrations/0012_auto_20151026_1406.py
Normal file
|
@ -0,0 +1,26 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import models, migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('meeting', '0011_ietf92_meetings'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='scheduledsession',
|
||||
name='session',
|
||||
field=models.ForeignKey(related_name='timeslotassignments', default=None, to='meeting.Session', help_text='Scheduled session.', null=True),
|
||||
preserve_default=True,
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='scheduledsession',
|
||||
name='timeslot',
|
||||
field=models.ForeignKey(related_name='sessionassignments', to='meeting.TimeSlot'),
|
||||
preserve_default=True,
|
||||
),
|
||||
]
|
39
ietf/meeting/migrations/0013_auto_20151026_1408.py
Normal file
39
ietf/meeting/migrations/0013_auto_20151026_1408.py
Normal file
|
@ -0,0 +1,39 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import models, migrations
|
||||
import datetime
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('meeting', '0012_auto_20151026_1406'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Dummy',
|
||||
fields=[
|
||||
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
||||
('modified', models.DateTimeField(default=datetime.datetime.now)),
|
||||
('notes', models.TextField(blank=True)),
|
||||
('badness', models.IntegerField(default=0, null=True, blank=True)),
|
||||
('pinned', models.BooleanField(default=False, help_text=b'Do not move session during automatic placement.')),
|
||||
('extendedfrom', models.ForeignKey(default=None, to='self', help_text='Timeslot this session is an extension of.', null=True)),
|
||||
('schedule', models.ForeignKey(related_name='assignments', to='meeting.Schedule')),
|
||||
('session', models.ForeignKey(related_name='timeslotassignments', default=None, to='meeting.Session', help_text='Scheduled session.', null=True)),
|
||||
('timeslot', models.ForeignKey(related_name='sessionassignments', to='meeting.TimeSlot')),
|
||||
],
|
||||
options={
|
||||
'ordering': ['timeslot__time', 'timeslot__type__slug', 'session__group__parent__name', 'session__group__acronym', 'session__name'],
|
||||
},
|
||||
bases=(models.Model,),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='timeslot',
|
||||
name='sessions',
|
||||
field=models.ManyToManyField(related_name='slots', to='meeting.Session', through='meeting.Dummy', blank=True, help_text='Scheduled session, if any.', null=True),
|
||||
preserve_default=True,
|
||||
),
|
||||
]
|
43
ietf/meeting/migrations/0014_auto_20151026_1414.py
Normal file
43
ietf/meeting/migrations/0014_auto_20151026_1414.py
Normal file
|
@ -0,0 +1,43 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import models, migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('meeting', '0013_auto_20151026_1408'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RenameModel('ScheduledSession', 'SchedTimeSessAssignment'),
|
||||
|
||||
migrations.AlterField(
|
||||
model_name='timeslot',
|
||||
name='sessions',
|
||||
field=models.ManyToManyField(related_name='slots', to='meeting.Session', through='meeting.SchedTimeSessAssignment', blank=True, help_text='Scheduled session, if any.', null=True),
|
||||
preserve_default=True,
|
||||
),
|
||||
|
||||
migrations.RemoveField(
|
||||
model_name='dummy',
|
||||
name='extendedfrom',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='dummy',
|
||||
name='schedule',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='dummy',
|
||||
name='session',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='dummy',
|
||||
name='timeslot',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='Dummy',
|
||||
),
|
||||
|
||||
]
|
|
@ -237,11 +237,11 @@ class Meeting(models.Model):
|
|||
# alltimeslots = self.timeslot_set.all()
|
||||
# for sched in self.schedule_set.all():
|
||||
# ts_hash = {}
|
||||
# for ss in sched.scheduledsession_set.all():
|
||||
# for ss in sched.assignments.all():
|
||||
# ts_hash[ss.timeslot] = ss
|
||||
# for ts in alltimeslots:
|
||||
# if not (ts in ts_hash):
|
||||
# ScheduledSession.objects.create(schedule = sched,
|
||||
# SchedTimeSessAssignment.objects.create(schedule = sched,
|
||||
# timeslot = ts)
|
||||
|
||||
def vtimezone(self):
|
||||
|
@ -297,7 +297,7 @@ class Room(models.Model):
|
|||
|
||||
def delete_timeslots(self):
|
||||
for ts in self.timeslot_set.all():
|
||||
ts.scheduledsession_set.all().delete()
|
||||
ts.sessionassignments.all().delete()
|
||||
ts.delete()
|
||||
|
||||
def create_timeslots(self):
|
||||
|
@ -339,14 +339,14 @@ class TimeSlot(models.Model):
|
|||
duration = TimedeltaField()
|
||||
location = models.ForeignKey(Room, blank=True, null=True)
|
||||
show_location = models.BooleanField(default=True, help_text="Show location in agenda.")
|
||||
sessions = models.ManyToManyField('Session', related_name='slots', through='ScheduledSession', null=True, blank=True, help_text=u"Scheduled session, if any.")
|
||||
sessions = models.ManyToManyField('Session', related_name='slots', through='SchedTimeSessAssignment', null=True, blank=True, help_text=u"Scheduled session, if any.")
|
||||
modified = models.DateTimeField(default=datetime.datetime.now)
|
||||
#
|
||||
|
||||
@property
|
||||
def session(self):
|
||||
if not hasattr(self, "_session_cache"):
|
||||
self._session_cache = self.sessions.filter(scheduledsession__schedule=self.meeting.agenda).first()
|
||||
self._session_cache = self.sessions.filter(timeslotassignments__schedule=self.meeting.agenda).first()
|
||||
return self._session_cache
|
||||
|
||||
@property
|
||||
|
@ -486,7 +486,7 @@ class TimeSlot(models.Model):
|
|||
|
||||
# now remove any schedule that might have been made to this
|
||||
# timeslot.
|
||||
ts.scheduledsession_set.all().delete()
|
||||
ts.sessionassignments.all().delete()
|
||||
ts.delete()
|
||||
|
||||
"""
|
||||
|
@ -527,11 +527,11 @@ class Schedule(models.Model):
|
|||
def base_url(self):
|
||||
return "/meeting/%s/agenda/%s/%s" % (self.meeting.number, self.owner_email(), self.name)
|
||||
|
||||
# temporary property to pacify the places where Schedule.scheduledsession_set is used
|
||||
@property
|
||||
def scheduledsession_set(self):
|
||||
return self.assignments
|
||||
|
||||
# temporary property to pacify the places where Schedule.assignments is used
|
||||
# @property
|
||||
# def schedtimesessassignment_set(self):
|
||||
# return self.assignments
|
||||
#
|
||||
# def url_edit(self):
|
||||
# return "/meeting/%s/agenda/%s/edit" % (self.meeting.number, self.name)
|
||||
#
|
||||
|
@ -571,7 +571,7 @@ class Schedule(models.Model):
|
|||
else:
|
||||
return "agenda_unofficial"
|
||||
|
||||
# returns a dictionary {group -> [scheduledsession+]}
|
||||
# returns a dictionary {group -> [schedtimesessassignment+]}
|
||||
# and it has [] if the session is not placed.
|
||||
# if there is more than one session for that group,
|
||||
# then a list of them is returned (always a list)
|
||||
|
@ -582,8 +582,8 @@ class Schedule(models.Model):
|
|||
else:
|
||||
return "unofficial"
|
||||
|
||||
def delete_scheduledsessions(self):
|
||||
self.scheduledsession_set.all().delete()
|
||||
def delete_assignments(self):
|
||||
self.assignments.all().delete()
|
||||
|
||||
def json_url(self):
|
||||
return "%s.json" % self.base_url()
|
||||
|
@ -601,12 +601,12 @@ class Schedule(models.Model):
|
|||
else:
|
||||
sch['public'] = "private"
|
||||
sch['owner'] = urljoin(host_scheme, self.owner.json_url())
|
||||
# should include href to list of scheduledsessions, but they have no direct API yet.
|
||||
# should include href to list of assignments, but they have no direct API yet.
|
||||
return sch
|
||||
|
||||
@property
|
||||
def qs_scheduledsessions_with_assignments(self):
|
||||
return self.scheduledsession_set.filter(session__isnull=False)
|
||||
def qs_assignments_with_sessions(self):
|
||||
return self.assignments.filter(session__isnull=False)
|
||||
|
||||
@property
|
||||
def group_mapping(self):
|
||||
|
@ -619,7 +619,7 @@ class Schedule(models.Model):
|
|||
sessions = dict()
|
||||
total = 0
|
||||
scheduled = 0
|
||||
allschedsessions = self.qs_scheduledsessions_with_assignments.filter(timeslot__type = "session").all()
|
||||
allschedsessions = self.qs_assignments_with_sessions.filter(timeslot__type = "session").all()
|
||||
for sess in self.meeting.sessions_that_can_meet.all():
|
||||
assignments[sess.group] = []
|
||||
sessions[sess] = None
|
||||
|
@ -653,20 +653,20 @@ class Schedule(models.Model):
|
|||
return badness
|
||||
|
||||
def delete_schedule(self):
|
||||
self.scheduledsession_set.all().delete()
|
||||
self.assignments.all().delete()
|
||||
self.delete()
|
||||
|
||||
# to be renamed ScheduleTimeslotSessionAssignments (stsa)
|
||||
class ScheduledSession(models.Model):
|
||||
# to be renamed SchedTimeSessAssignments (stsa)
|
||||
class SchedTimeSessAssignment(models.Model):
|
||||
"""
|
||||
This model provides an N:M relationship between Session and TimeSlot.
|
||||
Each relationship is attached to the named agenda, which is owned by
|
||||
a specific person/user.
|
||||
"""
|
||||
timeslot = models.ForeignKey('TimeSlot', null=False, blank=False)
|
||||
session = models.ForeignKey('Session', null=True, default=None, help_text=u"Scheduled session.")
|
||||
timeslot = models.ForeignKey('TimeSlot', null=False, blank=False, related_name='sessionassignments')
|
||||
session = models.ForeignKey('Session', null=True, default=None, related_name='timeslotassignments', help_text=u"Scheduled session.")
|
||||
schedule = models.ForeignKey('Schedule', null=False, blank=False, related_name='assignments')
|
||||
extendedfrom = models.ForeignKey('ScheduledSession', null=True, default=None, help_text=u"Timeslot this session is an extension of.")
|
||||
extendedfrom = models.ForeignKey('self', null=True, default=None, help_text=u"Timeslot this session is an extension of.")
|
||||
modified = models.DateTimeField(default=datetime.datetime.now)
|
||||
notes = models.TextField(blank=True)
|
||||
badness = models.IntegerField(default=0, blank=True, null=True)
|
||||
|
@ -675,7 +675,7 @@ class ScheduledSession(models.Model):
|
|||
class Meta:
|
||||
ordering = ["timeslot__time", "timeslot__type__slug", "session__group__parent__name", "session__group__acronym", "session__name", ]
|
||||
|
||||
# use to distinguish this from FakeScheduledSession in placement.py
|
||||
# use to distinguish this from FakeSchedTimeSessAssignment in placement.py
|
||||
faked = "real"
|
||||
|
||||
def __unicode__(self):
|
||||
|
@ -694,7 +694,7 @@ class ScheduledSession(models.Model):
|
|||
def slot_to_the_right(self):
|
||||
s = self.timeslot.slot_to_the_right
|
||||
if s:
|
||||
return self.schedule.scheduledsession_set.filter(timeslot=s).first()
|
||||
return self.schedule.assignments.filter(timeslot=s).first()
|
||||
else:
|
||||
return None
|
||||
|
||||
|
@ -736,11 +736,11 @@ class ScheduledSession(models.Model):
|
|||
|
||||
def json_dict(self, host_scheme):
|
||||
ss = dict()
|
||||
ss['scheduledsession_id'] = self.id
|
||||
ss['assignment_id'] = self.id
|
||||
ss['href'] = urljoin(host_scheme, self.json_url())
|
||||
ss['timeslot_id'] = self.timeslot.id
|
||||
|
||||
efset = self.session.scheduledsession_set.filter(schedule=self.schedule).order_by("timeslot__time")
|
||||
efset = self.session.timeslotassignments.filter(schedule=self.schedule).order_by("timeslot__time")
|
||||
if efset.count() > 1:
|
||||
# now we know that there is some work to do finding the extendedfrom_id.
|
||||
# loop through the list of items
|
||||
|
@ -939,7 +939,7 @@ class Session(models.Model):
|
|||
ss0name = "(%s)" % self.status.name
|
||||
else:
|
||||
ss0name = "(unscheduled)"
|
||||
ss = self.scheduledsession_set.filter(schedule=self.meeting.agenda).order_by('timeslot__time')
|
||||
ss = self.timeslotassignments.filter(schedule=self.meeting.agenda).order_by('timeslot__time')
|
||||
if ss:
|
||||
ss0name = ','.join([x.timeslot.time.strftime("%a-%H%M") for x in ss])
|
||||
return u"%s: %s %s %s" % (self.meeting, self.group.acronym, self.name, ss0name)
|
||||
|
@ -967,11 +967,11 @@ class Session(models.Model):
|
|||
def reverse_constraints(self):
|
||||
return Constraint.objects.filter(target=self.group, meeting=self.meeting).order_by('name__name')
|
||||
|
||||
def scheduledsession_for_agenda(self, schedule):
|
||||
return self.scheduledsession_set.filter(schedule=schedule)[0]
|
||||
def timeslotassignment_for_agenda(self, schedule):
|
||||
return self.timeslotassignments.filter(schedule=schedule)[0]
|
||||
|
||||
def official_scheduledsession(self):
|
||||
return self.scheduledsession_for_agenda(self.meeting.agenda)
|
||||
def official_timeslotassignment(self):
|
||||
return self.timeslotassignment_for_agenda(self.meeting.agenda)
|
||||
|
||||
def unique_constraints(self):
|
||||
global constraint_cache_uses, constraint_cache_initials
|
||||
|
|
|
@ -16,8 +16,8 @@ from datetime import datetime
|
|||
|
||||
from django.db import models
|
||||
#from settings import BADNESS_UNPLACED, BADNESS_TOOSMALL_50, BADNESS_TOOSMALL_100, BADNESS_TOOBIG, BADNESS_MUCHTOOBIG
|
||||
#from ietf.meeting.models import Schedule, ScheduledSession,TimeSlot,Room
|
||||
from ietf.meeting.models import ScheduledSession
|
||||
#from ietf.meeting.models import Schedule, SchedTimeSessAssignment,TimeSlot,Room
|
||||
from ietf.meeting.models import SchedTimeSessAssignment
|
||||
from django.template.defaultfilters import slugify, date as date_format, time as time_format
|
||||
|
||||
def do_prompt():
|
||||
|
@ -36,14 +36,14 @@ class ScheduleSlot(object):
|
|||
self.badness = None
|
||||
self.slotgroups = {}
|
||||
|
||||
# this is a partial copy of ScheduledSession's methods. Prune later.
|
||||
# this is a partial copy of SchedTimeSessAssignment's methods. Prune later.
|
||||
#def __unicode__(self):
|
||||
# return u"%s [%s<->%s]" % (self.schedule, self.session, self.timeslot)
|
||||
#
|
||||
#def __str__(self):
|
||||
# return self.__unicode__()
|
||||
|
||||
def add_scheduledsession(self,fs):
|
||||
def add_assignment(self,fs):
|
||||
self.slotgroups[fs] = fs
|
||||
|
||||
def scheduled_session_pk(self, assignments):
|
||||
|
@ -113,8 +113,8 @@ class UnplacedScheduleSlot(ScheduleSlot):
|
|||
def count(self):
|
||||
return len(self.unplaced_slot_numbers)
|
||||
|
||||
def add_scheduledsession(self,fs):
|
||||
super(UnplacedScheduleSlot, self).add_scheduledsession(fs)
|
||||
def add_assignment(self,fs):
|
||||
super(UnplacedScheduleSlot, self).add_assignment(fs)
|
||||
#print "unplaced add: %s" % (fs.available_slot)
|
||||
self.unplaced_slot_numbers.append(fs.available_slot)
|
||||
|
||||
|
@ -126,7 +126,7 @@ class UnplacedScheduleSlot(ScheduleSlot):
|
|||
del self.unplaced_slot_numbers[0]
|
||||
|
||||
|
||||
class FakeScheduledSession(object):
|
||||
class FakeSchedTimeSessAssignment(object):
|
||||
"""
|
||||
This model provides a fake (not-backed by database) N:M relationship between
|
||||
Session and TimeSlot, but in this case TimeSlot is always None, because the
|
||||
|
@ -147,7 +147,7 @@ class FakeScheduledSession(object):
|
|||
self.pinned = False
|
||||
self.scheduleslot = None
|
||||
|
||||
def fromScheduledSession(self, ss): # or from another FakeScheduledSession
|
||||
def fromSchedTimeSessAssignment(self, ss): # or from another FakeSchedTimeSessAssignment
|
||||
self.session = ss.session
|
||||
self.schedule = ss.schedule
|
||||
self.timeslot = ss.timeslot
|
||||
|
@ -158,7 +158,7 @@ class FakeScheduledSession(object):
|
|||
def save(self):
|
||||
pass
|
||||
|
||||
# this is a partial copy of ScheduledSession's methods. Prune later.
|
||||
# this is a partial copy of SchedTimeSessAssignment's methods. Prune later.
|
||||
def __unicode__(self):
|
||||
return u"%s [%s<->%s]" % (self.schedule, self.session, self.timeslot)
|
||||
|
||||
|
@ -254,7 +254,7 @@ class FakeScheduledSession(object):
|
|||
|
||||
def json_dict(self, selfurl):
|
||||
ss = dict()
|
||||
ss['scheduledsession_id'] = self.id
|
||||
ss['assignment_id'] = self.id
|
||||
#ss['href'] = self.url(sitefqdn)
|
||||
ss['empty'] = self.empty_str
|
||||
ss['timeslot_id'] = self.timeslot.id
|
||||
|
@ -324,13 +324,13 @@ class CurrentScheduleState:
|
|||
|
||||
if time_column is not None:
|
||||
# needs available_slot to be filled in
|
||||
time_column.add_scheduledsession(fs)
|
||||
time_column.add_assignment(fs)
|
||||
#print "adding item: %u to unplaced slots (pinned: %s)" % (fs.available_slot, fs.pinned)
|
||||
|
||||
def __init__(self, schedule, seed=None):
|
||||
# initialize available_slots with the places that a session can go based upon the
|
||||
# scheduledsession objects of the provided schedule.
|
||||
# for each session which is not initially scheduled, also create a scheduledsession
|
||||
# schedtimesessassignment objects of the provided schedule.
|
||||
# for each session which is not initially scheduled, also create a schedtimesessassignment
|
||||
# that has a session, but no timeslot.
|
||||
|
||||
self.recordsteps = True
|
||||
|
@ -339,7 +339,7 @@ class CurrentScheduleState:
|
|||
self.lastSaveStep = 0
|
||||
self.verbose = False
|
||||
|
||||
# this maps a *group* to a list of (session,location) pairs, using FakeScheduledSession
|
||||
# this maps a *group* to a list of (session,location) pairs, using FakeSchedTimeSessAssignment
|
||||
self.current_assignments = {}
|
||||
self.tempdict = {} # used when calculating badness.
|
||||
|
||||
|
@ -368,14 +368,14 @@ class CurrentScheduleState:
|
|||
for timeslot in schedule.meeting.timeslot_set.filter(type = "session").all():
|
||||
if not timeslot.time in self.timeslots:
|
||||
self.timeslots[timeslot.time] = ScheduleSlot(timeslot.time)
|
||||
fs = FakeScheduledSession(self.schedule)
|
||||
fs = FakeSchedTimeSessAssignment(self.schedule)
|
||||
fs.timeslot = timeslot
|
||||
self.add_to_available_slot(fs)
|
||||
self.timeslots[None] = self.unplaced_scheduledslots
|
||||
|
||||
# make list of things that need placement.
|
||||
for sess in self.meeting.sessions_that_can_be_placed().all():
|
||||
fs = FakeScheduledSession(self.schedule)
|
||||
fs = FakeSchedTimeSessAssignment(self.schedule)
|
||||
fs.session = sess
|
||||
self.sessions[sess] = fs
|
||||
self.current_assignments[sess.group] = []
|
||||
|
@ -383,16 +383,16 @@ class CurrentScheduleState:
|
|||
#print "Then had %u" % (self.total_slots)
|
||||
# now find slots that are not empty.
|
||||
# loop here and the one for useableslots could be merged into one loop
|
||||
allschedsessions = self.schedule.qs_scheduledsessions_with_assignments.filter(timeslot__type = "session").all()
|
||||
allschedsessions = self.schedule.qs_assignments_with_sessions.filter(timeslot__type = "session").all()
|
||||
for ss in allschedsessions:
|
||||
# do not need to check for ss.session is not none, because filter above only returns those ones.
|
||||
sess = ss.session
|
||||
if not (sess in self.sessions):
|
||||
#print "Had to create sess for %s" % (sess)
|
||||
self.sessions[sess] = FakeScheduledSession(self.schedule)
|
||||
self.sessions[sess] = FakeSchedTimeSessAssignment(self.schedule)
|
||||
fs = self.sessions[sess]
|
||||
#print "Updating %s from %s(%s)" % (fs.session.group.acronym, ss.timeslot.location.name, ss.timeslot.time)
|
||||
fs.fromScheduledSession(ss)
|
||||
fs.fromSchedTimeSessAssignment(ss)
|
||||
|
||||
# if pinned, then do not consider it when selecting, but it needs to be in
|
||||
# current_assignments so that conflicts are calculated.
|
||||
|
@ -406,7 +406,7 @@ class CurrentScheduleState:
|
|||
|
||||
# need to remove any sessions that might have gotten through above, but are in non-session
|
||||
# places, otherwise these could otherwise appear to be unplaced.
|
||||
allspecialsessions = self.schedule.qs_scheduledsessions_with_assignments.exclude(timeslot__type = "session").all()
|
||||
allspecialsessions = self.schedule.qs_assignments_with_sessions.exclude(timeslot__type = "session").all()
|
||||
for ss in allspecialsessions:
|
||||
sess = ss.session
|
||||
if sess is None:
|
||||
|
@ -693,7 +693,7 @@ class CurrentScheduleState:
|
|||
self.lastSaveStep = self.stepnum
|
||||
|
||||
# first, remove all assignments in the schedule.
|
||||
for ss in targetSchedule.scheduledsession_set.all():
|
||||
for ss in targetSchedule.assignments.all():
|
||||
if ss.pinned:
|
||||
continue
|
||||
ss.delete()
|
||||
|
@ -702,7 +702,7 @@ class CurrentScheduleState:
|
|||
for fs in self.available_slots:
|
||||
if fs is None:
|
||||
continue
|
||||
ss = ScheduledSession(timeslot = fs.timeslot,
|
||||
ss = SchedTimeSessAssignment(timeslot = fs.timeslot,
|
||||
schedule = targetSchedule,
|
||||
session = fs.session)
|
||||
ss.save()
|
||||
|
@ -733,7 +733,7 @@ if False:
|
|||
class AutomaticScheduleStep(models.Model):
|
||||
schedule = models.ForeignKey('Schedule', null=False, blank=False, help_text=u"Who made this agenda.")
|
||||
session = models.ForeignKey('Session', null=True, default=None, help_text=u"Scheduled session involved.")
|
||||
moved_from = models.ForeignKey('ScheduledSession', related_name="+", null=True, default=None, help_text=u"Where session was.")
|
||||
moved_to = models.ForeignKey('ScheduledSession', related_name="+", null=True, default=None, help_text=u"Where session went.")
|
||||
moved_from = models.ForeignKey('SchedTimeSessAssignment', related_name="+", null=True, default=None, help_text=u"Where session was.")
|
||||
moved_to = models.ForeignKey('SchedTimeSessAssignment', related_name="+", null=True, default=None, help_text=u"Where session went.")
|
||||
stepnum = models.IntegerField(default=0, blank=True, null=True)
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ from tastypie.constants import ALL, ALL_WITH_RELATIONS
|
|||
from ietf import api
|
||||
|
||||
from ietf.meeting.models import ( Meeting, ResourceAssociation, Constraint, Room, Schedule, Session,
|
||||
TimeSlot, ScheduledSession, SessionPresentation )
|
||||
TimeSlot, SchedTimeSessAssignment, SessionPresentation )
|
||||
|
||||
from ietf.name.resources import MeetingTypeNameResource
|
||||
class MeetingResource(ModelResource):
|
||||
|
@ -179,15 +179,15 @@ class TimeSlotResource(ModelResource):
|
|||
}
|
||||
api.meeting.register(TimeSlotResource())
|
||||
|
||||
class ScheduledSessionResource(ModelResource):
|
||||
class SchedTimeSessAssignmentResource(ModelResource):
|
||||
timeslot = ToOneField(TimeSlotResource, 'timeslot')
|
||||
session = ToOneField(SessionResource, 'session', null=True)
|
||||
schedule = ToOneField(ScheduleResource, 'schedule')
|
||||
extendedfrom = ToOneField('ietf.meeting.resources.ScheduledSessionResource', 'extendedfrom', null=True)
|
||||
extendedfrom = ToOneField('ietf.meeting.resources.SchedTimeSessAssignmentResource', 'extendedfrom', null=True)
|
||||
class Meta:
|
||||
queryset = ScheduledSession.objects.all()
|
||||
queryset = SchedTimeSessAssignment.objects.all()
|
||||
serializer = api.Serializer()
|
||||
#resource_name = 'scheduledsession'
|
||||
#resource_name = 'schedtimesessassignment'
|
||||
filtering = {
|
||||
"id": ALL,
|
||||
"modified": ALL,
|
||||
|
@ -199,7 +199,7 @@ class ScheduledSessionResource(ModelResource):
|
|||
"schedule": ALL_WITH_RELATIONS,
|
||||
"extendedfrom": ALL_WITH_RELATIONS,
|
||||
}
|
||||
api.meeting.register(ScheduledSessionResource())
|
||||
api.meeting.register(SchedTimeSessAssignmentResource())
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ import datetime
|
|||
|
||||
from ietf.doc.models import Document, State
|
||||
from ietf.group.models import Group
|
||||
from ietf.meeting.models import Meeting, Room, TimeSlot, Session, Schedule, ScheduledSession, ResourceAssociation, SessionPresentation
|
||||
from ietf.meeting.models import Meeting, Room, TimeSlot, Session, Schedule, SchedTimeSessAssignment, ResourceAssociation, SessionPresentation
|
||||
from ietf.name.models import RoomResourceName
|
||||
from ietf.person.models import Person
|
||||
from ietf.utils.test_data import make_test_data
|
||||
|
@ -34,7 +34,7 @@ def make_meeting_test_data():
|
|||
requested_duration=20, status_id="schedw",
|
||||
scheduled=datetime.datetime.now(),type_id="session")
|
||||
mars_session.resources = [projector]
|
||||
ScheduledSession.objects.create(timeslot=slot, session=mars_session, schedule=schedule)
|
||||
SchedTimeSessAssignment.objects.create(timeslot=slot, session=mars_session, schedule=schedule)
|
||||
|
||||
# ames WG
|
||||
slot = TimeSlot.objects.create(meeting=meeting, type_id="session", duration=30 * 60, location=room,
|
||||
|
@ -43,7 +43,7 @@ def make_meeting_test_data():
|
|||
attendees=10, requested_by=system_person,
|
||||
requested_duration=20, status_id="schedw",
|
||||
scheduled=datetime.datetime.now(),type_id="session")
|
||||
ScheduledSession.objects.create(timeslot=slot, session=ames_session, schedule=schedule)
|
||||
SchedTimeSessAssignment.objects.create(timeslot=slot, session=ames_session, schedule=schedule)
|
||||
|
||||
# IESG breakfast
|
||||
breakfast_slot = TimeSlot.objects.create(meeting=meeting, type_id="lead", duration=90 * 60,
|
||||
|
@ -54,7 +54,7 @@ def make_meeting_test_data():
|
|||
attendees=25, requested_by=system_person,
|
||||
requested_duration=20, status_id="schedw",
|
||||
scheduled=datetime.datetime.now(),type_id="lead")
|
||||
ScheduledSession.objects.create(timeslot=breakfast_slot, session=iesg_session, schedule=schedule)
|
||||
SchedTimeSessAssignment.objects.create(timeslot=breakfast_slot, session=iesg_session, schedule=schedule)
|
||||
|
||||
meeting.agenda = schedule
|
||||
meeting.save()
|
||||
|
|
|
@ -5,7 +5,7 @@ from urlparse import urlsplit
|
|||
from django.core.urlresolvers import reverse as urlreverse
|
||||
|
||||
from ietf.group.models import Group
|
||||
from ietf.meeting.models import Schedule, TimeSlot, Session, ScheduledSession, Meeting, Constraint
|
||||
from ietf.meeting.models import Schedule, TimeSlot, Session, SchedTimeSessAssignment, Meeting, Constraint
|
||||
from ietf.meeting.test_data import make_meeting_test_data
|
||||
from ietf.person.models import Person
|
||||
from ietf.utils.test_utils import TestCase
|
||||
|
@ -19,35 +19,35 @@ class ApiTests(TestCase):
|
|||
mars_session = Session.objects.filter(meeting=meeting, group__acronym="mars").first()
|
||||
ames_session = Session.objects.filter(meeting=meeting, group__acronym="ames").first()
|
||||
|
||||
mars_scheduled = ScheduledSession.objects.get(session=mars_session)
|
||||
mars_scheduled = SchedTimeSessAssignment.objects.get(session=mars_session)
|
||||
mars_slot = mars_scheduled.timeslot
|
||||
|
||||
ames_scheduled = ScheduledSession.objects.get(session=ames_session)
|
||||
ames_scheduled = SchedTimeSessAssignment.objects.get(session=ames_session)
|
||||
ames_slot = ames_scheduled.timeslot
|
||||
|
||||
def do_unschedule(scheduledsession):
|
||||
url = urlreverse("ietf.meeting.ajax.scheduledsession_json",
|
||||
kwargs=dict(num=scheduledsession.session.meeting.number,
|
||||
owner=scheduledsession.schedule.owner_email(),
|
||||
name=scheduledsession.schedule.name,
|
||||
scheduledsession_id=scheduledsession.pk,))
|
||||
def do_unschedule(assignment):
|
||||
url = urlreverse("ietf.meeting.ajax.assignment_json",
|
||||
kwargs=dict(num=assignment.session.meeting.number,
|
||||
owner=assignment.schedule.owner_email(),
|
||||
name=assignment.schedule.name,
|
||||
assignment_id=assignment.pk,))
|
||||
return self.client.delete(url)
|
||||
|
||||
def do_schedule(schedule,session,timeslot):
|
||||
url = urlreverse("ietf.meeting.ajax.scheduledsessions_json",
|
||||
url = urlreverse("ietf.meeting.ajax.assignments_json",
|
||||
kwargs=dict(num=session.meeting.number,
|
||||
owner=schedule.owner_email(),
|
||||
name=schedule.name,))
|
||||
post_data = '{ "session_id": "%s", "timeslot_id": "%s" }'%(session.pk,timeslot.pk)
|
||||
return self.client.post(url,post_data,content_type='application/x-www-form-urlencoded')
|
||||
|
||||
def do_extend(schedule,scheduledsession):
|
||||
session = scheduledsession.session
|
||||
url = urlreverse("ietf.meeting.ajax.scheduledsessions_json",
|
||||
def do_extend(schedule, assignment):
|
||||
session = assignment.session
|
||||
url = urlreverse("ietf.meeting.ajax.assignments_json",
|
||||
kwargs=dict(num=session.meeting.number,
|
||||
owner=schedule.owner_email(),
|
||||
name=schedule.name,))
|
||||
post_data = '{ "session_id": "%s", "timeslot_id": "%s", "extendedfrom_id": "%s" }'%(session.pk,scheduledsession.timeslot.slot_to_the_right.pk,scheduledsession.pk)
|
||||
post_data = '{ "session_id": "%s", "timeslot_id": "%s", "extendedfrom_id": "%s" }'%(session.pk,assignment.timeslot.slot_to_the_right.pk,assignment.pk)
|
||||
|
||||
|
||||
return self.client.post(url,post_data,content_type='application/x-www-form-urlencoded')
|
||||
|
@ -56,7 +56,7 @@ class ApiTests(TestCase):
|
|||
# faulty delete
|
||||
r = do_unschedule(mars_scheduled)
|
||||
self.assertEqual(r.status_code, 403)
|
||||
self.assertEqual(ScheduledSession.objects.get(pk=mars_scheduled.pk).session, mars_session)
|
||||
self.assertEqual(SchedTimeSessAssignment.objects.get(pk=mars_scheduled.pk).session, mars_session)
|
||||
# faulty post
|
||||
r = do_schedule(schedule,ames_session,mars_slot)
|
||||
self.assertEqual(r.status_code, 403)
|
||||
|
@ -88,16 +88,16 @@ class ApiTests(TestCase):
|
|||
r = do_extend(schedule,mars_scheduled)
|
||||
self.assertEqual(r.status_code, 201)
|
||||
self.assertTrue("error" not in json.loads(r.content))
|
||||
self.assertEqual(mars_session.scheduledsession_set.count(),2)
|
||||
self.assertEqual(mars_session.timeslotassignments.count(),2)
|
||||
|
||||
# Unschedule mars
|
||||
r = do_unschedule(mars_scheduled)
|
||||
self.assertEqual(r.status_code, 200)
|
||||
self.assertTrue("error" not in json.loads(r.content))
|
||||
# Make sure it got both the original and extended session
|
||||
self.assertEqual(mars_session.scheduledsession_set.count(),0)
|
||||
self.assertEqual(mars_session.timeslotassignments.count(),0)
|
||||
|
||||
self.assertEqual(ScheduledSession.objects.get(session=ames_session).timeslot, mars_slot)
|
||||
self.assertEqual(SchedTimeSessAssignment.objects.get(session=ames_session).timeslot, mars_slot)
|
||||
|
||||
|
||||
def test_constraints_json(self):
|
||||
|
@ -204,15 +204,15 @@ class ApiTests(TestCase):
|
|||
r = self.client.get(url)
|
||||
self.assertEqual(r.status_code, 200)
|
||||
info = json.loads(r.content)
|
||||
self.assertEqual(set([x['short_name'] for x in info]),set([s.session.short_name for s in meeting.agenda.scheduledsession_set.filter(session__type_id='session')]))
|
||||
self.assertEqual(set([x['short_name'] for x in info]),set([s.session.short_name for s in meeting.agenda.assignments.filter(session__type_id='session')]))
|
||||
|
||||
schedule = meeting.agenda
|
||||
url = urlreverse("ietf.meeting.ajax.scheduledsessions_json",
|
||||
url = urlreverse("ietf.meeting.ajax.assignments_json",
|
||||
kwargs=dict(num=meeting.number,owner=schedule.owner_email(),name=schedule.name))
|
||||
r = self.client.get(url)
|
||||
self.assertEqual(r.status_code, 200)
|
||||
info = json.loads(r.content)
|
||||
self.assertEqual(len(info),schedule.scheduledsession_set.count())
|
||||
self.assertEqual(len(info),schedule.assignments.count())
|
||||
|
||||
|
||||
def test_slot_json(self):
|
||||
|
@ -423,7 +423,7 @@ class ApiTests(TestCase):
|
|||
|
||||
def test_update_timeslot_pinned(self):
|
||||
meeting = make_meeting_test_data()
|
||||
scheduled = ScheduledSession.objects.filter(
|
||||
scheduled = SchedTimeSessAssignment.objects.filter(
|
||||
session__meeting=meeting, session__group__acronym="mars").first()
|
||||
|
||||
url = '/meeting/%s/agenda/%s/%s/session/%u.json' % (meeting.number, meeting.agenda.owner_email(), meeting.agenda.name, scheduled.pk)
|
||||
|
@ -437,7 +437,7 @@ class ApiTests(TestCase):
|
|||
self.assertEqual(r.status_code, 403,
|
||||
"post to %s should have failed, no permission, got: %u/%s" %
|
||||
(url, r.status_code, r.content))
|
||||
self.assertTrue(not ScheduledSession.objects.get(pk=scheduled.pk).pinned)
|
||||
self.assertTrue(not SchedTimeSessAssignment.objects.get(pk=scheduled.pk).pinned)
|
||||
|
||||
# set pinned
|
||||
meeting.agenda.owner = Person.objects.get(user__username="secretary")
|
||||
|
@ -451,7 +451,7 @@ class ApiTests(TestCase):
|
|||
self.assertEqual(r.status_code, 200,
|
||||
"post to %s should have worked, but got: %u/%s" %
|
||||
(url, r.status_code, r.content))
|
||||
self.assertTrue(ScheduledSession.objects.get(pk=scheduled.pk).pinned)
|
||||
self.assertTrue(SchedTimeSessAssignment.objects.get(pk=scheduled.pk).pinned)
|
||||
|
||||
class TimeSlotEditingApiTests(TestCase):
|
||||
|
||||
|
|
|
@ -5,9 +5,11 @@ from unittest import skipIf
|
|||
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
|
||||
from django.core.urlresolvers import reverse as urlreverse
|
||||
|
||||
import debug # pyflakes:ignore
|
||||
|
||||
from ietf.group import colors
|
||||
from ietf.meeting.test_data import make_meeting_test_data
|
||||
from ietf.meeting.models import ScheduledSession
|
||||
from ietf.meeting.models import SchedTimeSessAssignment
|
||||
from ietf import settings
|
||||
|
||||
skip_selenium = getattr(settings,'SKIP_SELENIUM',None)
|
||||
|
@ -52,7 +54,7 @@ class ScheduleEditTests(StaticLiveServerTestCase):
|
|||
|
||||
def testUnschedule(self):
|
||||
|
||||
self.assertEqual(ScheduledSession.objects.filter(session__meeting__number=42,session__group__acronym='mars').count(),1)
|
||||
self.assertEqual(SchedTimeSessAssignment.objects.filter(session__meeting__number=42,session__group__acronym='mars').count(),1)
|
||||
|
||||
self.login()
|
||||
url = self.absreverse('ietf.meeting.views.edit_agenda',kwargs=dict(num='42',name='test-agenda',owner='plain@example.com'))
|
||||
|
@ -69,7 +71,7 @@ class ScheduleEditTests(StaticLiveServerTestCase):
|
|||
self.assertTrue(len(q('#sortable-list #session_1'))>0)
|
||||
|
||||
time.sleep(0.1) # The API that modifies the database runs async
|
||||
self.assertEqual(ScheduledSession.objects.filter(session__meeting__number=42,session__group__acronym='mars').count(),0)
|
||||
self.assertEqual(SchedTimeSessAssignment.objects.filter(session__meeting__number=42,session__group__acronym='mars').count(),0)
|
||||
|
||||
# The following are useful debugging tools
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ class MeetingTests(TestCase):
|
|||
def test_agenda(self):
|
||||
meeting = make_meeting_test_data()
|
||||
session = Session.objects.filter(meeting=meeting, group__acronym="mars").first()
|
||||
slot = TimeSlot.objects.get(scheduledsession__session=session)
|
||||
slot = TimeSlot.objects.get(sessionassignments__session=session)
|
||||
|
||||
self.write_materials_files(meeting, session)
|
||||
|
||||
|
@ -215,7 +215,7 @@ class EditTests(TestCase):
|
|||
self.client.login(username="secretary", password="secretary+password")
|
||||
r = self.client.get(urlreverse("ietf.meeting.views.edit_agenda", kwargs=dict(num=meeting.number)))
|
||||
self.assertEqual(r.status_code, 200)
|
||||
self.assertTrue("load_scheduledsessions" in r.content)
|
||||
self.assertTrue("load_assignments" in r.content)
|
||||
|
||||
def test_save_agenda_as_and_read_permissions(self):
|
||||
meeting = make_meeting_test_data()
|
||||
|
@ -316,12 +316,12 @@ class EditTests(TestCase):
|
|||
def test_slot_to_the_right(self):
|
||||
meeting = make_meeting_test_data()
|
||||
session = Session.objects.filter(meeting=meeting, group__acronym="mars").first()
|
||||
mars_scheduled = session.scheduledsession_set.get()
|
||||
mars_slot = TimeSlot.objects.get(scheduledsession__session=session)
|
||||
mars_scheduled = session.timeslotassignments.get()
|
||||
mars_slot = TimeSlot.objects.get(sessionassignments__session=session)
|
||||
mars_ends = mars_slot.time + mars_slot.duration
|
||||
|
||||
session = Session.objects.filter(meeting=meeting, group__acronym="ames").first()
|
||||
ames_slot_qs = TimeSlot.objects.filter(scheduledsession__session=session)
|
||||
ames_slot_qs = TimeSlot.objects.filter(sessionassignments__session=session)
|
||||
|
||||
ames_slot_qs.update(time=mars_ends + datetime.timedelta(seconds=11 * 60))
|
||||
self.assertTrue(not mars_slot.slot_to_the_right)
|
||||
|
|
|
@ -25,8 +25,8 @@ urlpatterns = patterns('',
|
|||
(r'^(?P<num>\d+)/agenda/(?P<owner>[A-Za-z0-9-.+_]+@[A-Za-z0-9._]+)/(?P<name>[A-Za-z0-9-:_]+)/details$', views.edit_agenda_properties),
|
||||
(r'^(?P<num>\d+)/agenda/(?P<owner>[A-Za-z0-9-.+_]+@[A-Za-z0-9._]+)/(?P<name>[A-Za-z0-9-:_]+).(?P<ext>.html)?/?$', views.agenda),
|
||||
(r'^(?P<num>\d+)/agenda/(?P<owner>[A-Za-z0-9-.+_]+@[A-Za-z0-9._]+)/(?P<name>[A-Za-z0-9-:_]+)/permissions$', ajax.agenda_permission_api),
|
||||
(r'^(?P<num>\d+)/agenda/(?P<owner>[A-Za-z0-9-.+_]+@[A-Za-z0-9._]+)/(?P<name>[A-Za-z0-9-:_]+)/session/(?P<scheduledsession_id>\d+).json$', ajax.scheduledsession_json),
|
||||
(r'^(?P<num>\d+)/agenda/(?P<owner>[A-Za-z0-9-.+_]+@[A-Za-z0-9._]+)/(?P<name>[A-Za-z0-9-:_]+)/sessions.json$', ajax.scheduledsessions_json),
|
||||
(r'^(?P<num>\d+)/agenda/(?P<owner>[A-Za-z0-9-.+_]+@[A-Za-z0-9._]+)/(?P<name>[A-Za-z0-9-:_]+)/session/(?P<assignment_id>\d+).json$', ajax.assignment_json),
|
||||
(r'^(?P<num>\d+)/agenda/(?P<owner>[A-Za-z0-9-.+_]+@[A-Za-z0-9._]+)/(?P<name>[A-Za-z0-9-:_]+)/sessions.json$', ajax.assignments_json),
|
||||
(r'^(?P<num>\d+)/agenda/(?P<owner>[A-Za-z0-9-.+_]+@[A-Za-z0-9._]+)/(?P<name>[A-Za-z0-9-:_]+).json$', ajax.agenda_infourl),
|
||||
(r'^(?P<num>\d+)/agenda/edit$', views.edit_agenda),
|
||||
(r'^(?P<num>\d+)/agenda(-utc)?(?P<ext>.html)?/?$', views.agenda),
|
||||
|
|
|
@ -29,8 +29,8 @@ from ietf.ietfauth.utils import role_required, has_role
|
|||
from ietf.meeting.models import Meeting, Session, Schedule, Room
|
||||
from ietf.meeting.helpers import get_areas, get_person_by_email, get_schedule_by_name
|
||||
from ietf.meeting.helpers import build_all_agenda_slices, get_wg_name_list
|
||||
from ietf.meeting.helpers import get_all_scheduledsessions_from_schedule
|
||||
from ietf.meeting.helpers import get_modified_from_scheduledsessions
|
||||
from ietf.meeting.helpers import get_all_assignments_from_schedule
|
||||
from ietf.meeting.helpers import get_modified_from_assignments
|
||||
from ietf.meeting.helpers import get_wg_list, find_ads_for_meeting
|
||||
from ietf.meeting.helpers import get_meeting, get_schedule, agenda_permissions, meeting_updated
|
||||
from ietf.meeting.helpers import preprocess_assignments_for_agenda, read_agenda_file
|
||||
|
@ -57,7 +57,7 @@ def materials(request, meeting_num=None):
|
|||
|
||||
#sessions = Session.objects.filter(meeting__number=meeting_num, timeslot__isnull=False)
|
||||
schedule = get_schedule(meeting, None)
|
||||
sessions = Session.objects.filter(meeting__number=meeting_num, scheduledsession__schedule=schedule).select_related()
|
||||
sessions = Session.objects.filter(meeting__number=meeting_num, timeslotassignments__schedule=schedule).select_related()
|
||||
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')
|
||||
|
@ -111,7 +111,7 @@ def agenda_create(request, num=None, owner=None, name=None):
|
|||
messages.info(request, "This name contains illegal characters. Please choose another one.")
|
||||
return redirect(edit_agenda, num=num, owner=owner, name=name)
|
||||
|
||||
# create the new schedule, and copy the scheduledsessions
|
||||
# create the new schedule, and copy the assignments
|
||||
try:
|
||||
sched = meeting.schedule_set.get(name=savedname, owner=request.user.person)
|
||||
if sched:
|
||||
|
@ -136,7 +136,7 @@ def agenda_create(request, num=None, owner=None, name=None):
|
|||
|
||||
# keep a mapping so that extendedfrom references can be chased.
|
||||
mapping = {};
|
||||
for ss in schedule.scheduledsession_set.all():
|
||||
for ss in schedule.assignments.all():
|
||||
# hack to copy the object, creating a new one
|
||||
# just reset the key, and save it again.
|
||||
oldid = ss.pk
|
||||
|
@ -147,12 +147,12 @@ def agenda_create(request, num=None, owner=None, name=None):
|
|||
#print "Copying %u to %u" % (oldid, ss.pk)
|
||||
|
||||
# now fix up any extendedfrom references to new set.
|
||||
for ss in newschedule.scheduledsession_set.all():
|
||||
for ss in newschedule.assignments.all():
|
||||
if ss.extendedfrom is not None:
|
||||
oldid = ss.extendedfrom.id
|
||||
newid = mapping[oldid]
|
||||
#print "Fixing %u to %u" % (oldid, newid)
|
||||
ss.extendedfrom = newschedule.scheduledsession_set.get(pk = newid)
|
||||
ss.extendedfrom = newschedule.assignments.get(pk = newid)
|
||||
ss.save()
|
||||
|
||||
|
||||
|
@ -265,13 +265,13 @@ def edit_agenda(request, num=None, owner=None, name=None):
|
|||
"hide_menu": True
|
||||
}, status=403, content_type="text/html")
|
||||
|
||||
scheduledsessions = get_all_scheduledsessions_from_schedule(schedule)
|
||||
assignments = get_all_assignments_from_schedule(schedule)
|
||||
|
||||
# get_modified_from needs the query set, not the list
|
||||
modified = get_modified_from_scheduledsessions(scheduledsessions)
|
||||
modified = get_modified_from_assignments(assignments)
|
||||
|
||||
area_list = get_areas()
|
||||
wg_name_list = get_wg_name_list(scheduledsessions)
|
||||
wg_name_list = get_wg_name_list(assignments)
|
||||
wg_list = get_wg_list(wg_name_list)
|
||||
ads = find_ads_for_meeting(meeting)
|
||||
for ad in ads:
|
||||
|
@ -295,7 +295,7 @@ def edit_agenda(request, num=None, owner=None, name=None):
|
|||
"area_list": area_list,
|
||||
"area_directors" : ads,
|
||||
"wg_list": wg_list ,
|
||||
"scheduledsessions": scheduledsessions,
|
||||
"assignments": assignments,
|
||||
"show_inline": set(["txt","htm","html"]),
|
||||
"hide_menu": True,
|
||||
})
|
||||
|
@ -494,9 +494,9 @@ def agenda_by_room(request,num=None):
|
|||
meeting = get_meeting(num)
|
||||
schedule = get_schedule(meeting)
|
||||
ss_by_day = OrderedDict()
|
||||
for day in schedule.scheduledsession_set.dates('timeslot__time','day'):
|
||||
for day in schedule.assignments.dates('timeslot__time','day'):
|
||||
ss_by_day[day]=[]
|
||||
for ss in schedule.scheduledsession_set.order_by('timeslot__location__functional_name','timeslot__location__name','timeslot__time'):
|
||||
for ss in schedule.assignments.order_by('timeslot__location__functional_name','timeslot__location__name','timeslot__time'):
|
||||
day = ss.timeslot.time.date()
|
||||
ss_by_day[day].append(ss)
|
||||
return render(request,"meeting/agenda_by_room.html",{"meeting":meeting,"ss_by_day":ss_by_day})
|
||||
|
@ -505,20 +505,20 @@ def agenda_by_room(request,num=None):
|
|||
def agenda_by_type(request,num=None,type=None):
|
||||
meeting = get_meeting(num)
|
||||
schedule = get_schedule(meeting)
|
||||
scheduledsessions = schedule.scheduledsession_set.order_by('session__type__slug','timeslot__time')
|
||||
assignments = schedule.assignments.order_by('session__type__slug','timeslot__time')
|
||||
if type:
|
||||
scheduledsessions = scheduledsessions.filter(session__type__slug=type)
|
||||
return render(request,"meeting/agenda_by_type.html",{"meeting":meeting,"scheduledsessions":scheduledsessions})
|
||||
assignments = assignments.filter(session__type__slug=type)
|
||||
return render(request,"meeting/agenda_by_type.html",{"meeting":meeting,"assignments":assignments})
|
||||
|
||||
@role_required('Area Director','Secretariat','IAB')
|
||||
def agenda_by_type_ics(request,num=None,type=None):
|
||||
meeting = get_meeting(num)
|
||||
schedule = get_schedule(meeting)
|
||||
scheduledsessions = schedule.scheduledsession_set.order_by('session__type__slug','timeslot__time')
|
||||
assignments = schedule.assignments.order_by('session__type__slug','timeslot__time')
|
||||
if type:
|
||||
scheduledsessions = scheduledsessions.filter(session__type__slug=type)
|
||||
assignments = assignments.filter(session__type__slug=type)
|
||||
updated = meeting_updated(meeting)
|
||||
return render(request,"meeting/agenda.ics",{"schedule":schedule,"updated":updated,"assignments":scheduledsessions},content_type="text/calendar")
|
||||
return render(request,"meeting/agenda.ics",{"schedule":schedule,"updated":updated,"assignments":assignments},content_type="text/calendar")
|
||||
|
||||
def session_agenda(request, num, session):
|
||||
d = Document.objects.filter(type="agenda", session__meeting__number=num)
|
||||
|
@ -712,17 +712,17 @@ def room_view(request, num=None):
|
|||
if rooms.count() == 0:
|
||||
raise Http404
|
||||
|
||||
scheduledsessions = meeting.agenda.scheduledsession_set.all()
|
||||
assignments = meeting.agenda.assignments.all()
|
||||
unavailable = meeting.timeslot_set.filter(type__slug='unavail')
|
||||
if (unavailable.count() + scheduledsessions.count()) == 0 :
|
||||
if (unavailable.count() + assignments.count()) == 0 :
|
||||
raise Http404
|
||||
|
||||
earliest = None
|
||||
latest = None
|
||||
|
||||
if scheduledsessions:
|
||||
earliest = scheduledsessions.aggregate(Min('timeslot__time'))['timeslot__time__min']
|
||||
latest = scheduledsessions.aggregate(Max('timeslot__time'))['timeslot__time__max']
|
||||
if assignments:
|
||||
earliest = assignments.aggregate(Min('timeslot__time'))['timeslot__time__min']
|
||||
latest = assignments.aggregate(Max('timeslot__time'))['timeslot__time__max']
|
||||
|
||||
if unavailable:
|
||||
earliest_unavailable = unavailable.aggregate(Min('time'))['time__min']
|
||||
|
@ -749,13 +749,13 @@ def room_view(request, num=None):
|
|||
t.delta_from_beginning = (t.time - base_time).total_seconds()
|
||||
t.day = (t.time-base_day).days
|
||||
|
||||
scheduledsessions = list(scheduledsessions)
|
||||
for ss in scheduledsessions:
|
||||
assignments = list(assignments)
|
||||
for ss in assignments:
|
||||
ss.delta_from_beginning = (ss.timeslot.time - base_time).total_seconds()
|
||||
ss.day = (ss.timeslot.time-base_day).days
|
||||
|
||||
template = "meeting/room-view.html"
|
||||
return render(request, template,{"meeting":meeting,"unavailable":unavailable,"scheduledsessions":scheduledsessions,"rooms":rooms,"days":days})
|
||||
return render(request, template,{"meeting":meeting,"unavailable":unavailable,"assignments":assignments,"rooms":rooms,"days":days})
|
||||
|
||||
def ical_agenda(request, num=None, name=None, ext=None):
|
||||
meeting = get_meeting(num)
|
||||
|
@ -823,22 +823,22 @@ def session_details(request, num, acronym, date=None, week_day=None, seq=None):
|
|||
if date:
|
||||
if len(date)==15:
|
||||
start = datetime.datetime.strptime(date,"%Y-%m-%d-%H%M")
|
||||
sessions = sessions.filter(scheduledsession__schedule=meeting.agenda,scheduledsession__timeslot__time=start)
|
||||
sessions = sessions.filter(timeslotassignments__schedule=meeting.agenda,timeslotassignments__timeslot__time=start)
|
||||
else:
|
||||
start = datetime.datetime.strptime(date,"%Y-%m-%d").date()
|
||||
end = start+datetime.timedelta(days=1)
|
||||
sessions = sessions.filter(scheduledsession__schedule=meeting.agenda,scheduledsession__timeslot__time__range=(start,end))
|
||||
sessions = sessions.filter(timeslotassignments__schedule=meeting.agenda,timeslotassignments__timeslot__time__range=(start,end))
|
||||
|
||||
if week_day:
|
||||
try:
|
||||
dow = ['sun','mon','tue','wed','thu','fri','sat'].index(week_day.lower()[:3]) + 1
|
||||
except ValueError:
|
||||
raise Http404
|
||||
sessions = sessions.filter(scheduledsession__schedule=meeting.agenda,scheduledsession__timeslot__time__week_day=dow)
|
||||
sessions = sessions.filter(timeslotassignments__schedule=meeting.agenda,timeslotassignments__timeslot__time__week_day=dow)
|
||||
|
||||
|
||||
def sort_key(session):
|
||||
official_sessions = session.scheduledsession_set.filter(schedule=session.meeting.agenda)
|
||||
official_sessions = session.timeslotassignments.filter(schedule=session.meeting.agenda)
|
||||
if official_sessions:
|
||||
return official_sessions.first().timeslot.time
|
||||
else:
|
||||
|
@ -859,7 +859,7 @@ def session_details(request, num, acronym, date=None, week_day=None, seq=None):
|
|||
if len(sessions)==1:
|
||||
session = sessions[0]
|
||||
scheduled_time = "Not yet scheduled"
|
||||
ss = session.scheduledsession_set.filter(schedule=meeting.agenda).order_by('timeslot__time')
|
||||
ss = session.timeslotassignments.filter(schedule=meeting.agenda).order_by('timeslot__time')
|
||||
if ss:
|
||||
scheduled_time = ','.join(x.timeslot.time.strftime("%A %b-%d %H%M") for x in ss)
|
||||
# TODO FIXME Deleted materials shouldn't be in the sessionpresentation_set
|
||||
|
|
|
@ -4,7 +4,7 @@ import re
|
|||
from django import forms
|
||||
|
||||
from ietf.group.models import Group
|
||||
from ietf.meeting.models import Meeting, Room, TimeSlot, Session, ScheduledSession
|
||||
from ietf.meeting.models import Meeting, Room, TimeSlot, Session, SchedTimeSessAssignment
|
||||
from ietf.meeting.timedeltafield import TimedeltaFormField, TimedeltaWidget
|
||||
from ietf.name.models import TimeSlotTypeName
|
||||
|
||||
|
@ -63,9 +63,9 @@ class BaseMeetingRoomFormSet(forms.models.BaseInlineFormSet):
|
|||
'''Check that any rooms marked for deletion are not in use'''
|
||||
for form in self.deleted_forms:
|
||||
room = form.cleaned_data['id']
|
||||
scheduledsessions = ScheduledSession.objects.filter(timeslot__location=room,
|
||||
schedtimesessassignments = SchedTimeSessAssignment.objects.filter(timeslot__location=room,
|
||||
session__isnull=False)
|
||||
if scheduledsessions:
|
||||
if schedtimesessassignments:
|
||||
raise forms.ValidationError('Cannot delete meeting room %s. Already assigned to some session.' % room.name)
|
||||
|
||||
class TimeSlotModelChoiceField(forms.ModelChoiceField):
|
||||
|
|
|
@ -8,7 +8,7 @@ from django.conf import settings
|
|||
from django.core.urlresolvers import reverse
|
||||
|
||||
from ietf.group.models import Group, GroupEvent
|
||||
from ietf.meeting.models import Meeting, Room, TimeSlot, ScheduledSession
|
||||
from ietf.meeting.models import Meeting, Room, TimeSlot, SchedTimeSessAssignment
|
||||
from ietf.meeting.test_data import make_meeting_test_data
|
||||
from ietf.person.models import Person
|
||||
from ietf.utils.mail import outbox
|
||||
|
@ -139,7 +139,7 @@ class MainTestCase(TestCase):
|
|||
person = Person.objects.get(name="(System)")
|
||||
GroupEvent.objects.create(group=mars_group,time=now,type='sent_notification',
|
||||
by=person,desc='sent scheduled notification for %s' % meeting)
|
||||
ss = meeting.agenda.scheduledsession_set.get(session__group=ames_group)
|
||||
ss = meeting.agenda.assignments.get(session__group=ames_group)
|
||||
ss.modified = then
|
||||
ss.save()
|
||||
self.client.login(username="secretary", password="secretary+password")
|
||||
|
@ -173,7 +173,7 @@ class MainTestCase(TestCase):
|
|||
|
||||
# test delete
|
||||
# first unschedule sessions so we can delete
|
||||
ScheduledSession.objects.filter(schedule=meeting.agenda).delete()
|
||||
SchedTimeSessAssignment.objects.filter(schedule=meeting.agenda).delete()
|
||||
self.client.login(username="secretary", password="secretary+password")
|
||||
post_dict = {
|
||||
'room-TOTAL_FORMS': q('input[name="room-TOTAL_FORMS"]').val(),
|
||||
|
|
|
@ -17,7 +17,7 @@ from django.utils.functional import curry
|
|||
from ietf.ietfauth.utils import role_required
|
||||
from ietf.utils.mail import send_mail
|
||||
from ietf.meeting.helpers import get_meeting
|
||||
from ietf.meeting.models import Meeting, Session, Room, TimeSlot, ScheduledSession, Schedule
|
||||
from ietf.meeting.models import Meeting, Session, Room, TimeSlot, SchedTimeSessAssignment, Schedule
|
||||
from ietf.group.models import Group, GroupEvent
|
||||
from ietf.person.models import Person
|
||||
from ietf.secr.meetings.blue_sheets import create_blue_sheets
|
||||
|
@ -41,7 +41,7 @@ def assign(session,timeslot,meeting,schedule=None):
|
|||
'''
|
||||
if schedule == None:
|
||||
schedule = meeting.agenda
|
||||
ScheduledSession.objects.create(schedule=schedule,
|
||||
SchedTimeSessAssignment.objects.create(schedule=schedule,
|
||||
session=session,
|
||||
timeslot=timeslot)
|
||||
session.status_id = 'sched'
|
||||
|
@ -132,11 +132,11 @@ def build_nonsession(meeting,schedule):
|
|||
duration=slot.duration,
|
||||
show_location=slot.show_location)
|
||||
if session:
|
||||
ScheduledSession.objects.create(schedule=schedule,session=session,timeslot=ts)
|
||||
SchedTimeSessAssignment.objects.create(schedule=schedule,session=session,timeslot=ts)
|
||||
|
||||
def check_nonsession(meeting,schedule):
|
||||
'''
|
||||
Ensure non-session timeslots exist and have appropriate ScheduledSession objects
|
||||
Ensure non-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'))
|
||||
|
@ -146,18 +146,18 @@ def check_nonsession(meeting,schedule):
|
|||
|
||||
plenary = slots.filter(type='plenary').first()
|
||||
if plenary:
|
||||
scheduledsessions = plenary.scheduledsession_set.all()
|
||||
if not scheduledsessions.filter(schedule=schedule):
|
||||
source = scheduledsessions.first().schedule
|
||||
copy_scheduledsessions(slots,source,schedule)
|
||||
assignments = plenary.sessionassignments.all()
|
||||
if not assignments.filter(schedule=schedule):
|
||||
source = assignments.first().schedule
|
||||
copy_assignments(slots,source,schedule)
|
||||
|
||||
def copy_scheduledsessions(slots,source,target):
|
||||
def copy_assignments(slots,source,target):
|
||||
'''
|
||||
Copy scheduledsession objects from source schedule to target schedule. Slots is
|
||||
Copy SchedTimeSessAssignment objects from source schedule to target schedule. Slots is
|
||||
a queryset of slots
|
||||
'''
|
||||
for ss in ScheduledSession.objects.filter(schedule=source,timeslot__in=slots):
|
||||
ScheduledSession.objects.create(schedule=target,session=ss.session,timeslot=ss.timeslot)
|
||||
for ss in SchedTimeSessAssignment.objects.filter(schedule=source,timeslot__in=slots):
|
||||
SchedTimeSessAssignment.objects.create(schedule=target,session=ss.session,timeslot=ss.timeslot)
|
||||
|
||||
def get_last_meeting(meeting):
|
||||
last_number = int(meeting.number) - 1
|
||||
|
@ -172,7 +172,7 @@ def is_combined(session,meeting,schedule=None):
|
|||
'''
|
||||
if schedule == None:
|
||||
schedule = meeting.agenda
|
||||
if session.scheduledsession_set.filter(schedule=schedule).count() > 1:
|
||||
if session.timeslotassignments.filter(schedule=schedule).count() > 1:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
@ -248,7 +248,7 @@ def sort_groups(meeting,schedule=None):
|
|||
groups_with_sessions = [ s.group for s in sessions ]
|
||||
gset = set(groups_with_sessions)
|
||||
sorted_groups_with_sessions = sorted(gset, key = lambda instance: instance.acronym)
|
||||
scheduled_sessions = ScheduledSession.objects.filter(schedule=schedule,session__isnull=False)
|
||||
scheduled_sessions = SchedTimeSessAssignment.objects.filter(schedule=schedule,session__isnull=False)
|
||||
groups_with_timeslots = [ x.session.group for x in scheduled_sessions ]
|
||||
for group in sorted_groups_with_sessions:
|
||||
if group in groups_with_timeslots:
|
||||
|
@ -492,7 +492,7 @@ def non_session(request, meeting_id, schedule_name):
|
|||
session.save()
|
||||
|
||||
# create association
|
||||
ScheduledSession.objects.create(timeslot=timeslot,
|
||||
SchedTimeSessAssignment.objects.create(timeslot=timeslot,
|
||||
session=session,
|
||||
schedule=schedule)
|
||||
|
||||
|
@ -517,14 +517,14 @@ def non_session_delete(request, meeting_id, schedule_name, slot_id):
|
|||
'''
|
||||
This function deletes the non-session TimeSlot. For "other" and "plenary" timeslot
|
||||
types we need to delete the corresponding Session object as well. Check for uploaded
|
||||
material first. ScheduledSession objects get deleted as well.
|
||||
material first. SchedTimeSessAssignment objects get deleted as well.
|
||||
'''
|
||||
meeting = get_object_or_404(Meeting, number=meeting_id)
|
||||
# schedule = get_object_or_404(Schedule, meeting=meeting, name=schedule_name)
|
||||
slot = get_object_or_404(TimeSlot, id=slot_id)
|
||||
if slot.type_id in ('other','plenary','lead'):
|
||||
scheduledsessions = slot.scheduledsession_set.filter(schedule__meeting=meeting)
|
||||
session_objects = [ x.session for x in scheduledsessions ]
|
||||
assignments = slot.sessionassignments.filter(schedule__meeting=meeting)
|
||||
session_objects = [ x.session for x in assignments ]
|
||||
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)
|
||||
|
@ -595,7 +595,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.agenda.scheduledsession_set.filter(timeslot__type='session'):
|
||||
for ss in meeting.agenda.assignments.filter(timeslot__type='session'):
|
||||
last_notice = ss.session.group.latest_event(type='sent_notification')
|
||||
if last_notice and ss.modified > last_notice.time:
|
||||
groups.add(ss.session.group)
|
||||
|
@ -604,7 +604,7 @@ def notifications(request, meeting_id):
|
|||
|
||||
if request.method == "POST":
|
||||
# ensure session state is scheduled
|
||||
for ss in meeting.agenda.scheduledsession_set.all():
|
||||
for ss in meeting.agenda.assignments.all():
|
||||
session = ss.session
|
||||
if session.status.slug == "schedw":
|
||||
session.status_id = "sched"
|
||||
|
@ -635,7 +635,7 @@ def remove_session(request, meeting_id, acronym):
|
|||
now = datetime.datetime.now()
|
||||
|
||||
for session in sessions:
|
||||
ss = session.official_scheduledsession()
|
||||
ss = session.official_timeslotassignment()
|
||||
ss.session = None
|
||||
ss.modified = now
|
||||
ss.save()
|
||||
|
@ -756,15 +756,15 @@ def schedule(request, meeting_id, schedule_name, acronym):
|
|||
# COMBINE SECTION - BEFORE --------------
|
||||
if 'combine' in form.changed_data and not combine:
|
||||
next_slot = get_next_slot(initial_timeslot)
|
||||
for ss in next_slot.scheduledsession_set.filter(schedule=schedule,session=session):
|
||||
for ss in next_slot.sessionassignments.filter(schedule=schedule,session=session):
|
||||
ss.session = None
|
||||
ss.save()
|
||||
# ---------------------------------------
|
||||
if any(x in form.changed_data for x in ('day','time','room')):
|
||||
# clear the old association
|
||||
if initial_timeslot:
|
||||
# delete scheduledsession records to unschedule
|
||||
session.scheduledsession_set.filter(schedule=schedule).delete()
|
||||
# delete schedtimesessassignment records to unschedule
|
||||
session.timeslotassignments.filter(schedule=schedule).delete()
|
||||
|
||||
if timeslot:
|
||||
assign(session,timeslot,meeting,schedule=schedule)
|
||||
|
@ -1009,7 +1009,7 @@ def unschedule(request, meeting_id, schedule_name, session_id):
|
|||
meeting = get_object_or_404(Meeting, number=meeting_id)
|
||||
session = get_object_or_404(Session, id=session_id)
|
||||
|
||||
session.scheduledsession_set.filter(schedule=meeting.agenda).delete()
|
||||
session.timeslotassignments.filter(schedule=meeting.agenda).delete()
|
||||
|
||||
# TODO: change session state?
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ from ietf.doc.models import Document, RelatedDocument, DocEvent, NewRevisionDocE
|
|||
from ietf.group.models import Group, Role
|
||||
from ietf.group.utils import get_charter_text
|
||||
from ietf.meeting.helpers import get_schedule
|
||||
from ietf.meeting.models import Session, Meeting, ScheduledSession, SessionPresentation
|
||||
from ietf.meeting.models import Session, Meeting, SchedTimeSessAssignment, SessionPresentation
|
||||
from ietf.person.models import Person
|
||||
from ietf.secr.proceedings.models import InterimMeeting # proxy model
|
||||
from ietf.secr.proceedings.models import Registration
|
||||
|
@ -38,7 +38,7 @@ def check_audio_files(group,meeting):
|
|||
'''
|
||||
for session in Session.objects.filter(group=group,meeting=meeting,status__in=('sched','schedw')):
|
||||
try:
|
||||
timeslot = session.official_scheduledsession().timeslot
|
||||
timeslot = session.official_timeslotassignment().timeslot
|
||||
except IndexError:
|
||||
continue
|
||||
if not (timeslot.location and timeslot.time):
|
||||
|
@ -63,7 +63,7 @@ def create_recording(session,meeting,group,url):
|
|||
'''
|
||||
sequence = get_next_sequence(group,meeting,'recording')
|
||||
name = 'recording-{}-{}-{}'.format(meeting.number,group.acronym,sequence)
|
||||
time = session.official_scheduledsession().timeslot.time.strftime('%Y-%m-%d %H:%M')
|
||||
time = session.official_timeslotassignment().timeslot.time.strftime('%Y-%m-%d %H:%M')
|
||||
if url.endswith('mp3'):
|
||||
title = 'Audio recording for {}'.format(time)
|
||||
else:
|
||||
|
@ -434,11 +434,11 @@ def gen_acknowledgement(context):
|
|||
def gen_agenda(context):
|
||||
meeting = context['meeting']
|
||||
schedule = get_schedule(meeting)
|
||||
scheduledsessions = ScheduledSession.objects.filter(schedule=schedule).exclude(session__isnull=True)
|
||||
schedtimesessassignments = SchedTimeSessAssignment.objects.filter(schedule=schedule).exclude(session__isnull=True)
|
||||
|
||||
html = render_to_response('proceedings/agenda.html',{
|
||||
'meeting': meeting,
|
||||
'scheduledsessions': scheduledsessions}
|
||||
'schedtimesessassignments': schedtimesessassignments}
|
||||
)
|
||||
|
||||
path = os.path.join(settings.SECR_PROCEEDINGS_DIR,meeting.number,'agenda.html')
|
||||
|
|
|
@ -26,7 +26,7 @@ from ietf.secr.utils.meeting import get_upload_root, get_materials, get_timeslot
|
|||
from ietf.doc.models import Document, DocAlias, DocEvent, State, NewRevisionDocEvent
|
||||
from ietf.group.models import Group
|
||||
from ietf.ietfauth.utils import has_role, role_required
|
||||
from ietf.meeting.models import Meeting, Session, TimeSlot, ScheduledSession
|
||||
from ietf.meeting.models import Meeting, Session, TimeSlot, SchedTimeSessAssignment
|
||||
from ietf.secr.proceedings.forms import EditSlideForm, InterimMeetingForm, RecordingForm, RecordingEditForm, ReplaceSlideForm, UnifiedUploadForm
|
||||
from ietf.secr.proceedings.proc_utils import ( gen_acknowledgement, gen_agenda, gen_areas,
|
||||
gen_attendees, gen_group_pages, gen_index, gen_irtf, gen_overview, gen_plenaries,
|
||||
|
@ -279,10 +279,10 @@ def ajax_get_sessions(request, meeting_num, acronym):
|
|||
sessions = Session.objects.filter(meeting=meeting,group=group,status='sched')
|
||||
|
||||
# order by time scheduled
|
||||
sessions = sorted(sessions,key = lambda x: x.official_scheduledsession().timeslot.time)
|
||||
sessions = sorted(sessions,key = lambda x: x.official_timeslotassignment().timeslot.time)
|
||||
|
||||
for n,session in enumerate(sessions,start=1):
|
||||
timeslot = session.official_scheduledsession().timeslot
|
||||
timeslot = session.official_timeslotassignment().timeslot
|
||||
val = '{}: {} {}'.format(n,timeslot.time.strftime('%m-%d %H:%M'),timeslot.location.name)
|
||||
d = {'id':session.id, 'value': val}
|
||||
results.append(d)
|
||||
|
@ -793,7 +793,7 @@ def select(request, meeting_num):
|
|||
|
||||
# iniialize plenary form
|
||||
if has_role(user,['Secretariat','IETF Chair','IAB Chair']):
|
||||
ss = ScheduledSession.objects.filter(schedule=meeting.agenda,timeslot__type='plenary')
|
||||
ss = SchedTimeSessAssignment.objects.filter(schedule=meeting.agenda,timeslot__type='plenary')
|
||||
choices = [ (i.session.id, i.session.name) for i in sorted(ss,key=lambda x: x.session.name) ]
|
||||
plenary_form = GroupSelectForm(choices=choices)
|
||||
else:
|
||||
|
|
|
@ -204,7 +204,7 @@ def cancel(request, acronym):
|
|||
session_save(session)
|
||||
|
||||
# clear schedule assignments if already scheduled
|
||||
session.scheduledsession_set.all().delete()
|
||||
session.timeslotassignments.all().delete()
|
||||
|
||||
# send notifitcation
|
||||
(to_email, cc_list) = gather_address_lists('session_request_cancelled',group=group,person=login)
|
||||
|
|
|
@ -52,7 +52,7 @@ def get_session(timeslot, schedule=None):
|
|||
# todo, doesn't account for shared timeslot
|
||||
if not schedule:
|
||||
schedule = timeslot.meeting.agenda
|
||||
qs = timeslot.sessions.filter(scheduledsession__schedule=schedule) #.exclude(states__slug='deleted')
|
||||
qs = timeslot.sessions.filter(timeslotassignments__schedule=schedule) #.exclude(states__slug='deleted')
|
||||
if qs:
|
||||
return qs[0]
|
||||
else:
|
||||
|
@ -66,7 +66,7 @@ def get_timeslot(session, schedule=None):
|
|||
'''
|
||||
if not schedule:
|
||||
schedule = session.meeting.agenda
|
||||
ss = session.scheduledsession_set.filter(schedule=schedule)
|
||||
ss = session.timeslotassignments.filter(schedule=schedule)
|
||||
if ss:
|
||||
return ss[0].timeslot
|
||||
else:
|
||||
|
@ -83,4 +83,4 @@ def get_upload_root(meeting):
|
|||
meeting.date.strftime('%m'),
|
||||
meeting.date.strftime('%d'),
|
||||
meeting.session_set.all()[0].group.acronym)
|
||||
return path
|
||||
return path
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
//var schedule_id = 0; // what is the schedule we are editing.
|
||||
//var schedule_name; // what is the schedule we are editing.
|
||||
//var schedule_owner_href = ''; // who owns this schedule
|
||||
//var scheduledsession_post_href;
|
||||
//var assignments_post_href;
|
||||
//var meeting_base_url;
|
||||
//var site_base_url;
|
||||
//var total_rooms = 0; // the number of rooms
|
||||
|
@ -88,7 +88,7 @@ function initStuff(){
|
|||
|
||||
$.when.apply($,directorpromises).done(function() {
|
||||
/* can not load events until area director info,
|
||||
timeslots, sessions, and scheduledsessions
|
||||
timeslots, sessions, and assignments
|
||||
have been loaded
|
||||
*/
|
||||
log("loading/linking objects");
|
||||
|
@ -174,9 +174,6 @@ function read_only_check() {
|
|||
function print_all_ss(objs){
|
||||
console.log(objs)
|
||||
}
|
||||
function get_ss(){
|
||||
Dajaxice.ietf.meeting.get_scheduledsessions(print_all_ss);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
|
|
|
@ -123,7 +123,7 @@ function load_events(){
|
|||
if(ssid.extendedfrom_id != false) {
|
||||
other = agenda_globals.slot_objs[ssid.extendedfrom_id];
|
||||
if(__debug_load_events) {
|
||||
console.log("slot:",ssid.scheduledsession_id, "extended from: ",key,ssid.extendedfrom_id); // ," is: ", other);
|
||||
console.log("slot:",ssid.assignment_id, "extended from: ",key,ssid.extendedfrom_id); // ," is: ", other);
|
||||
}
|
||||
if(other != undefined) {
|
||||
ssid.extendedfrom = other;
|
||||
|
|
|
@ -290,7 +290,7 @@ function extend_slot(event) {
|
|||
|
||||
session = last_session;
|
||||
|
||||
console.log("session", session.title, "sslot:", current_scheduledslot.scheduledsession_id);
|
||||
console.log("session", session.title, "sslot:", current_scheduledslot.assignment_id);
|
||||
|
||||
/* bind current_timeslot into this function and continuations */
|
||||
var slot = current_timeslot;
|
||||
|
@ -305,10 +305,10 @@ function extend_slot(event) {
|
|||
buttons: {
|
||||
"Yes": {
|
||||
click: function() {
|
||||
// need to create new scheduledsession
|
||||
// need to create new assignment
|
||||
var new_ss = make_ss({ "session_id" : session.session_id,
|
||||
"timeslot_id": slot.following_timeslot.timeslot_id,
|
||||
"extendedfrom_id" : current_scheduledslot.scheduledsession_id});
|
||||
"extendedfrom_id" : current_scheduledslot.assignment_id});
|
||||
// make_ss also adds to slot_status.
|
||||
new_ss.saveit();
|
||||
|
||||
|
@ -571,7 +571,7 @@ function select_session(session) {
|
|||
if(current_timeslot) {
|
||||
current_timeslot_id = current_timeslot.timeslot_id;
|
||||
}
|
||||
current_scheduledslot = session.scheduledsession;
|
||||
current_scheduledslot = session.assignment;
|
||||
if(__debug_meeting_click) {
|
||||
console.log("2 meeting_click:", current_timeslot, session);
|
||||
}
|
||||
|
@ -698,13 +698,13 @@ function info_name_select_change(){
|
|||
console.log("selecting new item:", last_session.title);
|
||||
}
|
||||
|
||||
function set_pin_session_button(scheduledsession) {
|
||||
function set_pin_session_button(assignment) {
|
||||
$("#pin_slot").unbind('click');
|
||||
if(scheduledsession == undefined) {
|
||||
console.log("pin not set, scheduledsession undefined");
|
||||
if(assignment == undefined) {
|
||||
console.log("pin not set, assignment undefined");
|
||||
return;
|
||||
}
|
||||
state = scheduledsession.pinned;
|
||||
state = assignment.pinned;
|
||||
//console.log("button set to: ",state);
|
||||
$("#pin_slot").attr('disabled',false);
|
||||
if(state) {
|
||||
|
@ -712,24 +712,24 @@ function set_pin_session_button(scheduledsession) {
|
|||
$("#agenda_pin_slot").addClass("button_down");
|
||||
$("#agenda_pin_slot").removeClass("button_up");
|
||||
$("#pin_slot").click(function(event) {
|
||||
update_pin_session(scheduledsession, false);
|
||||
update_pin_session(assignment, false);
|
||||
});
|
||||
} else {
|
||||
$("#pin_slot").html(" Pin ");
|
||||
$("#agenda_pin_slot").addClass("button_up");
|
||||
$("#agenda_pin_slot").removeClass("button_down");
|
||||
$("#pin_slot").click(function(event) {
|
||||
update_pin_session(scheduledsession, true);
|
||||
update_pin_session(assignment, true);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function update_pin_session(scheduledsession, state) {
|
||||
function update_pin_session(assignment, state) {
|
||||
start_spin();
|
||||
scheduledsession.set_pinned(state, function(schedulesession) {
|
||||
assignment.set_pinned(state, function(assignment) {
|
||||
stop_spin();
|
||||
session.repopulate_event(scheduledsession.domid());
|
||||
set_pin_session_button(scheduledsession);
|
||||
session.repopulate_event(assignment.domid());
|
||||
set_pin_session_button(assignment);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -774,7 +774,7 @@ function fill_in_session_info(session, success, extra) {
|
|||
|
||||
$("#agenda_pin_slot").removeClass("button_disabled");
|
||||
$("#agenda_pin_slot").addClass("button_enabled");
|
||||
set_pin_session_button(session.scheduledsession);
|
||||
set_pin_session_button(session.assignment);
|
||||
} else {
|
||||
$("#pin_slot").unbind('click');
|
||||
}
|
||||
|
@ -977,7 +977,7 @@ function update_to_slot(session_id, to_slot_id, force){
|
|||
|
||||
var to_timeslot = agenda_globals.timeslot_bydomid[to_slot_id];
|
||||
if(to_timeslot != undefined && (to_timeslot.empty == true || force)) {
|
||||
// add a new scheduledsession for this, save it.
|
||||
// add a new assignment for this, save it.
|
||||
var new_ss = make_ss({ "session_id" : session_id,
|
||||
"timeslot_id": to_timeslot.timeslot_id});
|
||||
// make_ss also adds to slot_status.
|
||||
|
@ -1001,7 +1001,7 @@ function update_from_slot(session_id, from_slot_id)
|
|||
{
|
||||
var from_timeslot = agenda_globals.timeslot_bydomid[from_slot_id];
|
||||
|
||||
/* this is a list of scheduledsessions */
|
||||
/* this is a list of schedule-timeslot-session-assignments */
|
||||
var from_scheduledslots = agenda_globals.slot_status[from_slot_id];
|
||||
var delete_promises = [];
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ function AgendaGlobals() {
|
|||
this.sessions_objs = {};
|
||||
this.timeslot_bydomid = {};
|
||||
this.timeslot_byid = {};
|
||||
this.scheduledsession_promise = undefined;
|
||||
this.assignment_promise = undefined;
|
||||
this.timeslot_promise = undefined;
|
||||
this.__debug_session_move = false;
|
||||
}
|
||||
|
@ -318,7 +318,7 @@ function TimeSlot(){
|
|||
this.date = undefined;
|
||||
this.domid = undefined;
|
||||
this.empty = true;
|
||||
this.scheduledsessions = [];
|
||||
this.assignments = [];
|
||||
this.following_timeslot_id = undefined;
|
||||
this.unscheduled_box = false;
|
||||
}
|
||||
|
@ -420,13 +420,13 @@ function load_timeslots(href) {
|
|||
|
||||
// ++++++++++++++++++
|
||||
// ScheduledSlot Object
|
||||
// ScheduledSession is DJANGO name for this object, but needs to be renamed.
|
||||
// SchedTimeSessAssignment is the DJANGO name for this object
|
||||
// It represents a TimeSlot that can be assigned in this schedule.
|
||||
// { "scheduledsession_id": "{{s.id}}",
|
||||
// { "assignment_id": "{{s.id}}",
|
||||
// "href: "{{s.href}}",
|
||||
// "timeslot_id":"{{s.timeslot.id}}",
|
||||
// "session_id" :"{{s.session.id}}",
|
||||
// "extendedfrom_id" :refers to another scheduledsession by ss.id
|
||||
// "extendedfrom_id" :refers to another schedtimesessassignment by ss.id
|
||||
function ScheduledSlot(){
|
||||
this.extendedfrom = undefined;
|
||||
this.extendedto = undefined;
|
||||
|
@ -469,7 +469,7 @@ ScheduledSlot.prototype.saveit = function() {
|
|||
|
||||
var stuff = JSON.stringify(stuffjson, null, '\t');
|
||||
|
||||
var saveit = $.ajax(scheduledsession_post_href,{
|
||||
var saveit = $.ajax(assignments_post_href,{
|
||||
"content-type": "text/json",
|
||||
"type": "POST",
|
||||
"data": stuff,
|
||||
|
@ -518,7 +518,7 @@ function remove_from_slot_status(domid, ss_id) {
|
|||
if(agenda_globals.__debug_session_move) {
|
||||
console.log(" checking", index, value, ss_id);
|
||||
}
|
||||
if(value.scheduledsession_id == ss_id) {
|
||||
if(value.assignment_id == ss_id) {
|
||||
found_at = index;
|
||||
return;
|
||||
}
|
||||
|
@ -539,8 +539,8 @@ ScheduledSlot.prototype.deleteit = function() {
|
|||
});
|
||||
// now nuke self!
|
||||
var me = this;
|
||||
delete agenda_globals.slot_objs[this.scheduledsession_id];
|
||||
remove_from_slot_status(this.domid(), this.scheduledsession_id);
|
||||
delete agenda_globals.slot_objs[this.assignment_id];
|
||||
remove_from_slot_status(this.domid(), this.assignment_id);
|
||||
return deleteit;
|
||||
};
|
||||
|
||||
|
@ -553,7 +553,7 @@ function update_if_not_undefined(old, newval) {
|
|||
}
|
||||
|
||||
ScheduledSlot.prototype.make_unassigned = function() {
|
||||
this.scheduledsession_id = 0;
|
||||
this.assignment_id = 0;
|
||||
this.empty = true;
|
||||
this.session_id = null;
|
||||
this.room = "unassigned";
|
||||
|
@ -567,13 +567,13 @@ ScheduledSlot.prototype.make_unassigned = function() {
|
|||
|
||||
agenda_globals.slot_status[this.domid()]=[];
|
||||
agenda_globals.slot_status[this.domid()].push(this);
|
||||
agenda_globals.slot_objs[this.scheduledsession_id] = this;
|
||||
agenda_globals.slot_objs[this.assignment_id] = this;
|
||||
};
|
||||
|
||||
ScheduledSlot.prototype.real_initialize = function(json, extra) {
|
||||
/* do not copy everything over */
|
||||
this.pinned = update_if_not_undefined(this.pinned, json.pinned);
|
||||
this.scheduledsession_id = update_if_not_undefined(this.scheduledsession_id, json.scheduledsession_id);
|
||||
this.assignment_id = update_if_not_undefined(this.assignment_id, json.assignment_id);
|
||||
this.session_id = update_if_not_undefined(this.session_id, json.session_id);
|
||||
this.timeslot_id = update_if_not_undefined(this.timeslot_id, json.timeslot_id);
|
||||
this.href = update_if_not_undefined(this.href, json.href);
|
||||
|
@ -605,23 +605,23 @@ ScheduledSlot.prototype.real_initialize = function(json, extra) {
|
|||
}
|
||||
if(this.session_id != undefined) {
|
||||
// remove any old duplicate that might exist.
|
||||
remove_from_slot_status(this.domid(), this.scheduledsession_id);
|
||||
remove_from_slot_status(this.domid(), this.assignment_id);
|
||||
if(agenda_globals.__debug_session_move) {
|
||||
console.log(extra, "adding to slot_status", this.domid());
|
||||
}
|
||||
|
||||
agenda_globals.slot_status[this.domid()].push(this);
|
||||
//console.log("filling slot_objs", this.scheduledsession_id);
|
||||
//console.log("filling slot_objs", this.assignment_id);
|
||||
}
|
||||
}
|
||||
|
||||
agenda_globals.slot_objs[this.scheduledsession_id] = this;
|
||||
agenda_globals.slot_objs[this.assignment_id] = this;
|
||||
};
|
||||
ScheduledSlot.prototype.initialize = ScheduledSlot.prototype.real_initialize;
|
||||
|
||||
function load_scheduledsessions(ts_promise, session_promise, href) {
|
||||
if(agenda_globals.scheduledsession_promise == undefined) {
|
||||
agenda_globals.scheduledsession_promise = $.Deferred();
|
||||
function load_assignments(ts_promise, session_promise, href) {
|
||||
if(agenda_globals.assignment_promise == undefined) {
|
||||
agenda_globals.assignment_promise = $.Deferred();
|
||||
|
||||
var ss = $.ajax(href);
|
||||
var ss_loaded = $.when(ss,ts_promise,session_promise);
|
||||
|
@ -635,10 +635,10 @@ function load_scheduledsessions(ts_promise, session_promise, href) {
|
|||
//console.log("ss has:", one);
|
||||
make_ss(one);
|
||||
});
|
||||
agenda_globals.scheduledsession_promise.resolve(newobj);
|
||||
agenda_globals.assignment_promise.resolve(newobj);
|
||||
});
|
||||
}
|
||||
return agenda_globals.scheduledsession_promise;
|
||||
return agenda_globals.assignment_promise;
|
||||
}
|
||||
|
||||
ScheduledSlot.prototype.connect_to_timeslot_session = function() {
|
||||
|
@ -658,12 +658,12 @@ ScheduledSlot.prototype.session = function() {
|
|||
if(this.session_id != undefined) {
|
||||
return agenda_globals.meeting_objs[this.session_id];
|
||||
} else {
|
||||
console.log("ss id:", this.scheduledsession_id, "timeslot:", this.timeslot_id, this.timeslot.title(), "has null session");
|
||||
console.log("ss id:", this.assignment_id, "timeslot:", this.timeslot_id, this.timeslot.title(), "has null session");
|
||||
return undefined;
|
||||
}
|
||||
};
|
||||
ScheduledSlot.prototype.slot_title = function() {
|
||||
return "id#"+this.scheduledsession_id+" dom:"+this.domid();
|
||||
return "id#"+this.assignment_id+" dom:"+this.domid();
|
||||
};
|
||||
|
||||
function make_ss(json) {
|
||||
|
@ -864,14 +864,14 @@ Session.prototype.on_bucket_list = function() {
|
|||
this.column_class_list = [];
|
||||
this.element().parent("div").addClass("meeting_box_bucket_list");
|
||||
};
|
||||
Session.prototype.placed = function(where, forceslot, scheduledsession) {
|
||||
Session.prototype.placed = function(where, forceslot, assignment) {
|
||||
this.is_placed = true;
|
||||
|
||||
// forceslot is set on a move, but unset on initial placement,
|
||||
// as placed might be called more than once for a double slot session.
|
||||
if(forceslot || this.slot==undefined) {
|
||||
this.slot = where;
|
||||
this.scheduledsession = scheduledsession;
|
||||
this.assignment = assignment;
|
||||
|
||||
/* we can not mark old slot as empty, because it
|
||||
might have multiple sessions in it.
|
||||
|
@ -1232,7 +1232,7 @@ Session.prototype.generate_info_table = function() {
|
|||
if(this.slot != undefined) {
|
||||
ss = this.slot;
|
||||
if(ss.timeslot_id == null){
|
||||
$("#info_location_select").val(agenda_globals.meeting_objs[ss.scheduledsession_id]);
|
||||
$("#info_location_select").val(agenda_globals.meeting_objs[ss.assignment_id]);
|
||||
}else{
|
||||
$("#info_location_select").val(ss.timeslot_id); // ***
|
||||
}
|
||||
|
|
|
@ -26,7 +26,7 @@ li.daylistentry { margin-left:2em; font-weight: 400; }
|
|||
|
||||
{% block content %}
|
||||
<h1>Agenda for {{meeting}} by Session Type</h1>
|
||||
{% regroup scheduledsessions by session.type.slug as type_list %}
|
||||
{% regroup assignments by session.type.slug as type_list %}
|
||||
<ul class="typelist">
|
||||
{% for type in type_list %}
|
||||
<li class="typelistentry {% cycle 'even' 'odd' %}">
|
||||
|
|
|
@ -60,7 +60,7 @@ var schedule_name = "{{ schedule.name }}";
|
|||
var meeting_base_url = "{{ meeting_base_url }}";
|
||||
var schedule_owner_email = "{{ schedule.owner_email }}";
|
||||
var site_base_url = "{{ site_base_url }}";
|
||||
var scheduledsession_post_href = "{% url "ietf.meeting.ajax.scheduledsessions_json" meeting.number schedule.owner_email schedule.name %}";
|
||||
var assignments_post_href = "{% url "ietf.meeting.ajax.assignments_json" meeting.number schedule.owner_email schedule.name %}";
|
||||
var total_days = {{time_slices|length}};
|
||||
var total_rooms = {{rooms|length}};
|
||||
|
||||
|
@ -81,7 +81,7 @@ var sess_promise = load_sessions("{% url "ietf.meeting.ajax.sessions_json" meeti
|
|||
promiselist.push(ts_promise);
|
||||
promiselist.push(sess_promise);
|
||||
|
||||
var ss_promise = load_scheduledsessions(ts_promise, sess_promise, scheduledsession_post_href);
|
||||
var ss_promise = load_assignments(ts_promise, sess_promise, assignments_post_href);
|
||||
promiselist.push(ss_promise);
|
||||
|
||||
console.log("setup_slots run");
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
items.push({room_index:room_names.indexOf("{{slot.get_hidden_location}}"),day:{{slot.day}}, delta_from_beginning:{{slot.delta_from_beginning}},time:"{{slot.time|date:"Hi"}}-{{slot.end_time|date:"Hi"}}", verbose_time:"{{slot.time|date:"D M d Hi"}}-{{slot.end_time|date:"Hi"}}",duration:{{slot.duration.total_seconds}}, type:"{{slot.type}}", name:"Unavailable", dayname:"{{ slot.time|date:"l"|upper }}, {{ slot.time|date:"F j, Y" }}" });
|
||||
}
|
||||
{% endfor %}
|
||||
{% for ss in scheduledsessions %}
|
||||
{% for ss in assignments %}
|
||||
if (room_names.indexOf("{{ss.timeslot.get_hidden_location}}") >= 0 )
|
||||
{
|
||||
items.push({room_index:room_names.indexOf("{{ss.timeslot.get_hidden_location}}"),day:{{ss.day}}, delta_from_beginning:{{ss.delta_from_beginning}},time:"{{ss.timeslot.time|date:"Hi"}}-{{ss.timeslot.end_time|date:"Hi"}}", verbose_time:"{{ss.timeslot.time|date:"D M d Hi"}}-{{ss.timeslot.end_time|date:"Hi"}}",duration:{{ss.timeslot.duration.total_seconds}}, type:"{{ss.timeslot.type}}", {% if ss.session.name %}name:"{{ss.session.name|escapejs}}",{% if ss.session.group.acronym %} wg:"{{ss.session.group.acronym}}",{%endif%}{% else %}{% if ss.timeslot.type.name == "Break" %}name:"{{ss.timeslot.name|escapejs}}", area:"break", wg:"break",{% elif ss.timeslot.type.slug == "unavail" %}name:"Unavailable",{% else %}name:"{{ss.session.group.name|escapejs}}{%if ss.session.group.state.name = "BOF"%} BOF{%endif%}",wg:"{{ss.session.group.acronym}}",state:"{{ss.session.group.state}}",area:"{{ss.session.group.parent.acronym}}",{% endif %}{% endif %} dayname:"{{ ss.timeslot.time|date:"l"|upper }}, {{ ss.timeslot.time|date:"F j, Y" }}"{% if ss.session.agenda %}, agenda:"{{ss.session.agenda.get_absolute_url}}"{% endif %} });
|
||||
|
|
Loading…
Reference in a new issue