Import WG agendas, proxy more meeting code
- Legacy-Id: 3289
This commit is contained in:
parent
974877aafb
commit
d2ea0e5088
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in a new issue