2011-03-02 17:20:17 -08:00

327 lines
11 KiB
Python

# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright 2010 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""
Views for managing Nova through the Django admin interface.
"""
import boto.exception
from django import http
from django import template
from django.contrib import messages
from django.contrib.admin.views.decorators import staff_member_required
from django.contrib.auth import models as auth_models
from django.shortcuts import redirect, render_to_response
from django_nova import forms
from django_nova import models
from django_nova.connection import get_nova_admin_connection
@staff_member_required
def project_sendcredentials(request, project_id):
nova = get_nova_admin_connection()
project = nova.get_project(project_id)
users = [user.memberId for user in nova.get_project_members(project_id)]
form = forms.SendCredentialsForm(query_list=users)
if project == None:
raise http.Http404()
if request.method == 'POST':
if len(request.POST.getlist('users')) < 1:
msg = "Please select a user to send credentials to."
return render_to_response('admin/django_nova/project/send_credentials.html', {
'project' : project,
'form' : form,
'users' : users,
'error': msg,
}, context_instance = template.RequestContext(request))
else:
for username in request.POST.getlist('users'):
models.CredentialsAuthorization.authorize(username, project_id)
msg = "Credentials were successfully sent."
return render_to_response('admin/django_nova/project/send_credentials.html', {
'project' : project,
'form' : form,
'users' : users,
'success': msg,
}, context_instance = template.RequestContext(request))
return render_to_response('admin/django_nova/project/send_credentials.html', {
'project' : project,
'form' : form,
'users' : users,
}, context_instance = template.RequestContext(request))
@staff_member_required
def project_start_vpn(request, project_id):
nova = get_nova_admin_connection()
project = nova.get_project(project_id)
if project == None:
raise http.Http404()
try:
nova.start_vpn(project_id)
messages.success(request,
'Successfully started VPN for project %s.' %
project_id)
except boto.exception.EC2ResponseError, e:
messages.error(request,
'Unable to start VPN for the project %s: %s - %s' %
(project_id, e.code, e.error_message))
return redirect('admin_projects')
@staff_member_required
def projects_list(request):
nova = get_nova_admin_connection()
projects = nova.get_projects()
return render_to_response('admin/django_nova/project/project_list.html', {
'projects' : projects
}, context_instance = template.RequestContext(request))
@staff_member_required
def project_view(request, project_name):
nova = get_nova_admin_connection()
project = nova.get_project(project_name)
users = nova.get_project_members(project_name)
try:
manager = auth_models.User.objects.get(username=project.projectManagerId)
except auth_models.User.DoesNotExist:
manager = None
for user in users:
project_role = [str(role.role) for role in nova.get_user_roles(user.memberId, project_name)]
global_role = [str(role.role) for role in nova.get_user_roles(user.memberId, project=False)]
user.project_roles = ", ".join(project_role)
user.global_roles = ", ".join(global_role)
return render_to_response('admin/django_nova/project/edit_project.html', {
'project' : project,
'users' : users,
'projectname': project.projectname,
'manager': manager,
'description': project.description,
}, context_instance = template.RequestContext(request))
@staff_member_required
def add_project(request):
nova = get_nova_admin_connection()
if request.method == 'POST':
form = forms.ProjectForm(request.POST)
if form.is_valid():
manager = form.cleaned_data["manager"]
nova.create_project(form.cleaned_data["projectname"],
manager.username,
form.cleaned_data["description"])
return redirect('admin_project', request.POST["projectname"])
else:
form = forms.ProjectForm()
return render_to_response('admin/django_nova/project/add_project.html', {
'form' : form,
}, context_instance = template.RequestContext(request))
@staff_member_required
def delete_project(request, project_name):
nova = get_nova_admin_connection()
if request.method == 'POST':
nova.delete_project(project_name)
return redirect('admin_projects')
project = nova.get_project(project_name)
return render_to_response('admin/django_nova/project/delete_project.html', {
'project' : project,
}, context_instance = template.RequestContext(request))
def remove_project_roles(username, project):
nova = get_nova_admin_connection()
userroles = nova.get_user_roles(username, project)
roles = [str(role.role) for role in userroles]
for role in roles:
if role == "developer":
nova.remove_user_role(username, "developer", project)
if role == "sysadmin":
nova.remove_user_role(username, "sysadmin", project)
if role == "netadmin":
nova.remove_user_role(username, "netadmin", project)
def remove_global_roles(username):
nova = get_nova_admin_connection()
userroles = nova.get_user_roles(username)
roles = [str(role.role) for role in userroles]
for role in roles:
if role == "developer":
nova.remove_user_role(username, "developer")
if role == "sysadmin":
nova.remove_user_role(username, "sysadmin")
if role == "netadmin":
nova.remove_user_role(username, "netadmin")
if role == "cloudadmin":
nova.remove_user_role(username, "cloudadmin")
if role == "itsec":
nova.remove_user_role(username, "itsec")
@staff_member_required
def project_user(request, project_name, project_user):
nova = get_nova_admin_connection()
userroles = nova.get_user_roles(project_user, project_name)
try:
modeluser = auth_models.User.objects.get(username = project_user)
except auth_models.User.DoesNotExist:
modeluser = None
if request.method == 'POST':
form = forms.ProjectUserForm(request.POST)
if form.is_valid():
username = project_user
# hacky work around to interface correctly with multiple select form
remove_project_roles(username, project_name)
roleform = request.POST.getlist("role")
for role in roleform:
nova.add_user_role(username, str(role), project_name)
return redirect('admin_project', project_name)
else:
roles = [str(role.role) for role in userroles]
form = forms.ProjectUserForm({
'role': roles,
'user': modeluser,
})
project = nova.get_project(project_name)
return render_to_response('admin/django_nova/project/project_user.html', {
'form' : form,
'project' : project,
'user': modeluser,
}, context_instance = template.RequestContext(request))
@staff_member_required
def add_project_user(request, project_name):
nova = get_nova_admin_connection()
if request.method == 'POST':
form = forms.AddProjectUserForm(request.POST, project=project_name)
if form.is_valid():
username = form.cleaned_data["username"].username
nova.add_project_member(username, project_name,)
roleform = request.POST.getlist("role")
for role in roleform:
nova.add_user_role(username, str(role), project_name)
return redirect('admin_project', project_name)
else:
form = forms.AddProjectUserForm(project=project_name)
project = nova.get_project(project_name)
return render_to_response('admin/django_nova/project/add_project_user.html', {
'form' : form,
'project' : project,
}, context_instance = template.RequestContext(request))
@staff_member_required
def delete_project_user(request, project_name, project_user):
nova = get_nova_admin_connection()
if request.method == 'POST':
nova.remove_project_member(project_user, project_name)
return redirect('admin_project', project_name)
project = nova.get_project(project_name)
user = nova.get_user(project_user)
return render_to_response('admin/django_nova/project/delete_project_user.html', {
'user' : user,
'project' : project,
}, context_instance = template.RequestContext(request))
@staff_member_required
def users_list(request):
nova = get_nova_admin_connection()
users = nova.get_users()
for user in users:
# NOTE(devcamcar): Temporarily disabled for performance reasons.
#roles = [str(role.role) for role in nova.get_user_roles(user.username)]
roles = []
user.roles = ", ".join(roles)
return render_to_response('admin/django_nova/project/user_list.html', {
'users' : users
}, context_instance = template.RequestContext(request))
@staff_member_required
def user_roles(request, user_id):
nova = get_nova_admin_connection()
userroles = nova.get_user_roles(user_id)
try:
modeluser = auth_models.User.objects.get(username=user_id)
except auth_models.User.DoesNotExist:
modeluser = None
if request.method == 'POST':
form = forms.GlobalRolesForm(request.POST)
if form.is_valid():
username = user_id
# hacky work around to interface correctly with multiple select form
remove_global_roles(username)
roleform = request.POST.getlist("role")
for role in roleform:
nova.add_user_role(username, str(role))
return redirect('admin_user_roles', user_id)
else:
roles = [str(role.role) for role in userroles]
form = forms.GlobalRolesForm({
'username': modeluser and modeluser.id or None,
'role': roles,
})
return render_to_response('admin/django_nova/project/global_edit_user.html', {
'form' : form,
'user' : modeluser,
}, context_instance = template.RequestContext(request))