added send announcement view
- Legacy-Id: 11130
This commit is contained in:
parent
f46fdcfa14
commit
ba75fad3b5
|
@ -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
|
|
@ -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'''
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
11
ietf/templates/meeting/interim_announcement.txt
Normal file
11
ietf/templates/meeting/interim_announcement.txt
Normal 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]
|
|
@ -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 %}
|
||||
|
||||
|
|
Loading…
Reference in a new issue