Skip to content

Commit d2ea0e5

Browse files
committed
Import WG agendas, proxy more meeting code
- Legacy-Id: 3289
1 parent 974877a commit d2ea0e5

5 files changed

Lines changed: 125 additions & 53 deletions

File tree

ietf/meeting/models.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
from redesign.group.models import Group
99
from redesign.person.models import Person
10+
from redesign.doc.models import Document
1011
from redesign.name.models import TimeSlotTypeName, SessionStatusName, ConstraintName
1112

1213
countries = pytz.country_names.items()
@@ -82,6 +83,7 @@ class TimeSlot(models.Model):
8283
duration = TimedeltaField()
8384
location = models.ForeignKey(Room, blank=True, null=True)
8485
show_location = models.BooleanField(default=True)
86+
materials = models.ManyToManyField(Document, blank=True)
8587

8688
def __unicode__(self):
8789
location = self.get_location()
@@ -132,9 +134,13 @@ class Session(models.Model):
132134
scheduled = models.DateTimeField(null=True, blank=True)
133135
modified = models.DateTimeField(null=True, blank=True)
134136

137+
# contains the materials while the session is being requested,
138+
# when it is scheduled, timeslot.materials should be used (FIXME: ask Henrik)
139+
materials = models.ManyToManyField(Document, blank=True)
140+
135141
def __unicode__(self):
136142
return u"%s: %s %s" % (self.meeting, self.group.acronym, self.timeslot.time.strftime("%H%M") if self.timeslot else "(unscheduled)")
137-
143+
138144
# Agendas, Minutes and Slides are all mapped to Document.
139145

140146
# IESG history is extracted from GroupHistory, rather than hand coded in a

ietf/meeting/proxy.py

Lines changed: 37 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,10 @@ def __unicode__(self):
132132
def __str__(self):
133133
return "[%d] |%s| %s" % (self.meeting.number, self.time.strftime('%A'), self.time_desc)
134134
def sessions(self):
135-
return WgMeetingSessionProxy.objects.filter(meeting=self.meeting, time=self.time, type__in=("session", "plenary", "other"))
135+
if not hasattr(self, "sessions_cache"):
136+
self.sessions_cache = WgMeetingSessionProxy.objects.filter(meeting=self.meeting, time=self.time, type__in=("session", "plenary", "other"))
137+
138+
return self.sessions_cache
136139
def sessions_by_area(self):
137140
return [ {"area":session.area()+session.acronym(), "info":session} for session in self.sessions() ]
138141
def meeting_date(self):
@@ -225,16 +228,21 @@ def group_acronym_id(self):
225228
#number_attendee = models.IntegerField(null=True, blank=True)
226229
@property
227230
def number_attendee(self):
228-
s = self.get_session()
229-
return s.attendees if s else 0
231+
return self.get_session().attendees if self.get_session() else 0
230232
#approval_ad = models.IntegerField(null=True, blank=True)
231233
#status = models.ForeignKey(SessionStatus, null=True, blank=True) # same name
232234
#ts_status_id = models.IntegerField(null=True, blank=True)
233235
#requested_date = models.DateField(null=True, blank=True)
234236
#approved_date = models.DateField(null=True, blank=True)
235237
#requested_by = BrokenForeignKey(PersonOrOrgInfo, db_column='requested_by', null=True, null_values=(0, 888888))
236238
#scheduled_date = models.DateField(null=True, blank=True)
239+
@property
240+
def scheduled_date(self):
241+
return self.get_session().scheduled.date() if self.get_session() else ""
237242
#last_modified_date = models.DateField(null=True, blank=True)
243+
@property
244+
def last_modified_date(self):
245+
return self.get_session().modified.date() if self.get_session() else ""
238246
#ad_comments = models.TextField(blank=True,null=True)
239247
#sched_room_id1 = models.ForeignKey(MeetingRoom, db_column='sched_room_id1', null=True, blank=True, related_name='here1')
240248
#sched_time_id1 = BrokenForeignKey(MeetingTime, db_column='sched_time_id1', null=True, blank=True, related_name='now1')
@@ -246,6 +254,9 @@ def number_attendee(self):
246254
#sched_time_id3 = BrokenForeignKey(MeetingTime, db_column='sched_time_id3', null=True, blank=True, related_name='now3')
247255
#sched_date3 = models.DateField(null=True, blank=True)
248256
#special_agenda_note = models.CharField(blank=True, max_length=255)
257+
@property
258+
def special_agenda_note(self):
259+
return self.get_session().agenda_note if self.get_session() else ""
249260
#combined_room_id1 = models.ForeignKey(MeetingRoom, db_column='combined_room_id1', null=True, blank=True, related_name='here4')
250261
#combined_time_id1 = models.ForeignKey(MeetingTime, db_column='combined_time_id1', null=True, blank=True, related_name='now4')
251262
#combined_room_id2 = models.ForeignKey(MeetingRoom, db_column='combined_room_id2', null=True, blank=True, related_name='here5')
@@ -254,46 +265,25 @@ def __str__(self):
254265
return "%s at %s" % (self.acronym(), self.meeting)
255266
def agenda_file(self,interimvar=0):
256267
if not hasattr(self, '_agenda_file'):
257-
# FIXME
258-
irtfvar = 0
259-
if self.irtf:
260-
irtfvar = self.group_acronym_id
261-
if interimvar == 0:
262-
try:
263-
if self.interim:
264-
interimvar = 1
265-
except AttributeError:
266-
interimvar = 0
267-
try:
268-
filename = WgAgenda.objects.get(meeting=self.meeting, group_acronym_id=self.group_acronym_id,irtf=irtfvar,interim=interimvar).filename
269-
if self.meeting_id in WgMeetingSession._dirs:
270-
dir = WgMeetingSession._dirs[self.meeting_id]
271-
else:
272-
dir = Proceeding.objects.get(meeting_num=self.meeting).dir_name
273-
WgMeetingSession._dirs[self.meeting_id]=dir
274-
retvar = "%s/agenda/%s" % (dir,filename)
275-
except WgAgenda.DoesNotExist:
276-
retvar = ""
277-
self._agenda_file = retvar
268+
docs = self.materials.filter(type="agenda")
269+
if not docs:
270+
return ""
271+
272+
# we use external_url at the moment, should probably regularize
273+
# the filenames to match the document name instead
274+
filename = docs[0].external_url
275+
self._agenda_file = "%s/agenda/%s" % (self.meeting.number, filename)
276+
278277
return self._agenda_file
279278
def minute_file(self,interimvar=0):
280-
# FIXME
281-
irtfvar = 0
282-
if self.irtf:
283-
irtfvar = self.group_acronym_id
284-
if interimvar == 0:
285-
try:
286-
if self.interim:
287-
interimvar = 1
288-
except AttributeError:
289-
interimvar = 0
290-
try:
291-
filename = Minute.objects.get(meeting=self.meeting, group_acronym_id=self.group_acronym_id,irtf=irtfvar,interim=interimvar).filename
292-
dir = Proceeding.objects.get(meeting_num=self.meeting).dir_name
293-
retvar = "%s/minutes/%s" % (dir,filename)
294-
except Minute.DoesNotExist:
295-
retvar = ""
296-
return retvar
279+
docs = self.materials.filter(type="minutes")
280+
if not docs:
281+
return ""
282+
283+
# we use external_url at the moment, should probably regularize
284+
# the filenames to match the document name instead
285+
filename = docs[0].external_url
286+
return "%s/minutes/%s" % (self.meeting.number, filename)
297287
def slides(self,interimvar=0):
298288
"""
299289
Get all slides of this session.
@@ -337,12 +327,16 @@ class Dummy: pass
337327
d.room_name = self.location.name
338328
return d
339329

340-
_dirs = {}
341-
342330
# from ResolveAcronym:
343331
def acronym(self):
344332
s = self.get_session()
345333
if not s:
334+
if self.type_id == "plenary":
335+
for m in self.materials.filter(type="agenda"):
336+
if "plenaryw" in m.name:
337+
return "plenaryw"
338+
if "plenaryt" in m.name:
339+
return "plenaryt"
346340
return ""
347341
if hasattr(self, "interim"):
348342
return "i" + s.group.acronym

ietf/meeting/views.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
# Copyright The IETF Trust 2007, All Rights Reserved
22

3-
# Create your views here.
43
#import models
54
import datetime
65
import os
@@ -62,7 +61,6 @@ def current_materials(request):
6261
return HttpResponseRedirect( reverse(show_html_materials, args=[meeting.meeting_num]) )
6362

6463
def get_plenary_agenda(meeting_num, id):
65-
# FIXME: fix
6664
try:
6765
plenary_agenda_file = settings.AGENDA_PATH + WgMeetingSession.objects.get(meeting=meeting_num,group_acronym_id=id).agenda_file()
6866
try:
@@ -126,8 +124,26 @@ def agenda_infoREDESIGN(num=None):
126124
if not ads:
127125
ads = list(IESGHistory.objects.select_related().filter(meeting=str(int(meeting.number)-1)))
128126
ads.sort(key=(lambda item: item.area.area_acronym.acronym))
129-
plenaryw_agenda = get_plenary_agenda(meeting.number, -1)
130-
plenaryt_agenda = get_plenary_agenda(meeting.number, -2)
127+
128+
from redesign.doc.models import Document
129+
plenary_agendas = Document.objects.filter(timeslot__meeting=meeting, timeslot__type="plenary", type="agenda").distinct()
130+
plenaryw_agenda = plenaryt_agenda = "The Plenary has not been scheduled"
131+
for agenda in plenary_agendas:
132+
# we use external_url at the moment, should probably regularize
133+
# the filenames to match the document name instead
134+
path = os.path.join(settings.AGENDA_PATH, meeting.number, "agenda", agenda.external_url)
135+
try:
136+
f = open(path)
137+
s = f.read()
138+
f.close()
139+
except IOError:
140+
s = "THE AGENDA HAS NOT BEEN UPLOADED YET"
141+
142+
if "plenaryw" in agenda.name:
143+
plenaryw_agenda = s
144+
elif "plenaryt" in agenda.name:
145+
plenaryt_agenda = s
146+
131147
return timeslots, update, meeting, venue, ads, plenaryw_agenda, plenaryt_agenda
132148

133149
if settings.USE_DB_REDESIGN_PROXY_CLASSES:

ietf/proceedings/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -379,9 +379,9 @@ class WgMeetingSession(models.Model, ResolveAcronym):
379379
sched_date3 = models.DateField(null=True, blank=True)
380380
special_agenda_note = models.CharField(blank=True, max_length=255)
381381
combined_room_id1 = models.ForeignKey(MeetingRoom, db_column='combined_room_id1', null=True, blank=True, related_name='here4')
382-
combined_time_id1 = models.ForeignKey(MeetingTime, db_column='combined_time_id1', null=True, blank=True, related_name='now4')
382+
combined_time_id1 = BrokenForeignKey(MeetingTime, db_column='combined_time_id1', null=True, blank=True, related_name='now4')
383383
combined_room_id2 = models.ForeignKey(MeetingRoom, db_column='combined_room_id2', null=True, blank=True, related_name='here5')
384-
combined_time_id2 = models.ForeignKey(MeetingTime, db_column='combined_time_id2', null=True, blank=True, related_name='now5')
384+
combined_time_id2 = BrokenForeignKey(MeetingTime, db_column='combined_time_id2', null=True, blank=True, related_name='now5')
385385
def __str__(self):
386386
return "%s at %s" % (self.acronym(), self.meeting)
387387
def agenda_file(self,interimvar=0):

redesign/importing/import-meetings.py

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,19 @@
1111
from django.core import management
1212
management.setup_environ(settings)
1313

14+
from django.template.defaultfilters import slugify
1415

1516
from ietf.idtracker.models import AreaDirector, IETFWG, Acronym, IRTF
1617
from ietf.meeting.models import *
17-
from ietf.proceedings.models import Meeting as MeetingOld, MeetingVenue, MeetingRoom, NonSession, WgMeetingSession
18+
from ietf.proceedings.models import Meeting as MeetingOld, MeetingVenue, MeetingRoom, NonSession, WgMeetingSession, WgAgenda
1819
from redesign.person.models import *
20+
from redesign.doc.models import Document, DocAlias
1921
from redesign.importing.utils import get_or_create_email, old_person_to_person
22+
from redesign.name.models import *
2023
from redesign.name.utils import name
2124

2225

23-
# imports Meeting, MeetingVenue, MeetingRoom, NonSession, WgMeetingSession
26+
# imports Meeting, MeetingVenue, MeetingRoom, NonSession, WgMeetingSession, WgAgenda
2427

2528
# assumptions:
2629
# - persons have been imported
@@ -46,6 +49,8 @@
4649

4750
conflict_constraint = name(ConstraintName, "conflict", "Conflicts with")
4851

52+
agenda_doctype = name(DocTypeName, "agenda", "Agenda")
53+
4954
system_person = Person.objects.get(name="(System)")
5055
obviously_bogus_date = datetime.date(1970, 1, 1)
5156

@@ -160,7 +165,50 @@ def get_or_create_session_timeslot(meeting_time, room):
160165
"4": 150 * 60,
161166
}
162167

163-
for o in WgMeetingSession.objects.all().order_by("pk"):
168+
def import_materials_for_timeslot(timeslot, session=None, wg_meeting_session=None):
169+
if timeslot:
170+
meeting = timeslot.meeting
171+
materials = timeslot.materials
172+
else:
173+
meeting = session.meeting
174+
materials = session.materials
175+
176+
if wg_meeting_session:
177+
# import agendas
178+
irtf = 0
179+
if wg_meeting_session.irtf:
180+
irtf = wg_meeting_session.group_acronym_id
181+
agendas = WgAgenda.objects.filter(meeting=wg_meeting_session.meeting_id,
182+
group_acronym_id=wg_meeting_session.group_acronym_id,
183+
irtf=irtf)
184+
185+
for o in agendas:
186+
if session:
187+
acronym = session.group.acronym
188+
else:
189+
acronym = os.path.splitext(o.filename)[0].lower()
190+
rev = "01"
191+
name = ("agenda-%s-%s-%s" % (meeting.number, acronym, rev))
192+
193+
try:
194+
d = Document.objects.get(type=agenda_doctype, docalias__name=name)
195+
except Document.DoesNotExist:
196+
d = Document(type=agenda_doctype, name=name)
197+
198+
if session:
199+
session_name = session.group.acronym.upper()
200+
else:
201+
session_name = timeslot.name
202+
d.title = u"Agenda for %s at %s" % (session_name, meeting)
203+
d.external_url = o.filename # save filenames for now as they don't appear to be quite regular
204+
205+
d.save()
206+
207+
DocAlias.objects.get_or_create(document=d, name=name)
208+
209+
materials.add(d)
210+
211+
for o in WgMeetingSession.objects.all().order_by("pk").filter(pk=1699):
164212
# num_session is unfortunately not quite reliable, seems to be
165213
# right for 1 or 2 but not 3 and it's sometimes null
166214
sessions = o.num_session or 1
@@ -169,6 +217,8 @@ def get_or_create_session_timeslot(meeting_time, room):
169217

170218
print "importing WgMeetingSession", o.pk, "subsessions", sessions
171219

220+
print o.sched_time_id1, o.sched_time_id2, o.sched_time_id3
221+
172222
for i in range(1, 1 + sessions):
173223
pk = o.pk + (i - 1) * 10000 # move extra session out of the way
174224
try:
@@ -194,6 +244,7 @@ def get_or_create_session_timeslot(meeting_time, room):
194244
if not s.timeslot:
195245
print "IGNORING unscheduled non-WG-session", acronym.name
196246
continue
247+
197248
if sched_time_id.session_name_id:
198249
s.timeslot.name = sched_time_id.session_name.session_name
199250
else:
@@ -204,6 +255,9 @@ def get_or_create_session_timeslot(meeting_time, room):
204255
else:
205256
s.timeslot.type = other_slot
206257
s.timeslot.save()
258+
259+
import_materials_for_timeslot(s.timeslot, wg_meeting_session=o)
260+
207261
continue
208262

209263
s.group = Group.objects.get(acronym=acronym.acronym)
@@ -227,6 +281,8 @@ def get_or_create_session_timeslot(meeting_time, room):
227281

228282
s.save()
229283

284+
import_materials_for_timeslot(s.timeslot, session=s, wg_meeting_session=o)
285+
230286
conflict = (getattr(o, "conflict%s" % i) or "").replace(",", " ").lower()
231287
conflicting_groups = [g for g in conflict.split() if g]
232288
for target in Group.objects.filter(acronym__in=conflicting_groups):

0 commit comments

Comments
 (0)