diff --git a/ietf/meeting/helpers.py b/ietf/meeting/helpers.py index b3779d0a9..0d0531411 100644 --- a/ietf/meeting/helpers.py +++ b/ietf/meeting/helpers.py @@ -3,12 +3,7 @@ #import models import datetime import os -import re -import tarfile -from tempfile import mkstemp - -from django import forms from django.http import Http404 from django.http import HttpRequest from django.db.models import Max, Q @@ -17,10 +12,8 @@ from django.core.cache import cache from django.utils.cache import get_cache_key import debug -import urllib from django.shortcuts import get_object_or_404 -from ietf.idtracker.models import InternetDraft from ietf.ietfauth.decorators import has_role from ietf.utils.history import find_history_active_at from ietf.doc.models import Document, State @@ -28,125 +21,9 @@ 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, TimeSlot, Session -from ietf.meeting.models import Schedule, ScheduledSession +from ietf.meeting.models import Meeting from ietf.group.models import Group -class NamedTimeSlot(object): - """ - this encapsulates a TimeSlot with a Schedule, so that - specific time slots can be returned as appropriate. It proxies - most things to TimeSlot. Agenda_info returns an array of these - objects rather than actual Time Slots, as the templates do not - permit multiple parameters to be passed into a relation. - This may be irrelevant with Django 1.3+, given with argument extension - to templating language. - """ - def __init__(self, agenda, timeslot): - self.agenda = agenda - self.timeslot = timeslot - - def scheduledsessions(self): - self.timeslot.scheduledsessions_set.filter(schedule=self.agenda, session__isnull=False) - - @property - def time(self): - return self.timeslot.time - - @property - def meeting_date(self): - return self.timeslot.meeting_date - - @property - def reg_info(self): - return self.timeslot.reg_info - - @property - def registration(self): - return self.timeslot.registration - - @property - def session_name(self): - return self.timeslot.session_name - - @property - def break_info(self): - return self.timeslot.break_info - - @property - def time_desc(self): - return self.timeslot.time_desc - - @property - def is_plenary(self): - return self.timeslot.is_plenary - - def is_plenaryw(self): - return self.timeslot.is_plenary_type("opsplenary") - - def is_plenaryt(self): - return self.timeslot.is_plenary_type("techplenary") - - @property - def tzname(self): - return self.timeslot.tzname - - @property - def room_name(self): - if self.timeslot: - if self.timeslot.location: - return self.timeslot.location.name - else: - return "no room set for plenary %u" % (self.timeslot.pk) - else: - return "bogus NamedTimeSlot" - - @property - def sessions(self): - return [ ss.session for ss in self.timeslot.scheduledsession_set.filter(schedule=self.agenda, schedule__isnull=False) ] - - @property - def scheduledsessions_at_same_time(self): - if not hasattr(self, "sessions_at_same_time_cache"): - self.sessions_at_same_time_cache = self.timeslot.scheduledsessions_at_same_time(self.agenda) - return self.sessions_at_same_time_cache - - @property - def scheduledsessions(self): - return self.timeslot.scheduledsession_set.filter(schedule=self.agenda) - - @property - def scheduledsessions_by_area(self): - things = self.scheduledsessions_at_same_time - if things is not None: - return [ {"area":ss.area+ss.acronym_name, "info":ss} for ss in things ] - else: - return [ ] - - @property - def slot_decor(self): - return self.timeslot.slot_decor - -def get_ntimeslots_from_ss(agenda, scheduledsessions): - ntimeslots = [] - time_seen = set() - - for ss in scheduledsessions: - t = ss.timeslot - if not t.time in time_seen: - time_seen.add(t.time) - ntimeslots.append(NamedTimeSlot(agenda, t)) - time_seen = None - - return ntimeslots - -def get_ntimeslots_from_agenda(agenda): - # now go through the timeslots, only keeping those that are - # sessions/plenary/training and don't occur at the same time - scheduledsessions = agenda.scheduledsession_set.all().order_by("timeslot__time").exclude(timeslot__type = "unavail") - ntimeslots = get_ntimeslots_from_ss(agenda, scheduledsessions) - return ntimeslots, scheduledsessions - def find_ads_for_meeting(meeting): ads = [] meeting_time = datetime.datetime.combine(meeting.date, datetime.time(0, 0, 0)) @@ -249,7 +126,6 @@ def build_all_agenda_slices(scheduledsessions, all = False): time_slices = [] date_slices = {} - ids = [] for ss in scheduledsessions: if(all or ss.session != None):# and len(ss.timeslot.session.agenda_note)>1): ymd = ss.timeslot.time.date() diff --git a/ietf/meeting/models.py b/ietf/meeting/models.py index 46f36cd54..aaa34776c 100644 --- a/ietf/meeting/models.py +++ b/ietf/meeting/models.py @@ -14,7 +14,6 @@ from timedeltafield import TimedeltaField # mostly used by json_dict() from django.template.defaultfilters import slugify, date as date_format, time as time_format -from django.utils import formats from ietf.group.models import Group from ietf.person.models import Person @@ -38,11 +37,6 @@ def fmt_date(o): d = datetime_safe.new_date(o) return d.strftime(DATE_FORMAT) -def fmt_datetime(o): - d = datetime_safe.new_date(o) - return d.strftime("%s %s" % (DATE_FORMAT, TIME_FORMAT)) - - class Meeting(models.Model): # number is either the number for IETF meetings, or some other # identifier for interim meetings/IESG retreats/liaison summits/... @@ -116,10 +110,6 @@ class Meeting(models.Model): return qs[0] return None - @property - def sessions_that_wont_meet(self): - return self.session_set.filter(status__slug='notmeet') - @property def sessions_that_can_meet(self): return self.session_set.exclude(status__slug='notmeet').exclude(status__slug='disappr').exclude(status__slug='deleted').exclude(status__slug='apprw') @@ -159,7 +149,6 @@ class Meeting(models.Model): time_slices = {} # the times on each day slots = {} - ids = [] for ts in self.timeslot_set.all(): if ts.location is None: continue @@ -290,16 +279,6 @@ class TimeSlot(models.Model): self._reg_info = None return self._reg_info - def reg_info(self): - return (self.registration() is not None) - - def break_info(self): - breaks = self.__class__.objects.filter(meeting=self.meeting, time__month=self.time.month, time__day=self.time.day, type="break").order_by("time") - for brk in breaks: - if brk.time_desc[-4:] == self.time_desc[:4]: - return brk - return None - def __unicode__(self): location = self.get_location() if not location: @@ -319,6 +298,7 @@ class TimeSlot(models.Model): if not self.show_location: location = "" return location + @property def tz(self): if self.meeting.time_zone: @@ -343,30 +323,6 @@ class TimeSlot(models.Model): else: return None - def session_name(self): - if self.type_id not in ("session", "plenary"): - return None - - class Dummy(object): - def __unicode__(self): - return self.session_name - d = Dummy() - d.session_name = self.name - return d - - def session_for_schedule(self, schedule): - ss = scheduledsession_set.filter(schedule=schedule).all()[0] - if ss: - return ss.session - else: - return None - - def scheduledsessions_at_same_time(self, agenda=None): - if agenda is None: - agenda = self.meeting.agenda - - return agenda.scheduledsession_set.filter(timeslot__time=self.time, timeslot__type__in=("session", "plenary", "other")) - @property def js_identifier(self): # this returns a unique identifier that is js happy. @@ -375,25 +331,6 @@ class TimeSlot(models.Model): # {{r|slugify}}_{{day}}_{{slot.0|date:'Hi'}} return "%s_%s_%s" % (slugify(self.get_location()), self.time.strftime('%Y-%m-%d'), self.time.strftime('%H%M')) - - @property - def is_plenary(self): - return self.type_id == "plenary" - - def is_plenary_type(self, name, agenda=None): - return self.type_id == "plenary" and self.sessions.all()[0].short == name - - @property - def slot_decor(self): - if self.type_id == "plenary": - return "plenary"; - elif self.type_id == "session": - return "session"; - elif self.type_id == "non-session": - return "non-session"; - else: - return "reserved"; - def json_dict(self, selfurl): ts = dict() ts['timeslot_id'] = self.id @@ -558,10 +495,6 @@ class Schedule(models.Model): def qs_scheduledsessions_with_assignments(self): return self.scheduledsession_set.filter(session__isnull=False) - @property - def qs_scheduledsessions_without_assignments(self): - return self.scheduledsession_set.filter(session__isnull=True) - @property def group_mapping(self): assignments,sessions,total,scheduled = self.group_session_mapping @@ -586,12 +519,6 @@ class Schedule(models.Model): scheduled =+ 1 return assignments,sessions,total,scheduled - # calculate badness of entire schedule - def calc_badness(self): - # now calculate badness - assignments = self.group_mapping - return self.calc_badness1(assignments) - cached_sessions_that_can_meet = None @property def sessions_that_can_meet(self): @@ -599,14 +526,6 @@ class Schedule(models.Model): self.cached_sessions_that_can_meet = self.meeting.sessions_that_can_meet.all() return self.cached_sessions_that_can_meet - # calculate badness of entire schedule - def calc_badness1(self, assignments): - badness = 0 - for sess in self.sessions_that_can_meet: - badness += sess.badness(assignments) - self.badness = badness - return badness - def area_list(self): return ( self.assignments.filter(session__group__type__slug__in=['wg', 'rg', 'ag'], session__group__parent__isnull=False) @@ -645,10 +564,6 @@ class ScheduledSession(models.Model): def room_name(self): return self.timeslot.location.name - @property - def special_agenda_note(self): - return self.session.agenda_note if self.session else "" - @property def acronym(self): if self.session and self.session.group: @@ -662,23 +577,6 @@ class ScheduledSession(models.Model): else: return None - @property - def acronym_name(self): - if not self.session: - return self.notes - if hasattr(self, "interim"): - return self.session.group.name + " (interim)" - elif self.session.name: - return self.session.name - else: - return self.session.group.name - - @property - def session_name(self): - if self.timeslot.type_id not in ("session", "plenary"): - return None - return self.timeslot.name - @property def area(self): if not self.session or not self.session.group: @@ -691,31 +589,6 @@ class ScheduledSession(models.Model): return "" return self.session.group.parent.acronym -# def break_info(self): -# breaks = self.schedule.scheduledsessions_set.filter(timeslot__time__month=self.timeslot.time.month, timeslot__time__day=self.timeslot.time.day, timeslot__type="break").order_by("timeslot__time") -# now = self.timeslot.time_desc[:4] -# for brk in breaks: -# if brk.time_desc[-4:] == now: -# return brk -# return None - - @property - def area_name(self): - if self.timeslot.type_id == "plenary": - return "Plenary Sessions" - elif self.session and self.session.group and self.session.group.acronym == "edu": - return "Training" - elif not self.session or not self.session.group or not self.session.group.parent or not self.session.group.parent.type_id == "area": - return "" - return self.session.group.parent.name - - @property - def isWG(self): - if not self.session or not self.session.group: - return False - if self.session.group.type_id == "wg" and self.session.group.state_id != "bof": - return True - @property def group_type_str(self): if not self.session or not self.session.group: @@ -982,12 +855,12 @@ class Session(models.Model): return sess1 def badness_test(self, num): - import sys from settings import BADNESS_CALC_LOG #sys.stdout.write("num: %u / BAD: %u\n" % (num, BADNESS_CALC_LOG)) return BADNESS_CALC_LOG >= num def badness_log(self, num, msg): + import sys if self.badness_test(num): sys.stdout.write(msg) @@ -1013,7 +886,6 @@ class Session(models.Model): if self.badness_test(2): self.badness_log(2, "badgroup: %s badness calculation has %u constraints\n" % (self.group.acronym, len(conflicts))) - import sys from settings import BADNESS_UNPLACED, BADNESS_TOOSMALL_50, BADNESS_TOOSMALL_100, BADNESS_TOOBIG, BADNESS_MUCHTOOBIG count = 0 myss_list = assignments[self.group] diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index ccac6e02d..f69b39818 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -2,7 +2,6 @@ #import models import datetime -import sys import os import re import tarfile @@ -23,7 +22,6 @@ from django.utils.decorators import decorator_from_middleware from ietf.ietfauth.decorators import group_required, has_role from django.middleware.gzip import GZipMiddleware from django.db.models import Max -from ietf.group.colors import fg_group_colors, bg_group_colors from django.forms.models import modelform_factory import debug @@ -33,17 +31,15 @@ from ietf.utils.pipe import pipe from ietf.doc.models import Document, State # Old model -- needs to be removed -from ietf.proceedings.models import Meeting as OldMeeting, WgMeetingSession, MeetingVenue, IESGHistory, Proceeding, Switches +from ietf.proceedings.models import Meeting as OldMeeting, WgMeetingSession, Proceeding, Switches # New models from ietf.person.models import Person -from ietf.meeting.models import Meeting, TimeSlot, Session -from ietf.meeting.models import Schedule, ScheduledSession, Room +from ietf.meeting.models import TimeSlot, Session, Schedule from ietf.group.models import Group -from ietf.meeting.helpers import NamedTimeSlot, get_ntimeslots_from_ss -from ietf.meeting.helpers import get_ntimeslots_from_agenda, agenda_info -from ietf.meeting.helpers import get_areas, get_area_list_from_sessions, get_pseudo_areas +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 @@ -91,56 +87,6 @@ def current_materials(request): meeting = OldMeeting.objects.exclude(number__startswith='interim-').order_by('-meeting_num')[0] return HttpResponseRedirect( reverse(materials, args=[meeting.meeting_num]) ) -def get_plenary_agenda(meeting_num, id): - try: - plenary_agenda_file = settings.AGENDA_PATH + WgMeetingSession.objects.get(meeting=meeting_num,group_acronym_id=id).agenda_file() - try: - f = open(plenary_agenda_file) - plenary_agenda = f.read() - f.close() - return plenary_agenda - except IOError: - return "THE AGENDA HAS NOT BEEN UPLOADED YET" - except WgMeetingSession.DoesNotExist: - return "The Plenary has not been scheduled" - -########################################################################################################################## -## dispatch based upon request type. -def agenda_html_request(request,num=None, schedule_name=None): - if request.method == 'POST': - return agenda_create(request, num, schedule_name) - else: - # GET and HEAD. - return html_agenda(request, num, schedule_name) - -def legacy_get_agenda_info(request, num=None, schedule=None): - meeting = get_meeting(num) - timeslots = TimeSlot.objects.filter(Q(meeting__id = meeting.id)).exclude(type__slug='unavail').order_by('time','name') - modified = timeslots.aggregate(Max('modified'))['modified__max'] - - area_list = list(set([ session.group.parent.acronym for session in [ timeslot.session for timeslot in timeslots.filter(type = 'Session', sessions__group__parent__isnull = False, scheduledsession__schedule=schedule).order_by('sessions__group__parent__acronym').distinct() if timeslot.session ] ])) - area_list.sort() - -# wg_name_list = timeslots.filter(type = 'Session', sessions__group__isnull = False, sessions__group__parent__isnull = False, scheduledsession__schedule=schedule).order_by('sessions__group__acronym').distinct('sessions__group')#.values_list('sessions__group__acronym',flat=True) - wg_name_list = list(set([ session.group.acronym for session in [ timeslot.session for timeslot in timeslots.filter(type = 'Session', sessions__group__parent__isnull = False, scheduledsession__schedule=schedule).order_by('sessions__group__acronym').distinct() if timeslot.session ] ])) - - wg_list = Group.objects.filter(acronym__in = set(wg_name_list)).order_by('parent__acronym','acronym') - - return timeslots, modified, meeting, area_list, wg_list - -def get_agenda_info(request, num=None, schedule_name=None): - meeting = get_meeting(num) - schedule = get_schedule(meeting, schedule_name) - scheduledsessions = get_scheduledsessions_from_schedule(schedule) - modified = get_modified_from_scheduledsessions(scheduledsessions) - - area_list = get_areas() - wg_list = get_wg_list(scheduledsessions) - time_slices,date_slices = build_all_agenda_slices(scheduledsessions, False) - rooms = meeting.room_set - - return scheduledsessions, schedule, modified, meeting, area_list, wg_list, time_slices, date_slices, rooms - def mobile_user_agent_detect(request): if settings.SERVER_MODE != 'production' and '_testiphone' in request.REQUEST: user_agent = "iPhone" @@ -152,28 +98,6 @@ def mobile_user_agent_detect(request): user_agent = "" return user_agent -@decorator_from_middleware(GZipMiddleware) -def html_agenda_1(request, num, schedule_name, template_version="meeting/agenda.html"): - user_agent = mobile_user_agent_detect(request) - if "iPhone" in user_agent: - return iphone_agenda(request, num, schedule_name) - - meeting = get_meeting(num) - schedule = get_schedule(meeting, schedule_name) - - timeslots, modified, meeting, area_list, wg_list = legacy_get_agenda_info(request, num, schedule) - return HttpResponse(render_to_string(template_version, - {"timeslots":timeslots, "modified": modified, "meeting":meeting, - "area_list": area_list, "wg_list": wg_list , - "show_inline": set(["txt","htm","html"]) }, - RequestContext(request)), mimetype="text/html") - -def html_agenda(request, num=None, schedule_name=None): - return html_agenda_1(request, num, schedule_name, "meeting/agenda.html") - -def html_agenda_utc(request, num=None, schedule_name=None): - return html_agenda_1(request, num, schedule_name, "meeting/agenda_utc.html") - class SaveAsForm(forms.Form): savename = forms.CharField(max_length=100) @@ -334,8 +258,6 @@ def edit_agenda(request, num=None, schedule_name=None): # get_modified_from needs the query set, not the list modified = get_modified_from_scheduledsessions(scheduledsessions) - ntimeslots = get_ntimeslots_from_ss(schedule, scheduledsessions) - area_list = get_areas() wg_name_list = get_wg_name_list(scheduledsessions) wg_list = get_wg_list(wg_name_list) @@ -675,20 +597,6 @@ def ical_agenda(request, num=None, name=None, ext=None): {"schedule":schedule, "assignments":assignments, "updated":updated}, RequestContext(request)), mimetype="text/calendar") -def csv_agenda(request, num=None, name=None): - timeslots, update, meeting, venue, ads, plenaryw_agenda, plenaryt_agenda = agenda_info(num) - #wgs = IETFWG.objects.filter(status=IETFWG.ACTIVE).order_by('group_acronym__acronym') - #rgs = IRTF.objects.all().order_by('acronym') - #areas = Area.objects.filter(status=Area.ACTIVE).order_by('area_acronym__acronym') - - # we should really use the Python csv module or something similar - # rather than a template file which is one big mess - - return HttpResponse(render_to_string("meeting/agenda.csv", - {"timeslots":timeslots, "update":update, "meeting":meeting, "venue":venue, "ads":ads, - "plenaryw_agenda":plenaryw_agenda, "plenaryt_agenda":plenaryt_agenda, }, - RequestContext(request)), mimetype="text/csv") - def meeting_requests(request, num=None) : meeting = get_meeting(num) sessions = Session.objects.filter(meeting__number=meeting.number,group__parent__isnull = False).exclude(requested_by=0).order_by("group__parent__acronym","status__slug","group__acronym")