diff --git a/ietf/meeting/helpers.py b/ietf/meeting/helpers.py index 53d78f40a..52a224672 100644 --- a/ietf/meeting/helpers.py +++ b/ietf/meeting/helpers.py @@ -1,26 +1,23 @@ # Copyright The IETF Trust 2007, All Rights Reserved -#import models import datetime import os +import pytz + from django.http import Http404 from django.http import HttpRequest from django.db.models import Max, Q from django.conf import settings from django.core.cache import cache from django.utils.cache import get_cache_key +from django.shortcuts import get_object_or_404 import debug -from django.shortcuts import get_object_or_404 from ietf.ietfauth.utils import has_role from ietf.utils.history import find_history_active_at from ietf.doc.models import Document, State - -from ietf.proceedings.models import Meeting as OldMeeting, MeetingTime, IESGHistory, Switches - -# New models from ietf.meeting.models import Meeting from ietf.group.models import Group @@ -37,70 +34,17 @@ def find_ads_for_meeting(meeting): if history and history != g: #print " history[%u]: %s" % (num, history) if history.state_id == "active": - for x in history.rolehistory_set.filter(name="ad").select_related(): + for x in history.rolehistory_set.filter(name="ad").select_related('group', 'person', 'email'): #print "xh[%u]: %s" % (num, x) - ads.append(IESGHistory().from_role(x, meeting_time)) + ads.append(x) else: #print " group[%u]: %s" % (num, g) if g.state_id == "active": - for x in g.role_set.filter(name="ad").select_related('group', 'person'): + for x in g.role_set.filter(name="ad").select_related('group', 'person', 'email'): #print "xg[%u]: %s (#%u)" % (num, x, x.pk) - ads.append(IESGHistory().from_role(x, meeting_time)) + ads.append(x) return ads -def agenda_info(num=None): - try: - if num != None: - meeting = OldMeeting.objects.get(number=num) - else: - meeting = OldMeeting.objects.all().order_by('-date')[:1].get() - except OldMeeting.DoesNotExist: - raise Http404("No meeting information for meeting %s available" % num) - - # now go through the timeslots, only keeping those that are - # sessions/plenary/training and don't occur at the same time - timeslots = [] - time_seen = set() - for t in MeetingTime.objects.filter(meeting=meeting, type__in=("session", "plenary", "other")).order_by("time").select_related(): - if not t.time in time_seen: - time_seen.add(t.time) - timeslots.append(t) - - update = Switches().from_object(meeting) - venue = meeting.meeting_venue - - ads = [] - meeting_time = datetime.datetime.combine(meeting.date, datetime.time(0, 0, 0)) - for g in Group.objects.filter(type="area").order_by("acronym"): - history = find_history_active_at(g, meeting_time) - if history and history != g: - if history.state_id == "active": - ads.extend(IESGHistory().from_role(x, meeting_time) for x in history.rolehistory_set.filter(name="ad").select_related()) - else: - if g.state_id == "active": - ads.extend(IESGHistory().from_role(x, meeting_time) for x in g.role_set.filter(name="ad").select_related('group', 'person')) - - active_agenda = State.objects.get(used=True, type='agenda', slug='active') - plenary_agendas = Document.objects.filter(session__meeting=meeting, session__slots__type="plenary", type="agenda", ).distinct() - plenaryw_agenda = plenaryt_agenda = "The agenda has not been uploaded yet." - for agenda in plenary_agendas: - if active_agenda in agenda.states.all(): - # 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 = "No agenda file found." - - if "tech" in agenda.name.lower(): - plenaryt_agenda = s - else: - plenaryw_agenda = s - - return timeslots, update, meeting, venue, ads, plenaryw_agenda, plenaryt_agenda # get list of all areas, + IRTF + IETF (plenaries). def get_pseudo_areas(): @@ -169,7 +113,7 @@ def get_wg_list(scheduledsessions): def get_meeting(num=None): - if (num == None): + if num == None: meeting = Meeting.objects.filter(type="ietf").order_by("-date")[:1].get() else: meeting = get_object_or_404(Meeting, number=num) @@ -189,6 +133,13 @@ def get_schedule_by_id(meeting, schedid): schedule = get_object_or_404(meeting.schedule_set, id=int(schedid)) return schedule +def meeting_updated(meeting): + ts = max(meeting.timeslot_set.aggregate(Max('modified'))["modified__max"], + meeting.session_set.aggregate(Max('modified'))["modified__max"]) + tz = pytz.timezone(settings.PRODUCTION_TIMEZONE) + ts = tz.localize(ts) + return ts + def agenda_permissions(meeting, schedule, user): # do this in positive logic. cansee = False diff --git a/ietf/meeting/models.py b/ietf/meeting/models.py index 59ae9ab2a..c8e96d9eb 100644 --- a/ietf/meeting/models.py +++ b/ietf/meeting/models.py @@ -1056,7 +1056,7 @@ class Session(models.Model): with open(path) as f: return f.read() else: - "No agenda file found" + return "No agenda file found" else: return "The agenda has not been uploaded yet." diff --git a/ietf/meeting/tests/agenda.py b/ietf/meeting/tests/agenda.py index 7c9316a3c..9d67bf2ab 100644 --- a/ietf/meeting/tests/agenda.py +++ b/ietf/meeting/tests/agenda.py @@ -1,5 +1,5 @@ import sys -from django.test import Client + from ietf.meeting.tests.ttest import AgendaTransactionalTestCase from ietf.utils import TestCase from ietf.name.models import SessionStatusName @@ -26,30 +26,6 @@ class AgendaInfoTestCase(TestCase): s1 = m1.session_set.create(name = "newone", group = g1, requested_by = p1, status = st1) self.assertEqual(s1.__unicode__(), "IETF-83: pkix (unscheduled)[22090]") - def test_AgendaInfo(self): - from ietf.meeting.views import agenda_info - num = '83' - timeslots, update, meeting, venue, ads, plenaryw_agenda, plenaryt_agenda = agenda_info(num) - # I think that "timeslots" here, is unique times, not actually - # the timeslots array itself. - self.assertEqual(len(timeslots),26) - self.assertEqual(meeting.number,'83') - self.assertEqual(venue.meeting_num, "83") - # will change as more ADs are added to fixtures - self.assertEqual(len(ads), 8) - - def test_AgendaInfoReturnsSortedTimeSlots(self): - from ietf.meeting.views import agenda_info - num = '83' - timeslots, update, meeting, venue, ads, plenaryw_agenda, plenaryt_agenda = agenda_info(num) - for slotnum in range(0,len(timeslots)-1): - # debug - #sys.stdout.write("%d: %s vs %d: %s\n" % (timeslots[slotnum].pk, - # timeslots[slotnum].time, - # timeslots[slotnum+1].pk, - # timeslots[slotnum+1].time)) - self.assertTrue(timeslots[slotnum].time < timeslots[slotnum+1].time) - # this tests that a slot at 11:20 AM on Friday, has slot 10 minutes later # after it def test_TimeSlot2408_has_SlotToTheRight(self): @@ -68,17 +44,6 @@ class AgendaInfoTestCase(TestCase): ss2418 = ScheduledSession.objects.get(pk = 2418) self.assertFalse(ss2418.slot_to_the_right) - def test_AgendaInfoNotFound(self): - from django.http import Http404 - from ietf.meeting.views import agenda_info - num = '83b' - try: - timeslots, update, meeting, venue, ads, plenaryw_agenda, plenaryt_agenda = agenda_info(num) - # fail!!! - self.assertFalse(True) - except Http404: - pass - def test_DoNotGetSchedule(self): from django.http import Http404 num = '83' diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index 363ebfc33..538e829c5 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -6,12 +6,12 @@ import re import tarfile import debug import urllib +import json from tempfile import mkstemp from django import forms -from django.shortcuts import render_to_response, get_object_or_404 -from django.utils import simplejson as json +from django.shortcuts import render_to_response, get_object_or_404, redirect from django.http import HttpResponseRedirect, HttpResponse, Http404 from django.core.urlresolvers import reverse from django.db.models import Q @@ -24,44 +24,40 @@ from django.db.models import Max from django.forms.models import modelform_factory from ietf.utils.pipe import pipe -from ietf.doc.models import Document, State -from ietf.idtracker.models import IETFWG, IRTF, Area from ietf.ietfauth.utils import role_required, has_role - -# Old model -- needs to be removed -from ietf.proceedings.models import Meeting as OldMeeting, WgMeetingSession, Proceeding, Switches - -# New models +from ietf.doc.models import Document, State from ietf.person.models import Person -from ietf.meeting.models import TimeSlot, Session, Schedule +from ietf.meeting.models import Meeting, TimeSlot, Session, Schedule from ietf.group.models import Group -from ietf.meeting.helpers import agenda_info from ietf.meeting.helpers import get_areas from ietf.meeting.helpers import build_all_agenda_slices, get_wg_name_list from ietf.meeting.helpers import get_scheduledsessions_from_schedule, get_all_scheduledsessions_from_schedule from ietf.meeting.helpers import get_modified_from_scheduledsessions from ietf.meeting.helpers import get_wg_list, find_ads_for_meeting -from ietf.meeting.helpers import get_meeting, get_schedule, agenda_permissions +from ietf.meeting.helpers import get_meeting, get_schedule, agenda_permissions, meeting_updated @decorator_from_middleware(GZipMiddleware) def materials(request, meeting_num=None): - proceeding = get_object_or_404(Proceeding, meeting_num=meeting_num) - begin_date = proceeding.sub_begin_date - cut_off_date = proceeding.sub_cut_off_date - cor_cut_off_date = proceeding.c_sub_cut_off_date + meeting = get_meeting(meeting_num) + + begin_date = meeting.get_submission_start_date() + cut_off_date = meeting.get_submission_cut_off_date() + cor_cut_off_date = meeting.get_submission_correction_date() now = datetime.date.today() if settings.SERVER_MODE != 'production' and '_testoverride' in request.REQUEST: pass elif now > cor_cut_off_date: - return render_to_response("meeting/materials_upload_closed.html",{'meeting_num':meeting_num,'begin_date':begin_date, 'cut_off_date':cut_off_date, 'cor_cut_off_date':cor_cut_off_date}, context_instance=RequestContext(request)) - sub_began = 0 - if now > begin_date: - sub_began = 1 + return render_to_response("meeting/materials_upload_closed.html", { + 'meeting_num': meeting_num, + 'begin_date': begin_date, + 'cut_off_date': cut_off_date, + 'cor_cut_off_date': cor_cut_off_date + }, context_instance=RequestContext(request)) + #sessions = Session.objects.filter(meeting__number=meeting_num, timeslot__isnull=False) - meeting = get_meeting(meeting_num) - schedule = get_schedule(meeting,None ) - sessions = Session.objects.filter(meeting__number=meeting_num,scheduledsession__schedule=schedule ) + schedule = get_schedule(meeting, None) + sessions = Session.objects.filter(meeting__number=meeting_num, scheduledsession__schedule=schedule) plenaries = sessions.filter(name__icontains='plenary') ietf = sessions.filter(group__parent__type__slug = 'area').exclude(group__acronym='edu') irtf = sessions.filter(group__parent__acronym = 'irtf') @@ -69,18 +65,21 @@ def materials(request, meeting_num=None): iab = sessions.filter(group__parent__acronym = 'iab') cache_version = Document.objects.filter(session__meeting__number=meeting_num).aggregate(Max('time'))["time__max"] - # - return render_to_response("meeting/materials.html", - {'meeting_num':meeting_num, - 'plenaries': plenaries, 'ietf':ietf, 'training':training, 'irtf': irtf, 'iab':iab, - 'begin_date':begin_date, 'cut_off_date':cut_off_date, - 'cor_cut_off_date':cor_cut_off_date,'sub_began':sub_began, - 'cache_version':cache_version}, - context_instance=RequestContext(request)) + return render_to_response("meeting/materials.html", { + 'meeting_num': meeting_num, + 'plenaries': plenaries, 'ietf': ietf, 'training': training, 'irtf': irtf, 'iab': iab, + 'cut_off_date': cut_off_date, + 'cor_cut_off_date': cor_cut_off_date, + 'submission_started': now > begin_date, + 'cache_version': cache_version, + }, context_instance=RequestContext(request)) def current_materials(request): - meeting = OldMeeting.objects.exclude(number__startswith='interim-').order_by('-meeting_num')[0] - return HttpResponseRedirect( reverse(materials, args=[meeting.meeting_num]) ) + meetings = Meeting.objects.exclude(number__startswith='interim-').order_by('-number') + if meetings: + return redirect(materials, meetings[0].number) + else: + raise Http404 def get_user_agent(request): if settings.SERVER_MODE != 'production' and '_testiphone' in request.REQUEST: @@ -231,9 +230,9 @@ def edit_agenda(request, num=None, schedule_name=None): saveasurl=reverse(edit_agenda, args=[meeting.number, schedule.name]) - cansee,canedit = agenda_permissions(meeting, schedule, user) + can_see, can_edit = agenda_permissions(meeting, schedule, user) - if not cansee: + if not can_see: #sys.stdout.write("visible: %s public: %s owner: %s request from: %s\n" % ( # schedule.visible, schedule.public, schedule.owner, requestor)) return HttpResponse(render_to_string("meeting/private_agenda.html", @@ -338,7 +337,7 @@ def agenda(request, num=None, name=None, base=None, ext=None): mimetype = {".html":"text/html", ".txt": "text/plain", ".ics":"text/calendar", ".csv":"text/csv"} meeting = get_meeting(num) schedule = get_schedule(meeting, name) - updated = Switches().from_object(meeting).updated() + updated = meeting_updated(meeting) return HttpResponse(render_to_string("meeting/"+base+ext, {"schedule":schedule, "updated": updated}, RequestContext(request)), mimetype=mimetype[ext]) @@ -536,7 +535,7 @@ def week_view(request, num=None): def ical_agenda(request, num=None, name=None, ext=None): meeting = get_meeting(num) schedule = get_schedule(meeting, name) - updated = Switches().from_object(meeting).updated() + updated = meeting_updated(meeting) q = request.META.get('QUERY_STRING','') or "" filter = set(urllib.unquote(q).lower().split(',')) diff --git a/ietf/secr/proceedings/proc_utils.py b/ietf/secr/proceedings/proc_utils.py index ea2e69e2c..cd47e52bc 100644 --- a/ietf/secr/proceedings/proc_utils.py +++ b/ietf/secr/proceedings/proc_utils.py @@ -8,7 +8,6 @@ from django.shortcuts import render_to_response from ietf.group.models import Group, Role from ietf.group.utils import get_charter_text from ietf.meeting.models import Session, TimeSlot, Meeting -from ietf.meeting.views import agenda_info from ietf.doc.models import Document, RelatedDocument, DocEvent from itertools import chain from ietf.secr.proceedings.models import Registration @@ -374,7 +373,6 @@ def gen_acknowledgement(context): def gen_agenda(context): meeting = context['meeting'] - #timeslots, update, meeting, venue, ads, plenaryw_agenda, plenaryt_agenda = agenda_info(meeting.number) timeslots = TimeSlot.objects.filter(meeting=meeting) # sort by area:group then time diff --git a/ietf/templates/meeting/landscape_edit.html b/ietf/templates/meeting/landscape_edit.html index b05acf2be..ea2a42cbf 100644 --- a/ietf/templates/meeting/landscape_edit.html +++ b/ietf/templates/meeting/landscape_edit.html @@ -57,10 +57,10 @@ function setup_slots(){ {% endfor %} {% for ad in area_directors %} -area_directors["{{ad.area}}"] = []; +area_directors["{{ad.group.acronym}}"] = []; {% endfor %} {% for ad in area_directors %} -area_directors["{{ad.area}}"].push(find_person_by_href("{{ad.defurl}}")); +area_directors["{{ad.group.acronym}}"].push(find_person_by_href("{{ad.person.defurl}}")); {% endfor %} {% autoescape off %} diff --git a/ietf/templates/meeting/materials.html b/ietf/templates/meeting/materials.html index 24f75aa92..ef9f6eb9b 100644 --- a/ietf/templates/meeting/materials.html +++ b/ietf/templates/meeting/materials.html @@ -10,7 +10,7 @@ table.ietf-materials td { padding:0.5em 0; } {% block content %}

IETF {{ meeting_num }} Meeting Materials

-{% if sub_began %} +{% if submission_started %}

Submission cutoff date: {{ cut_off_date|date:"F j, Y" }}
Corrections to submissions cutoff date: {{ cor_cut_off_date|date:"F j, Y" }}

{% endif %}