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 
 - Legacy-Id: 5334
This commit is contained in:
Emilio A. Sánchez López 2013-01-30 08:26:15 +00:00
parent 51f24f047c
commit 20320ea9ff
13 changed files with 282 additions and 18 deletions

View file

@ -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))

View file

@ -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:

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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'),

View file

@ -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

View 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 %}

View 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 &#123;&#123;variable&#125;&#125; 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 %}

View 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 %}

View 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 %}

View file

@ -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>

View 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 %}