added send announcement view

- Legacy-Id: 11130
This commit is contained in:
Ryan Cross 2016-04-22 23:14:35 +00:00
parent f46fdcfa14
commit ba75fad3b5
7 changed files with 115 additions and 9 deletions

View file

@ -11,6 +11,7 @@ from ietf.group.models import Group
from ietf.ietfauth.utils import has_role
from ietf.meeting.models import Session, countries, timezones
from ietf.meeting.helpers import assign_interim_session
from ietf.message.models import Message
from ietf.utils.fields import DatepickerDateField
# need to insert empty option for use in ChoiceField
@ -156,13 +157,13 @@ class InterimRequestForm(forms.Form):
if has_role(self.user, "Secretariat"):
return # don't reduce group options
if has_role(self.user, "Area Director"):
queryset = Group.objects.filter(type="wg", state="active").order_by('acronym')
queryset = Group.objects.filter(type="wg", state__in=("active","proposed")).order_by('acronym')
elif has_role(self.user, "IRTF Chair"):
queryset = Group.objects.filter(type="rg", state="active").order_by('acronym')
queryset = Group.objects.filter(type="rg", state__in=("active","proposed")).order_by('acronym')
elif has_role(self.user, "WG Chair"):
queryset = Group.objects.filter(type="wg", state="active", role__person=self.person, role__name="chair").distinct().order_by('acronym')
queryset = Group.objects.filter(type="wg", state__in=("active","proposed"), role__person=self.person, role__name="chair").distinct().order_by('acronym')
elif has_role(self.user, "RG Chair"):
queryset = Group.objects.filter(type="rg", state="active", role__person=self.person, role__name="chair").distinct().order_by('acronym')
queryset = Group.objects.filter(type="rg", state__in=("active","proposed"), role__person=self.person, role__name="chair").distinct().order_by('acronym')
self.fields['group'].queryset = queryset
# if there's only one possibility make it the default
@ -216,3 +217,20 @@ class InterimSessionForm(forms.Form):
if agenda:
self._save_agenda(agenda)
class InterimAnnounceForm(forms.ModelForm):
class Meta:
model = Message
fields = ('to','frm','cc','bcc','reply_to','subject','body')
#def __init__(self):
# super(InterimAnnounceForm, self).__init__(*args,**kwargs)
def save(self, *args, **kwargs):
user = kwargs.pop('user')
message = super(InterimAnnounceForm, self).save(commit=False)
message.by = user.person
message.save()
return message

View file

@ -11,6 +11,7 @@ from django.conf import settings
from django.core.cache import cache
from django.utils.cache import get_cache_key
from django.shortcuts import get_object_or_404
from django.template.loader import render_to_string
import debug # pyflakes:ignore
@ -289,6 +290,22 @@ def session_constraint_expire(request,session):
# -------------------------------------------------
# Interim Meeting Helpers
# -------------------------------------------------
def get_announcement_initial(meeting):
'''Returns a dictionary suitable to initialize an InterimAnnouncementForm (Message ModelForm)'''
group = meeting.session_set.first().group
in_person = bool(meeting.city)
initial = {}
initial['to'] = settings.INTERIM_ANNOUNCE_TO_EMAIL
initial['cc'] = group.list_email
initial['frm'] = settings.INTERIM_ANNOUNCE_FROM_EMAIL
if in_person:
desc = 'Interim'
else:
desc = 'Virtual'
initial['subject'] = '%s (%s) WG %s Meeting: %s' % (group.name,group.acronym,desc,meeting.date)
body = render_to_string('meeting/interim_announcement.txt', locals())
initial['body'] = body
return initial
def get_earliest_session(session_formset):
'''Return earliest InterimSessionForm from formset'''

View file

@ -13,10 +13,12 @@ from pyquery import PyQuery
from ietf.doc.models import Document
from ietf.group.models import Group
from ietf.meeting.helpers import can_approve_interim_request, can_view_interim_request
from ietf.meeting.helpers import get_announcement_initial
from ietf.meeting.models import Session, TimeSlot, Meeting
from ietf.meeting.test_data import make_meeting_test_data
from ietf.name.models import SessionStatusName
from ietf.utils.test_utils import TestCase, login_testing_unauthorized, unicontent
from ietf.utils.mail import outbox
class MeetingTests(TestCase):
def setUp(self):
@ -363,7 +365,7 @@ class InterimTests(TestCase):
self.assertEqual(len(q("a:contains('Announce')")),0)
self.client.logout()
# secretariat
username = "ad"
username = "secretary"
self.client.login(username=username, password= username + "+password")
r = self.client.get(url)
q = PyQuery(r.content)
@ -390,6 +392,13 @@ class InterimTests(TestCase):
login_testing_unauthorized(self,"secretary",url)
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
initial = r.context['form'].initial
# send announcement
len_before = len(outbox)
r = self.client.post(url,initial)
self.assertRedirects(r,urlreverse('ietf.meeting.views.interim_announce'))
self.assertEqual(len(outbox),len_before+1)
self.assertTrue('WG Virtual Meeting' in outbox[-1]['Subject'])
def test_interim_approve(self):
make_meeting_test_data()

View file

@ -39,11 +39,12 @@ from ietf.meeting.helpers import preprocess_assignments_for_agenda, read_agenda_
from ietf.meeting.helpers import convert_draft_to_pdf, get_earliest_session
from ietf.meeting.helpers import create_interim_meeting_from_forms
from ietf.meeting.helpers import can_view_interim_request, can_approve_interim_request
from ietf.meeting.helpers import can_request_interim_meeting
from ietf.meeting.helpers import can_request_interim_meeting, get_announcement_initial
from ietf.utils.mail import send_mail_message
from ietf.utils.pipe import pipe
from ietf.utils.pdf import pdf_pages
from .forms import InterimRequestForm, InterimSessionForm
from .forms import InterimRequestForm, InterimSessionForm, InterimAnnounceForm
def get_menu_entries(request):
@ -930,8 +931,23 @@ def interim_announce(request):
def interim_send_announcement(request,number):
'''View for sending the announcement of a new interim meeting'''
meeting = get_object_or_404(Meeting,number=number)
group = meeting.session_set.first().group
if request.method == 'POST':
form = InterimAnnounceForm(request.POST, initial=get_announcement_initial(meeting))
if form.is_valid():
message = form.save(user=request.user)
message.related_groups.add(group)
meeting.session_set.update(status_id='sched')
send_mail_message(request,message)
messages.success(request, 'Interim meeting announcement sent')
return redirect(interim_announce)
return render(request, "meeting/interim_send_announcement.html")
form = InterimAnnounceForm(initial=get_announcement_initial(meeting))
return render(request, "meeting/interim_send_announcement.html", {
'meeting': meeting,
'form': form})
@role_required('Area Director','Secretariat','IRTF Chair','WG Chair','RG Chair')
def interim_pending(request):
@ -940,7 +956,6 @@ def interim_pending(request):
menu_entries = get_menu_entries(request)
selected_menu_entry = 'pending'
meetings = [ m for m in meetings if can_view_interim_request(m,request.user)]
for meeting in meetings:
if can_approve_interim_request(meeting,request.user):

View file

@ -462,6 +462,10 @@ IDSUBMIT_FROM_EMAIL = 'IETF I-D Submission Tool <idsubmission@ietf.org>'
IDSUBMIT_ANNOUNCE_FROM_EMAIL = 'internet-drafts@ietf.org'
IDSUBMIT_ANNOUNCE_LIST_EMAIL = 'i-d-announce@ietf.org'
# Interim Meeting Tool settings
INTERIM_ANNOUNCE_FROM_EMAIL = 'IESG Secretary <iesg-secretary@ietf.org>'
INTERIM_ANNOUNCE_TO_EMAIL = 'IETF Announcement List <ietf-announce@ietf.org>'
# Days from meeting to day of cut off dates on submit -- cutoff_time_utc is added to this
IDSUBMIT_DEFAULT_CUTOFF_DAY_OFFSET_00 = 13
IDSUBMIT_DEFAULT_CUTOFF_DAY_OFFSET_01 = 13

View file

@ -0,0 +1,11 @@
The {{ group.name }} ({{ group.acronym }}) Working Group will hold a
virtual interim meeting on {{ meeting.date }} from {{ start }} to
{{ end }} UTC.
Agenda:
[AGENDA]
To join the interim meeting:
{{ meeting.session_set.all.0.remote_instructions }}
[ADDITIONAL INFORMATION]

View file

@ -14,6 +14,38 @@
{% origin %}
<h1>Announce Interim Meeting</h1>
<form method="post" role="form" class="form-horizontal">
{% csrf_token %}
<div class="fieldset" >
<div class="form-group">
<label for="id_to" class="col-md-2 control-label">To</label>
<div class="col-md-10">{% render_field form.to class="form-control" readonly="readonly" %}</div>
</div>
<div class="form-group">
<label for="id_cc" class="col-md-2 control-label">Cc</label>
<div class="col-md-10">{% render_field form.cc class="form-control" %}</div>
</div>
<div class="form-group">
<label for="id_from" class="col-md-2 control-label">From</label>
<div class="col-md-10">{% render_field form.frm class="form-control" readonly="readonly" %}</div>
</div>
<div class="form-group">
<label for="id_subject" class="col-md-2 control-label">Subject</label>
<div class="col-md-10">{% render_field form.subject class="form-control" readonly="readonly" %}</div>
</div>
<div class="form-group">
<label for="id_body" class="col-md-2 control-label">Body</label>
<div class="col-md-10">{% render_field form.body class="form-control" %}</div>
</div>
</div> <!-- fieldset -->
<input class="btn btn-default" type="submit" value="Send" name='send' />
<a class="btn btn-danger pull-right" href="{% url 'ietf.meeting.views.interim_announce' %}">Cancel</a>
</form>
{% endblock %}