From f34ae9c6128d3e939fa5241f1c273c83ec933a61 Mon Sep 17 00:00:00 2001 From: Robert Sparks Date: Wed, 27 Apr 2016 20:46:02 +0000 Subject: [PATCH] Reworked the pages that manage all the possible schedules for a meeting. Removed a lot of custom javascript. Fixes #1921. Commit ready for merge. - Legacy-Id: 11137 --- ietf/meeting/tests_views.py | 49 ++++- ietf/meeting/urls.py | 20 +- ietf/meeting/views.py | 81 ++++++-- .../ietf/js/agenda/agenda_properties_edit.js | 177 ------------------ .../ietf/js/agenda/agenda_property_utils.js | 101 ---------- ietf/static/ietf/js/agenda/agendas_edit.js | 123 ------------ ietf/templates/meeting/agenda_list.html | 113 ++++------- ietf/templates/meeting/delete_schedule.html | 28 +++ ietf/templates/meeting/landscape_edit.html | 2 +- .../meeting/make_schedule_official.html | 29 +++ ietf/templates/meeting/private_agenda.html | 2 +- ietf/templates/meeting/properties_edit.html | 84 ++------- 12 files changed, 239 insertions(+), 570 deletions(-) delete mode 100644 ietf/static/ietf/js/agenda/agenda_properties_edit.js delete mode 100644 ietf/static/ietf/js/agenda/agenda_property_utils.js delete mode 100644 ietf/static/ietf/js/agenda/agendas_edit.js create mode 100644 ietf/templates/meeting/delete_schedule.html create mode 100644 ietf/templates/meeting/make_schedule_official.html diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index 809a101aa..cf70f621f 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -11,13 +11,13 @@ from django.conf import settings from pyquery import PyQuery from ietf.doc.models import Document -from ietf.meeting.models import Session, TimeSlot +from ietf.meeting.models import Session, TimeSlot, Meeting from ietf.meeting.test_data import make_meeting_test_data from ietf.utils.test_utils import TestCase, login_testing_unauthorized, unicontent from ietf.person.factories import PersonFactory from ietf.group.factories import GroupFactory -from ietf.meeting.factories import SessionFactory, SessionPresentationFactory +from ietf.meeting.factories import SessionFactory, SessionPresentationFactory, ScheduleFactory, MeetingFactory from ietf.doc.factories import DocumentFactory class MeetingTests(TestCase): @@ -401,3 +401,48 @@ class SessionDetailsTests(TestCase): q = PyQuery(r.content) self.assertEqual(1,len(q(".alert-warning:contains('may affect published proceedings')"))) +class EditScheduleListTests(TestCase): + def setUp(self): + self.mtg = MeetingFactory(type_id='ietf') + ScheduleFactory(meeting=self.mtg,name='Empty-Schedule') + + def test_list_agendas(self): + url = urlreverse('ietf.meeting.views.list_agendas',kwargs={'num':self.mtg.number}) + login_testing_unauthorized(self,"secretary",url) + r = self.client.get(url) + self.assertTrue(r.status_code, 200) + + def test_delete_schedule(self): + url = urlreverse('ietf.meeting.views.delete_schedule', + kwargs={'num':self.mtg.number, + 'owner':self.mtg.agenda.owner.email_address(), + 'name':self.mtg.agenda.name, + }) + login_testing_unauthorized(self,"secretary",url) + r = self.client.get(url) + self.assertTrue(r.status_code, 403) + r = self.client.post(url,{'save':1}) + self.assertTrue(r.status_code, 403) + self.assertEqual(self.mtg.schedule_set.count(),2) + self.mtg.agenda=None + self.mtg.save() + r = self.client.get(url) + self.assertTrue(r.status_code, 200) + r = self.client.post(url,{'save':1}) + self.assertTrue(r.status_code, 302) + self.assertEqual(self.mtg.schedule_set.count(),1) + + def test_make_schedule_official(self): + schedule = self.mtg.schedule_set.exclude(id=self.mtg.agenda.id).first() + url = urlreverse('ietf.meeting.views.make_schedule_official', + kwargs={'num':self.mtg.number, + 'owner':schedule.owner.email_address(), + 'name':schedule.name, + }) + login_testing_unauthorized(self,"secretary",url) + r = self.client.get(url) + self.assertTrue(r.status_code, 200) + r = self.client.post(url,{'save':1}) + self.assertTrue(r.status_code, 302) + mtg = Meeting.objects.get(number=self.mtg.number) + self.assertEqual(mtg.agenda,schedule) diff --git a/ietf/meeting/urls.py b/ietf/meeting/urls.py index 9a33caad7..b48ac50a9 100644 --- a/ietf/meeting/urls.py +++ b/ietf/meeting/urls.py @@ -12,18 +12,22 @@ safe_for_all_meeting_types = [ ] type_ietf_only_patterns = [ - url(r'^agenda/(?P[A-Za-z0-9-.+_]+@[A-Za-z0-9._]+)/(?P[A-Za-z0-9-:_]+)/edit$', views.edit_agenda), - url(r'^agenda/(?P[A-Za-z0-9-.+_]+@[A-Za-z0-9._]+)/(?P[A-Za-z0-9-:_]+)/details$', views.edit_agenda_properties), - url(r'^agenda/(?P[A-Za-z0-9-.+_]+@[A-Za-z0-9._]+)/(?P[A-Za-z0-9-:_]+).(?P.html)?/?$', views.agenda), - url(r'^agenda/(?P[A-Za-z0-9-.+_]+@[A-Za-z0-9._]+)/(?P[A-Za-z0-9-:_]+)/permissions$', ajax.agenda_permission_api), - url(r'^agenda/(?P[A-Za-z0-9-.+_]+@[A-Za-z0-9._]+)/(?P[A-Za-z0-9-:_]+)/session/(?P\d+).json$', ajax.assignment_json), - url(r'^agenda/(?P[A-Za-z0-9-.+_]+@[A-Za-z0-9._]+)/(?P[A-Za-z0-9-:_]+)/sessions.json$', ajax.assignments_json), - url(r'^agenda/(?P[A-Za-z0-9-.+_]+@[A-Za-z0-9._]+)/(?P[A-Za-z0-9-:_]+).json$', ajax.agenda_infourl), + url(r'^agenda/(?P[A-Za-z0-9-.+_]+@[A-Za-z0-9-._]+)/(?P[A-Za-z0-9-:_]+)/edit$', views.edit_agenda), + url(r'^agenda/(?P[A-Za-z0-9-.+_]+@[A-Za-z0-9-._]+)/(?P[A-Za-z0-9-:_]+)/details$', views.edit_agenda_properties), + url(r'^agenda/(?P[A-Za-z0-9-.+_]+@[A-Za-z0-9-._]+)/(?P[A-Za-z0-9-:_]+)/delete$', views.delete_schedule), + url(r'^agenda/(?P[A-Za-z0-9-.+_]+@[A-Za-z0-9-._]+)/(?P[A-Za-z0-9-:_]+)/make_official$', views.make_schedule_official), +# The following view is broken? + url(r'^agenda/(?P[A-Za-z0-9-.+_]+@[A-Za-z0-9-._]+)/(?P[A-Za-z0-9-:_]+).(?P.html)?/?$', views.agenda), + url(r'^agenda/(?P[A-Za-z0-9-.+_]+@[A-Za-z0-9-._]+)/(?P[A-Za-z0-9-:_]+)/permissions$', ajax.agenda_permission_api), + url(r'^agenda/(?P[A-Za-z0-9-.+_]+@[A-Za-z0-9-._]+)/(?P[A-Za-z0-9-:_]+)/session/(?P\d+).json$', ajax.assignment_json), + url(r'^agenda/(?P[A-Za-z0-9-.+_]+@[A-Za-z0-9-._]+)/(?P[A-Za-z0-9-:_]+)/sessions.json$', ajax.assignments_json), + url(r'^agenda/(?P[A-Za-z0-9-.+_]+@[A-Za-z0-9-._]+)/(?P[A-Za-z0-9-:_]+).json$', ajax.agenda_infourl), url(r'^agenda/by-room$', views.agenda_by_room), url(r'^agenda/by-type$', views.agenda_by_type), url(r'^agenda/by-type/(?P[a-z]+)$', views.agenda_by_type), url(r'^agenda/by-type/(?P[a-z]+)/ics$', views.agenda_by_type_ics), - url(r'^agendas/edit$', views.edit_agendas), + url(r'^agendas/list$', views.list_agendas, name='meeting_list_agendas'), + url(r'^agendas/edit$', RedirectView.as_view(pattern_name='meeting_list_agendas', permanent=True)), url(r'^timeslots/edit$', views.edit_timeslots), url(r'^rooms$', ajax.timeslot_roomsurl), url(r'^room/(?P\d+).json$', ajax.timeslot_roomurl), diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index 1126a4fcc..efa547540 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -304,30 +304,33 @@ def edit_agenda(request, num=None, owner=None, name=None): ############################################################################## # show the properties associated with an agenda (visible, public) -# this page uses ajax POST requests to the API # AgendaPropertiesForm = modelform_factory(Schedule, fields=('name','visible', 'public')) @role_required('Area Director','Secretariat') -@ensure_csrf_cookie def edit_agenda_properties(request, num=None, owner=None, name=None): meeting = get_meeting(num) person = get_person_by_email(owner) schedule = get_schedule_by_name(meeting, person, name) if schedule is None: raise Http404("No meeting information for meeting %s owner %s schedule %s available" % (num, owner, name)) - form = AgendaPropertiesForm(instance=schedule) cansee, canedit, secretariat = agenda_permissions(meeting, schedule, request.user) if not (canedit or has_role(request.user,'Secretariat')): return HttpResponseForbidden("You may not edit this agenda") else: + if request.method == 'POST': + form = AgendaPropertiesForm(instance=schedule,data=request.POST) + if form.is_valid(): + form.save() + return HttpResponseRedirect(reverse('ietf.meeting.views.list_agendas',kwargs={'num': num})) + else: + form = AgendaPropertiesForm(instance=schedule) return render(request, "meeting/properties_edit.html", {"schedule":schedule, "form":form, "meeting":meeting, - "hide_menu": True, }) ############################################################################## @@ -335,11 +338,7 @@ def edit_agenda_properties(request, num=None, owner=None, name=None): # @role_required('Area Director','Secretariat') -@ensure_csrf_cookie -def edit_agendas(request, num=None, order=None): - - #if request.method == 'POST': - # return agenda_create(request, num, owner, name) +def list_agendas(request, num=None ): meeting = get_meeting(num) user = request.user @@ -350,10 +349,11 @@ def edit_agendas(request, num=None, order=None): schedules = schedules.order_by('owner', 'name') + schedules = sorted(list(schedules),key=lambda x:not x.is_official) + return render(request, "meeting/agenda_list.html", {"meeting": meeting, - "schedules": schedules.all(), - "hide_menu": True, + "schedules": schedules, }) @ensure_csrf_cookie @@ -927,3 +927,62 @@ def add_session_drafts(request, session_id, num): 'already_linked': session.sessionpresentation_set.filter(document__type_id='draft'), 'form': form, }) + +@role_required('Secretariat') +def make_schedule_official(request, num, owner, name): + + meeting = get_meeting(num) + person = get_person_by_email(owner) + schedule = get_schedule_by_name(meeting, person, name) + + if schedule is None: + raise Http404 + + if request.method == 'POST': + if not (schedule.public and schedule.visible): + schedule.public = True + schedule.visible = True + schedule.save() + meeting.agenda = schedule + meeting.save() + return HttpResponseRedirect(reverse('ietf.meeting.views.list_agendas',kwargs={'num':num})) + + if not schedule.public: + messages.warning(request,"This schedule will be made public as it is made official.") + + if not schedule.visible: + messages.warning(request,"This schedule will be made visible as it is made official.") + + return render(request, "meeting/make_schedule_official.html", + { 'schedule' : schedule, + 'meeting' : meeting, + } + ) + + +@role_required('Secretariat','Area Director') +def delete_schedule(request, num, owner, name): + + meeting = get_meeting(num) + person = get_person_by_email(owner) + schedule = get_schedule_by_name(meeting, person, name) + + if schedule.name=='Empty-Schedule': + return HttpResponseForbidden('You may not delete the default empty schedule') + + if schedule == meeting.agenda: + return HttpResponseForbidden('You may not delete the official agenda for %s'%meeting) + + if not ( has_role(request.user, 'Secretariat') or person.user == request.user ): + return HttpResponseForbidden("You may not delete other user's schedules") + + if request.method == 'POST': + schedule.delete() + return HttpResponseRedirect(reverse('ietf.meeting.views.list_agendas',kwargs={'num':num})) + + return render(request, "meeting/delete_schedule.html", + { 'schedule' : schedule, + 'meeting' : meeting, + } + ) + diff --git a/ietf/static/ietf/js/agenda/agenda_properties_edit.js b/ietf/static/ietf/js/agenda/agenda_properties_edit.js deleted file mode 100644 index 6ecb4a04f..000000000 --- a/ietf/static/ietf/js/agenda/agenda_properties_edit.js +++ /dev/null @@ -1,177 +0,0 @@ -/* -* agenda_properties_edit.js -* -* Copyright (c) 2013, The IETF Trust. See ../../../LICENSE. -* -* www.credil.org: Project Orlando 2013 -* Author: Justin Hornosty ( justin@credil.org ) -* Michael Richardson -* -* This file should contain functions relating to -* editing the properties of a single agenda. -* -*/ - - - - -//////////////-GLOBALS----//////////////////////////////////////// - - -/////////////-END-GLOBALS-/////////////////////////////////////// -var cancel_url; - -$(document).ready(function() { - init_agenda_edit(); - - cancel_url = $("#agenda_cancel_url").attr("href"); - - /* hide the side bar by default. */ - $("#close_ietf_menubar").click(); -}); - -function init_agenda_edit(){ - log("initstuff() ran"); - static_listeners(); - - $(".agenda_delete").unbind('click'); - $(".agenda_delete").click(delete_agenda); - - $("#agenda_save").unbind('click'); - $("#agenda_save").click(save_agenda); - - $(".agenda_official_mark").unbind('click'); - $(".agenda_official_mark").click(toggle_official); - - -} - -function toggle_public(event) { - var span_to_replace = event.target; - var current_value = $(event.target).html(); - var agenda_url = $(event.target).closest('tr').attr('href'); - - var new_value = 1; - log("value "+current_value); - if(current_value == "public") { - new_value = 0; - } - event.preventDefault(); - - $.ajax({ "url": agenda_url, - "type": "POST", - "data": { "public" : new_value }, - "dataType": "json", - "success": function(result) { - /* result is a json object */ - value = result["public"]; - log("new value "+value); - $(span_to_replace).html(value); - }}); -} - -function toggle_visible(event) { - var span_to_replace = event.target; - var current_value = $(event.target).html(); - var agenda_url = $(event.target).closest('tr').attr('href'); - - var new_value = 1; - log("value "+current_value); - if(current_value == "visible") { - new_value = 0; - } - event.preventDefault(); - - $.ajax({ "url": agenda_url, - "type": "POST", - "data": { "visible" : new_value }, - "dataType": "json", - "success": function(result) { - /* result is a json object */ - value = result["visible"] - log("new value "+value) - $(span_to_replace).html(value) - }}); -} - -function toggle_official(event) { - var agenda_name = $(event.target).closest('tr').attr('agenda_name'); - var agenda_id = $(event.target).closest('tr').attr('id'); - var meeting_url = $(".agenda_list_title").attr('href'); - event.preventDefault(); - - /* - * if any of them are clicked, then go through all of them - * and set them to "unofficial", then based upon the return - * we might this one to official. - */ - - var value = 0; - if($(event.target).html() == "official") { - value = 1; - } - var new_value = agenda_name; - var new_official = 1; - if(value > 0) { - new_value = "None"; - new_official = 0; - } - - var rows = $(".agenda_list tr:gt(0)"); - rows.each(function(index) { - log("row: "+this); - /* this is now the tr */ - $(this).removeClass("agenda_official_row"); - $(this).addClass("agenda_unofficial_row"); - - /* not DRY, this occurs deep in the model too */ - $(this).find(".agenda_official_mark").html("unofficial"); - }); - - //log("clicked on "+agenda_url+" sending to "+meeting_url); - - $.ajax({ "url": meeting_url, - "type": "POST", - "data": { "agenda" : new_value }, - "dataType": "json", - "success": function(result) { - /* result is a json object */ - if(new_official) { - $("#"+agenda_id).find(".agenda_official_mark").html("official"); - $("#"+agenda_id).addClass("agenda_official_row"); - }}}); -} - -function save_agenda(form) { - - var agenda_url = form.action; - var name_str = form.elements["name"].value; - var public_flag = false; - var visible_flag= false; - - public_flag = form.elements["public"].checked ? true : false; - visible_flag = form.elements["visible"].checked ? true: false; - console.log("POST to ",agenda_url," with name:", name_str, - "visible:", visible_flag, - "public:", public_flag); - - $.ajax({"url": agenda_url, - "type": "POST", - "data": { "public" : public_flag, - "visible": visible_flag, - "name" : name_str, - }, - "dataType": "json", - "success": function(result) { - window.location.assign(cancel_url); - }}); - -} - - -/* - * Local Variables: - * c-basic-offset:4 - * End: - */ - diff --git a/ietf/static/ietf/js/agenda/agenda_property_utils.js b/ietf/static/ietf/js/agenda/agenda_property_utils.js deleted file mode 100644 index 897faeefc..000000000 --- a/ietf/static/ietf/js/agenda/agenda_property_utils.js +++ /dev/null @@ -1,101 +0,0 @@ -/* -* agenda_property_utils.js -* -* Copyright (c) 2013, The IETF Trust. See ../../../LICENSE. -* -* www.credil.org: Project Orlando 2013 -* Author: Justin Hornosty ( justin@credil.org ) -* Michael Richardson -* -* Some functions for toggling, saving and deleting agenda properties. -* -*/ - - - - -//////////////-GLOBALS----//////////////////////////////////////// - - -/////////////-END-GLOBALS-/////////////////////////////////////// - - -function delete_agenda(event) { - var agenda_url = $(event.target).closest('tr').attr('href') + ".json"; - event.preventDefault(); - - $("#agenda_delete_dialog").dialog({ - buttons : { - "Confirm" : function() { - $.ajax({ - url: agenda_url, - type: 'DELETE', - success: function(result) { - window.location.reload(true); - } - }); - $(this).dialog("close"); - }, - "Cancel" : function() { - $(this).dialog("close"); - } - } - }); - - $("#room_delete_dialog").dialog("open"); -} - -function toggle_public(event) { - var span_to_replace = event.target; - var current_value = $(event.target).html(); - var agenda_url = $(event.target).closest('tr').attr('href'); - - var new_value = 1; - log("value "+current_value) - if(current_value == "public") { - new_value = 0 - } - event.preventDefault(); - - $.ajax({ "url": agenda_url, - "type": "POST", - "data": { "public" : new_value }, - "dataType": "json", - "success": function(result) { - /* result is a json object */ - value = result["public"] - log("new value "+value) - $(span_to_replace).html(value) - }}); -} - -function toggle_visible(event) { - var span_to_replace = event.target; - var current_value = $(event.target).html(); - var agenda_url = $(event.target).closest('tr').attr('href'); - - var new_value = 1; - log("value "+current_value) - if(current_value == "visible") { - new_value = 0 - } - event.preventDefault(); - - $.ajax({ "url": agenda_url, - "type": "POST", - "data": { "visible" : new_value }, - "dataType": "json", - "success": function(result) { - /* result is a json object */ - value = result["visible"] - log("new value "+value) - $(span_to_replace).html(value) - }}); -} - -/* - * Local Variables: - * c-basic-offset:4 - * End: - */ - diff --git a/ietf/static/ietf/js/agenda/agendas_edit.js b/ietf/static/ietf/js/agenda/agendas_edit.js deleted file mode 100644 index 03b7e4f28..000000000 --- a/ietf/static/ietf/js/agenda/agendas_edit.js +++ /dev/null @@ -1,123 +0,0 @@ -/* -* agendas_edit.js -* -* Copyright (c) 2013, The IETF Trust. See ../../../LICENSE. -* -* www.credil.org: Project Orlando 2013 -* Author: Justin Hornosty ( justin@credil.org ) -* Michael Richardson -* -* This file should contain functions relating to -* editing a list of agendas -* -*/ - - - - -//////////////-GLOBALS----//////////////////////////////////////// - - -/////////////-END-GLOBALS-/////////////////////////////////////// - -$(document).ready(function() { - init_agendas_edit(); - - /* hide the side bar by default. */ - $("#close_ietf_menubar").click(); -}); - -/* - init_timeslot_editf() - This is ran at page load and sets up appropriate listeners -*/ -function init_agendas_edit(){ - log("initstuff() ran"); - static_listeners(); - - $(".agenda_delete").unbind('click'); - $(".agenda_delete").click(delete_agenda); - - $(".agenda_official_mark").unbind('click'); - $(".agenda_official_mark").click(toggle_official); -} - -function toggle_official(event) { - var agenda_line = $(event.target).closest('tr'); - var agenda_url = agenda_line.attr('href'); - var agenda_name = agenda_line.attr('agenda_name'); - var agenda_id = agenda_line.attr('id'); - var meeting_url = $(".agenda_list_title").attr('href'); - event.preventDefault(); - - /* - * if any of them are clicked, then go through all of them - * and set them to "unofficial", then based upon the return - * we might this one to official. - */ - - /* if agenda_official is > 1, then it is enabled */ - var value = 0; - if($(event.target).html() == "official") { - value = 1; - } - var new_value = agenda_name; - var new_official = 1; - if(value > 0) { - new_value = "None"; - new_official = 0; - } - - - if(new_official == 1) { - // see if this item is public, fail otherwise. - var agenda_public_span = agenda_line.find('.agenda_public').html(); - // console.log("public_span", agenda_public_span); - if (agenda_public_span == "private") { - $("#agenda_notpublic_dialog").dialog(); - return; - } - } - - - var rows = $(".agenda_list tr:gt(0)"); - rows.each(function(index) { - log("row: "+this); - /* this is now the tr */ - $(this).removeClass("agenda_official_row"); - $(this).addClass("agenda_unofficial_row"); - - /* not DRY, this occurs deep in the model too */ - $(this).find(".agenda_official_mark").html("unofficial"); - }); - - log("clicked on "+agenda_url+" sending to "+meeting_url); - - $.ajax({ "url": meeting_url, - "type": "POST", - "data": { "agenda" : new_value }, - "dataType": "json", - "success": function(result) { - /* result is a json object, which has the agenda_href to mark official */ - var agenda_href = result.agenda_href; - - var rows = $(".agenda_list tr:gt(0)"); - rows.each(function(index) { - var my_href = $(this).attr('href') - /* this is now the tr */ - - if(agenda_href == my_href) { - $(this).find(".agenda_official_mark").html("official"); - $(this).addClass("agenda_official_row"); - } - }); - }}); -} - - -/* - * Local Variables: - * c-basic-offset:4 - * End: - */ - diff --git a/ietf/templates/meeting/agenda_list.html b/ietf/templates/meeting/agenda_list.html index 045edabca..41445b306 100644 --- a/ietf/templates/meeting/agenda_list.html +++ b/ietf/templates/meeting/agenda_list.html @@ -3,91 +3,48 @@ {% load origin %} {% load staticfiles %} {% load ietf_filters %} -{% load humanize %} - -{% block title %}IETF {{ meeting.number }} Meeting Agenda{% endblock %} -{% load agenda_custom_tags %} -{% block pagehead %} - - - -{% endblock pagehead %} - -{% block js %} - - - - - - - - - - - - - - -{% endblock js %} +{% block title %}IETF {{ meeting.number }} Meeting Agenda List{% endblock %} {% block content %} {% origin %} -
-
- < -
+

IETF {{meeting.number}} Agenda List

-
-

Meeting {{meeting.number}}

-
+{% comment %} + +{% endcomment %} - - -
- - - - - - - - - {% for agenda in schedules %} - - - - - - - - +
+ {% regroup schedules by is_official as classed_schedules %} + {% for class in classed_schedules %} +
+
{{class.grouper|yesno:"Official,Unofficial"}} Schedule{{class.list|length|pluralize}}
+
+
OwnerNameVisiblePublic
{{ agenda.official_token }} {{ agenda.owner }} - {{ agenda.name }} - {{ agenda.visible_token }} {{ agenda.public_token }} EDIT DEL
+ + + + + + + + {% for agenda in class.list %} + + + + + + - {% endfor %} -
NameOwnerVisiblePublic
+ {{ agenda.name }}{{ agenda.owner }}{{ agenda.visible_token }}{{ agenda.public_token }} + EDIT
+ {% endfor %} + +
- -
- Are you sure you want to delete this agenda? -
- -
- You can not mark an agenda as official, if it is not public. -
- + {% endfor %} -{% endblock %} +{% endblock content %} diff --git a/ietf/templates/meeting/delete_schedule.html b/ietf/templates/meeting/delete_schedule.html new file mode 100644 index 000000000..fe51a0a35 --- /dev/null +++ b/ietf/templates/meeting/delete_schedule.html @@ -0,0 +1,28 @@ +{% extends "base.html" %} +{# Copyright The IETF Trust 2015, All Rights Reserved #} +{% load origin %} +{% load staticfiles %} +{% load ietf_filters %} +{% load bootstrap3 %} + +{% block title %}Delete IETF {{ meeting.number }} Meeting Agenda: {{schedule.owner}} / {{ schedule.name }}{% endblock %} + +{% block content %} + {% origin %} + +

Delete IETF {{meeting.number}} Schedule: {{schedule.owner}}/{{schedule.name}}

+ +
+ +
+ {% csrf_token %} + {# Null Form #} + {% buttons %} + + Cancel + {% endbuttons %} +
+ +
+ +{% endblock %} diff --git a/ietf/templates/meeting/landscape_edit.html b/ietf/templates/meeting/landscape_edit.html index 0a2e755f8..01ec9424e 100644 --- a/ietf/templates/meeting/landscape_edit.html +++ b/ietf/templates/meeting/landscape_edit.html @@ -117,7 +117,7 @@ promiselist.push(ss_promise);
diff --git a/ietf/templates/meeting/make_schedule_official.html b/ietf/templates/meeting/make_schedule_official.html new file mode 100644 index 000000000..9c4f73c79 --- /dev/null +++ b/ietf/templates/meeting/make_schedule_official.html @@ -0,0 +1,29 @@ +{% extends "base.html" %} +{# Copyright The IETF Trust 2015, All Rights Reserved #} +{% load origin %} +{% load staticfiles %} +{% load ietf_filters %} +{% load bootstrap3 %} + +{% block title %}IETF {{ meeting.number }} : Make {{schedule.owner}} / {{ schedule.name }} Official{% endblock %} + +{% block content %} + {% origin %} + +

IETF {{meeting.number}}

+

Make Schedule: {{schedule.owner}}/{{schedule.name}} Official + +
+ +
+ {% csrf_token %} + {# Null Form #} + {% buttons %} + + Cancel + {% endbuttons %} +
+ +
+ +{% endblock %} diff --git a/ietf/templates/meeting/private_agenda.html b/ietf/templates/meeting/private_agenda.html index 83e6a4b17..bf7a4f165 100644 --- a/ietf/templates/meeting/private_agenda.html +++ b/ietf/templates/meeting/private_agenda.html @@ -15,7 +15,7 @@

You do not have access this agenda. It belongs to {{ schedule.owner }}.

-

List your meetings.

+

List your meetings.

diff --git a/ietf/templates/meeting/properties_edit.html b/ietf/templates/meeting/properties_edit.html index 8f5a7466f..7bd9865a9 100644 --- a/ietf/templates/meeting/properties_edit.html +++ b/ietf/templates/meeting/properties_edit.html @@ -3,84 +3,32 @@ {% load origin %} {% load staticfiles %} {% load ietf_filters %} -{% load humanize %} +{% load bootstrap3 %} {% block title %}IETF {{ meeting.number }} Meeting Agenda: {{schedule.owner}} / {{ schedule.name }}{% endblock %} -{% load agenda_custom_tags %} -{% block pagehead %} - - - -{% endblock pagehead %} - -{% block js %} - - - - - - - - - - - - - - -{% endblock js %} {% block content %} {% origin %} -

-
-
-< -
-
-

Meeting {{meeting.number}}

-
+

IETF {{meeting.number}}

+

Schedule: {{schedule.owner}}/{{schedule.name}} ({{schedule.official_token }}) + {% if not schedule.is_official %} + Make this the official schedule + Delete this schedule + {% endif %} +

-
-
-

Schedule: {{schedule.owner}}/{{schedule.name}}

- -
- {{ schedule.official_token }} -
-
+
-
-
- - {{ form.as_table }} - - - - - - -
- CancelDEL
-
+ + {% csrf_token %} + {% bootstrap_form form %} + {% buttons %} + + Cancel + {% endbuttons %}
-
- -
- Are you sure you want to delete this agenda? -
- {% endblock %}