From 609f368ce122e163d4692ed33b2b7584724adaa9 Mon Sep 17 00:00:00 2001 From: Robert Sparks Date: Wed, 15 Jul 2015 02:13:48 +0000 Subject: [PATCH 1/3] Still clunky but far enough along for sprinters to play with and comment on - Legacy-Id: 9720 --- hack_pres.py | 31 +++++++++++++++++++++ ietf/doc/views_doc.py | 18 ++++++++---- ietf/doc/views_material.py | 21 ++++++++++---- ietf/meeting/models.py | 3 ++ ietf/templates/doc/document_draft.html | 19 +++++++++++++ ietf/templates/meeting/group_materials.html | 9 ++++++ ietf/templates/meeting/materials.html | 1 + 7 files changed, 90 insertions(+), 12 deletions(-) create mode 100755 hack_pres.py diff --git a/hack_pres.py b/hack_pres.py new file mode 100755 index 000000000..9590229cd --- /dev/null +++ b/hack_pres.py @@ -0,0 +1,31 @@ +#!/usr/bin/python + +import os, sys +import django + +#basedir = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')) +#sys.path.insert(0, basedir) +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ietf.settings") + +django.setup() + +from django.db.utils import IntegrityError +from ietf.meeting.views import session_draft_list +from ietf.meeting.models import Meeting +from ietf.doc.models import Document + +m93 = Meeting.objects.get(number=93) + +for acronym in set(m93.agenda.scheduledsession_set.values_list('session__group__acronym',flat=True)): + for namerev in session_draft_list(93,acronym): + name=namerev[:-3] + rev = namerev[-2:] + doc = Document.objects.filter(docalias__name=name).first() + if not doc: + print "Can't find anything named",name + else: + for session in m93.session_set.filter(group__acronym=acronym): + try: + session.sessionpresentation_set.get_or_create(document=doc,rev=rev) + except IntegrityError: + print "No luck on ",acronym,"->",name,rev diff --git a/ietf/doc/views_doc.py b/ietf/doc/views_doc.py index efc5db1df..026fbc47e 100644 --- a/ietf/doc/views_doc.py +++ b/ietf/doc/views_doc.py @@ -299,6 +299,8 @@ def document_main(request, name, rev=None): status_changes = [ rel.document for rel in status_change_docs if rel.document.get_state_slug() in ('appr-sent','appr-pend')] proposed_status_changes = [ rel.document for rel in status_change_docs if rel.document.get_state_slug() in ('needshep','adrev','iesgeval','defer','appr-pr')] + presentations = doc.future_presentations() + # remaining actions actions = [] @@ -361,6 +363,7 @@ def document_main(request, name, rev=None): table_rows['stream'] += 1 if consensus else 0 table_rows['stream'] += 1 if shepherd_writeup or can_edit_shepherd_writeup else 0 table_rows['stream'] += 1 if published and started_iesg_process and published.time < started_iesg_process.time else 0 + table_rows['stream'] += 1 if presentations or can_edit_stream_info else 0 table_rows['iesg'] += 1 if iesg_state and (doc.note or can_edit) else 0 @@ -422,6 +425,7 @@ def document_main(request, name, rev=None): search_archive=search_archive, actions=actions, tracking_document=tracking_document, + presentations=presentations, ), context_instance=RequestContext(request)) @@ -540,13 +544,15 @@ def document_main(request, name, rev=None): if doc.type_id in ("slides", "agenda", "minutes"): can_manage_material = can_manage_materials(request.user, doc.group) - presentations = None - if doc.type_id=='slides' and doc.get_state_slug('slides')=='active' : - presentations = doc.future_presentations() + #presentations = None + #if doc.type_id=='slides' and doc.get_state_slug('slides')=='active' : + # presentations = doc.future_presentations() + presentations = doc.future_presentations() if doc.meeting_related(): - # disallow editing meeting-related stuff through this - # interface for the time being - can_manage_material = False + ## disallow editing meeting-related stuff through this + ## interface for the time being + # Now try allowing it + # can_manage_material = False basename = doc.canonical_name() # meeting materials are unversioned at the moment if doc.external_url: # we need to remove the extension for the globbing below to work diff --git a/ietf/doc/views_material.py b/ietf/doc/views_material.py index c1c5f6c3c..9747ae994 100644 --- a/ietf/doc/views_material.py +++ b/ietf/doc/views_material.py @@ -250,11 +250,15 @@ def get_upcoming_manageable_sessions(user, doc, acronym=None, date=None, seq=Non def edit_material_presentations(request, name, acronym=None, date=None, seq=None, week_day=None): doc = get_object_or_404(Document, name=name) - if not (doc.type_id=='slides' and doc.get_state('slides').slug=='active'): - raise Http404 + + # For now, allow any document type, in any state to be put on an agenda. + # if not (doc.type_id=='slides' and doc.get_state('slides').slug=='active'): + # raise Http404 group = doc.group - if not (group.features.has_materials and can_manage_materials(request.user,group)): + + #if not (group.features.has_materials and can_manage_materials(request.user,group)): + if not can_manage_materials(request.user,group): raise Http404 sorted_sessions = get_upcoming_manageable_sessions(request.user, doc, acronym, date, seq, week_day) @@ -301,11 +305,16 @@ def edit_material_presentations(request, name, acronym=None, date=None, seq=None def material_presentations(request, name, acronym=None, date=None, seq=None, week_day=None): doc = get_object_or_404(Document, name=name) - if not (doc.type_id=='slides' and doc.get_state('slides').slug=='active'): - raise Http404 + + # For now, allow any document type, in any state to be put on an agenda. + #if not (doc.type_id=='slides' and doc.get_state('slides').slug=='active'): + # raise Http404 group = doc.group - if not (group.features.has_materials and can_manage_materials(request.user,group)): + + #if not (group.features.has_materials and can_manage_materials(request.user,group)): + + if not can_manage_materials(request.user,group): raise Http404 sorted_sessions = get_upcoming_manageable_sessions(request.user, doc, acronym, date, seq, week_day) diff --git a/ietf/meeting/models.py b/ietf/meeting/models.py index bcecac490..02525e52d 100644 --- a/ietf/meeting/models.py +++ b/ietf/meeting/models.py @@ -895,6 +895,9 @@ class Session(models.Model): def slides(self): return list(self.materials.filter(type='slides').exclude(states__type='slides',states__slug='deleted').order_by('order')) + def drafts(self): + return list(self.materials.filter(type='draft')) + def __unicode__(self): if self.meeting.type_id == "interim": return self.meeting.number diff --git a/ietf/templates/doc/document_draft.html b/ietf/templates/doc/document_draft.html index 7cf63883f..58de392d4 100644 --- a/ietf/templates/doc/document_draft.html +++ b/ietf/templates/doc/document_draft.html @@ -196,6 +196,25 @@ {% endif %} + {% if presentations or can_edit_stream_info %} + + On Agenda + + {% if not snapshot and can_edit_stream_info %} + {% doc_edit_button "material_presentations" name=doc.name %} + {% endif %} + + + + {% if presentations %} + {% for pres in presentations %}{{ pres.session.short_name }} at {{ pres.session.meeting }} {% if pres.rev != doc.rev %}(version -{{ pres.rev }}){% endif %}{% if not forloop.last %}, {% endif %}{% endfor %} + {% else %} + None + {% endif %} + + + {% endif %} + Document shepherd diff --git a/ietf/templates/meeting/group_materials.html b/ietf/templates/meeting/group_materials.html index af8299d45..f5432b7c2 100644 --- a/ietf/templates/meeting/group_materials.html +++ b/ietf/templates/meeting/group_materials.html @@ -48,6 +48,15 @@ {% endfor %} {% endwith %} + + {% with session.drafts as drafts %} + {% for draft in drafts %} + {{ draft.canonical_name }}
+ {% empty %} + No drafts + {% endfor %} + {% endwith %} + {% endif %} diff --git a/ietf/templates/meeting/materials.html b/ietf/templates/meeting/materials.html index 36912db99..f5a015479 100644 --- a/ietf/templates/meeting/materials.html +++ b/ietf/templates/meeting/materials.html @@ -64,6 +64,7 @@ Agenda Minutes Slides + Drafts From 0db79011f273012332463e130035347c3720db2c Mon Sep 17 00:00:00 2001 From: Robert Sparks Date: Mon, 1 Feb 2016 16:32:36 +0000 Subject: [PATCH 2/3] Provide navigation for session requests from the meeting tab. - Legacy-Id: 10759 --- ietf/group/info.py | 4 ++++ ietf/templates/group/meetings-row.html | 12 +++++++++--- ietf/templates/group/meetings.html | 12 ++++++++++-- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/ietf/group/info.py b/ietf/group/info.py index 0ae939afd..6602d1ebf 100644 --- a/ietf/group/info.py +++ b/ietf/group/info.py @@ -59,6 +59,7 @@ from ietf.group.utils import can_manage_materials, get_group_or_404 from ietf.utils.pipe import pipe from ietf.settings import MAILING_LIST_INFO_URL from ietf.mailtrigger.utils import gather_relevant_expansions +from ietf.ietfauth.utils import has_role def roles(group, role_name): return Role.objects.filter(group=group, name=role_name).select_related("email", "person") @@ -764,10 +765,13 @@ def meetings(request, acronym=None, group_type=None): else: past.append(s) + can_edit = has_role(request.user,["Secretariat","Area Director"]) or group.has_role(request.user,["Chair","Secretary"]) + return render(request,'group/meetings.html', construct_group_menu_context(request, group, "meetings", group_type, { 'group':group, 'future':future, 'in_progress':in_progress, 'past':past, + 'can_edit':can_edit, })) diff --git a/ietf/templates/group/meetings-row.html b/ietf/templates/group/meetings-row.html index dff8cee5f..4643e97b2 100644 --- a/ietf/templates/group/meetings-row.html +++ b/ietf/templates/group/meetings-row.html @@ -18,10 +18,16 @@ {% else %} {{s.status}} {% endif %} + {% if show_request and s.meeting.type.slug == 'ietf' %} + {% if can_edit %} +
+ Edit Session Request + {% endif %} + {% endif %} - {% if s.minutes %}Minutes{% endif %} - {% if s.agenda %}Agenda{% endif %} - Materials + {% if s.minutes %}Minutes{% endif %} + {% if s.agenda %}Agenda{% endif %} + Materials {% endfor %} diff --git a/ietf/templates/group/meetings.html b/ietf/templates/group/meetings.html index 48f1bc641..68bedf9d3 100644 --- a/ietf/templates/group/meetings.html +++ b/ietf/templates/group/meetings.html @@ -6,13 +6,21 @@ {% block group_content %} {% origin %} + +
+Session requests +{% if can_edit %} +Request a session +{% endif %} +
+ {% if in_progress %}
Meetings in progress
- {% with in_progress as sessions %} + {% with sessions=in_progress show_request=True %} {% include "group/meetings-row.html" %} {% endwith %}
@@ -25,7 +33,7 @@ Future Meetings
- {% with future as sessions %} + {% with sessions=future show_request=True %} {% include "group/meetings-row.html" %} {% endwith %}
From a91ab77dbc02b032f2ee33097e6a76f46c44ff4e Mon Sep 17 00:00:00 2001 From: Robert Sparks Date: Mon, 1 Feb 2016 19:39:10 +0000 Subject: [PATCH 3/3] Provided navigation for managing materials from the group meeting and meeting session views - Legacy-Id: 10760 --- ietf/meeting/views.py | 16 ++++++- ietf/templates/meeting/session_details.html | 46 ++++++++++++++------- 2 files changed, 45 insertions(+), 17 deletions(-) diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index a89903390..d7c57f634 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -6,7 +6,7 @@ import re import tarfile import urllib from tempfile import mkstemp -from collections import OrderedDict +from collections import OrderedDict, Counter import csv import json @@ -25,6 +25,7 @@ from django.views.decorators.csrf import ensure_csrf_cookie from ietf.doc.models import Document, State from ietf.group.models import Group +from ietf.group.utils import can_manage_materials from ietf.ietfauth.utils import role_required, has_role from ietf.meeting.models import Meeting, Session, Schedule, Room from ietf.meeting.helpers import get_areas, get_person_by_email, get_schedule_by_name @@ -844,21 +845,32 @@ def session_details(request, num, acronym ): if not sessions: raise Http404 + type_counter = Counter() + for session in sessions: ss = session.timeslotassignments.filter(schedule=meeting.agenda).order_by('timeslot__time') if ss: session.time = ', '.join(x.timeslot.time.strftime("%A %b-%d-%Y %H%M") for x in ss) + if session.status.slug == 'canceled': + session.time += " CANCELLED" elif session.meeting.type_id=='interim': session.time = session.meeting.date.strftime("%A %b-%d-%Y") + if session.status.slug == 'canceled': + session.time += " CANCELLED" else: - session.time = 'Not yet scheduled' + session.time = session.status.name # TODO FIXME Deleted materials shouldn't be in the sessionpresentation_set session.filtered_sessionpresentation_set = [p for p in session.sessionpresentation_set.all() if p.document.get_state_slug(p.document.type_id)!='deleted'] + type_counter.update([p.document.type.slug for p in session.filtered_sessionpresentation_set]) + + can_manage = can_manage_materials(request.user, Group.objects.get(acronym=acronym)) return render(request, "meeting/session_details.html", { 'sessions':sessions , 'meeting' :meeting , 'acronym' :acronym, + 'can_manage_materials' : can_manage, + 'type_counter': type_counter, }) diff --git a/ietf/templates/meeting/session_details.html b/ietf/templates/meeting/session_details.html index b18065991..ade616a2a 100644 --- a/ietf/templates/meeting/session_details.html +++ b/ietf/templates/meeting/session_details.html @@ -9,23 +9,39 @@

{{ meeting }} : {{ acronym }}

{% for session in sessions %} -

{{ session.time }}{% if session.name %} : {{ session.name }}{% endif %}

+

{% if sessions|length > 1 %}Session {{ forloop.counter }} : {% endif %}{{ session.time }}{% if session.name %} : {{ session.name }}{% endif %}

+ + {% if can_manage_materials %} + {% if session.status.slug == 'sched' or session.status.slug == 'schedw' %} +
+ + Upload/Edit Materials + + {% if not type_counter.agenda %} + This session does not yet have an agenda + {% endif %} +
+ {% endif %} + {% endif %} {% if session.filtered_sessionpresentation_set %} -

Materials:

- - - {% for pres in session.filtered_sessionpresentation_set %} - {% if pres.document.type_id != 'bluesheets' and pres.document.type_id != 'recording' %} - - - - {% endif %} - {% endfor %} -
- {{pres.document.title}} ({{ pres.document.name }}-{{ pres.rev }}) - -
+
+
Materials:
+
+ + {% for pres in session.filtered_sessionpresentation_set %} + {% if pres.document.type_id != 'bluesheets' and pres.document.type_id != 'recording' %} + + + + {% endif %} + {% endfor %} +
+ {{pres.document.title}} ({{ pres.document.name }}-{{ pres.rev }}) + +
+
+
{% endif %} {% endfor %}