Merge position and nominee into one field in the feedback pending forms.

Style the feedback pending forms. 
See #975
 - Legacy-Id: 5668
This commit is contained in:
Emilio A. Sánchez López 2013-04-19 07:46:23 +00:00
parent 5a0963b78c
commit 6898c51490
3 changed files with 88 additions and 8 deletions

View file

@ -73,6 +73,27 @@ class PositionNomineeField(forms.ChoiceField):
return (position, nominee)
class MultiplePositionNomineeField(forms.MultipleChoiceField, PositionNomineeField):
def clean(self, value):
nominees = super(PositionNomineeField, self).clean(value)
result = []
for nominee in nominees:
if not nominee:
return nominee
(position_id, nominee_id) = nominee.split('_')
try:
position = Position.objects.get_by_nomcom(self.nomcom).opened().get(id=position_id)
except Position.DoesNotExist:
raise forms.ValidationError('Invalid nominee')
try:
nominee = position.nominee_set.get_by_nomcom(self.nomcom).get(id=nominee_id)
except Nominee.DoesNotExist:
raise forms.ValidationError('Invalid nominee')
result.append((position, nominee))
return result
class BaseNomcomForm(object):
def __unicode__(self):
return self.as_div()
@ -712,3 +733,31 @@ class PrivateKeyForm(BaseNomcomForm, forms.Form):
key = forms.CharField(label='Private key', widget=forms.Textarea(), required=False)
fieldsets = [('Private key', ('key',))]
class PendingFeedbackForm(BaseNomcomForm, forms.ModelForm):
class Meta:
model = Feedback
fields = ('author', 'type', 'nominee')
def set_nomcom(self, nomcom, user):
self.nomcom = nomcom
self.user = user
self.fields['nominee'] = MultiplePositionNomineeField(nomcom=self.nomcom, required=True, widget=forms.SelectMultiple)
def save(self, commit=True):
feedback = super(PendingFeedbackForm, self).save(commit=False)
author = get_user_email(self.user)
if author:
feedback.author = author
feedback.nomcom = self.nomcom
feedback.user = self.user
feedback.save()
self.save_m2m()
for (position, nominee) in self.cleaned_data['nominee']:
feedback.nominees.add(nominee)
feedback.positions.add(position)

View file

@ -22,7 +22,7 @@ from ietf.name.models import NomineePositionState, FeedbackType
from ietf.nomcom.decorators import member_required, private_key_required
from ietf.nomcom.forms import (NominateForm, FeedbackForm, QuestionnaireForm,
MergeForm, NomComTemplateForm, PositionForm,
PrivateKeyForm, EditNomcomForm)
PrivateKeyForm, EditNomcomForm, PendingFeedbackForm)
from ietf.nomcom.models import Position, NomineePosition, Nominee, Feedback, NomCom
from ietf.nomcom.utils import (get_nomcom_by_year, HOME_TEMPLATE,
store_nomcom_private_key, get_hash_nominee_position,
@ -394,6 +394,7 @@ def view_feedback_pending(request, year):
nomcom = get_nomcom_by_year(year)
message = None
FeedbackFormSet = modelformset_factory(Feedback,
form=PendingFeedbackForm,
exclude=('nomcom', 'comments'),
extra=0)
feedbacks = Feedback.objects.filter(Q(type__isnull=True) |
@ -401,11 +402,18 @@ def view_feedback_pending(request, year):
Q(positions__isnull=True))
if request.method == 'POST':
formset = FeedbackFormSet(request.POST)
for form in formset.forms:
form.set_nomcom(nomcom, request.user)
if formset.is_valid():
formset.save()
message = ('success', 'The feedbacks has been saved.')
formset = FeedbackFormSet(queryset=feedbacks)
for form in formset.forms:
form.set_nomcom(nomcom, request.user)
else:
formset = FeedbackFormSet(queryset=feedbacks)
for form in formset.forms:
form.set_nomcom(nomcom, request.user)
return render_to_response('nomcom/view_feedback_pending.html',
{'year': year,
'selected': 'view_feedback',

View file

@ -19,20 +19,43 @@
<form id="feedbackformset" action="" method="post">{% csrf_token %}
{{ formset.management_form }}
{% for form in formset.forms %}
<h3 class="ietf-divider">{{ form.instance.time|date:"Y-m-d" }} id:{{ form.instance.id }}</h3>
<h3 class="ietf-divider" style="margin-bottom: 0px;">{{ form.instance.time|date:"Y-m-d" }} id:{{ form.instance.id }}</h3>
{% if form.errors %}<div class="info-message-error">Please correct the following errors</div>{% endif %}
<div>
<table style="width: 100%;"><tr><td>
<div class="baseform">
<div class="fieldset">
<h2>Comment meta data</h2>
{% for field in form %}
<div>
{% if not field.field.widget.is_hidden %}{{ field.label_tag }}:{% endif %} {{ field }}{{ field.errors }}
</div>
<div id="baseform-fieldname-{{ field.html_name }}"
{% if field.field.widget.is_hidden %}style="display: none;"{% endif %}
class="{% if field.errors %}fieldError {% endif %}field BaseFormStringWidget{% if field.field.column_style %} {{ field.field.column_style }}{% endif %}">
<label for="id_{{ field.html_name }}">{{ field.label }}
{% if field.field.required %}
<span class="fieldRequired" title="Required">*</span>
{% endif %}
</label>
<div class="fieldWidget">
<div id="{{ field.html_name }}_help" class="formHelp"> {{ field.help_text }}</div>
{{ field }}
{{ field.errors }}
</div>
<div class="endfield"></div>
</div>
{% endfor %}
{% decrypt form.instance.comments request year %}
</div>
</div>
</td><td style="width: 50%; vertical-align: top;">
<div class="baseform">
<div class="fieldset">
<h2>Comment body</h2>
<pre style="padding: 1em;">{% decrypt form.instance.comments request year %}</pre>
</div>
</div>
</td></tr></table>
{% endfor %}
<div class="ietf-divider"></div>
<input type="submit" value="Submit" />
</form>
</div>
{% endblock %}
{% endblock %}