Skip to content

Commit d298785

Browse files
committed
Merged in ^/branch/amsl/interim@11230, which provides interim meeting management support. Also fixes issues ietf-tools#1961, ietf-tools#1962 and ietf-tools#1964.
- Legacy-Id: 11402
3 parents 688ffa4 + ead0056 + 0b4d3b5 commit d298785

44 files changed

Lines changed: 3242 additions & 68 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

ietf/bin/interim_minutes_reminder

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
# -*- Python -*-
4+
#
5+
'''
6+
This script calls ietf.meeting.helpers.check_interim_minutes() which sends
7+
a reminder email for interim meetings that occurred 10 days ago but still
8+
don't have minutes.
9+
'''
10+
11+
# Set PYTHONPATH and load environment variables for standalone script -----------------
12+
import os, sys
13+
basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../.."))
14+
sys.path = [ basedir ] + sys.path
15+
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ietf.settings")
16+
17+
import django
18+
django.setup()
19+
# -------------------------------------------------------------------------------------
20+
21+
from ietf.meeting.helpers import check_interim_minutes
22+
23+
check_interim_minutes()

ietf/doc/models.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ def href(self):
120120

121121
meeting = None
122122
if meeting_related:
123-
meeting = self.name.split("-")[1]
123+
meeting = self.session_set.first().meeting
124124

125125
return format.format(doc=self,meeting=meeting)
126126

@@ -388,15 +388,7 @@ def get_absolute_url(self):
388388
filename = os.path.splitext(self.external_url)[0]
389389
else:
390390
filename = self.external_url
391-
if meeting.type_id == 'ietf':
392-
url = '%sproceedings/%s/%s/%s' % (settings.IETF_HOST_URL,meeting.number,self.type_id,filename)
393-
elif meeting.type_id == 'interim':
394-
url = "%sproceedings/interim/%s/%s/%s/%s" % (
395-
settings.IETF_HOST_URL,
396-
meeting.date.strftime('%Y/%m/%d'),
397-
session.group.acronym,
398-
self.type_id,
399-
filename)
391+
url = '%sproceedings/%s/%s/%s' % (settings.IETF_HOST_URL,meeting.number,self.type_id,filename)
400392
return url
401393
return urlreverse('doc_view', kwargs={ 'name': name }, urlconf="ietf.urls")
402394

ietf/doc/templatetags/ietf_filters.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
import textwrap
44
import re
55
import datetime
6+
import os
67
import types
78
from email.utils import parseaddr
89

910
import debug # pyflakes:ignore
1011

1112
from ietf.doc.models import ConsensusDocEvent
13+
from ietf.doc.utils import get_document_content
1214
from django import template
1315
from django.conf import settings
1416
from django.utils.html import escape, fix_ampersands
@@ -590,3 +592,27 @@ def urlize_html(html, autoescape=False):
590592
def emailwrap(email):
591593
email = str(email)
592594
return mark_safe(email.replace('@', '<wbr>@'))
595+
596+
@register.filter
597+
def document_content(doc):
598+
if doc is None:
599+
return None
600+
path = os.path.join(doc.get_file_path(),doc.filename_with_rev())
601+
return get_document_content(doc.name,path,markup=False)
602+
603+
@register.filter
604+
def session_start_time(session):
605+
timeslot = session.official_timeslotassignment().timeslot
606+
return timeslot.time
607+
608+
@register.filter
609+
def session_end_time(session):
610+
timeslot = session.official_timeslotassignment().timeslot
611+
return timeslot.time + timeslot.duration
612+
613+
@register.filter
614+
def format_timedelta(timedelta):
615+
s = timedelta.seconds
616+
hours, remainder = divmod(s, 3600)
617+
minutes, seconds = divmod(remainder, 60)
618+
return '{hours:02d}:{minutes:02d}'.format(hours=hours,minutes=minutes)
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals
3+
4+
from django.db import migrations
5+
6+
7+
def make_recipients(apps):
8+
Recipient = apps.get_model('mailtrigger', 'Recipient')
9+
10+
rc = Recipient.objects.create
11+
12+
rc(slug='group_secretaries',
13+
desc="The group's secretaries",
14+
template=None)
15+
16+
17+
def make_mailtriggers(apps):
18+
Recipient = apps.get_model('mailtrigger','Recipient')
19+
MailTrigger = apps.get_model('mailtrigger','MailTrigger')
20+
21+
def mt_factory(slug,desc,to_slugs,cc_slugs=[]):
22+
23+
# Try to protect ourselves from typos
24+
all_slugs = to_slugs[:]
25+
all_slugs.extend(cc_slugs)
26+
for recipient_slug in all_slugs:
27+
try:
28+
Recipient.objects.get(slug=recipient_slug)
29+
except Recipient.DoesNotExist:
30+
print "****Some rule tried to use",recipient_slug
31+
raise
32+
33+
m = MailTrigger.objects.create(slug=slug, desc=desc)
34+
m.to = Recipient.objects.filter(slug__in=to_slugs)
35+
m.cc = Recipient.objects.filter(slug__in=cc_slugs)
36+
37+
mt_factory(slug='session_minutes_reminder',
38+
desc="Recipients when a group is sent a reminder "
39+
"to submit minutes for a session",
40+
to_slugs=['group_chairs','group_secretaries'],
41+
cc_slugs=['group_responsible_directors']
42+
)
43+
44+
def forward(apps, schema_editor):
45+
make_recipients(apps)
46+
make_mailtriggers(apps)
47+
48+
49+
class Migration(migrations.Migration):
50+
dependencies = [
51+
('mailtrigger', '0003_merge_request_trigger'),
52+
]
53+
54+
operations = [migrations.RunPython(forward)]

ietf/mailtrigger/models.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,14 @@ def gather_group_responsible_directors(self, **kwargs):
157157
addrs.extend(Recipient.objects.get(slug='stream_managers').gather(**{'streams':['irtf']}))
158158
return addrs
159159

160+
def gather_group_secretaries(self, **kwargs):
161+
addrs = []
162+
if 'group' in kwargs:
163+
group = kwargs['group']
164+
if not group.acronym=='none':
165+
addrs.extend(group.role_set.filter(name='secr').values_list('email__address',flat=True))
166+
return addrs
167+
160168
def gather_doc_group_responsible_directors(self, **kwargs):
161169
addrs = []
162170
if 'doc' in kwargs:

0 commit comments

Comments
 (0)