* Add a new method, affiliation to idtracker/models.py, in class PersonOrOrgInfo * Agenda for the Plenaries should be stored in /home/master-site/proceedings directory to be displayed. * Bug found in listing ADs at the end of the agenda. An agenda always lists the current IESG instead of the IESG at each meeting. Bug is fixed in the ported tool. * meeting_agenda_text.cgi was obsolete, but ported anyway in case someone still has it bookmarked. - Legacy-Id: 182
362 lines
15 KiB
Python
362 lines
15 KiB
Python
from django.db import models
|
|
from ietf.idtracker.models import Acronym, PersonOrOrgInfo, IRTF, AreaGroup, Area, IETFWG
|
|
import datetime
|
|
from ietf.utils import log
|
|
|
|
# group_acronym is either an IETF Acronym
|
|
# or an IRTF one, depending on the value of irtf.
|
|
# Multiple inheritance to the rescue.
|
|
#
|
|
# interim = i prefix (complicated because you have to check if self has
|
|
# an interim attribute first)
|
|
class ResolveAcronym(object):
|
|
def acronym(self):
|
|
try:
|
|
interim = self.interim
|
|
except AttributeError:
|
|
interim = False
|
|
if self.irtf:
|
|
acronym = IRTF.objects.get(pk=self.group_acronym_id).acronym
|
|
else:
|
|
acronym = Acronym.objects.get(pk=self.group_acronym_id).acronym
|
|
if interim:
|
|
return "i" + acronym
|
|
return acronym
|
|
def acronym_name(self):
|
|
try:
|
|
interim = self.interim
|
|
except AttributeError:
|
|
interim = False
|
|
if self.irtf:
|
|
acronym_name = IRTF.objects.get(pk=self.group_acronym_id).name
|
|
else:
|
|
acronym_name = Acronym.objects.get(pk=self.group_acronym_id).name
|
|
if interim:
|
|
return "i" + acronym
|
|
return acronym_name
|
|
def area(self):
|
|
if self.irtf:
|
|
area = "irtf"
|
|
else:
|
|
try:
|
|
area = AreaGroup.objects.get(group=self.group_acronym_id).area.area_acronym.acronym
|
|
except AreaGroup.DoesNotExist:
|
|
area = ""
|
|
return area
|
|
def isWG(self):
|
|
if self.irtf:
|
|
return False
|
|
else:
|
|
try:
|
|
g_type_id = IETFWG.objects.get(pk=self.group_acronym_id).group_type_id == 1
|
|
if g_type_id == 1:
|
|
return True
|
|
else:
|
|
return False
|
|
except IETFWG.DoesNotExist:
|
|
return False
|
|
|
|
class Meeting(models.Model):
|
|
meeting_num = models.IntegerField(primary_key=True)
|
|
start_date = models.DateField()
|
|
end_date = models.DateField()
|
|
city = models.CharField(blank=True, maxlength=255)
|
|
state = models.CharField(blank=True, maxlength=255)
|
|
country = models.CharField(blank=True, maxlength=255)
|
|
ack = models.TextField(blank=True)
|
|
agenda_html = models.TextField(blank=True)
|
|
agenda_text = models.TextField(blank=True)
|
|
future_meeting = models.TextField(blank=True)
|
|
overview1 = models.TextField(blank=True)
|
|
overview2 = models.TextField(blank=True)
|
|
def __str__(self):
|
|
return "IETF %d" % (self.meeting_num)
|
|
def get_meeting_date (self,offset):
|
|
return self.start_date + datetime.timedelta(days=offset)
|
|
class Meta:
|
|
db_table = 'meetings'
|
|
class Admin:
|
|
pass
|
|
|
|
class MeetingVenue(models.Model):
|
|
meeting_num = models.ForeignKey(Meeting, db_column='meeting_num', unique=True)
|
|
break_area_name = models.CharField(maxlength=255)
|
|
reg_area_name = models.CharField(maxlength=255)
|
|
def __str__(self):
|
|
return "IETF %d" % (self.meeting_num_id)
|
|
class Meta:
|
|
db_table = 'meeting_venues'
|
|
class Admin:
|
|
pass
|
|
|
|
class NonSessionRef(models.Model):
|
|
name = models.CharField(maxlength=255)
|
|
def __str__(self):
|
|
return self.name
|
|
class Meta:
|
|
db_table = 'non_session_ref'
|
|
|
|
class NonSession(models.Model):
|
|
non_session_id = models.AutoField(primary_key=True)
|
|
day_id = models.IntegerField(blank=True, null=True)
|
|
non_session_ref = models.ForeignKey(NonSessionRef)
|
|
meeting = models.ForeignKey(Meeting, db_column='meeting_num')
|
|
time_desc = models.CharField(blank=True, maxlength=75)
|
|
def __str__(self):
|
|
if self.day_id:
|
|
return "%s %s %s @%d" % ((self.meeting.start_date + datetime.timedelta(self.day_id)).strftime('%A'), self.time_desc, self.non_session_ref, self.meeting_id)
|
|
else:
|
|
return "** %s %s @%d" % (self.time_desc, self.non_session_ref, self.meeting_id)
|
|
class Meta:
|
|
db_table = 'non_session'
|
|
|
|
class Proceeding(models.Model):
|
|
meeting_num = models.ForeignKey(Meeting, db_column='meeting_num', unique=True, primary_key=True)
|
|
dir_name = models.CharField(blank=True, maxlength=25)
|
|
sub_begin_date = models.DateField(null=True, blank=True)
|
|
sub_cut_off_date = models.DateField(null=True, blank=True)
|
|
frozen = models.IntegerField(null=True, blank=True)
|
|
c_sub_cut_off_date = models.DateField(null=True, blank=True)
|
|
pr_from_date = models.DateField(null=True, blank=True)
|
|
pr_to_date = models.DateField(null=True, blank=True)
|
|
def __str__(self):
|
|
return "IETF %d" % (self.meeting_num_id)
|
|
class Meta:
|
|
db_table = 'proceedings'
|
|
ordering = ['?'] # workaround for FK primary key
|
|
#class Admin:
|
|
# pass # admin site doesn't like something about meeting_num
|
|
|
|
class SessionConflict(models.Model):
|
|
group_acronym = models.ForeignKey(Acronym, raw_id_admin=True, related_name='conflicts_set')
|
|
conflict_gid = models.ForeignKey(Acronym, raw_id_admin=True, related_name='conflicts_with_set', db_column='conflict_gid')
|
|
meeting_num = models.ForeignKey(Meeting, db_column='meeting_num')
|
|
def __str__(self):
|
|
return "At IETF %d, %s conflicts with %s" % ( self.meeting_num_id, self.group_acronym.acronym, self.conflict_gid.acronym)
|
|
class Meta:
|
|
db_table = 'session_conflicts'
|
|
class Admin:
|
|
pass
|
|
|
|
class SessionName(models.Model):
|
|
session_name_id = models.AutoField(primary_key=True)
|
|
session_name = models.CharField(blank=True, maxlength=255)
|
|
def __str__(self):
|
|
return self.session_name
|
|
class Meta:
|
|
db_table = 'session_names'
|
|
class Admin:
|
|
pass
|
|
class IESGHistory(models.Model):
|
|
meeting = models.ForeignKey(Meeting, db_column='meeting_num', primary_key=True, core=True)
|
|
area = models.ForeignKey(Area, db_column='area_acronym_id', primary_key=True, core=True)
|
|
person = models.ForeignKey(PersonOrOrgInfo, db_column='person_or_org_tag', raw_id_admin=True, core=True)
|
|
def __str__(self):
|
|
return "%s (%s)" % (self.person,self.area)
|
|
class Meta:
|
|
db_table = 'iesg_history'
|
|
class Admin:
|
|
pass
|
|
|
|
class MeetingTime(models.Model):
|
|
time_id = models.AutoField(primary_key=True)
|
|
time_desc = models.CharField(maxlength=100)
|
|
meeting = models.ForeignKey(Meeting, db_column='meeting_num', unique=True)
|
|
day_id = models.IntegerField()
|
|
session_name = models.ForeignKey(SessionName)
|
|
def __str__(self):
|
|
return "[%d] |%s| %s" % (self.meeting_id, (self.meeting.start_date + datetime.timedelta(self.day_id)).strftime('%A'), self.time_desc)
|
|
def sessions(self):
|
|
"""
|
|
Get all sessions that are scheduled at this time.
|
|
"""
|
|
sessions = WgMeetingSession.objects.filter(
|
|
models.Q(sched_time_id1=self.time_id) |
|
|
models.Q(sched_time_id2=self.time_id) |
|
|
models.Q(sched_time_id3=self.time_id) |
|
|
models.Q(combined_time_id1=self.time_id) |
|
|
models.Q(combined_time_id2=self.time_id))
|
|
for s in sessions:
|
|
if s.sched_time_id1_id == self.time_id:
|
|
s.room_id = s.sched_room_id1
|
|
elif s.sched_time_id2_id == self.time_id:
|
|
s.room_id = s.sched_room_id2
|
|
elif s.sched_time_id3_id == self.time_id:
|
|
s.room_id = s.sched_room_id3
|
|
elif s.combined_time_id1_id == self.time_id:
|
|
s.room_id = s.combined_room_id1
|
|
elif s.combined_time_id2_id == self.time_id:
|
|
s.room_id = s.combined_room_id2
|
|
else:
|
|
s.room_id = 0
|
|
return sessions
|
|
def meeting_date(self):
|
|
return self.meeting.get_meeting_date(self.day_id)
|
|
def reg_info(self):
|
|
reg_info = NonSession.objects.get(meeting=self.meeting, day_id=self.day_id, non_session_ref=1)
|
|
if reg_info.time_desc:
|
|
return "%s %s" % (reg_info.time_desc, reg_info.non_session_ref)
|
|
else:
|
|
return ""
|
|
def morning_br_info(self):
|
|
br_info = NonSession.objects.get(models.Q(day_id=self.day_id) | models.Q(day_id__isnull=True), meeting=self.meeting, non_session_ref=2)
|
|
return "%s %s" % (br_info.time_desc, br_info.non_session_ref)
|
|
def lunch_br_info(self):
|
|
return NonSession.objects.get(meeting=self.meeting, non_session_ref=3).time_desc
|
|
def an_br1_info(self):
|
|
an_br1_info = NonSession.objects.get(meeting=self.meeting, day_id=self.day_id, non_session_ref=4)
|
|
return "%s %s" % (an_br1_info.time_desc, an_br1_info.non_session_ref)
|
|
def an_br2_info(self):
|
|
an_br2_info = NonSession.objects.get(meeting=self.meeting, day_id=self.day_id, non_session_ref=5)
|
|
return "%s %s" % (an_br2_info.time_desc, an_br2_info.non_session_ref)
|
|
def fbreak_info(self):
|
|
fbreak_info = NonSession.objects.get(meeting-self.meeting, day_id=5, non_session_ref=6)
|
|
return "%s %s" % (fbreak_info.time_desc, fbreak_info.non_session_ref)
|
|
class Meta:
|
|
db_table = 'meeting_times'
|
|
class Admin:
|
|
pass
|
|
|
|
class MeetingRoom(models.Model):
|
|
room_id = models.AutoField(primary_key=True)
|
|
meeting = models.ForeignKey(Meeting, db_column='meeting_num')
|
|
room_name = models.CharField(maxlength=255)
|
|
def __str__(self):
|
|
return "[%d] %s" % (self.meeting_id, self.room_name)
|
|
class Meta:
|
|
db_table = 'meeting_rooms'
|
|
class Admin:
|
|
pass
|
|
|
|
class WgMeetingSession(models.Model, ResolveAcronym):
|
|
session_id = models.AutoField(primary_key=True)
|
|
meeting = models.ForeignKey(Meeting, db_column='meeting_num')
|
|
group_acronym_id = models.IntegerField()
|
|
irtf = models.BooleanField()
|
|
num_session = models.IntegerField()
|
|
length_session1 = models.CharField(blank=True, maxlength=100)
|
|
length_session2 = models.CharField(blank=True, maxlength=100)
|
|
length_session3 = models.CharField(blank=True, maxlength=100)
|
|
conflict1 = models.CharField(blank=True, maxlength=255)
|
|
conflict2 = models.CharField(blank=True, maxlength=255)
|
|
conflict3 = models.CharField(blank=True, maxlength=255)
|
|
conflict_other = models.TextField(blank=True)
|
|
special_req = models.TextField(blank=True)
|
|
number_attendee = models.IntegerField(null=True, blank=True)
|
|
approval_ad = models.IntegerField(null=True, blank=True)
|
|
status_id = models.IntegerField(null=True, blank=True)
|
|
ts_status_id = models.IntegerField(null=True, blank=True)
|
|
requested_date = models.DateField(null=True, blank=True)
|
|
approved_date = models.DateField(null=True, blank=True)
|
|
requested_by = models.ForeignKey(PersonOrOrgInfo, raw_id_admin=True, db_column='requested_by')
|
|
scheduled_date = models.DateField(null=True, blank=True)
|
|
last_modified_date = models.DateField(null=True, blank=True)
|
|
ad_comments = models.TextField(blank=True)
|
|
sched_room_id1 = models.ForeignKey(MeetingRoom, db_column='sched_room_id1', null=True, blank=True, related_name='here1')
|
|
sched_time_id1 = models.ForeignKey(MeetingTime, db_column='sched_time_id1', null=True, blank=True, related_name='now1')
|
|
sched_date1 = models.DateField(null=True, blank=True)
|
|
sched_room_id2 = models.ForeignKey(MeetingRoom, db_column='sched_room_id2', null=True, blank=True, related_name='here2')
|
|
sched_time_id2 = models.ForeignKey(MeetingTime, db_column='sched_time_id2', null=True, blank=True, related_name='now2')
|
|
sched_date2 = models.DateField(null=True, blank=True)
|
|
sched_room_id3 = models.ForeignKey(MeetingRoom, db_column='sched_room_id3', null=True, blank=True, related_name='here3')
|
|
sched_time_id3 = models.ForeignKey(MeetingTime, db_column='sched_time_id3', null=True, blank=True, related_name='now3')
|
|
sched_date3 = models.DateField(null=True, blank=True)
|
|
special_agenda_note = models.CharField(blank=True, maxlength=255)
|
|
combined_room_id1 = models.ForeignKey(MeetingRoom, db_column='combined_room_id1', null=True, blank=True, related_name='here4')
|
|
combined_time_id1 = models.ForeignKey(MeetingTime, db_column='combined_time_id1', null=True, blank=True, related_name='now4')
|
|
combined_room_id2 = models.ForeignKey(MeetingRoom, db_column='combined_room_id2', null=True, blank=True, related_name='here5')
|
|
combined_time_id2 = models.ForeignKey(MeetingTime, db_column='combined_time_id2', null=True, blank=True, related_name='now5')
|
|
def __str__(self):
|
|
return "%s at %s" % (self.acronym(), self.meeting)
|
|
def agenda_file(self):
|
|
irtfvar = 0
|
|
if self.irtf:
|
|
irtfvar = self.irtf
|
|
try:
|
|
filename = WgAgenda.objects.get(meeting=self.meeting, group_acronym_id=self.group_acronym_id,irtf=irtfvar,interim=0).filename
|
|
dir = Proceeding.objects.get(meeting_num=self.meeting).dir_name
|
|
retvar = "%s/agenda/%s" % (dir,filename)
|
|
except WgAgenda.DoesNotExist:
|
|
retvar = ""
|
|
return retvar
|
|
class Meta:
|
|
db_table = 'wg_meeting_sessions'
|
|
class Admin:
|
|
pass
|
|
|
|
class WgAgenda(models.Model, ResolveAcronym):
|
|
meeting = models.ForeignKey(Meeting, db_column='meeting_num')
|
|
group_acronym_id = models.IntegerField()
|
|
filename = models.CharField(maxlength=255)
|
|
irtf = models.BooleanField()
|
|
interim = models.BooleanField()
|
|
def __str__(self):
|
|
return "Agenda for %s at IETF %d" % (self.acronym(), self.meeting_id)
|
|
class Meta:
|
|
db_table = 'wg_agenda'
|
|
class Admin:
|
|
pass
|
|
|
|
class Minute(models.Model, ResolveAcronym):
|
|
meeting = models.ForeignKey(Meeting, db_column='meeting_num')
|
|
group_acronym = models.ForeignKey(Acronym, raw_id_admin=True)
|
|
filename = models.CharField(blank=True, maxlength=255)
|
|
irtf = models.BooleanField()
|
|
interim = models.BooleanField()
|
|
def __str__(self):
|
|
return "Minutes for %s at IETF %d" % (self.acronym(), self.meeting_id)
|
|
class Meta:
|
|
db_table = 'minutes'
|
|
class Admin:
|
|
pass
|
|
|
|
# It looks like Switches was meant for something bigger, but
|
|
# is only used for the agenda generation right now so we'll
|
|
# put it here.
|
|
class Switches(models.Model):
|
|
name = models.CharField(maxlength=100)
|
|
val = models.IntegerField(null=True, blank=True)
|
|
updated_date = models.DateField(null=True, blank=True)
|
|
updated_time = models.TimeField(null=True, blank=True)
|
|
def __str__(self):
|
|
return self.name
|
|
class Meta:
|
|
db_table = 'switches'
|
|
class Admin:
|
|
pass
|
|
|
|
# Empty table, don't pretend that it exists.
|
|
#class SlideTypes(models.Model):
|
|
# type_id = models.AutoField(primary_key=True)
|
|
# type = models.CharField(maxlength=255, db_column='type_name')
|
|
# def __str__(self):
|
|
# return self.type
|
|
# class Meta:
|
|
# db_table = 'slide_types'
|
|
# class Admin:
|
|
# pass
|
|
|
|
class Slide(models.Model, ResolveAcronym):
|
|
SLIDE_TYPE_CHOICES=(
|
|
('1', '(converted) HTML'),
|
|
('2', 'PDF'),
|
|
('3', 'Text'),
|
|
('4', 'PowerPoint'),
|
|
('5', 'Microsoft Word'),
|
|
)
|
|
meeting = models.ForeignKey(Meeting, db_column='meeting_num')
|
|
group_acronym_id = models.IntegerField(null=True, blank=True)
|
|
slide_num = models.IntegerField(null=True, blank=True)
|
|
slide_type_id = models.IntegerField(choices=SLIDE_TYPE_CHOICES)
|
|
slide_name = models.CharField(blank=True, maxlength=255)
|
|
irtf = models.BooleanField()
|
|
interim = models.BooleanField()
|
|
order_num = models.IntegerField(null=True, blank=True)
|
|
in_q = models.IntegerField(null=True, blank=True)
|
|
def __str__(self):
|
|
return "IETF%d: %s slides (%s)" % (self.meeting_id, self.acronym(), self.slide_name)
|
|
class Meta:
|
|
db_table = 'slides'
|
|
class Admin:
|
|
pass
|