Nominations are processed first and then the rest of feedback.
Select multiple resizable when selecting a nominee. Fixed command that gets the feedback from email to retrieve the full address on the from header. Added a "feedback pending" link in the top bar. Fixed escaped html tags when displaying comments from feedback. See #975 - Legacy-Id: 5781
This commit is contained in:
parent
c12400641a
commit
49117c1622
|
@ -785,6 +785,9 @@ class MutableFeedbackForm(forms.ModelForm):
|
|||
if i.id == self.instance.id:
|
||||
self.feedback_type = i.type
|
||||
break
|
||||
a = self.fields['type']
|
||||
b = self.data
|
||||
c = self.add_prefix('type')
|
||||
self.feedback_type = self.feedback_type or self.fields['type'].clean(self.fields['type'].widget.value_from_datadict(self.data, self.files, self.add_prefix('type')))
|
||||
|
||||
self.initial['type'] = self.feedback_type
|
||||
|
|
|
@ -3,7 +3,7 @@ import tempfile
|
|||
|
||||
from django import template
|
||||
from django.conf import settings
|
||||
from django.template.defaultfilters import linebreaksbr
|
||||
from django.template.defaultfilters import linebreaksbr, force_escape
|
||||
|
||||
from ietf.utils.pipe import pipe
|
||||
from ietf.ietfauth.decorators import has_role
|
||||
|
@ -80,5 +80,5 @@ def decrypt(string, request, year, plain=False):
|
|||
return '<-Encripted text [Your private key is invalid]->'
|
||||
|
||||
if not plain:
|
||||
return linebreaksbr(out)
|
||||
return out
|
||||
return force_escape(linebreaksbr(out))
|
||||
return force_escape(out)
|
||||
|
|
|
@ -385,10 +385,10 @@ def parse_email(text):
|
|||
def create_feedback_email(nomcom, msg):
|
||||
from ietf.nomcom.models import Feedback
|
||||
by, subject, body = parse_email(msg)
|
||||
name, addr = parseaddr(by)
|
||||
#name, addr = parseaddr(by)
|
||||
|
||||
feedback = Feedback(nomcom=nomcom,
|
||||
author=addr,
|
||||
author=by,
|
||||
subject=subject or '',
|
||||
comments=body)
|
||||
feedback.save()
|
||||
|
|
|
@ -12,6 +12,7 @@ from django.shortcuts import render_to_response, get_object_or_404
|
|||
from django.template import RequestContext
|
||||
from django.template.loader import render_to_string
|
||||
from django.utils import simplejson
|
||||
from django.utils.datastructures import SortedDict
|
||||
from django.db.models import Count
|
||||
from django.forms.models import modelformset_factory, inlineformset_factory
|
||||
|
||||
|
@ -327,6 +328,7 @@ def private_feedback_email(request, year):
|
|||
nomcom=nomcom)
|
||||
if form.is_valid():
|
||||
form.save()
|
||||
form = FeedbackEmailForm(nomcom=nomcom)
|
||||
message = ('success', 'The feedback email has been registered.')
|
||||
|
||||
return render_to_response(template,
|
||||
|
@ -442,6 +444,7 @@ def view_feedback(request, year):
|
|||
@nomcom_private_key_required
|
||||
def view_feedback_pending(request, year):
|
||||
nomcom = get_nomcom_by_year(year)
|
||||
extra_ids = None
|
||||
message = None
|
||||
for message in get_messages(request):
|
||||
message = ('success', message.message)
|
||||
|
@ -468,33 +471,56 @@ def view_feedback_pending(request, year):
|
|||
success(request, 'Feedback saved')
|
||||
return HttpResponseRedirect(reverse('nomcom_view_feedback_pending', None, args=(year, )))
|
||||
elif request.method == 'POST' and request.POST.get('end'):
|
||||
extra_ids = request.POST.get('extra_ids', None)
|
||||
extra_step = True
|
||||
formset = FullFeedbackFormSet(request.POST)
|
||||
for form in formset.forms:
|
||||
form.set_nomcom(nomcom, request.user)
|
||||
if formset.is_valid():
|
||||
formset.save()
|
||||
success(request, 'Feedback saved')
|
||||
return HttpResponseRedirect(reverse('nomcom_view_feedback_pending', None, args=(year, )))
|
||||
if extra_ids:
|
||||
extra = []
|
||||
for key in extra_ids.split(','):
|
||||
id, pk_type = key.split(':')
|
||||
feedback = Feedback.objects.get(id=id)
|
||||
feedback.type_id = pk_type
|
||||
extra.append(feedback)
|
||||
formset = FullFeedbackFormSet(queryset=Feedback.objects.filter(id__in=[i.id for i in extra]))
|
||||
for form in formset.forms:
|
||||
form.set_nomcom(nomcom, request.user, extra)
|
||||
extra_ids = None
|
||||
else:
|
||||
success(request, 'Feedback saved')
|
||||
return HttpResponseRedirect(reverse('nomcom_view_feedback_pending', None, args=(year, )))
|
||||
elif request.method == 'POST':
|
||||
formset = FeedbackFormSet(request.POST)
|
||||
for form in formset.forms:
|
||||
form.set_nomcom(nomcom, request.user)
|
||||
if formset.is_valid():
|
||||
extra = []
|
||||
nominations = []
|
||||
moved = 0
|
||||
for form in formset.forms:
|
||||
if form.instance.type and form.instance.type.slug in settings.NOMINEE_FEEDBACK_TYPES:
|
||||
extra.append(form.instance)
|
||||
if form.instance.type.slug == 'nomina':
|
||||
nominations.append(form.instance)
|
||||
else:
|
||||
extra.append(form.instance)
|
||||
else:
|
||||
if form.instance.type:
|
||||
moved += 1
|
||||
form.save()
|
||||
if extra:
|
||||
if extra or nominations:
|
||||
extra_step = True
|
||||
formset = FullFeedbackFormSet(queryset=Feedback.objects.filter(id__in=[i.id for i in extra]))
|
||||
for form in formset.forms:
|
||||
form.set_nomcom(nomcom, request.user, extra)
|
||||
if nominations:
|
||||
formset = FullFeedbackFormSet(queryset=Feedback.objects.filter(id__in=[i.id for i in nominations]))
|
||||
for form in formset.forms:
|
||||
form.set_nomcom(nomcom, request.user, nominations)
|
||||
extra_ids = ','.join(['%s:%s' % (i.id, i.type.pk) for i in extra])
|
||||
else:
|
||||
formset = FullFeedbackFormSet(queryset=Feedback.objects.filter(id__in=[i.id for i in extra]))
|
||||
for form in formset.forms:
|
||||
form.set_nomcom(nomcom, request.user, extra)
|
||||
if moved:
|
||||
message = ('success', '%s messages classified. You must enter more information for the following feedback.' % moved)
|
||||
else:
|
||||
|
@ -504,13 +530,24 @@ def view_feedback_pending(request, year):
|
|||
formset = FeedbackFormSet(queryset=feedbacks)
|
||||
for form in formset.forms:
|
||||
form.set_nomcom(nomcom, request.user)
|
||||
type_dict = SortedDict({})
|
||||
for t in FeedbackType.objects.all().order_by('pk'):
|
||||
rest = t.name
|
||||
slug = rest[0]
|
||||
rest = rest[1:]
|
||||
while slug in type_dict and rest:
|
||||
slug = rest[0]
|
||||
rest = rest[1]
|
||||
type_dict[slug] = t
|
||||
return render_to_response('nomcom/view_feedback_pending.html',
|
||||
{'year': year,
|
||||
'selected': 'view_feedback',
|
||||
'selected': 'feedback_pending',
|
||||
'formset': formset,
|
||||
'message': message,
|
||||
'extra_step': extra_step,
|
||||
'default_type': default_type,
|
||||
'type_dict': type_dict,
|
||||
'extra_ids': extra_ids,
|
||||
'types': FeedbackType.objects.all().order_by('pk'),
|
||||
'nomcom': nomcom}, RequestContext(request))
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
{% if extra_step %}
|
||||
<th>Type</th>
|
||||
{% else %}
|
||||
<th>Unclassified</th>{% for t in types %}<th>{{ t }}</th>{% endfor %}
|
||||
<th style="text-align: center;">U</th>{% for t in type_dict.keys %}<th style="text-align: center;">{{ t }}</th>{% endfor %}
|
||||
{% endif %}
|
||||
<th>Author</th>
|
||||
<th>Subject</th>
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
{% if selected == "view_feedback" %}<span class="selected">View comments</span>{% else %}<a href="{% url nomcom_view_feedback year %}">View comments</a>{% endif %} |
|
||||
{% if selected == "private_key" %}<span class="selected">Private key</span>{% else %}<a href="{% url nomcom_private_key year %}">Private key</a>{% endif %}
|
||||
{% if user|is_chair:year %} |
|
||||
{% if selected == "feedback_pending" %}<span class="selected">Feedback Pending</span>{% else %}<a href="{% url nomcom_view_feedback_pending year %}">Feedback Pending</a>{% endif %} |
|
||||
{% if selected == "feedback_email" %}<span class="selected">Provide Email Feedback</span>{% else %}<a href="{% url nomcom_private_feedback_email year %}">Provide Email Feedback</a>{% endif %} |
|
||||
{% if selected == "merge" %}<span class="selected">Merge nominee email addr</span>{% else %}<a href="{% url nomcom_private_merge year %}">Merge nominee email addr</a>{% endif %} |
|
||||
{% if selected == "send_reminder_mail" %}<span class="selected">Send Reminder Mail</span>{% else %}<a href="{% url nomcom_send_reminder_mail year %}">Send reminder mail</a>{% endif %} |
|
||||
|
|
|
@ -6,10 +6,6 @@
|
|||
|
||||
{% block nomcom_content %}
|
||||
|
||||
{% if user|is_chair:year %}
|
||||
<p><a href="{% url nomcom_view_feedback_pending year %}">Feedback pending</a></p>
|
||||
{% endif %}
|
||||
|
||||
<h2>Feedback related to Nominees</h2>
|
||||
|
||||
<table class="ietf-table ietf-doctable">
|
||||
|
|
|
@ -5,8 +5,14 @@
|
|||
|
||||
{% block subtitle %} - Feeback pending{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
{% block pagehead %}
|
||||
<link rel="stylesheet" type="text/css" href="/css/jquery-ui-themes/jquery-ui-1.8.11.custom.css"></link>
|
||||
{% endblock %}
|
||||
|
||||
{% block js %}
|
||||
{{ block.super }}
|
||||
<script type="text/javascript" src="/js/jquery-ui-1.8.11.custom.min.js"></script>
|
||||
<script type="text/javascript">
|
||||
(function($) {
|
||||
$(document).ready(function() {
|
||||
$('.toggle .trigger').click(function() {
|
||||
|
@ -19,14 +25,14 @@
|
|||
}
|
||||
return false;
|
||||
});
|
||||
$('#feedbackformset select[multiple=multiple]').resizable();
|
||||
});
|
||||
})(jQuery);
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
{% block nomcom_content %}
|
||||
|
||||
<p>Back to <a href="{% url nomcom_view_feedback year %}">feedback index</a></p>
|
||||
|
||||
<h2>Feedback pending from email list</h2>
|
||||
|
||||
{% if message %}
|
||||
|
@ -40,6 +46,7 @@
|
|||
|
||||
<div>
|
||||
<form id="feedbackformset" action="" method="post">{% csrf_token %}
|
||||
{% if extra_ids %}<input type="hidden" name="extra_ids" value="{{ extra_ids }}" />{% endif %}
|
||||
<div class="sumit-row">
|
||||
{% if extra_step %}
|
||||
<input type="submit" value="Save feedback" name="end" />
|
||||
|
@ -49,6 +56,12 @@
|
|||
{% if default_type %}<input type="submit" name="move_to_default" value="Move all unclassified feedback to {{ default_type }}" />{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% if not extra_step %}
|
||||
<div class="legend" style="margin-bottom: 1em;">
|
||||
<h4 style="margin-bottom: 0px;">Feedback types</h4>
|
||||
(U) Unclassified, {% for legend, t in type_dict.items %}({{ legend }}) {{ t.name }}{% if not forloop.last %},{% endif %} {% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{{ formset.management_form }}
|
||||
<table class="ietf-table">
|
||||
{% include "nomcom/inc.feedback_pending_header.html" %}
|
||||
|
|
Loading…
Reference in a new issue