Import WG agendas, proxy more meeting code

- Legacy-Id: 3289
This commit is contained in:
Ole Laursen 2011-08-08 19:10:49 +00:00
parent 974877aafb
commit d2ea0e5088
5 changed files with 125 additions and 53 deletions

View file

@ -7,6 +7,7 @@ from timedeltafield import TimedeltaField
from redesign.group.models import Group
from redesign.person.models import Person
from redesign.doc.models import Document
from redesign.name.models import TimeSlotTypeName, SessionStatusName, ConstraintName
countries = pytz.country_names.items()
@ -82,6 +83,7 @@ class TimeSlot(models.Model):
duration = TimedeltaField()
location = models.ForeignKey(Room, blank=True, null=True)
show_location = models.BooleanField(default=True)
materials = models.ManyToManyField(Document, blank=True)
def __unicode__(self):
location = self.get_location()
@ -132,9 +134,13 @@ class Session(models.Model):
scheduled = models.DateTimeField(null=True, blank=True)
modified = models.DateTimeField(null=True, blank=True)
# contains the materials while the session is being requested,
# when it is scheduled, timeslot.materials should be used (FIXME: ask Henrik)
materials = models.ManyToManyField(Document, blank=True)
def __unicode__(self):
return u"%s: %s %s" % (self.meeting, self.group.acronym, self.timeslot.time.strftime("%H%M") if self.timeslot else "(unscheduled)")
# Agendas, Minutes and Slides are all mapped to Document.
# IESG history is extracted from GroupHistory, rather than hand coded in a

View file

@ -132,7 +132,10 @@ class MeetingTimeProxy(TimeSlot):
def __str__(self):
return "[%d] |%s| %s" % (self.meeting.number, self.time.strftime('%A'), self.time_desc)
def sessions(self):
return WgMeetingSessionProxy.objects.filter(meeting=self.meeting, time=self.time, type__in=("session", "plenary", "other"))
if not hasattr(self, "sessions_cache"):
self.sessions_cache = WgMeetingSessionProxy.objects.filter(meeting=self.meeting, time=self.time, type__in=("session", "plenary", "other"))
return self.sessions_cache
def sessions_by_area(self):
return [ {"area":session.area()+session.acronym(), "info":session} for session in self.sessions() ]
def meeting_date(self):
@ -225,8 +228,7 @@ class WgMeetingSessionProxy(TimeSlot):
#number_attendee = models.IntegerField(null=True, blank=True)
@property
def number_attendee(self):
s = self.get_session()
return s.attendees if s else 0
return self.get_session().attendees if self.get_session() else 0
#approval_ad = models.IntegerField(null=True, blank=True)
#status = models.ForeignKey(SessionStatus, null=True, blank=True) # same name
#ts_status_id = models.IntegerField(null=True, blank=True)
@ -234,7 +236,13 @@ class WgMeetingSessionProxy(TimeSlot):
#approved_date = models.DateField(null=True, blank=True)
#requested_by = BrokenForeignKey(PersonOrOrgInfo, db_column='requested_by', null=True, null_values=(0, 888888))
#scheduled_date = models.DateField(null=True, blank=True)
@property
def scheduled_date(self):
return self.get_session().scheduled.date() if self.get_session() else ""
#last_modified_date = models.DateField(null=True, blank=True)
@property
def last_modified_date(self):
return self.get_session().modified.date() if self.get_session() else ""
#ad_comments = models.TextField(blank=True,null=True)
#sched_room_id1 = models.ForeignKey(MeetingRoom, db_column='sched_room_id1', null=True, blank=True, related_name='here1')
#sched_time_id1 = BrokenForeignKey(MeetingTime, db_column='sched_time_id1', null=True, blank=True, related_name='now1')
@ -246,6 +254,9 @@ class WgMeetingSessionProxy(TimeSlot):
#sched_time_id3 = BrokenForeignKey(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, max_length=255)
@property
def special_agenda_note(self):
return self.get_session().agenda_note if self.get_session() else ""
#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')
@ -254,46 +265,25 @@ class WgMeetingSessionProxy(TimeSlot):
return "%s at %s" % (self.acronym(), self.meeting)
def agenda_file(self,interimvar=0):
if not hasattr(self, '_agenda_file'):
# FIXME
irtfvar = 0
if self.irtf:
irtfvar = self.group_acronym_id
if interimvar == 0:
try:
if self.interim:
interimvar = 1
except AttributeError:
interimvar = 0
try:
filename = WgAgenda.objects.get(meeting=self.meeting, group_acronym_id=self.group_acronym_id,irtf=irtfvar,interim=interimvar).filename
if self.meeting_id in WgMeetingSession._dirs:
dir = WgMeetingSession._dirs[self.meeting_id]
else:
dir = Proceeding.objects.get(meeting_num=self.meeting).dir_name
WgMeetingSession._dirs[self.meeting_id]=dir
retvar = "%s/agenda/%s" % (dir,filename)
except WgAgenda.DoesNotExist:
retvar = ""
self._agenda_file = retvar
docs = self.materials.filter(type="agenda")
if not docs:
return ""
# we use external_url at the moment, should probably regularize
# the filenames to match the document name instead
filename = docs[0].external_url
self._agenda_file = "%s/agenda/%s" % (self.meeting.number, filename)
return self._agenda_file
def minute_file(self,interimvar=0):
# FIXME
irtfvar = 0
if self.irtf:
irtfvar = self.group_acronym_id
if interimvar == 0:
try:
if self.interim:
interimvar = 1
except AttributeError:
interimvar = 0
try:
filename = Minute.objects.get(meeting=self.meeting, group_acronym_id=self.group_acronym_id,irtf=irtfvar,interim=interimvar).filename
dir = Proceeding.objects.get(meeting_num=self.meeting).dir_name
retvar = "%s/minutes/%s" % (dir,filename)
except Minute.DoesNotExist:
retvar = ""
return retvar
docs = self.materials.filter(type="minutes")
if not docs:
return ""
# we use external_url at the moment, should probably regularize
# the filenames to match the document name instead
filename = docs[0].external_url
return "%s/minutes/%s" % (self.meeting.number, filename)
def slides(self,interimvar=0):
"""
Get all slides of this session.
@ -337,12 +327,16 @@ class WgMeetingSessionProxy(TimeSlot):
d.room_name = self.location.name
return d
_dirs = {}
# from ResolveAcronym:
def acronym(self):
s = self.get_session()
if not s:
if self.type_id == "plenary":
for m in self.materials.filter(type="agenda"):
if "plenaryw" in m.name:
return "plenaryw"
if "plenaryt" in m.name:
return "plenaryt"
return ""
if hasattr(self, "interim"):
return "i" + s.group.acronym

View file

@ -1,6 +1,5 @@
# Copyright The IETF Trust 2007, All Rights Reserved
# Create your views here.
#import models
import datetime
import os
@ -62,7 +61,6 @@ def current_materials(request):
return HttpResponseRedirect( reverse(show_html_materials, args=[meeting.meeting_num]) )
def get_plenary_agenda(meeting_num, id):
# FIXME: fix
try:
plenary_agenda_file = settings.AGENDA_PATH + WgMeetingSession.objects.get(meeting=meeting_num,group_acronym_id=id).agenda_file()
try:
@ -126,8 +124,26 @@ def agenda_infoREDESIGN(num=None):
if not ads:
ads = list(IESGHistory.objects.select_related().filter(meeting=str(int(meeting.number)-1)))
ads.sort(key=(lambda item: item.area.area_acronym.acronym))
plenaryw_agenda = get_plenary_agenda(meeting.number, -1)
plenaryt_agenda = get_plenary_agenda(meeting.number, -2)
from redesign.doc.models import Document
plenary_agendas = Document.objects.filter(timeslot__meeting=meeting, timeslot__type="plenary", type="agenda").distinct()
plenaryw_agenda = plenaryt_agenda = "The Plenary has not been scheduled"
for agenda in plenary_agendas:
# we use external_url at the moment, should probably regularize
# the filenames to match the document name instead
path = os.path.join(settings.AGENDA_PATH, meeting.number, "agenda", agenda.external_url)
try:
f = open(path)
s = f.read()
f.close()
except IOError:
s = "THE AGENDA HAS NOT BEEN UPLOADED YET"
if "plenaryw" in agenda.name:
plenaryw_agenda = s
elif "plenaryt" in agenda.name:
plenaryt_agenda = s
return timeslots, update, meeting, venue, ads, plenaryw_agenda, plenaryt_agenda
if settings.USE_DB_REDESIGN_PROXY_CLASSES:

View file

@ -379,9 +379,9 @@ class WgMeetingSession(models.Model, ResolveAcronym):
sched_date3 = models.DateField(null=True, blank=True)
special_agenda_note = models.CharField(blank=True, max_length=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_time_id1 = BrokenForeignKey(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')
combined_time_id2 = BrokenForeignKey(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,interimvar=0):

View file

@ -11,16 +11,19 @@ settings.USE_DB_REDESIGN_PROXY_CLASSES = False
from django.core import management
management.setup_environ(settings)
from django.template.defaultfilters import slugify
from ietf.idtracker.models import AreaDirector, IETFWG, Acronym, IRTF
from ietf.meeting.models import *
from ietf.proceedings.models import Meeting as MeetingOld, MeetingVenue, MeetingRoom, NonSession, WgMeetingSession
from ietf.proceedings.models import Meeting as MeetingOld, MeetingVenue, MeetingRoom, NonSession, WgMeetingSession, WgAgenda
from redesign.person.models import *
from redesign.doc.models import Document, DocAlias
from redesign.importing.utils import get_or_create_email, old_person_to_person
from redesign.name.models import *
from redesign.name.utils import name
# imports Meeting, MeetingVenue, MeetingRoom, NonSession, WgMeetingSession
# imports Meeting, MeetingVenue, MeetingRoom, NonSession, WgMeetingSession, WgAgenda
# assumptions:
# - persons have been imported
@ -46,6 +49,8 @@ other_slot = name(TimeSlotTypeName, "other", "Other")
conflict_constraint = name(ConstraintName, "conflict", "Conflicts with")
agenda_doctype = name(DocTypeName, "agenda", "Agenda")
system_person = Person.objects.get(name="(System)")
obviously_bogus_date = datetime.date(1970, 1, 1)
@ -160,7 +165,50 @@ requested_length_mapping = {
"4": 150 * 60,
}
for o in WgMeetingSession.objects.all().order_by("pk"):
def import_materials_for_timeslot(timeslot, session=None, wg_meeting_session=None):
if timeslot:
meeting = timeslot.meeting
materials = timeslot.materials
else:
meeting = session.meeting
materials = session.materials
if wg_meeting_session:
# import agendas
irtf = 0
if wg_meeting_session.irtf:
irtf = wg_meeting_session.group_acronym_id
agendas = WgAgenda.objects.filter(meeting=wg_meeting_session.meeting_id,
group_acronym_id=wg_meeting_session.group_acronym_id,
irtf=irtf)
for o in agendas:
if session:
acronym = session.group.acronym
else:
acronym = os.path.splitext(o.filename)[0].lower()
rev = "01"
name = ("agenda-%s-%s-%s" % (meeting.number, acronym, rev))
try:
d = Document.objects.get(type=agenda_doctype, docalias__name=name)
except Document.DoesNotExist:
d = Document(type=agenda_doctype, name=name)
if session:
session_name = session.group.acronym.upper()
else:
session_name = timeslot.name
d.title = u"Agenda for %s at %s" % (session_name, meeting)
d.external_url = o.filename # save filenames for now as they don't appear to be quite regular
d.save()
DocAlias.objects.get_or_create(document=d, name=name)
materials.add(d)
for o in WgMeetingSession.objects.all().order_by("pk").filter(pk=1699):
# num_session is unfortunately not quite reliable, seems to be
# right for 1 or 2 but not 3 and it's sometimes null
sessions = o.num_session or 1
@ -169,6 +217,8 @@ for o in WgMeetingSession.objects.all().order_by("pk"):
print "importing WgMeetingSession", o.pk, "subsessions", sessions
print o.sched_time_id1, o.sched_time_id2, o.sched_time_id3
for i in range(1, 1 + sessions):
pk = o.pk + (i - 1) * 10000 # move extra session out of the way
try:
@ -194,6 +244,7 @@ for o in WgMeetingSession.objects.all().order_by("pk"):
if not s.timeslot:
print "IGNORING unscheduled non-WG-session", acronym.name
continue
if sched_time_id.session_name_id:
s.timeslot.name = sched_time_id.session_name.session_name
else:
@ -204,6 +255,9 @@ for o in WgMeetingSession.objects.all().order_by("pk"):
else:
s.timeslot.type = other_slot
s.timeslot.save()
import_materials_for_timeslot(s.timeslot, wg_meeting_session=o)
continue
s.group = Group.objects.get(acronym=acronym.acronym)
@ -227,6 +281,8 @@ for o in WgMeetingSession.objects.all().order_by("pk"):
s.save()
import_materials_for_timeslot(s.timeslot, session=s, wg_meeting_session=o)
conflict = (getattr(o, "conflict%s" % i) or "").replace(",", " ").lower()
conflicting_groups = [g for g in conflict.split() if g]
for target in Group.objects.filter(acronym__in=conflicting_groups):