Views for manage nomcom positions
Views for edit templates related to nomcom group and nomcom positions Refactored some strings in html templates Allow the secretariat to access the same views and view the same links as the chair Fixes #914 - Legacy-Id: 5334
This commit is contained in:
parent
51f24f047c
commit
20320ea9ff
ietf
|
@ -21,23 +21,26 @@ def template_list(request, acronym):
|
|||
}, RequestContext(request))
|
||||
|
||||
|
||||
def template_edit(request, acronym, template_id):
|
||||
def template_edit(request, acronym, template_id, base_template='dbtemplate/template_edit.html', formclass=DBTemplateForm, extra_context=None):
|
||||
group = get_object_or_404(Group, acronym=acronym)
|
||||
chairs = group.role_set.filter(name__slug='chair')
|
||||
extra_context = extra_context or {}
|
||||
|
||||
if not has_role(request.user, "Secretariat") and not chairs.filter(person__user=request.user).count():
|
||||
return HttpResponseForbidden("You are not authorized to access this view")
|
||||
|
||||
template = get_object_or_404(DBTemplate, id=template_id, group=group)
|
||||
if request.method == 'POST':
|
||||
form = DBTemplateForm(instance=template, data=request.POST)
|
||||
form = formclass(instance=template, data=request.POST)
|
||||
if form.is_valid():
|
||||
form.save()
|
||||
return HttpResponseRedirect('..')
|
||||
else:
|
||||
form = DBTemplateForm(instance=template)
|
||||
return render_to_response('dbtemplate/template_edit.html',
|
||||
{'template': template,
|
||||
'group': group,
|
||||
'form': form,
|
||||
}, RequestContext(request))
|
||||
form = formclass(instance=template)
|
||||
|
||||
context = {'template': template,
|
||||
'group': group,
|
||||
'form': form,
|
||||
}
|
||||
context.update(extra_context)
|
||||
return render_to_response(base_template, context, RequestContext(request))
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
from ietf.ietfauth.decorators import passes_test_decorator
|
||||
from ietf.ietfauth.decorators import passes_test_decorator, has_role
|
||||
|
||||
from ietf.nomcom.utils import get_nomcom_by_year
|
||||
|
||||
|
@ -8,6 +8,8 @@ def member_required(role=None):
|
|||
year = kwargs.get('year', None)
|
||||
if year:
|
||||
nomcom = get_nomcom_by_year(year=year)
|
||||
if has_role(user, "Secretariat"):
|
||||
return True
|
||||
if role == 'chair':
|
||||
return nomcom.group.is_chair(user)
|
||||
else:
|
||||
|
|
|
@ -9,6 +9,7 @@ from django.utils.decorators import method_decorator
|
|||
from django.shortcuts import render_to_response
|
||||
from django.template.context import RequestContext
|
||||
|
||||
from ietf.dbtemplate.forms import DBTemplateForm
|
||||
from ietf.utils import unaccent
|
||||
from ietf.utils.mail import send_mail
|
||||
from ietf.ietfauth.decorators import role_required
|
||||
|
@ -415,3 +416,27 @@ class NominateForm(BaseNomcomForm, forms.ModelForm):
|
|||
class Media:
|
||||
js = ("/js/jquery-1.5.1.min.js",
|
||||
"/js/nomcom.js", )
|
||||
|
||||
|
||||
class NomComTemplateForm(BaseNomcomForm, DBTemplateForm):
|
||||
|
||||
fieldsets = [('Template content', ('content', )),
|
||||
]
|
||||
|
||||
|
||||
class PositionForm(BaseNomcomForm, forms.ModelForm):
|
||||
|
||||
fieldsets = [('Position', ('name', 'description',
|
||||
'is_open', 'incumbent'))]
|
||||
|
||||
class Meta:
|
||||
model = Position
|
||||
fields = ('name', 'description', 'is_open', 'incumbent')
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.nomcom = kwargs.pop('nomcom', None)
|
||||
super(PositionForm, self).__init__(*args, **kwargs)
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.instance.nomcom = self.nomcom
|
||||
super(PositionForm, self).save(*args, **kwargs)
|
||||
|
|
|
@ -100,7 +100,7 @@ class NomineePosition(models.Model):
|
|||
class Position(models.Model):
|
||||
nomcom = models.ForeignKey('NomCom')
|
||||
name = models.CharField(verbose_name='Name', max_length=255)
|
||||
description = models.TextField(verbose_name='Despcription')
|
||||
description = models.TextField(verbose_name='Description')
|
||||
initial_text = models.TextField(verbose_name='Initial text for nominations',
|
||||
blank=True)
|
||||
requirement = models.ForeignKey(DBTemplate, related_name='requirement', null=True, editable=False)
|
||||
|
@ -127,6 +127,13 @@ class Position(models.Model):
|
|||
if changed:
|
||||
self.save()
|
||||
|
||||
def get_templates(self):
|
||||
if hasattr(self, '_templates'):
|
||||
return self._templates
|
||||
from ietf.dbtemplate.models import DBTemplate
|
||||
self._templates = DBTemplate.objects.filter(group=self.nomcom.group).filter(path__contains='/%s/position/' % self.id).order_by('title')
|
||||
return self._templates
|
||||
|
||||
|
||||
class Feedback(models.Model):
|
||||
author = models.EmailField(verbose_name='Author', blank=True)
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
from django import template
|
||||
|
||||
from ietf.ietfauth.decorators import has_role
|
||||
from ietf.nomcom.utils import get_nomcom_by_year
|
||||
|
||||
register = template.Library()
|
||||
|
@ -10,4 +11,6 @@ def is_chair(user, year):
|
|||
if not user or not year:
|
||||
return False
|
||||
nomcom = get_nomcom_by_year(year=year)
|
||||
if has_role(user, "Secretariat"):
|
||||
return True
|
||||
return nomcom.group.is_chair(user)
|
||||
|
|
|
@ -9,6 +9,12 @@ urlpatterns = patterns('ietf.nomcom.views',
|
|||
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-publickey/$', 'edit_publickey', name='nomcom_edit_publickey'),
|
||||
url(r'^(?P<year>\d{4})/private/chair/templates/$', 'list_templates', name='nomcom_list_templates'),
|
||||
url(r'^(?P<year>\d{4})/private/chair/templates/(?P<template_id>\d+)/$', 'edit_template', name='nomcom_edit_template'),
|
||||
url(r'^(?P<year>\d{4})/private/chair/position/$', 'list_positions', name='nomcom_list_positions'),
|
||||
url(r'^(?P<year>\d{4})/private/chair/position/add/$', 'edit_position', name='nomcom_add_position'),
|
||||
url(r'^(?P<year>\d{4})/private/chair/position/(?P<position_id>\d+)/$', 'edit_position', name='nomcom_edit_position'),
|
||||
url(r'^(?P<year>\d{4})/private/chair/position/(?P<position_id>\d+)/remove/$', 'remove_position', name='nomcom_remove_position'),
|
||||
|
||||
url(r'^(?P<year>\d{4})/$', 'index', name='nomcom_index'),
|
||||
url(r'^(?P<year>\d{4})/requirements/$', 'requirements', name='nomcom_requirements'),
|
||||
|
|
|
@ -1,15 +1,19 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.http import HttpResponse, Http404, HttpResponseRedirect
|
||||
from django.shortcuts import render_to_response
|
||||
from django.template import RequestContext
|
||||
from django.http import HttpResponse
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.template.loader import render_to_string
|
||||
from django.utils import simplejson
|
||||
|
||||
from ietf.nomcom.utils import get_nomcom_by_year, HOME_TEMPLATE
|
||||
from ietf.dbtemplate.models import DBTemplate
|
||||
from ietf.dbtemplate.views import template_edit
|
||||
from ietf.nomcom.decorators import member_required
|
||||
from ietf.nomcom.forms import EditPublicKeyForm, NominateForm, MergeForm
|
||||
from ietf.nomcom.forms import (EditPublicKeyForm, NominateForm, MergeForm,
|
||||
NomComTemplateForm, PositionForm)
|
||||
from ietf.nomcom.models import Position
|
||||
from ietf.nomcom.utils import get_nomcom_by_year, HOME_TEMPLATE
|
||||
|
||||
|
||||
def index(request, year):
|
||||
|
@ -151,6 +155,88 @@ def edit_publickey(request, year):
|
|||
'selected': 'edit_publickey'}, RequestContext(request))
|
||||
|
||||
|
||||
@member_required(role='chair')
|
||||
def list_templates(request, year):
|
||||
nomcom = get_nomcom_by_year(year)
|
||||
positions = nomcom.position_set.all()
|
||||
template_list = DBTemplate.objects.filter(group=nomcom.group).exclude(path__contains='/position/')
|
||||
|
||||
return render_to_response('nomcom/list_templates.html',
|
||||
{'template_list': template_list,
|
||||
'positions': positions,
|
||||
'year': year,
|
||||
'selected': 'edit_templates',
|
||||
'nomcom': nomcom}, RequestContext(request))
|
||||
|
||||
|
||||
@member_required(role='chair')
|
||||
def edit_template(request, year, template_id):
|
||||
nomcom = get_nomcom_by_year(year)
|
||||
return_url = request.META.get('HTTP_REFERER', None)
|
||||
|
||||
return template_edit(request, nomcom.group.acronym, template_id,
|
||||
base_template='nomcom/edit_template.html',
|
||||
formclass=NomComTemplateForm,
|
||||
extra_context={'year': year,
|
||||
'return_url': return_url,
|
||||
'nomcom': nomcom})
|
||||
|
||||
|
||||
@member_required(role='chair')
|
||||
def list_positions(request, year):
|
||||
nomcom = get_nomcom_by_year(year)
|
||||
positions = nomcom.position_set.all()
|
||||
|
||||
return render_to_response('nomcom/list_positions.html',
|
||||
{'positions': positions,
|
||||
'year': year,
|
||||
'selected': 'edit_positions',
|
||||
'nomcom': nomcom}, RequestContext(request))
|
||||
|
||||
|
||||
@member_required(role='chair')
|
||||
def remove_position(request, year, position_id):
|
||||
nomcom = get_nomcom_by_year(year)
|
||||
try:
|
||||
position = nomcom.position_set.get(id=position_id)
|
||||
except Position.DoesNotExist:
|
||||
raise Http404
|
||||
|
||||
if request.POST.get('remove', None):
|
||||
position.delete()
|
||||
return HttpResponseRedirect(reverse('nomcom_list_positions', None, args=(year, )))
|
||||
return render_to_response('nomcom/remove_position.html',
|
||||
{'year': year,
|
||||
'position': position,
|
||||
'nomcom': nomcom}, RequestContext(request))
|
||||
|
||||
|
||||
@member_required(role='chair')
|
||||
def edit_position(request, year, position_id=None):
|
||||
nomcom = get_nomcom_by_year(year)
|
||||
if position_id:
|
||||
try:
|
||||
position = nomcom.position_set.get(id=position_id)
|
||||
except Position.DoesNotExist:
|
||||
raise Http404
|
||||
else:
|
||||
position = None
|
||||
|
||||
if request.method == 'POST':
|
||||
form = PositionForm(request.POST, instance=position, nomcom=nomcom)
|
||||
if form.is_valid():
|
||||
form.save()
|
||||
return HttpResponseRedirect(reverse('nomcom_list_positions', None, args=(year, )))
|
||||
else:
|
||||
form = PositionForm(instance=position, nomcom=nomcom)
|
||||
|
||||
return render_to_response('nomcom/edit_position.html',
|
||||
{'form': form,
|
||||
'position': position,
|
||||
'year': year,
|
||||
'nomcom': nomcom}, RequestContext(request))
|
||||
|
||||
|
||||
def ajax_position_text(request, position_id):
|
||||
try:
|
||||
position_text = Position.objects.get(id=position_id).initial_text
|
||||
|
|
12
ietf/templates/nomcom/edit_position.html
Normal file
12
ietf/templates/nomcom/edit_position.html
Normal file
|
@ -0,0 +1,12 @@
|
|||
{% extends "nomcom/nomcom_private_base.html" %}
|
||||
|
||||
{% block nomcom_content %}
|
||||
<h3>{% if position %}Edit{% else %}Add{% endif %} position</h3>
|
||||
|
||||
{% if form.errors %}<div class="info-message-error">Please correct the following errors</div>{% endif %}
|
||||
|
||||
<form action="" method="post">
|
||||
{{ form }}
|
||||
<p><input type="submit" value="{% if position %}Edit{% else %}Add{% endif %}" /> <a href="../">Cancel</a></p>
|
||||
</form>
|
||||
{% endblock nomcom_content %}
|
40
ietf/templates/nomcom/edit_template.html
Normal file
40
ietf/templates/nomcom/edit_template.html
Normal file
|
@ -0,0 +1,40 @@
|
|||
{% extends "nomcom/nomcom_private_base.html" %}
|
||||
|
||||
{% block nomcom_content %}
|
||||
<h2>Template: {{ template }}</h2>
|
||||
|
||||
<h3>Meta information</h3>
|
||||
<dl>
|
||||
<dt>Title</dt>
|
||||
<dd>{{ template.title }}</dt>
|
||||
<dt>Group</dt>
|
||||
<dd>{{ template.group }}</dd>
|
||||
<dt>Template type</dt>
|
||||
<dd>{{ template.type.name }}
|
||||
{% ifequal template.type.slug "rst" %}
|
||||
<p>This template uses the syntax of reStructuredText. Get a quick reference at <a href="http://docutils.sourceforge.net/docs/user/rst/quickref.html">http://docutils.sourceforge.net/docs/user/rst/quickref.html</a>.</p>
|
||||
<p>You can do variable interpolation with $varialbe if the template allows any variable.</p>
|
||||
{% endifequal %}
|
||||
{% ifequal template.type.slug "django" %}
|
||||
<p>This template uses the syntax of the default django template framework. Get more info at <a href="https://docs.djangoproject.com/en/dev/topics/templates/">https://docs.djangoproject.com/en/dev/topics/templates/</a>.</p>
|
||||
<p>You can do variable interpolation with the current django markup {{variable}} if the template allows any variable.</p>
|
||||
{% endifequal %}
|
||||
{% ifequal template.type.slug "plain" %}
|
||||
<p>This template uses plain text, so no markup is used. You can do variable interpolation with $variable if the template allows any variable.</p>
|
||||
{% endifequal %}
|
||||
</dd>
|
||||
{% if template.variables %}
|
||||
<dt>Variables allowed in this template</dt>
|
||||
<dd>{{ template.variables|linebreaks }}</dd>
|
||||
{% endif %}
|
||||
</dl>
|
||||
|
||||
<h3>Edit template content</h3>
|
||||
|
||||
{% if form.errors %}<div class="info-message-error">Please correct the following errors</div>{% endif %}
|
||||
|
||||
<form action="" method="post">
|
||||
{{ form }}
|
||||
<p><input type="submit" value="Save template" /> <a href="{% if return_url %}{{ return_url }}{% else %}../{% endif %}">Cancel</a></p>
|
||||
</form>
|
||||
{% endblock nomcom_content %}
|
30
ietf/templates/nomcom/list_positions.html
Normal file
30
ietf/templates/nomcom/list_positions.html
Normal file
|
@ -0,0 +1,30 @@
|
|||
{% extends "nomcom/nomcom_private_base.html" %}
|
||||
|
||||
{% block nomcom_content %}
|
||||
|
||||
<h2>Positions in {{ nomcom.group }}</h2>
|
||||
<a href="{% url nomcom_add_position year %}">Add a new position</a>
|
||||
{% if positions %}
|
||||
{% for position in positions %}
|
||||
<h3>{{ position.name }} <a href="{% url nomcom_edit_position year position.id %}">[Edit]</a> <a href="{% url nomcom_remove_position year position.id %}">[Remove]</a></h3>
|
||||
<dl>
|
||||
<dt>Description:</dt>
|
||||
<dd>{{ position.description }}</dd>
|
||||
<dt>Incumbent:</dt>
|
||||
<dd>{{ position.incumbent }}</dd>
|
||||
<dt>Is open:</dt>
|
||||
<dd>{{ position.is_open }}</dd>
|
||||
<dt>Templates:</dt>
|
||||
<dd>
|
||||
<ul>
|
||||
{% for template in position.get_templates %}
|
||||
<li><a href="{% url nomcom_edit_template year template.id %}">{{ template }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</dd>
|
||||
</dl>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<p>There are no positions defined.</p>
|
||||
{% endif %}
|
||||
{% endblock nomcom_content %}
|
29
ietf/templates/nomcom/list_templates.html
Normal file
29
ietf/templates/nomcom/list_templates.html
Normal file
|
@ -0,0 +1,29 @@
|
|||
{% extends "nomcom/nomcom_private_base.html" %}
|
||||
|
||||
{% block nomcom_content %}
|
||||
<h2>Defined templates for {{ nomcom.group }}</h2>
|
||||
|
||||
{% if template_list %}
|
||||
<ul>
|
||||
{% for template in template_list %}
|
||||
<li><a href="{% url nomcom_edit_template year template.id %}">{{ template }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<p>There are no templates defined for this group.</p>
|
||||
{% endif %}
|
||||
|
||||
<h2>Defined templates for positions in {{ nomcom.group }}</h2>
|
||||
{% if positions %}
|
||||
{% for position in positions %}
|
||||
<h3>{{ position.name }}</h3>
|
||||
<ul>
|
||||
{% for template in position.get_templates %}
|
||||
<li><a href="{% url nomcom_edit_template year template.id %}">{{ template }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<p>There are no positions defined.</p>
|
||||
{% endif %}
|
||||
{% endblock nomcom_content %}
|
|
@ -8,11 +8,13 @@
|
|||
|
||||
<div class="ietf-navset">
|
||||
{% if selected == "index" %}<span class="selected">List of nominees</span>{% else %}<a href="{% url nomcom_private_index year %}">List of nominees</a>{% endif %} |
|
||||
{% if selected == "nominate" %}<span class="selected">Nominate{% else %}<a href="{% url nomcom_private_nominate year %}">Nominate</a>{% endif %} |
|
||||
{% if selected == "nominate" %}<span class="selected">Nominate</span>{% else %}<a href="{% url nomcom_private_nominate year %}">Nominate</a>{% endif %} |
|
||||
{% if user|is_chair:year %}
|
||||
{% if selected == "merge" %}<span class="selected">Merge nominee email addr{% else %}<a href="{% url nomcom_private_merge year %}">Merge nominee email addr</a>{% endif %} |
|
||||
{% if selected == "edit_members" %}<span class="selected">Edit nomcom members{% else %}<a href="{% url nomcom_edit_members year %}">Edit nomcom members</a>{% endif %} |
|
||||
{% if selected == "edit_publickey" %}<span class="selected">Edit public key{% else %}<a href="{% url nomcom_edit_publickey year %}">Edit public key</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 == "edit_members" %}<span class="selected">Nomcom members</span>{% else %}<a href="{% url nomcom_edit_members year %}">Nomcom members</a>{% endif %} |
|
||||
{% if selected == "edit_publickey" %}<span class="selected">Public key</span>{% else %}<a href="{% url nomcom_edit_publickey year %}">Public key</a>{% endif %} |
|
||||
{% if selected == "edit_templates" %}<span class="selected">Templates</span>{% else %}<a href="{% url nomcom_list_templates year %}">Templates</a>{% endif %} |
|
||||
{% if selected == "edit_positions" %}<span class="selected">Positions</span>{% else %}<a href="{% url nomcom_list_positions year %}">Positions</a>{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
|
|
19
ietf/templates/nomcom/remove_position.html
Normal file
19
ietf/templates/nomcom/remove_position.html
Normal file
|
@ -0,0 +1,19 @@
|
|||
{% extends "nomcom/nomcom_private_base.html" %}
|
||||
|
||||
{% block nomcom_content %}
|
||||
<h2>Position: {{ position }}</h2>
|
||||
<dl>
|
||||
<dt>Description:</dt>
|
||||
<dd>{{ position.description }}</dd>
|
||||
<dt>Incumbent:</dt>
|
||||
<dd>{{ position.incumbent }}</dd>
|
||||
<dt>Is open:</dt>
|
||||
<dd>{{ position.is_open }}</dd>
|
||||
</dl>
|
||||
|
||||
<h3>Do you want to remove it?</h3>
|
||||
<form method="post" action="">
|
||||
<p><input type="submit" name="remove" value="Yes, remove it" /> <a href="../">No, get me out of here</a></p>
|
||||
</form>
|
||||
|
||||
{% endblock nomcom_content %}
|
Loading…
Reference in a new issue