@@ -297,7 +297,9 @@ def updated(self):
297297 min_time = datetime .datetime (1970 , 1 , 1 , 0 , 0 , 0 ) # should be Meeting.modified, but we don't have that
298298 timeslots_updated = self .timeslot_set .aggregate (Max ('modified' ))["modified__max" ] or min_time
299299 sessions_updated = self .session_set .aggregate (Max ('modified' ))["modified__max" ] or min_time
300- assignments_updated = (self .schedule .assignments .aggregate (Max ('modified' ))["modified__max" ] or min_time ) if self .schedule else min_time
300+ assignments_updated = min_time
301+ if self .schedule :
302+ assignments_updated = SchedTimeSessAssignment .objects .filter (schedule__in = [self .schedule , self .schedule .base if self .schedule else None ]).aggregate (Max ('modified' ))["modified__max" ] or min_time
301303 ts = max (timeslots_updated , sessions_updated , assignments_updated )
302304 tz = pytz .timezone (settings .PRODUCTION_TIMEZONE )
303305 ts = tz .localize (ts )
@@ -397,14 +399,14 @@ def functional_display_name(self):
397399 return self .functional_name
398400 # audio stream support
399401 def audio_stream_url (self ):
400- urlresource = self .urlresource_set .filter ( name_id = 'audiostream' ). first ()
401- return urlresource .url if urlresource else None
402+ urlresources = [ ur for ur in self .urlresource_set .all () if ur . name_id == 'audiostream' ]
403+ return urlresources [ 0 ] .url if urlresources else None
402404 def video_stream_url (self ):
403- urlresource = self .urlresource_set .filter ( name_id__in = ['meetecho' , ]). first ()
404- return urlresource .url if urlresource else None
405+ urlresources = [ ur for ur in self .urlresource_set .all () if ur . name_id in ['meetecho' ]]
406+ return urlresources [ 0 ] .url if urlresources else None
405407 def webex_url (self ):
406- urlresource = self .urlresource_set .filter ( name_id__in = ['webex' , ]). first ()
407- return urlresource .url if urlresource else None
408+ urlresources = [ ur for ur in self .urlresource_set .all () if ur . name_id in ['webex' ]]
409+ return urlresources [ 0 ] .url if urlresources else None
408410 #
409411 class Meta :
410412 ordering = ["-id" ]
@@ -456,7 +458,7 @@ class TimeSlot(models.Model):
456458 @property
457459 def session (self ):
458460 if not hasattr (self , "_session_cache" ):
459- self ._session_cache = self .sessions .filter (timeslotassignments__schedule = self .meeting .schedule ).first ()
461+ self ._session_cache = self .sessions .filter (timeslotassignments__schedule__in = [ self .meeting .schedule , self . meeting . schedule . base if self . meeting else None ] ).first ()
460462 return self ._session_cache
461463
462464 @property
@@ -628,10 +630,14 @@ class Schedule(models.Model):
628630 meeting = ForeignKey (Meeting , null = True , related_name = 'schedule_set' )
629631 name = models .CharField (max_length = 16 , blank = False , help_text = "Letters, numbers and -:_ allowed." , validators = [RegexValidator (r'^[A-Za-z0-9-:_]*$' )])
630632 owner = ForeignKey (Person )
631- visible = models .BooleanField (default = True , help_text = "Make this agenda available to those who know about it ." )
632- public = models .BooleanField (default = True , help_text = "Make this agenda publically available ." )
633+ visible = models .BooleanField ("Show in agenda list" , default = True , help_text = "Show in the list of possible agendas for the meeting ." )
634+ public = models .BooleanField (default = True , help_text = "Allow others to see this agenda ." )
633635 badness = models .IntegerField (null = True , blank = True )
634- # considering copiedFrom = ForeignKey('Schedule', blank=True, null=True)
636+ notes = models .TextField (blank = True )
637+ origin = ForeignKey ('Schedule' , blank = True , null = True , on_delete = models .SET_NULL , related_name = "+" )
638+ base = ForeignKey ('Schedule' , blank = True , null = True , on_delete = models .SET_NULL ,
639+ help_text = "Sessions scheduled in the base schedule show up in this schedule too." , related_name = "derivedschedule_set" ,
640+ limit_choices_to = {'base' : None }) # prevent the inheritance from being more than one layer deep (no recursion)
635641
636642 def __str__ (self ):
637643 return u"%s:%s(%s)" % (self .meeting , self .name , self .owner )
@@ -658,20 +664,6 @@ def owner_email(self):
658664 else :
659665 return "noemail"
660666
661- @property
662- def visible_token (self ):
663- if self .visible :
664- return "visible"
665- else :
666- return "hidden"
667-
668- @property
669- def public_token (self ):
670- if self .public :
671- return "public"
672- else :
673- return "private"
674-
675667 @property
676668 def is_official (self ):
677669 return (self .meeting .schedule == self )
@@ -943,6 +935,8 @@ class Session(models.Model):
943935 modified = models .DateTimeField (auto_now = True )
944936 remote_instructions = models .CharField (blank = True ,max_length = 1024 )
945937
938+ tombstone_for = models .ForeignKey ('Session' , blank = True , null = True , help_text = "This session is the tombstone for a session that was rescheduled" , on_delete = models .CASCADE )
939+
946940 materials = models .ManyToManyField (Document , through = SessionPresentation , blank = True )
947941 resources = models .ManyToManyField (ResourceAssociation , blank = True )
948942
@@ -1084,7 +1078,7 @@ def __str__(self):
10841078 ss0name = "(%s)" % SessionStatusName .objects .get (slug = status_id ).name
10851079 else :
10861080 ss0name = "(unscheduled)"
1087- ss = self .timeslotassignments .filter (schedule = self .meeting .schedule ).order_by ('timeslot__time' )
1081+ ss = self .timeslotassignments .filter (schedule__in = [ self .meeting .schedule , self . meeting . schedule . base if self . meeting . schedule else None ] ).order_by ('timeslot__time' )
10881082 if ss :
10891083 ss0name = ',' .join (x .timeslot .time .strftime ("%a-%H%M" ) for x in ss )
10901084 return "%s: %s %s %s" % (self .meeting , self .group .acronym , self .name , ss0name )
@@ -1117,11 +1111,8 @@ def constraints(self):
11171111 def reverse_constraints (self ):
11181112 return Constraint .objects .filter (target = self .group , meeting = self .meeting ).order_by ('name__name' )
11191113
1120- def timeslotassignment_for_schedule (self , schedule ):
1121- return self .timeslotassignments .filter (schedule = schedule ).first ()
1122-
11231114 def official_timeslotassignment (self ):
1124- return self .timeslotassignment_for_schedule ( self .meeting .schedule )
1115+ return self .timeslotassignments . filter ( schedule__in = [ self .meeting .schedule , self . meeting . schedule . base if self . meeting . schedule else None ]). first ( )
11251116
11261117 def constraints_dict (self , host_scheme ):
11271118 constraint_list = []
0 commit comments