|
36 | 36 | import itertools |
37 | 37 | import re |
38 | 38 | from tempfile import mkstemp |
| 39 | +import datetime |
39 | 40 | from collections import OrderedDict |
40 | 41 |
|
41 | 42 | from django.shortcuts import render, redirect |
@@ -333,6 +334,8 @@ def construct_group_menu_context(request, group, selected, group_type, others): |
333 | 334 | entries.append(("About", urlreverse("group_about", kwargs=kwargs))) |
334 | 335 | if group.features.has_materials and get_group_materials(group).exists(): |
335 | 336 | entries.append(("Materials", urlreverse("ietf.group.info.materials", kwargs=kwargs))) |
| 337 | + if group.type_id in ('rg','wg'): |
| 338 | + entries.append(("Meetings", urlreverse("ietf.group.info.meetings", kwargs=kwargs))) |
336 | 339 | entries.append(("Email expansions", urlreverse("ietf.group.info.email", kwargs=kwargs))) |
337 | 340 | entries.append(("History", urlreverse("ietf.group.info.history", kwargs=kwargs))) |
338 | 341 | if group.features.has_documents: |
@@ -714,3 +717,47 @@ def email_aliases(request, acronym=None, group_type=None): |
714 | 717 |
|
715 | 718 | return render(request,'group/email_aliases.html',{'aliases':aliases,'ietf_domain':settings.IETF_DOMAIN,'group':group}) |
716 | 719 |
|
| 720 | +def meetings(request, acronym=None, group_type=None): |
| 721 | + group = get_group_or_404(acronym,group_type) if acronym else None |
| 722 | + |
| 723 | + four_years_ago = datetime.datetime.now()-datetime.timedelta(days=4*365) |
| 724 | + |
| 725 | + sessions = group.session_set.filter(status__in=['sched','schedw','appr','canceled'],meeting__date__gt=four_years_ago) |
| 726 | + |
| 727 | + def sort_key(session): |
| 728 | + if session.meeting.type.slug=='ietf': |
| 729 | + official_sessions = session.timeslotassignments.filter(schedule=session.meeting.agenda) |
| 730 | + if official_sessions: |
| 731 | + return official_sessions.first().timeslot.time |
| 732 | + elif session.meeting.date: |
| 733 | + return datetime.datetime.combine(session.meeting.date,datetime.datetime.min.time()) |
| 734 | + else: |
| 735 | + return session.requested |
| 736 | + else: |
| 737 | + # TODO: use timeslots for interims once they have them |
| 738 | + return datetime.datetime.combine(session.meeting.date,datetime.datetime.min.time()) |
| 739 | + |
| 740 | + for s in sessions: |
| 741 | + s.time=sort_key(s) |
| 742 | + |
| 743 | + sessions = sorted(sessions,key=lambda s:s.time,reverse=True) |
| 744 | + |
| 745 | + today = datetime.date.today() |
| 746 | + future = [] |
| 747 | + in_progress = [] |
| 748 | + past = [] |
| 749 | + for s in sessions: |
| 750 | + if s.meeting.date > today: |
| 751 | + future.append(s) |
| 752 | + elif s.meeting.end_date() >= today: |
| 753 | + in_progress.append(s) |
| 754 | + else: |
| 755 | + past.append(s) |
| 756 | + |
| 757 | + return render(request,'group/meetings.html', |
| 758 | + construct_group_menu_context(request, group, "meetings", group_type, { |
| 759 | + 'group':group, |
| 760 | + 'future':future, |
| 761 | + 'in_progress':in_progress, |
| 762 | + 'past':past, |
| 763 | + })) |
0 commit comments