Add Committee management page
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -6,6 +6,9 @@ __pycache__/
|
|||||||
# vim
|
# vim
|
||||||
*.swp
|
*.swp
|
||||||
|
|
||||||
|
# tags
|
||||||
|
tags
|
||||||
|
|
||||||
# C extensions
|
# C extensions
|
||||||
*.so
|
*.so
|
||||||
|
|
||||||
|
|||||||
10
committee/urls.py
Normal file
10
committee/urls.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
from django.conf.urls import url
|
||||||
|
from . import views
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
url(r'^$', views.edit, name='edit'),
|
||||||
|
url(r'^update/(?P<committee>\d+)/$', views.update, name='update'),
|
||||||
|
url(r'^fincom/$', views.add_to_fincom, name='add_to_fincom'),
|
||||||
|
url(r'^fincom/delete$', views.remove_fincom, name='remove_fincom'),
|
||||||
|
url(r'^new$', views.new_committee, name='new_committee'),
|
||||||
|
]
|
||||||
@@ -1,3 +1,71 @@
|
|||||||
from django.shortcuts import render
|
from django.shortcuts import HttpResponse, HttpResponseRedirect
|
||||||
|
from django.template import loader
|
||||||
|
from django.contrib.auth.decorators import login_required
|
||||||
|
from django.contrib.auth.models import User, Group
|
||||||
|
from models import Committee
|
||||||
|
|
||||||
# Create your views here.
|
@login_required
|
||||||
|
def edit(request):
|
||||||
|
if (not request.user.groups.filter(name='Fincom').exists()):
|
||||||
|
return HttpResponseRedirect('/items')
|
||||||
|
|
||||||
|
template = loader.get_template('committee/edit.html')
|
||||||
|
|
||||||
|
context = {
|
||||||
|
'committees': Committee.objects.order_by('name'),
|
||||||
|
'fincom': User.objects.filter(groups__name='Fincom'),
|
||||||
|
'users': User.objects.order_by('first_name', 'last_name'),
|
||||||
|
}
|
||||||
|
|
||||||
|
return HttpResponse(template.render(context, request))
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def update(request, committee):
|
||||||
|
if (not request.user.groups.filter(name='Fincom').exists()):
|
||||||
|
return HttpResponseRedirect('/items')
|
||||||
|
|
||||||
|
committee = Committee.objects.get(pk=committee)
|
||||||
|
|
||||||
|
committee.name = request.POST['name']
|
||||||
|
committee.chair = User.objects.get(pk=request.POST['chair'])
|
||||||
|
|
||||||
|
committee.save()
|
||||||
|
|
||||||
|
return HttpResponseRedirect('/committees')
|
||||||
|
@login_required
|
||||||
|
def new_committee(request):
|
||||||
|
if (not request.user.groups.filter(name='Fincom').exists()):
|
||||||
|
return HttpResponseRedirect('/items')
|
||||||
|
|
||||||
|
committee = Committee(
|
||||||
|
name = request.POST['name'],
|
||||||
|
chair = User.objects.get(pk=request.POST['chair']),
|
||||||
|
)
|
||||||
|
|
||||||
|
committee.save()
|
||||||
|
|
||||||
|
return HttpResponseRedirect('/committees')
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def add_to_fincom(request):
|
||||||
|
if (not request.user.groups.filter(name='Fincom').exists()):
|
||||||
|
return HttpResponseRedirect('/items')
|
||||||
|
|
||||||
|
user = User.objects.get(pk=request.POST['user'])
|
||||||
|
user.groups.add(Group.objects.filter(name='Fincom')[0])
|
||||||
|
|
||||||
|
user.save()
|
||||||
|
|
||||||
|
return HttpResponseRedirect('/committees')
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def remove_fincom(request):
|
||||||
|
if (not request.user.groups.filter(name='Fincom').exists()):
|
||||||
|
return HttpResponseRedirect('/items')
|
||||||
|
|
||||||
|
for u in request.POST.getlist('user'):
|
||||||
|
user = User.objects.get(pk=u)
|
||||||
|
user.groups.remove(Group.objects.filter(name='Fincom')[0])
|
||||||
|
user.save()
|
||||||
|
|
||||||
|
return HttpResponseRedirect('/committees')
|
||||||
@@ -21,6 +21,7 @@ urlpatterns = [
|
|||||||
url(r'^$', views.index, name='index'),
|
url(r'^$', views.index, name='index'),
|
||||||
url(r'^logout$', views.user_logout, name='logout'),
|
url(r'^logout$', views.user_logout, name='logout'),
|
||||||
url(r'^items/', include('items.urls')),
|
url(r'^items/', include('items.urls')),
|
||||||
|
url(r'^committees/', include('committee.urls')),
|
||||||
url('', include('social_django.urls', namespace='social')),
|
url('', include('social_django.urls', namespace='social')),
|
||||||
url(r'^admin/', admin.site.urls),
|
url(r'^admin/', admin.site.urls),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -53,6 +53,8 @@ def list(request):
|
|||||||
'newitems': pageItems(request, items, Item.NEW),
|
'newitems': pageItems(request, items, Item.NEW),
|
||||||
'rejected': pageItems(request, items, Item.REJECTED),
|
'rejected': pageItems(request, items, Item.REJECTED),
|
||||||
'mine': pageItems(request, mine, 'M'),
|
'mine': pageItems(request, mine, 'M'),
|
||||||
|
'committees': Committee.objects.order_by('name'),
|
||||||
|
'fincom': request.user.groups.filter(name='Fincom').exists(),
|
||||||
}
|
}
|
||||||
|
|
||||||
return HttpResponse(template.render(context, request))
|
return HttpResponse(template.render(context, request))
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ body {
|
|||||||
float: right;
|
float: right;
|
||||||
color: #fdd017;
|
color: #fdd017;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
font-size: 16px; }
|
font-size: 16px;
|
||||||
|
margin-left: 8px; }
|
||||||
|
|
||||||
.pull-right {
|
.pull-right {
|
||||||
float: right;
|
float: right;
|
||||||
@@ -84,6 +85,11 @@ body {
|
|||||||
.details span {
|
.details span {
|
||||||
color: #969499; }
|
color: #969499; }
|
||||||
|
|
||||||
|
form.committee {
|
||||||
|
border-bottom: 1px solid #969499;
|
||||||
|
padding: 16px;
|
||||||
|
margin-bottom: 0; }
|
||||||
|
|
||||||
section {
|
section {
|
||||||
color: #969499;
|
color: #969499;
|
||||||
font-weight: lighter;
|
font-weight: lighter;
|
||||||
|
|||||||
5
static/sass/committee.scss
Normal file
5
static/sass/committee.scss
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
form.committee {
|
||||||
|
border-bottom: 1px solid $midgray;
|
||||||
|
padding: $pad-l;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
@@ -44,6 +44,7 @@ body {
|
|||||||
color: $gold;
|
color: $gold;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
|
margin-left: $pad-m;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
@import 'globals';
|
@import 'globals';
|
||||||
@import 'details';
|
@import 'details';
|
||||||
|
@import 'committee';
|
||||||
@import 'items';
|
@import 'items';
|
||||||
@import 'login';
|
@import 'login';
|
||||||
@import 'new';
|
@import 'new';
|
||||||
|
|||||||
@@ -8,6 +8,9 @@
|
|||||||
<body>
|
<body>
|
||||||
<div class="nav">
|
<div class="nav">
|
||||||
<a href="/logout">logout</a>
|
<a href="/logout">logout</a>
|
||||||
|
{% if fincom %}
|
||||||
|
<a href="/committees">manage</a>
|
||||||
|
{% endif %}
|
||||||
<h3>Fincom Web App</h3>
|
<h3>Fincom Web App</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
|||||||
73
templates/committee/edit.html
Normal file
73
templates/committee/edit.html
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
{% extends "../boilerplate.html" %}
|
||||||
|
|
||||||
|
{% block main %}
|
||||||
|
<div>
|
||||||
|
{% for C in committees %}
|
||||||
|
<form class="committee" action="/committees/update/{{ C.pk }}/" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<label for="name">Committee Name</label>
|
||||||
|
<input id="name" name="name" value="{{ C.name }}">
|
||||||
|
|
||||||
|
<label for="chair">Chair</label>
|
||||||
|
<select name="chair" id="name">
|
||||||
|
{% for U in users %}
|
||||||
|
{% if C.chair == U %}
|
||||||
|
<option selected value="{{ U.pk }}">{{ U.first_name }} {{ U.last_name }}</option>
|
||||||
|
{% else %}
|
||||||
|
<option value="{{ U.pk }}">{{ U.first_name }} {{ U.last_name }}</option>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<input type="submit" value="Update">
|
||||||
|
</form>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
<form class="committee" action="/committees/new" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<label for="name">New Committee</label>
|
||||||
|
<input id="name" name="name" value="{{ C.name }}">
|
||||||
|
|
||||||
|
<label for="chair">Chair</label>
|
||||||
|
<select name="chair" id="name">
|
||||||
|
{% for U in users %}
|
||||||
|
{% if C.chair == U %}
|
||||||
|
<option selected value="{{ U.pk }}">{{ U.first_name }} {{ U.last_name }}</option>
|
||||||
|
{% else %}
|
||||||
|
<option value="{{ U.pk }}">{{ U.first_name }} {{ U.last_name }}</option>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<input type="submit" value="Create">
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<form class="committee" action="/committees/fincom/" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<label for="user" id="fincom">Add user to Fincom</label>
|
||||||
|
<select name="user" id="user">
|
||||||
|
{% for U in users %}
|
||||||
|
<option value="{{ U.pk }}">{{ U.first_name }} {{ U.last_name }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<input type="submit" value="Add">
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<form class="committee" action="/committees/fincom/delete" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<label>Remove user from Fincom</label><br>
|
||||||
|
{% for U in fincom %}
|
||||||
|
<input type="checkbox" name="user" value="{{ U.pk }}">
|
||||||
|
{{ U.first_name }} {{ U.last_name }} <br>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
<input type="submit" value="Remove Users">
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<div class="item">
|
||||||
|
<a href="/items" class="btn">Back</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
Reference in New Issue
Block a user