@@ -280,7 +280,6 @@ class Meta:
280280
281281class ResourceAssociation (models .Model ):
282282 name = models .ForeignKey (RoomResourceName )
283- #url = models.UrlField() # not sure what this was for.
284283 icon = models .CharField (max_length = 64 ) # icon to be found in /static/img
285284 desc = models .CharField (max_length = 256 )
286285
@@ -344,7 +343,7 @@ def json_dict(self, host_scheme):
344343 'name' : self .name ,
345344 'capacity' : self .capacity ,
346345 }
347-
346+ # floorplan support
348347 def left (self ):
349348 return min (self .x1 , self .x2 ) if (self .x1 and self .x2 ) else 0
350349 def top (self ):
@@ -361,9 +360,24 @@ def functional_display_name(self):
361360 if self .functional_name [0 ].isdigit ():
362361 return ""
363362 return self .functional_name
363+ # audio stream support
364+ def audio_stream_url (self ):
365+ urlresource = self .urlresource_set .filter (name_id = 'audiostream' ).first ()
366+ return urlresource .url if urlresource else None
367+ def video_stream_url (self ):
368+ urlresource = self .urlresource_set .filter (name_id__in = ['meetecho' , ]).first ()
369+ return urlresource .url if urlresource else None
370+ #
364371 class Meta :
365372 ordering = ["-meeting" , "name" ]
366373
374+
375+ class UrlResource (models .Model ):
376+ "For things like audio stream urls, meetecho stream urls"
377+ name = models .ForeignKey (RoomResourceName )
378+ room = models .ForeignKey (Room )
379+ url = models .URLField (null = True , blank = True )
380+
367381def floorplan_path (instance , filename ):
368382 root , ext = os .path .splitext (filename )
369383 return u"%s/floorplan-%s-%s%s" % (settings .FLOORPLAN_MEDIA_DIR , instance .meeting .number , xslugify (instance .name ), ext )
@@ -373,6 +387,9 @@ class FloorPlan(models.Model):
373387 meeting = models .ForeignKey (Meeting )
374388 order = models .SmallIntegerField ()
375389 image = models .ImageField (storage = NoLocationMigrationFileSystemStorage (), upload_to = floorplan_path , blank = True , default = None )
390+ #
391+ def __unicode__ (self ):
392+ return 'floorplan-%s-%s' % (self .meeting .number , xslugify (self .name ))
376393
377394# === Schedules, Sessions, Timeslots and Assignments ===========================
378395
@@ -423,6 +440,7 @@ def __unicode__(self):
423440 location = "(no location)"
424441
425442 return u"%s: %s-%s %s, %s" % (self .meeting .number , self .time .strftime ("%m-%d %H:%M" ), (self .time + self .duration ).strftime ("%H:%M" ), self .name , location )
443+
426444 def end_time (self ):
427445 return self .time + self .duration
428446
@@ -452,26 +470,28 @@ def get_functional_location(self):
452470 name_parts .append (location )
453471 return ' - ' .join (name_parts )
454472
455- @property
456473 def tz (self ):
457- if self .meeting .time_zone :
458- return pytz .timezone (self .meeting .time_zone )
459- else :
460- return None
474+ if not hasattr (self , '_cached_tz' ):
475+ if self .meeting .time_zone :
476+ self ._cached_tz = pytz .timezone (self .meeting .time_zone )
477+ else :
478+ self ._cached_tz = None
479+ return self ._cached_tz
480+
461481 def tzname (self ):
462- if self .tz :
463- return self .tz .tzname (self .time )
482+ if self .tz () :
483+ return self .tz () .tzname (self .time )
464484 else :
465485 return ""
466486 def utc_start_time (self ):
467- if self .tz :
468- local_start_time = self .tz .localize (self .time )
487+ if self .tz () :
488+ local_start_time = self .tz () .localize (self .time )
469489 return local_start_time .astimezone (pytz .utc )
470490 else :
471491 return None
472492 def utc_end_time (self ):
473- if self .tz :
474- local_end_time = self .tz .localize (self .end_time ())
493+ if self .tz () :
494+ local_end_time = self .tz () .localize (self .end_time ())
475495 return local_end_time .astimezone (pytz .utc )
476496 else :
477497 return None
0 commit comments