diff --git a/.editorconfig b/.editorconfig index 11e80fa69..423b09c43 100644 --- a/.editorconfig +++ b/.editorconfig @@ -11,7 +11,7 @@ root = true [*] indent_size = 4 charset = utf-8 -trim_trailing_whitespace = true +trim_trailing_whitespace = false insert_final_newline = true # Specializations below *add to* the above defaults diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index a3b44fc04..6f3f410ae 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -438,18 +438,6 @@ class MeetingTests(BaseMeetingTestCase): r = self.client.get(url) self.assertFalse(any([x in unicontent(r) for x in ['IESG Breakfast','Breakfast Room']])) - def test_agenda_room_view(self): - meeting = make_meeting_test_data() - url = urlreverse("ietf.meeting.views.room_view",kwargs=dict(num=meeting.number)) - login_testing_unauthorized(self,"secretary",url) - r = self.client.get(url) - self.assertEqual(r.status_code,200) - self.assertTrue(all([x in unicontent(r) for x in ['mars','IESG Breakfast','Test Room','Breakfast Room']])) - url = urlreverse("ietf.meeting.views.room_view",kwargs=dict(num=meeting.number,name=meeting.unofficial_schedule.name,owner=meeting.unofficial_schedule.owner.email())) - r = self.client.get(url) - self.assertTrue(all([x in unicontent(r) for x in ['mars','Test Room','Breakfast Room']])) - self.assertNotContains(r, 'IESG Breakfast') - def test_agenda_week_view(self): meeting = make_meeting_test_data() diff --git a/ietf/meeting/urls.py b/ietf/meeting/urls.py index 60f8ba8d8..17dd0fc0c 100644 --- a/ietf/meeting/urls.py +++ b/ietf/meeting/urls.py @@ -34,7 +34,6 @@ type_ietf_only_patterns = [ url(r'^agenda/%(owner)s/%(schedule_name)s/make_official$' % settings.URL_REGEXPS, views.make_schedule_official), url(r'^agenda/%(owner)s/%(schedule_name)s(\.(?P.html))?/?$' % settings.URL_REGEXPS, views.agenda), url(r'^agenda/%(owner)s/%(schedule_name)s/week-view(?:.html)?/?$' % settings.URL_REGEXPS, views.week_view), - url(r'^agenda/%(owner)s/%(schedule_name)s/room-view(?:.html)?/?$' % settings.URL_REGEXPS, views.room_view), url(r'^agenda/%(owner)s/%(schedule_name)s/by-room/?$' % settings.URL_REGEXPS, views.agenda_by_room), url(r'^agenda/%(owner)s/%(schedule_name)s/by-type/?$' % settings.URL_REGEXPS, views.agenda_by_type), url(r'^agenda/%(owner)s/%(schedule_name)s/by-type/(?P[a-z]+)$' % settings.URL_REGEXPS, views.agenda_by_type), @@ -77,11 +76,9 @@ type_ietf_only_patterns_id_optional = [ url(r'^agenda\.ics$', views.agenda_ical), url(r'^agenda.json$', views.agenda_json), url(r'^agenda/week-view(?:.html)?/?$', views.week_view), - url(r'^agenda/room-view(?:.html)?/?$', views.room_view), url(r'^floor-plan/?$', views.floor_plan), url(r'^floor-plan/(?P[-a-z0-9_]+)/?$', views.floor_plan), url(r'^week-view(?:.html)?/?$', views.week_view), - url(r'^room-view(?:.html)?/?$', views.room_view), url(r'^materials(?:.html)?/?$', views.materials), url(r'^request_minutes/?$', views.request_minutes), url(r'^materials/%(document)s((?P\.[a-z0-9]+)|/)?$' % settings.URL_REGEXPS, views.materials_document), diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index 408b6a29c..692197963 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -32,7 +32,7 @@ from django.contrib.auth.decorators import login_required from django.core.exceptions import ValidationError from django.core.validators import URLValidator from django.urls import reverse,reverse_lazy -from django.db.models import F, Min, Max, Q +from django.db.models import F, Max, Q from django.forms.models import modelform_factory, inlineformset_factory from django.template import TemplateDoesNotExist from django.template.loader import render_to_string @@ -1906,69 +1906,6 @@ def week_view(request, num=None, name=None, owner=None): "items": json.dumps(items), }) -@role_required('Area Director','Secretariat','IAB') -def room_view(request, num=None, name=None, owner=None): - meeting = get_meeting(num) - - rooms = meeting.room_set.order_by('functional_name','name') - if not rooms.exists(): - return HttpResponse("No rooms defined yet") - - if name is None: - schedule = get_schedule(meeting) - else: - person = get_person_by_email(owner) - schedule = get_schedule_by_name(meeting, person, name) - - assignments = SchedTimeSessAssignment.objects.filter( - schedule__in=[schedule, schedule.base if schedule else None] - ).prefetch_related( - 'timeslot', 'timeslot__location', 'session', 'session__group', 'session__group__parent' - ) - unavailable = meeting.timeslot_set.filter(type__slug='unavail') - if not (assignments.exists() or unavailable.exists()): - return HttpResponse("No sessions/timeslots available yet") - - earliest = None - latest = None - - if assignments: - earliest = assignments.aggregate(Min('timeslot__time'))['timeslot__time__min'] - latest = assignments.aggregate(Max('timeslot__time'))['timeslot__time__max'] - - if unavailable: - earliest_unavailable = unavailable.aggregate(Min('time'))['time__min'] - if not earliest or ( earliest_unavailable and earliest_unavailable < earliest ): - earliest = earliest_unavailable - latest_unavailable = unavailable.aggregate(Max('time'))['time__max'] - if not latest or ( latest_unavailable and latest_unavailable > latest ): - latest = latest_unavailable - - if not (earliest and latest): - raise Http404 - - base_time = earliest - base_day = datetime.datetime(base_time.year,base_time.month,base_time.day) - - day = base_day - days = [] - while day <= latest : - days.append(day) - day += datetime.timedelta(days=1) - - unavailable = list(unavailable) - for t in unavailable: - t.delta_from_beginning = (t.time - base_time).total_seconds() - t.day = (t.time-base_day).days - - assignments = list(assignments) - for ss in assignments: - ss.delta_from_beginning = (ss.timeslot.time - base_time).total_seconds() - ss.day = (ss.timeslot.time-base_day).days - - template = "meeting/room-view.html" - return render(request, template,{"meeting":meeting,"schedule":schedule,"unavailable":unavailable,"assignments":assignments,"rooms":rooms,"days":days}) - def ical_session_status(assignment): if assignment.session.current_status == 'canceled': return "CANCELLED" diff --git a/ietf/static/js/room-view.js b/ietf/static/js/room-view.js deleted file mode 100644 index 1a20a7b8c..000000000 --- a/ietf/static/js/room-view.js +++ /dev/null @@ -1,514 +0,0 @@ -var start_map = items.map(function (el, i) { - return { room_index: el.room_index, start_time: el.delta_from_beginning, index: i }; -}); -start_map.sort(function (a, b) { - if (a.room_index != b.room_index) { - return (a.room_index - b.room_index); - } - return a.start_time - b.start_time; -}); - -var end_map = items.map(function (el, i) { - return { room_index: el.room_index, end_time: el.delta_from_beginning + el.duration, index: i }; -}); -end_map.sort(function (a, b) { - if (a.room_index != b.room_index) { - return (a.room_index - b.room_index); - } - return a.end_time - b.end_time; -}); - -var si = 0; -var ei = 0; -var overlap = 0; -var max_lanes = 0; -var next_lane = []; - -var start_overlap = si; -while (si < items.length) { - var start_room_change = false; - while (!start_room_change && si < items.length && start_map[si].start_time < end_map[ei].end_time) { - overlap++; - if (next_lane.length > 0) { - items[start_map[si].index].lane = next_lane.shift(); - } else { - items[start_map[si].index].lane = max_lanes; - max_lanes++; - } - start_room_change = (si + 1 == items.length || start_map[si].room_index != start_map[si + 1].room_index); - si++; - } - var end_room_change = false; - while (ei < items.length && !end_room_change && (start_room_change || si == items.length || start_map[si].start_time >= end_map[ei].end_time)) { - next_lane.push(items[end_map[ei].index].lane); - overlap--; - end_room_change = (ei + 1 == items.length || end_map[ei].room_index != end_map[ei + 1].room_index); - ei++; - } - if (overlap == 0) { - for (var i = start_overlap; i < si; i++) { - items[start_map[i].index].lanes = max_lanes; - } - max_lanes = 0; - next_lane = []; - start_overlap = si; - } -} - -var fg = { - app: "#008", - art: "#808", - gen: "#080", - int: "#088", - ops: "#800", - rai: "#808", - rtg: "#880", - sec: "#488", - tsv: "#484", - irtf: "#448", - break: "#000" -}; - -var bg = { - app: "#eef", - art: "#fef", - gen: "#efe", - int: "#eff", - ops: "#fee", - rai: "#fef", - rtg: "#ffe", - sec: "#dff", - tsv: "#dfd", - irtf: "#ddf", - break: "#fff" -}; - -var divlist = []; - -var lastfrag; -var lastheight; -var lastwidth; - -var padding = 2; -var border = 1; - -setInterval(animate, 50); - -window.draw_calendar = function () { - window.setTimeout(draw_calendar, 1000); - - var width = $('#mtgheader') - .width(); - var offset = $('#mtgheader') - .offset() - .left; - var height = document.body.clientHeight; - - if (lastheight == height && - lastwidth == width && - lastfrag == window.location.hash) { - return; - } - - var i; - - var day_start = 23 * 60 + 59; - var day_end = 0; - - /* Find our boundaries */ - for (i = 0; i < items.length; i++) { - { - var start_time = parseInt(items[i].time.substr(0, 2), 10) * 60 + - parseInt(items[i].time.substr(2, 2), 10); - var end_time = start_time + (items[i].duration / 60); - - if (start_time < day_start) { day_start = start_time; } - if (end_time > day_end) { day_end = end_time; } - } - } - - var timelabel_width = width * 0.020; - var header_height = height * 0.05; - var header_offset = $('#daytabs') - .outerHeight(true) + $('#mtgheader') - .outerHeight(true); - - var num_minutes = day_end - day_start; - var minute_height = (height - header_height - header_offset) / num_minutes; - - var daydiv; - for (i = 0; i < num_days; i++) { - daydiv = document.getElementById("day" + i); - while (daydiv.childNodes.length) { daydiv.removeChild(daydiv.childNodes[0]); } - } - - var room_width = (width - timelabel_width) / (rooms_count ? rooms_count : 1); - for (var day = 0; day < num_days; day++) { - for (var ri = 0; ri < room_names.length; ri++) { - var e = document.createElement("div"); - - e.style.border = "solid"; - e.style.borderWidth = border + "px"; - - e.style.background = "#2647f0"; - e.style.color = "#fff"; - e.style.borderColor = "#000 #fff"; - e.style.borderColor = "#2647f0 #2647f0 #000 #2647f0"; - - e.style.display = "block"; - e.style.overflow = "hidden"; - e.style.position = "absolute"; - - e.style.top = header_offset + "px"; - e.style.left = (offset + timelabel_width + ri * room_width) + "px"; - e.style.width = room_width + "px"; - e.style.height = header_height + "px"; - - e.style.margin = 0 + "px"; - e.style.padding = padding + "px"; - e.style.fontFamily = "sans-serif"; - e.style.fontSize = (header_height * 0.25) + "px"; - - e.style.textAlign = "center"; - - var div = document.createElement("div"); - div.appendChild(document.createTextNode(room_names[ri])); - if (room_functional_names[ri].length > 0) { - div.appendChild(document.createElement("br")); - div.appendChild(document.createTextNode(room_functional_names[ri])); - } - if (room_typelabels[ri].length > 0) { - div.title = room_names[ri] + "\n" + room_functional_names[ri] + "\n" + room_typelabels[ri]; - } - e.appendChild(div); - document.getElementById("day" + day) - .appendChild(e); - - //----------------------------------------------------------------- - // Draw column border - //----------------------------------------------------------------- - e = document.createElement("div"); - - e.style.border = "solid"; - e.style.borderWidth = border + "px"; - - e.style.color = "#000"; - e.style.borderColor = "#fff #000"; - - e.style.display = "block"; - e.style.overflow = "hidden"; - e.style.position = "absolute"; - - e.style.top = (header_height + header_offset) + "px"; - e.style.left = (offset + timelabel_width + ri * room_width) + "px"; - e.style.width = room_width + "px"; - e.style.height = (height - header_height - header_offset) + "px"; - - e.style.margin = 0 + "px"; - e.style.padding = padding + "px"; - - document.getElementById("day" + day) - .appendChild(e); - - } - - //----------------------------------------------------------------- - // Draw hour lines - //----------------------------------------------------------------- - for (var time = day_start - (day_start % 60) + 60; time < day_end; time += 60) { - e = document.createElement("div"); - e.style.borderTopStyle = "solid"; - e.style.boderTopWidth = "2px"; - e.style.borderColor = "#f8f8f8"; - e.style.overflow = "hidden"; - e.style.position = "absolute"; - e.style.top = (header_height + header_offset + (time - day_start) * minute_height) + "px"; - e.style.left = (offset + timelabel_width) + "px"; - e.style.width = (width - timelabel_width) + "px"; - e.style.height = 0 + "px"; - e.style.zIndex = "-1"; - e.style.margin = 0 + "px"; - e.style.padding = padding + "px"; - document.getElementById("day" + day) - .appendChild(e); - - e = document.createElement("div"); - e.style.overflow = "hidden"; - e.style.position = "absolute"; - e.style.top = (header_height + header_offset - (header_height * 0.125) + (time - day_start) * minute_height) + "px"; - e.style.left = offset + "px"; - e.style.width = timelabel_width + "px"; - e.style.height = (header_height * 0.5) + "px"; - e.style.zIndex = "-1"; - e.style.margin = 0 + "px"; - e.style.padding = padding; - e.style.fontFamily = "sans-serif"; - e.style.fontSize = (header_height * 0.25) + "px"; - e.style.textAlign = "right"; - e.style.color = "#e0e0e0"; - var label = time / 60 + "00"; - if (label.length < 4) { - label = "0" + label; - } - e.appendChild(document.createTextNode(label)); - - document.getElementById("day" + day) - .appendChild(e); - } - - } - - //----------------------------------------------------------------- - // Draw a block for each meeting - //----------------------------------------------------------------- - var resize_func = function (div, t, l, w, h, to_fit) { return function () { resize(div, t, l, w, h, to_fit); }; }; - var maximize_func = function (e) { return function () { maximize(e); }; }; - - for (i = 0; i < items.length; i++) { - { - start_time = parseInt(items[i].time.substr(0, 2), 10) * 60 + - parseInt(items[i].time.substr(2, 2), 10); - end_time = start_time + (items[i].duration / 60); - - var sess_width = room_width / items[i].lanes; - var sess_height = ((end_time - start_time) * minute_height); - var room_left = offset + timelabel_width + items[i].room_index * room_width; - var sess_left = room_left + sess_width * items[i].lane; - var sess_top = ((start_time - day_start) * minute_height) + header_height + header_offset; - - e = document.createElement("div"); - e.style.border = "solid"; - e.style.borderWidth = border + "px"; - - if (fg[items[i].area]) { - e.style.background = bg[items[i].area]; - e.style.color = fg[items[i].area]; - e.style.borderColor = fg[items[i].area]; - } else { - e.style.background = "#e0e0e0"; - e.style.color = "#000000"; - e.style.borderColor = "#000000"; - } - - e.style.display = "block"; - e.style.overflow = "hidden"; - e.style.position = "absolute"; - e.style.top = sess_top + "px"; - e.style.left = sess_left + "px"; - e.style.width = sess_width + "px"; - e.style.height = sess_height + "px"; - e.style.margin = 0 + "px"; - e.style.padding = padding + "px"; - e.style.fontFamily = "sans-serif"; - e.style.fontSize = "8pt"; - if (items[i].from_base_schedule) - e.style.opacity = 0.5; - - e.id = i; - - e.onmouseover = resize_func(e, sess_top, room_left, - room_width, - sess_height, true); - - e.onmouseout = resize_func(e, sess_top, sess_left, sess_width, sess_height, false); - - if (items[i].agenda) { - e.onclick = maximize_func(e); - e.style.cursor = "pointer"; - } - - div = document.createElement("div"); - div.appendChild(document.createTextNode(items[i].verbose_time)); - div.appendChild(document.createElement("br")); - - label = items[i].name; - if (label.length == 0) { label = "Free Slot"; } - if (items[i].wg && fg[items[i].area]) { - label = label + " (" + items[i].wg + ")"; - } - var bold = document.createElement("span"); - bold.appendChild(document.createTextNode(label)); - bold.style.fontWeight = "bold"; - div.appendChild(bold); - - e.appendChild(div); - - document.getElementById("day" + items[i].day) - .appendChild(e); - } - } - - lastheight = height; - lastwidth = width; - lastfrag = window.location.hash; -}; - -function resize(div, t2, l2, w2, h2, to_fit) { - // Move the element to the front - var parent = div.parentElement; - parent.removeChild(div); - parent.appendChild(div); - - div.t2 = t2; - div.l2 = l2; - div.w2 = w2; - div.h2 = h2; - div.to_fit = to_fit; - div.percent = 0; - divlist.push(div); -} - -function animate() { - var offset = $('#mtgheader') - .offset() - .left; - var i; - for (i = divlist.length - 1; i >= 0; i--) { - var div = divlist[i]; - if (div.percent < 100) { - div.percent += 5; - var t1 = parseFloat(div.style.top.replace("px", "")) + "px"; - var l1 = offset + parseFloat(div.style.left.replace("px", "")) + "px"; - var w1 = parseFloat(div.style.width.replace("px", "")) + "px"; - var h1 = parseFloat(div.style.height.replace("px", "")) + "px"; - - div.style.top = wavg(t1, div.t2, div.percent) + "px" + "px"; - div.style.left = offset + wavg(l1, div.l2, div.percent) + "px" + "px"; - div.style.width = wavg(w1, div.w2, div.percent) + "px" + "px"; - div.style.height = wavg(h1, div.h2, div.percent) + "px" + "px"; - - if (t1 == div.t2 && l1 == div.l2 && - w1 == div.w2 && h1 == div.h2) { div.percent = 100; } - - } else { - if (div.to_fit) { - var tmp = div.style.height; - div.style.removeProperty("height"); - if (div.h2 < div.clientHeight) { - div.h2 = div.clientHeight; - div.percent = 0; - } else { - divlist.remove(i); - if (div.callback) { - tmp = div.callback; - div.callback = undefined; - tmp(); - } - } - div.style.height = tmp + "px"; - } else { - divlist.remove(i); - if (div.callback) { - tmp = div.callback; - div.callback = undefined; - tmp(); - } - } - } - } - -} - -function finish_maximize(e) { - if (!items[e.id].agenda) { - return; - } - - e.insertBefore(document.createElement("br"), e.firstChild); - var offset = $('#mtgheader') - .offset() - .left; - - var minimize_func = function (e) { return function () { minimize(e); }; }; - var i = document.createElement("i"); - i.classList.add('bi', 'bi-x-lg'); - i.style.cssFloat = "right"; - i.onclick = minimize_func(e); - i.style.cursor = "pointer"; - e.insertBefore(i, e.firstChild); - - var h = document.createElement("span"); - h.appendChild(document.createTextNode(items[e.id].dayname)); - h.style.fontWeight = "bold"; - e.insertBefore(h, e.firstChild); - e.style.fontSize = "10pt"; - - var tmp = e.style.height; - e.style.removeProperty("height"); - var used_height = e.clientHeight; - e.style.height = tmp + "px"; - - var frame = document.createElement("iframe"); - frame.setAttribute("src", items[e.id].agenda); - - frame.style.position = "absolute"; - frame.style.left = (offset + 8) + "px"; - frame.style.width = (e.clientWidth - 16) + "px"; - frame.style.top = (used_height + 8) + "px"; - frame.style.height = (e.clientHeight - used_height - 16) + "px"; - - frame.style.background = "#fff"; - frame.style.overflow = "auto"; - frame.id = "agenda"; - - frame.style.border = e.style.border; - frame.style.borderWidth = border + "px"; - frame.style.padding = padding + "px"; - frame.style.borderColor = e.style.borderColor; - - e.appendChild(frame); -} - -function finish_minimize(e) { - e.onmouseover = e.oldmouseover; - e.onmouseout = e.oldmouseout; - e.oldmouseover = undefined; - e.oldmouseout = undefined; - e.style.cursor = "pointer"; -} - -function maximize(e) { - if (e.onmouseover) { - e.oldmouseover = e.onmouseover; - e.oldmouseout = e.onmouseout; - e.onmouseover = undefined; - e.onmouseout = undefined; - e.style.cursor = "auto"; - - var callback_func = function (e) { return function () { finish_maximize(e); }; }; - e.callback = callback_func(e); - - resize(e, 0, 0, - document.body.clientWidth, - document.body.clientHeight); - } -} - -function minimize(e) { - var agenda = document.getElementById("agenda"); - if (agenda) { - e.removeChild(agenda); - } - - var callback_func = function (e) { return function () { finish_minimize(e); }; }; - e.callback = callback_func(e); - e.oldmouseout(); - - e.removeChild(e.firstChild); - e.removeChild(e.firstChild); - e.removeChild(e.firstChild); - e.style.fontSize = "8pt"; -} - -function wavg(x1, x2, percent) { - if (percent == 100) { return x2; } - var res = x2 * (percent / 100) + x1 * ((100 - percent) / 100); - return res; -} - -// Array Remove - By John Resig (MIT Licensed) -Array.prototype.remove = function (from, to) { - var rest = this.slice((to || from) + 1 || this.length); - this.length = from < 0 ? this.length + from : from; - return this.push.apply(this, rest); -}; \ No newline at end of file diff --git a/ietf/templates/meeting/meeting_heading.html b/ietf/templates/meeting/meeting_heading.html index 7a22120dd..6be8608f8 100644 --- a/ietf/templates/meeting/meeting_heading.html +++ b/ietf/templates/meeting/meeting_heading.html @@ -66,13 +66,6 @@ type - {% else %} - {% endif %} {% endif %} - \ No newline at end of file + diff --git a/ietf/templates/meeting/room-view.html b/ietf/templates/meeting/room-view.html deleted file mode 100644 index c95f28b30..000000000 --- a/ietf/templates/meeting/room-view.html +++ /dev/null @@ -1,87 +0,0 @@ -{% extends "base.html" %} -{# Copyright The IETF Trust 2015, All Rights Reserved #} -{% load origin %} -{% load ietf_filters %} -{% load textfilters %} -{% load static %} -{% block title %} - IETF {{ meeting.number }} meeting agenda - {% if "-utc" in request.path %}(UTC){% endif %} -{% endblock %} -{% block bodyAttrs %}onload="draw_calendar();" onresize="draw_calendar();"{% endblock %} -{% block content %} - {% origin %} - {# FIXME: patched this for some minimal functionality, this code needs to be replaced, ideally with fullcalendar #} -
- {% include "meeting/meeting_heading.html" with updated=schedule.meeting.updated selected="room-view" title_extra="Room Grid" %} -
-
- -
- {% for day in days %} -
- Error loading calendar for {{ day|date:"D, M d" }} -
- {% endfor %} -
-
-{% endblock %} -{% block js %} - - - -{% endblock %} \ No newline at end of file diff --git a/package.json b/package.json index 526d8a735..be74c83be 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,6 @@ "ietf/static/js/moment.js", "ietf/static/js/password_strength.js", "ietf/static/js/review-stats.js", - "ietf/static/js/room-view.js", "ietf/static/js/room_params.js", "ietf/static/js/select2.js", "ietf/static/js/session_details_form.js",