Fixes for LP bugs 879626, 879633, and 879641.

Tenant delete works properly. And since keystone support for tenant/user names is spotty, changes things to make user and tenant names immutable in the dashboard.
This commit is contained in:
Gabriel Hurley 2011-10-24 16:21:40 -07:00
parent c0fdb7b704
commit 14c0ce55e8
4 changed files with 71 additions and 34 deletions

View File

@ -609,6 +609,10 @@ def tenant_get(request, tenant_id):
return Tenant(account_api(request).tenants.get(tenant_id))
def tenant_delete(request, tenant_id):
account_api(request).tenants.delete(tenant_id)
@check_openstackx
def tenant_list(request):
return [Tenant(t) for t in account_api(request).tenants.list()]

View File

@ -111,7 +111,8 @@ class CreateTenant(forms.SelfHandlingForm):
class UpdateTenant(forms.SelfHandlingForm):
id = forms.CharField(label="ID",
widget=forms.TextInput(attrs={'readonly': 'readonly'}))
name = forms.CharField(label="Name")
name = forms.CharField(label="Name",
widget=forms.TextInput(attrs={'readonly': 'readonly'}))
description = forms.CharField(widget=forms.widgets.Textarea(),
label="Description")
enabled = forms.BooleanField(label="Enabled")
@ -126,7 +127,7 @@ class UpdateTenant(forms.SelfHandlingForm):
data['enabled'])
messages.success(request,
'%s was successfully updated.'
% data['id'])
% data['name'])
except api_exceptions.ApiException, e:
LOG.exception('ApiException while updating tenant\n'
'Id: "%s", Name: "%s", Description: "%s", Enabled "%s"' %
@ -171,9 +172,32 @@ class UpdateQuotas(forms.SelfHandlingForm):
return redirect('syspanel_tenants')
class DeleteTenant(forms.SelfHandlingForm):
tenant_id = forms.CharField(required=True)
def handle(self, request, data):
tenant_id = data['tenant_id']
try:
api.tenant_delete(request, tenant_id)
messages.info(request, _('Successfully deleted tenant %(tenant)s.')
% {"tenant": tenant_id})
except Exception, e:
LOG.exception("Error deleting tenant")
messages.error(request,
_("Error deleting tenant: %s") % e.message)
return redirect(request.build_absolute_uri())
@login_required
@enforce_admin_access
def index(request):
form, handled = DeleteTenant.maybe_handle(request)
if handled:
return handled
tenant_delete_form = DeleteTenant()
tenants = []
try:
tenants = api.tenant_list(request)
@ -184,6 +208,7 @@ def index(request):
return render_to_response(
'django_openstack/syspanel/tenants/index.html', {
'tenants': tenants,
'tenant_delete_form': tenant_delete_form,
}, context_instance=template.RequestContext(request))

View File

@ -50,7 +50,25 @@ class UserForm(forms.Form):
self.fields['tenant_id'].choices = [[tenant.id, tenant.id]
for tenant in tenant_list]
id = forms.CharField(label="ID (username)")
name = forms.CharField(label="Name")
email = forms.CharField(label="Email")
password = forms.CharField(label="Password",
widget=forms.PasswordInput(render_value=False),
required=False)
tenant_id = forms.ChoiceField(label="Primary Tenant")
class UserUpdateForm(forms.Form):
def __init__(self, *args, **kwargs):
tenant_list = kwargs.pop('tenant_list', None)
super(UserUpdateForm, self).__init__(*args, **kwargs)
self.fields['tenant_id'].choices = [[tenant.id, tenant.id]
for tenant in tenant_list]
id = forms.CharField(label="ID",
widget=forms.TextInput(attrs={'readonly': 'readonly'}))
# FIXME: keystone doesn't return the username from a get API call.
#name = forms.CharField(label="Name")
email = forms.CharField(label="Email")
password = forms.CharField(label="Password",
widget=forms.PasswordInput(render_value=False),
@ -123,7 +141,7 @@ def index(request):
def update(request, user_id):
if request.method == "POST":
tenants = api.tenant_list(request)
form = UserForm(request.POST, tenant_list=tenants)
form = UserUpdateForm(request.POST, tenant_list=tenants)
if form.is_valid():
user = form.clean()
updated = []
@ -154,20 +172,10 @@ def update(request, user_id):
else:
u = api.user_get(request, user_id)
tenants = api.tenant_list(request)
try:
# FIXME
email = u.email
except:
email = ''
try:
tenant_id = u.tenantId
except:
tenant_id = None
form = UserForm(initial={'id': user_id,
'tenant_id': tenant_id,
'email': email},
tenant_list=tenants)
form = UserUpdateForm(tenant_list=tenants,
initial={'id': user_id,
'tenant_id': getattr(u, 'tenantId', None),
'email': getattr(u, 'email', '')})
return render_to_response(
'django_openstack/syspanel/users/update.html', {
'form': form,
@ -191,32 +199,32 @@ def create(request):
user = form.clean()
# TODO Make this a real request
try:
LOG.info('Creating user with id "%s"' % user['id'])
api.user_create(request,
user['id'],
user['email'],
user['password'],
user['tenant_id'],
True)
LOG.info('Creating user with name "%s"' % user['name'])
new_user = api.user_create(request,
user['name'],
user['email'],
user['password'],
user['tenant_id'],
True)
messages.success(request,
'%s was successfully created.'
% user['id'])
'User "%s" was successfully created.'
% user['name'])
try:
api.role_add_for_tenant_user(
request, user['tenant_id'], user['id'],
request, user['tenant_id'], new_user.id,
settings.OPENSTACK_KEYSTONE_DEFAULT_ROLE)
except api_exceptions.ApiException, e:
LOG.exception('ApiException while assigning\
role to new user: %s' % user['id'])
messages.error(request, 'Error assigning role to user: %s'
role to new user: %s' % new_user.id)
messages.error(request, 'Error assigning role to user: %s'
% e.message)
return redirect('syspanel_users')
except api_exceptions.ApiException, e:
LOG.exception('ApiException while creating user\n'
'id: "%s", email: "%s", tenant_id: "%s"' %
(user['id'], user['email'], user['tenant_id']))
'name: "%s", email: "%s", tenant_id: "%s"' %
(user['name'], user['email'], user['tenant_id']))
messages.error(request,
'Error creating user: %s'
% e.message)

View File

@ -3,7 +3,7 @@
{% for hidden in form.hidden_fields %}
{{hidden}}
{% endfor %}
<input name="tenant" type="hidden" value="{{tenant.id}}" />
<input id="enable_{{tenant.id}}" class="enable" title="Tenant: {{tenant.id}}" type="submit" value="Delete" />
<input name="tenant_id" type="hidden" value="{{tenant.id}}" />
<input id="delete_{{tenant.id}}" class="delete" title="Tenant: {{tenant.id}}" type="submit" value="Delete" />
</form>