Summary: Port remaining parts of nomcom to bootstrap, fix some bugs,

let the private/public feedback pages share the same template, remove
the edit NomCom chair thing - there's no link to it and the
Secretariat can instead use the ordinary group management tool they
have available
 - Legacy-Id: 8721
This commit is contained in:
Ole Laursen 2014-12-02 10:43:20 +00:00
parent 027a976da4
commit a3399b0bcd
11 changed files with 30 additions and 236 deletions

View file

@ -207,62 +207,6 @@ class EditMembersFormPreview(FormPreview):
return redirect('nomcom_edit_members', year=self.year)
class EditChairForm(BaseNomcomForm, forms.Form):
chair = forms.EmailField(label="Chair email", required=False,
widget=forms.TextInput(attrs={'size': '40'}))
fieldsets = [('Chair info', ('chair',))]
class EditChairFormPreview(FormPreview):
form_template = 'nomcom/edit_chair.html'
preview_template = 'nomcom/edit_chair_preview.html'
@method_decorator(role_required("Secretariat"))
def __call__(self, request, *args, **kwargs):
year = kwargs['year']
group = get_nomcom_group_or_404(year)
self.state['group'] = group
self.state['rolodex_url'] = ROLODEX_URL
self.group = group
self.year = year
return super(EditChairFormPreview, self).__call__(request, *args, **kwargs)
def get_initial(self, request):
chair = self.group.get_chair()
if chair:
return { "chair": chair.email.address }
return {}
def process_preview(self, request, form, context):
chair_email = form.cleaned_data['chair']
try:
chair_email_obj = Email.objects.get(address=chair_email)
chair_person = chair_email_obj.person
except Email.DoesNotExist:
chair_person = None
chair_email_obj = None
chair_info = {'email': chair_email,
'email_obj': chair_email_obj,
'person': chair_person}
self.state.update({'chair_info': chair_info})
def done(self, request, cleaned_data):
chair_info = self.state['chair_info']
chair_exclude = self.group.role_set.filter(name__slug='chair').exclude(email__address=chair_info['email'])
chair_exclude.delete()
if chair_info['email_obj'] and chair_info['person']:
Role.objects.get_or_create(name=RoleName.objects.get(slug="chair"),
group=self.group,
person=chair_info['person'],
email=chair_info['email_obj'])
return redirect('nomcom_edit_chair', year=self.year)
class EditNomcomForm(BaseNomcomForm, forms.ModelForm):
fieldsets = [('Edit nomcom settings', ('public_key', 'initial_text',

View file

@ -22,7 +22,7 @@ from ietf.nomcom.test_data import nomcom_test_data, generate_cert, check_comment
from ietf.nomcom.models import NomineePosition, Position, Nominee, \
NomineePositionStateName, Feedback, FeedbackTypeName, \
Nomination
from ietf.nomcom.forms import EditChairForm, EditChairFormPreview, EditMembersForm
from ietf.nomcom.forms import EditMembersForm, EditMembersFormPreview
from ietf.nomcom.utils import get_nomcom_by_year, get_or_create_nominee
from ietf.nomcom.management.commands.send_reminders import Command, is_time_to_send
@ -54,7 +54,6 @@ class NomcomViewsTest(TestCase):
self.private_index_url = reverse('nomcom_private_index', kwargs={'year': self.year})
self.private_merge_url = reverse('nomcom_private_merge', kwargs={'year': self.year})
self.edit_members_url = reverse('nomcom_edit_members', kwargs={'year': self.year})
self.edit_chair_url = reverse('nomcom_edit_chair', kwargs={'year': self.year})
self.edit_nomcom_url = reverse('nomcom_edit_nomcom', kwargs={'year': self.year})
self.private_nominate_url = reverse('nomcom_private_nominate', kwargs={'year': self.year})
self.add_questionnaire_url = reverse('nomcom_private_questionnaire', kwargs={'year': self.year})
@ -298,7 +297,7 @@ class NomcomViewsTest(TestCase):
# preview
self.client.post(self.edit_members_url, test_data)
hash = EditChairFormPreview(EditChairForm).security_hash(None, EditMembersForm(test_data))
hash = EditMembersFormPreview(EditMembersForm).security_hash(None, EditMembersForm(test_data))
test_data.update({'hash': hash, 'stage': 2})
# submit
@ -323,33 +322,6 @@ class NomcomViewsTest(TestCase):
self.check_url_status(self.private_index_url, 403)
self.client.logout()
def change_chair(self, user):
test_data = {'chair': '%s%s' % (user, EMAIL_DOMAIN),
'stage': 1}
# preview
self.client.post(self.edit_chair_url, test_data)
hash = EditChairFormPreview(EditChairForm).security_hash(None, EditChairForm(test_data))
test_data.update({'hash': hash, 'stage': 2})
# submit
self.client.post(self.edit_chair_url, test_data)
def test_edit_chair_view(self):
self.access_secretariat_url(self.edit_chair_url)
self.change_chair(COMMUNITY_USER)
# check chair actions
self.client.login(username=COMMUNITY_USER,password=COMMUNITY_USER+"+password")
self.check_url_status(self.edit_members_url, 200)
self.check_url_status(self.edit_nomcom_url, 200)
self.client.logout()
# revert edit nomcom chair
login_testing_unauthorized(self, SECRETARIAT_USER, self.edit_chair_url)
self.change_chair(CHAIR_USER)
self.client.logout()
def test_edit_nomcom_view(self):
r = self.access_chair_url(self.edit_nomcom_url)
q = PyQuery(r.content)

View file

@ -1,8 +1,7 @@
from django.conf.urls import patterns, url
from django.views.generic import TemplateView
from ietf.nomcom.forms import ( EditChairForm, EditChairFormPreview,
EditMembersForm, EditMembersFormPreview )
from ietf.nomcom.forms import EditMembersForm, EditMembersFormPreview
urlpatterns = patterns('ietf.nomcom.views',
url(r'^$', 'index'),
@ -22,7 +21,6 @@ urlpatterns = patterns('ietf.nomcom.views',
# url(r'^(?P<year>\d{4})/private/send-reminder-mail/$', RedirectView.as_view(url=reverse_lazy('nomcom_send_reminder_mail',kwargs={'year':year,'type':'accept'}))),
url(r'^(?P<year>\d{4})/private/send-reminder-mail/(?P<type>\w+)/$', 'send_reminder_mail', name='nomcom_send_reminder_mail'),
url(r'^(?P<year>\d{4})/private/edit-members/$', EditMembersFormPreview(EditMembersForm), name='nomcom_edit_members'),
url(r'^(?P<year>\d{4})/private/edit-chair/$', EditChairFormPreview(EditChairForm), name='nomcom_edit_chair'),
url(r'^(?P<year>\d{4})/private/edit-nomcom/$', 'edit_nomcom', name='nomcom_edit_nomcom'),
url(r'^(?P<year>\d{4})/private/delete-nomcom/$', 'delete_nomcom', name='nomcom_delete_nomcom'),
url(r'^deleted/$', TemplateView.as_view(template_name='nomcom/deleted.html'), name='nomcom_deleted'),

View file

@ -361,17 +361,19 @@ def feedback(request, year, public):
positions = Position.objects.get_by_nomcom(nomcom=nomcom).opened()
if public:
template = 'nomcom/public_feedback.html'
base_template = "nomcom/nomcom_public_base.html"
else:
template = 'nomcom/private_feedback.html'
base_template = "nomcom/nomcom_private_base.html"
if not has_publickey:
message = ('warning', "This Nomcom is not yet accepting comments")
return render_to_response(template,
{'message': message,
'nomcom': nomcom,
'year': year,
'selected': 'feedback'}, RequestContext(request))
return render(request, 'nomcom/feedback.html', {
'message': message,
'nomcom': nomcom,
'year': year,
'selected': 'feedback',
'base_template': base_template
})
message = None
if request.method == 'POST':
@ -385,14 +387,16 @@ def feedback(request, year, public):
form = FeedbackForm(nomcom=nomcom, user=request.user, public=public,
position=position, nominee=nominee)
return render_to_response(template,
{'form': form,
'message': message,
'nomcom': nomcom,
'year': year,
'positions': positions,
'submit_disabled': submit_disabled,
'selected': 'feedback'}, RequestContext(request))
return render(request, 'nomcom/feedback.html', {
'form': form,
'message': message,
'nomcom': nomcom,
'year': year,
'positions': positions,
'submit_disabled': submit_disabled,
'selected': 'feedback',
'base_template': base_template
})
@role_required("Nomcom Chair", "Nomcom Advisor")

View file

@ -1,6 +1,9 @@
{% extends "nomcom/nomcom_base.html" %}
{% extends "ietf.html" %}
{% block title %}NomCom deleted{% endblock %}
{% block content %}
<h1>NomCom deleted</h1>
<p class="alert alert-success">All data about the NomCom has been removed.</p>

View file

@ -1,18 +0,0 @@
{% extends "base.html" %}
{% block title %}Edit {{ state.group.acronym }} chair{% endblock %}
{% block content %}
<h1>Edit {{ state.group.acronym }} chair</h1>
{% if form.errors %}<div class="alert alert-danger">Please correct the following errors</div>{% endif %}
<form action="" method="post">{% csrf_token %}
<table>
{{ form }}
</table>
<input type="hidden" name="{{ stage_field }}" value="1">
<p><input type="submit" value="Preview"></p>
</form>
{% endblock %}

View file

@ -1,44 +0,0 @@
{% extends "base.html" %}
{% block title %}Edit {{ state.group.acronym }} chair{% endblock %}
{% block content %}
<h1>Edit {{ state.group.acronym }} chair</h1>
<h2>Chair info </h2>
<p>
{% if state.chair_info.person %}
<ul>
<li><strong>Email:</strong> {{ state.chair_info.email }}</li>
<li><strong>Person name:</strong> {{ state.chair_info.person.name }}</li>
</ul>
{% else %}
<p>Person with {{ state.chair_info.email }} not exists. {% if state.rolodex_url %} Please go to <a href="{{ state.rolodex_url }}">{{ state.rolodex_url }}</a> to add this person.{% endif %}</p>
{% endif %}
</p>
{% if state.chair_info.person %}
<table>
<form action="" method="post">{% csrf_token %}
{% for field in form %}{{ field.as_hidden }}
{% endfor %}
<input type="hidden" name="{{ stage_field }}" value="2">
<input type="hidden" name="{{ hash_field }}" value="{{ hash_value }}">
<p><input type="submit" value="Submit"></p>
</form>
{% endif %}
<h1>Edit it again</h1>
<form action="" method="post">{% csrf_token %}
<table>
{{ form }}
</table>
<input type="hidden" name="{{ stage_field }}" value="1">
<p><input type="submit" value="Preview"></p>
</form>
{% endblock %}

View file

@ -1,4 +1,4 @@
{% extends "nomcom/nomcom_public_base.html" %}
{% extends base_template %}
{% load bootstrap3 %}
{% load nomcom_tags %}
@ -26,9 +26,9 @@
{% for p in positions %}
{% if p.nomineeposition_set.accepted.not_duplicated %}
<h4>{{ p.name }}</h4>
<div class="btn-group-vertical btn-group-justified form-group">
<div class="btn-group-vertical form-group">
{% for np in p.nomineeposition_set.accepted.not_duplicated %}
<a class="btn btn-default btn-xs" href="{% url "nomcom_public_feedback" year %}?nominee={{np.nominee.id}}&position={{ np.position.id}}">
<a class="btn btn-default btn-xs" href="?nominee={{np.nominee.id}}&position={{ np.position.id}}">
{{ np.nominee }}
{% add_num_nominations user np.position np.nominee %}
</a>

View file

@ -1,3 +0,0 @@
{% extends "base.html" %}
{% block title %}NomCom {{ year }}{% block subtitle %}{% endblock %}{% endblock %}

View file

@ -1,63 +0,0 @@
{% extends "nomcom/nomcom_private_base.html" %}
{% load bootstrap3 %}
{% load nomcom_tags %}
{% block subtitle %} - Feedback{% endblock %}
{% block nomcom_content %}
<p class="alert alert-info">
First select a nominee from the list of nominees to provide input about that nominee.
This will fill in the non-editable fields in the form.
</p>
{% if message %}
<p class="alert alert-{{ message.0 }}">{{ message.1 }}</p>
{% endif %}
{% bootstrap_messages %}
{% if nomcom|has_publickey %}
<div class="row">
<div class="col-sm-4 col-sm-push-8">
<h3>Nominees</h3>
{% for p in positions %}
{% if p.nomineeposition_set.accepted.not_duplicated %}
<h4>{{ p.name }}</h4>
<div class="btn-group-vertical btn-group-justified form-group">
{% for np in p.nomineeposition_set.accepted.not_duplicated %}
<a class="btn btn-default btn-xs" href="{% url "nomcom_private_feedback" year %}?nominee={{np.nominee.id}}&position={{ np.position.id}}">
{{ np.nominee }}
{% add_num_nominations user np.position np.nominee %}
</a>
{% endfor %}
</div>
{% endif %}
{% endfor %}
<p>
An number after a name indicates
that you have given comments on this nominee
earlier. If you position the mouse pointer over
it, you should see how many comments
exist from you for this nominee.
</p>
</div>
<div class="col-sm-8 col-sm-pull-4">
<h3>Provide feedback</h3>
<form id="feedbackform" role="form" method="post">
{% csrf_token %}
{% bootstrap_form form %}
{% buttons %}
<input class="btn btn-primary" type="submit" value="Save" name="save" {% if submit_disabled %}disabled="disabled"{% endif %}>
{% endbuttons %}
</form>
</div>
</div>
{% endif %}
{% endblock %}

View file

@ -1,6 +1,7 @@
{% extends "nomcom/nomcom_private_base.html" %}
{% load bootstrap3 %}
{% load nomcom_tags %}
{% block subtitle %} - Provide feedback email{% endblock %}