Skip to content

Commit ba75fad

Browse files
committed
added send announcement view
- Legacy-Id: 11130
1 parent f46fdcf commit ba75fad

7 files changed

Lines changed: 115 additions & 9 deletions

File tree

ietf/meeting/forms.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from ietf.ietfauth.utils import has_role
1212
from ietf.meeting.models import Session, countries, timezones
1313
from ietf.meeting.helpers import assign_interim_session
14+
from ietf.message.models import Message
1415
from ietf.utils.fields import DatepickerDateField
1516

1617
# need to insert empty option for use in ChoiceField
@@ -156,13 +157,13 @@ def set_group_options(self):
156157
if has_role(self.user, "Secretariat"):
157158
return # don't reduce group options
158159
if has_role(self.user, "Area Director"):
159-
queryset = Group.objects.filter(type="wg", state="active").order_by('acronym')
160+
queryset = Group.objects.filter(type="wg", state__in=("active","proposed")).order_by('acronym')
160161
elif has_role(self.user, "IRTF Chair"):
161-
queryset = Group.objects.filter(type="rg", state="active").order_by('acronym')
162+
queryset = Group.objects.filter(type="rg", state__in=("active","proposed")).order_by('acronym')
162163
elif has_role(self.user, "WG Chair"):
163-
queryset = Group.objects.filter(type="wg", state="active", role__person=self.person, role__name="chair").distinct().order_by('acronym')
164+
queryset = Group.objects.filter(type="wg", state__in=("active","proposed"), role__person=self.person, role__name="chair").distinct().order_by('acronym')
164165
elif has_role(self.user, "RG Chair"):
165-
queryset = Group.objects.filter(type="rg", state="active", role__person=self.person, role__name="chair").distinct().order_by('acronym')
166+
queryset = Group.objects.filter(type="rg", state__in=("active","proposed"), role__person=self.person, role__name="chair").distinct().order_by('acronym')
166167
self.fields['group'].queryset = queryset
167168

168169
# if there's only one possibility make it the default
@@ -216,3 +217,20 @@ def save(self, request, group, meeting, is_approved):
216217

217218
if agenda:
218219
self._save_agenda(agenda)
220+
221+
class InterimAnnounceForm(forms.ModelForm):
222+
223+
class Meta:
224+
model = Message
225+
fields = ('to','frm','cc','bcc','reply_to','subject','body')
226+
227+
#def __init__(self):
228+
# super(InterimAnnounceForm, self).__init__(*args,**kwargs)
229+
230+
def save(self, *args, **kwargs):
231+
user = kwargs.pop('user')
232+
message = super(InterimAnnounceForm, self).save(commit=False)
233+
message.by = user.person
234+
message.save()
235+
236+
return message

ietf/meeting/helpers.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from django.core.cache import cache
1212
from django.utils.cache import get_cache_key
1313
from django.shortcuts import get_object_or_404
14+
from django.template.loader import render_to_string
1415

1516
import debug # pyflakes:ignore
1617

@@ -289,6 +290,22 @@ def session_constraint_expire(request,session):
289290
# -------------------------------------------------
290291
# Interim Meeting Helpers
291292
# -------------------------------------------------
293+
def get_announcement_initial(meeting):
294+
'''Returns a dictionary suitable to initialize an InterimAnnouncementForm (Message ModelForm)'''
295+
group = meeting.session_set.first().group
296+
in_person = bool(meeting.city)
297+
initial = {}
298+
initial['to'] = settings.INTERIM_ANNOUNCE_TO_EMAIL
299+
initial['cc'] = group.list_email
300+
initial['frm'] = settings.INTERIM_ANNOUNCE_FROM_EMAIL
301+
if in_person:
302+
desc = 'Interim'
303+
else:
304+
desc = 'Virtual'
305+
initial['subject'] = '%s (%s) WG %s Meeting: %s' % (group.name,group.acronym,desc,meeting.date)
306+
body = render_to_string('meeting/interim_announcement.txt', locals())
307+
initial['body'] = body
308+
return initial
292309

293310
def get_earliest_session(session_formset):
294311
'''Return earliest InterimSessionForm from formset'''

ietf/meeting/tests_views.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@
1313
from ietf.doc.models import Document
1414
from ietf.group.models import Group
1515
from ietf.meeting.helpers import can_approve_interim_request, can_view_interim_request
16+
from ietf.meeting.helpers import get_announcement_initial
1617
from ietf.meeting.models import Session, TimeSlot, Meeting
1718
from ietf.meeting.test_data import make_meeting_test_data
1819
from ietf.name.models import SessionStatusName
1920
from ietf.utils.test_utils import TestCase, login_testing_unauthorized, unicontent
21+
from ietf.utils.mail import outbox
2022

2123
class MeetingTests(TestCase):
2224
def setUp(self):
@@ -363,7 +365,7 @@ def check_interim_tabs(self, url):
363365
self.assertEqual(len(q("a:contains('Announce')")),0)
364366
self.client.logout()
365367
# secretariat
366-
username = "ad"
368+
username = "secretary"
367369
self.client.login(username=username, password= username + "+password")
368370
r = self.client.get(url)
369371
q = PyQuery(r.content)
@@ -390,6 +392,13 @@ def test_interim_send_announcement(self):
390392
login_testing_unauthorized(self,"secretary",url)
391393
r = self.client.get(url)
392394
self.assertEqual(r.status_code, 200)
395+
initial = r.context['form'].initial
396+
# send announcement
397+
len_before = len(outbox)
398+
r = self.client.post(url,initial)
399+
self.assertRedirects(r,urlreverse('ietf.meeting.views.interim_announce'))
400+
self.assertEqual(len(outbox),len_before+1)
401+
self.assertTrue('WG Virtual Meeting' in outbox[-1]['Subject'])
393402

394403
def test_interim_approve(self):
395404
make_meeting_test_data()

ietf/meeting/views.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,12 @@
3939
from ietf.meeting.helpers import convert_draft_to_pdf, get_earliest_session
4040
from ietf.meeting.helpers import create_interim_meeting_from_forms
4141
from ietf.meeting.helpers import can_view_interim_request, can_approve_interim_request
42-
from ietf.meeting.helpers import can_request_interim_meeting
42+
from ietf.meeting.helpers import can_request_interim_meeting, get_announcement_initial
43+
from ietf.utils.mail import send_mail_message
4344
from ietf.utils.pipe import pipe
4445
from ietf.utils.pdf import pdf_pages
4546

46-
from .forms import InterimRequestForm, InterimSessionForm
47+
from .forms import InterimRequestForm, InterimSessionForm, InterimAnnounceForm
4748

4849

4950
def get_menu_entries(request):
@@ -930,8 +931,23 @@ def interim_announce(request):
930931
def interim_send_announcement(request,number):
931932
'''View for sending the announcement of a new interim meeting'''
932933
meeting = get_object_or_404(Meeting,number=number)
934+
group = meeting.session_set.first().group
935+
936+
if request.method == 'POST':
937+
form = InterimAnnounceForm(request.POST, initial=get_announcement_initial(meeting))
938+
if form.is_valid():
939+
message = form.save(user=request.user)
940+
message.related_groups.add(group)
941+
meeting.session_set.update(status_id='sched')
942+
send_mail_message(request,message)
943+
messages.success(request, 'Interim meeting announcement sent')
944+
return redirect(interim_announce)
933945

934-
return render(request, "meeting/interim_send_announcement.html")
946+
form = InterimAnnounceForm(initial=get_announcement_initial(meeting))
947+
948+
return render(request, "meeting/interim_send_announcement.html", {
949+
'meeting': meeting,
950+
'form': form})
935951

936952
@role_required('Area Director','Secretariat','IRTF Chair','WG Chair','RG Chair')
937953
def interim_pending(request):
@@ -940,7 +956,6 @@ def interim_pending(request):
940956
menu_entries = get_menu_entries(request)
941957
selected_menu_entry = 'pending'
942958

943-
944959
meetings = [ m for m in meetings if can_view_interim_request(m,request.user)]
945960
for meeting in meetings:
946961
if can_approve_interim_request(meeting,request.user):

ietf/settings.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,10 @@ def skip_unreadable_post(record):
462462
IDSUBMIT_ANNOUNCE_FROM_EMAIL = 'internet-drafts@ietf.org'
463463
IDSUBMIT_ANNOUNCE_LIST_EMAIL = 'i-d-announce@ietf.org'
464464

465+
# Interim Meeting Tool settings
466+
INTERIM_ANNOUNCE_FROM_EMAIL = 'IESG Secretary <iesg-secretary@ietf.org>'
467+
INTERIM_ANNOUNCE_TO_EMAIL = 'IETF Announcement List <ietf-announce@ietf.org>'
468+
465469
# Days from meeting to day of cut off dates on submit -- cutoff_time_utc is added to this
466470
IDSUBMIT_DEFAULT_CUTOFF_DAY_OFFSET_00 = 13
467471
IDSUBMIT_DEFAULT_CUTOFF_DAY_OFFSET_01 = 13
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
The {{ group.name }} ({{ group.acronym }}) Working Group will hold a
2+
virtual interim meeting on {{ meeting.date }} from {{ start }} to
3+
{{ end }} UTC.
4+
5+
Agenda:
6+
[AGENDA]
7+
8+
To join the interim meeting:
9+
{{ meeting.session_set.all.0.remote_instructions }}
10+
11+
[ADDITIONAL INFORMATION]

ietf/templates/meeting/interim_send_announcement.html

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,38 @@
1414
{% origin %}
1515
<h1>Announce Interim Meeting</h1>
1616

17+
<form method="post" role="form" class="form-horizontal">
18+
{% csrf_token %}
19+
20+
<div class="fieldset" >
21+
22+
<div class="form-group">
23+
<label for="id_to" class="col-md-2 control-label">To</label>
24+
<div class="col-md-10">{% render_field form.to class="form-control" readonly="readonly" %}</div>
25+
</div>
26+
<div class="form-group">
27+
<label for="id_cc" class="col-md-2 control-label">Cc</label>
28+
<div class="col-md-10">{% render_field form.cc class="form-control" %}</div>
29+
</div>
30+
<div class="form-group">
31+
<label for="id_from" class="col-md-2 control-label">From</label>
32+
<div class="col-md-10">{% render_field form.frm class="form-control" readonly="readonly" %}</div>
33+
</div>
34+
<div class="form-group">
35+
<label for="id_subject" class="col-md-2 control-label">Subject</label>
36+
<div class="col-md-10">{% render_field form.subject class="form-control" readonly="readonly" %}</div>
37+
</div>
38+
<div class="form-group">
39+
<label for="id_body" class="col-md-2 control-label">Body</label>
40+
<div class="col-md-10">{% render_field form.body class="form-control" %}</div>
41+
</div>
42+
43+
</div> <!-- fieldset -->
44+
45+
<input class="btn btn-default" type="submit" value="Send" name='send' />
46+
<a class="btn btn-danger pull-right" href="{% url 'ietf.meeting.views.interim_announce' %}">Cancel</a>
47+
48+
</form>
1749

1850
{% endblock %}
1951

0 commit comments

Comments
 (0)