Renamed all user-facing cases of "tenant" to "project".

This required a little more refactoring than expected because I
wanted to make the url slug also say "project", which required
changing the panel slug, which in turn required changing the name of
the panel directory, and then it seemed silly not to make the template
directory match.

Fixed bug 909495.

Change-Id: I9da3b544b46f507a223a44c256d0008c8674ab3b
This commit is contained in:
Gabriel Hurley 2012-02-06 18:05:33 -08:00
parent 6892653c05
commit 87e6970a54
43 changed files with 125 additions and 111 deletions

View File

@ -126,3 +126,16 @@ Be sure to generate the documentation before submitting a patch for review.
Unexpected warnings often appear when building the documentation, and slight
reST syntax errors frequently cause links or cross-references not to work
correctly.
Conventions
-----------
Simply by convention, we have a few rules about naming:
* The term "project" is used in place of Keystone's "tenant" terminology
in all user-facing text. The term "tenant" is still used in API code to
make things more obvious for developers.
* The term "dashboard" refers to a top-level dashboard class, and "panel" to
the sub-items within a dashboard. Referring to a panel as a dashboard is
both confusing and incorrect.

View File

@ -17,3 +17,8 @@ Panel
A Python class representing a sub-navigation item (e.g. "instances")
which contains all the necessary logic (views, forms, tests, etc.) for
that interface.
Project
Used in user-facing text in place of the term "Tenant" which is Keystone's
word.

View File

@ -31,7 +31,7 @@ LOG = logging.getLogger(__name__)
class AllocateIP(tables.LinkAction):
name = "allocate"
verbose_name = _("Allocate IP To Tenant")
verbose_name = _("Allocate IP To Project")
attrs = {"class": "ajax-modal btn small"}
url = "horizon:nova:access_and_security:floating_ips:allocate"

View File

@ -39,7 +39,7 @@ class NetworksTable(tables.DataTable):
used = tables.Column('used', verbose_name=_('Used'))
available = tables.Column('available', verbose_name=_('Available'))
total = tables.Column('total', verbose_name=_('Total'))
#tenant = tables.Column('tenant', verbose_name=_('Tenant'))
#tenant = tables.Column('tenant', verbose_name=_('Project'))
def get_object_id(self, datum):
return datum['id']

View File

@ -15,7 +15,7 @@
</div>
<div class="right">
<h3>{% trans "Description:" %}</h3>
<p>{% trans "Specify the details for launching an instance. Also please make note of the table below; all tenants have quotas which define the limit of resources they are allowed to provision." %}</p>
<p>{% trans "Specify the details for launching an instance. Also please make note of the table below; all projects have quotas which define the limit of resources they are allowed to provision." %}</p>
<table class="table table-striped table-bordered">
<tr>
<th>{% trans "Quota Name" %}</th>

View File

@ -20,9 +20,9 @@ import horizon
class Settings(horizon.Dashboard):
name = "Settings"
name = _("Settings")
slug = "settings"
panels = ('user', 'tenant')
panels = ('user', 'project')
default_panel = 'user'
nav = False

View File

@ -32,7 +32,7 @@ LOG = logging.getLogger(__name__)
class DownloadOpenRCForm(forms.SelfHandlingForm):
tenant = forms.ChoiceField(label=_("Select a Tenant"))
tenant = forms.ChoiceField(label=_("Select a Project"))
@classmethod
def _instantiate(cls, request, *args, **kwargs):
@ -58,7 +58,7 @@ class DownloadOpenRCForm(forms.SelfHandlingForm):
'tenant_id': data['tenant']}
response = shortcuts.render(request,
'settings/tenant/openrc.sh.template',
'settings/project/openrc.sh.template',
context,
content_type="text/plain")
response['Content-Disposition'] = 'attachment; filename=openrc.sh'

View File

@ -19,8 +19,8 @@ from horizon.dashboards.settings import dashboard
class TenantPanel(horizon.Panel):
name = "Tenant Settings"
slug = 'tenant'
name = "Project Settings"
slug = 'project'
dashboard.Settings.register(TenantPanel)

View File

@ -17,5 +17,5 @@
from django.conf.urls.defaults import patterns, url
urlpatterns = patterns('horizon.dashboards.settings.tenant.views',
urlpatterns = patterns('horizon.dashboards.settings.project.views',
url(r'^$', 'index', name='index'))

View File

@ -15,7 +15,7 @@
# under the License.
from django import shortcuts
from horizon.dashboards.settings.tenant.forms import DownloadOpenRCForm
from .forms import DownloadOpenRCForm
def index(request):
@ -26,4 +26,4 @@ def index(request):
context = {'form': form}
return shortcuts.render(request, 'settings/tenant/settings.html', context)
return shortcuts.render(request, 'settings/project/settings.html', context)

View File

@ -2,7 +2,7 @@
{% load i18n %}
{% block form_id %}openrc_download_form{% endblock %}
{% block form_action %}{% url horizon:settings:tenant:index %}{% endblock %}
{% block form_action %}{% url horizon:settings:project:index %}{% endblock %}
{% block modal_id %}language_settings_modal{% endblock %}
{% block modal-header %}{% trans "Download RC File" %}{% endblock %}
@ -15,12 +15,12 @@
</div>
<div class="right">
<h3>{% trans "Description:" %}</h3>
<p>{% trans 'Download the RC file for the selected tenant, then type "source openrc" in the terminal to configure your environment to communicate with OpenStack.' %}</p>
<p>{% trans 'Download the RC file for the selected project, then type "source openrc" in the terminal to configure your environment to communicate with OpenStack.' %}</p>
</div>
{% endblock %}
{% block modal-footer %}
<input class="btn primary pull-right" type="submit" value="{% trans "Download RC File" %}" />
{% if hide %}<a href="{% url horizon:settings:tenant:index %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>{% endif %}
{% if hide %}<a href="{% url horizon:settings:project:index %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>{% endif %}
{% endblock %}

View File

@ -3,9 +3,9 @@
{% block title %}OpenRC Download{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Tenant Settings") %}
{% include "horizon/common/_page_header.html" with title=_("Project Settings") %}
{% endblock page_header %}
{% block settings_main %}
{% include "settings/tenant/_openrc.html" %}
{% include "settings/project/_openrc.html" %}
{% endblock %}

View File

@ -15,7 +15,6 @@
# under the License.
from django import shortcuts
from horizon.dashboards.settings.tenant.forms import DownloadOpenRCForm
def index(request):

View File

@ -23,7 +23,7 @@ class Syspanel(horizon.Dashboard):
name = "Admin" # Appears in navigation
slug = "syspanel"
panels = {_("System Panel"): ('overview', 'instances', 'services',
'flavors', 'images', 'tenants', 'users',
'flavors', 'images', 'projects', 'users',
'quotas',)}
default_panel = 'overview'
roles = ('admin',)

View File

@ -52,7 +52,7 @@ class AddUser(forms.SelfHandlingForm):
messages.success(request, _('Successfully added user to tenant.'))
except:
exceptions.handle(request, _('Unable to add user to tenant.'))
return shortcuts.redirect('horizon:syspanel:tenants:users',
return shortcuts.redirect('horizon:syspanel:projects:users',
tenant_id=data['tenant_id'])
@ -76,7 +76,7 @@ class CreateTenant(forms.SelfHandlingForm):
% data['name'])
except:
exceptions.handle(request, _('Unable to create tenant.'))
return shortcuts.redirect('horizon:syspanel:tenants:index')
return shortcuts.redirect('horizon:syspanel:projects:index')
class UpdateTenant(forms.SelfHandlingForm):
@ -102,7 +102,7 @@ class UpdateTenant(forms.SelfHandlingForm):
% data['name'])
except:
exceptions.handle(request, _('Unable to update tenant.'))
return shortcuts.redirect('horizon:syspanel:tenants:index')
return shortcuts.redirect('horizon:syspanel:projects:index')
class UpdateQuotas(forms.SelfHandlingForm):
@ -138,4 +138,4 @@ class UpdateQuotas(forms.SelfHandlingForm):
% data['tenant_id'])
except:
exceptions.handle(request, _('Unable to update quotas.'))
return shortcuts.redirect('horizon:syspanel:tenants:index')
return shortcuts.redirect('horizon:syspanel:projects:index')

View File

@ -23,8 +23,8 @@ from horizon.dashboards.syspanel import dashboard
class Tenants(horizon.Panel):
name = "Tenants"
slug = 'tenants'
name = "Projects"
slug = 'projects'
dashboard.Syspanel.register(Tenants)

View File

@ -15,39 +15,39 @@ LOG = logging.getLogger(__name__)
class ModifyQuotasLink(tables.LinkAction):
name = "quotas"
verbose_name = _("Modify Quotas")
url = "horizon:syspanel:tenants:quotas"
url = "horizon:syspanel:projects:quotas"
attrs = {"class": "ajax-modal"}
class ViewMembersLink(tables.LinkAction):
name = "users"
verbose_name = _("Modify Users")
url = "horizon:syspanel:tenants:users"
url = "horizon:syspanel:projects:users"
class UsageLink(tables.LinkAction):
name = "usage"
verbose_name = _("View Usage")
url = "horizon:syspanel:tenants:usage"
url = "horizon:syspanel:projects:usage"
class EditLink(tables.LinkAction):
name = "update"
verbose_name = _("Edit Tenant")
url = "horizon:syspanel:tenants:update"
verbose_name = _("Edit Project")
url = "horizon:syspanel:projects:update"
attrs = {"class": "ajax-modal"}
class CreateLink(tables.LinkAction):
name = "create"
verbose_name = _("Create New Tenant")
url = "horizon:syspanel:tenants:create"
verbose_name = _("Create New Project")
url = "horizon:syspanel:projects:create"
attrs = {"class": "ajax-modal btn small"}
class DeleteTenantsAction(tables.DeleteAction):
data_type_singular = _("Tenant")
data_type_plural = _("Tenants")
data_type_singular = _("Project")
data_type_plural = _("Projects")
def delete(self, request, obj_id):
api.keystone.tenant_delete(request, obj_id)
@ -76,7 +76,7 @@ class TenantsTable(tables.DataTable):
class Meta:
name = "tenants"
verbose_name = _("Tenants")
verbose_name = _("Projects")
row_actions = (EditLink, UsageLink, ViewMembersLink, ModifyQuotasLink,
DeleteTenantsAction)
table_actions = (TenantFilterAction, CreateLink, DeleteTenantsAction)
@ -98,15 +98,15 @@ class RemoveUserAction(tables.BatchAction):
class TenantUsersTable(UsersTable):
class Meta:
name = "tenant_users"
verbose_name = _("Users For Tenant")
verbose_name = _("Users For Project")
table_actions = (RemoveUserAction,)
row_actions = (RemoveUserAction,)
class AddUserAction(tables.LinkAction):
name = "add_user"
verbose_name = _("Add To Tenant")
url = "horizon:syspanel:tenants:add_user"
verbose_name = _("Add To Project")
url = "horizon:syspanel:projects:add_user"
classes = ('ajax-modal',)
def get_link_url(self, user):

View File

@ -22,7 +22,7 @@ from horizon import api
from horizon import test
INDEX_URL = reverse('horizon:syspanel:tenants:index')
INDEX_URL = reverse('horizon:syspanel:projects:index')
class FakeResource(object):
@ -60,7 +60,7 @@ class TenantsViewTests(test.BaseAdminViewTests):
res = self.client.get(INDEX_URL)
self.assertTemplateUsed(res, 'syspanel/tenants/index.html')
self.assertTemplateUsed(res, 'syspanel/projects/index.html')
self.assertItemsEqual(res.context['table'].data, self.tenants)
def test_modify_quota(self):
@ -78,7 +78,7 @@ class TenantsViewTests(test.BaseAdminViewTests):
self.mox.ReplayAll()
url = reverse('horizon:syspanel:tenants:quotas',
url = reverse('horizon:syspanel:projects:quotas',
args=(self.TEST_TENANT,))
data = {"method": "UpdateQuotas",
"tenant_id": self.TEST_TENANT,

View File

@ -41,7 +41,7 @@ LOG = logging.getLogger(__name__)
class IndexView(tables.DataTableView):
table_class = TenantsTable
template_name = 'syspanel/tenants/index.html'
template_name = 'syspanel/projects/index.html'
def get_data(self):
tenants = []
@ -63,12 +63,12 @@ class IndexView(tables.DataTableView):
class CreateView(forms.ModalFormView):
form_class = CreateTenant
template_name = 'syspanel/tenants/create.html'
template_name = 'syspanel/projects/create.html'
class UpdateView(forms.ModalFormView):
form_class = UpdateTenant
template_name = 'syspanel/tenants/update.html'
template_name = 'syspanel/projects/update.html'
context_object_name = 'tenant'
def get_object(self, *args, **kwargs):
@ -79,7 +79,7 @@ class UpdateView(forms.ModalFormView):
LOG.exception('Error fetching tenant with id "%s"' % tenant_id)
messages.error(self.request, _('Unable to update tenant: %s')
% e.message)
raise http.Http404("Tenant with ID %s not found." % tenant_id)
raise http.Http404("Project with ID %s not found." % tenant_id)
def get_initial(self):
return {'id': self.object.id,
@ -90,7 +90,7 @@ class UpdateView(forms.ModalFormView):
class UsersView(tables.MultiTableView):
table_classes = (TenantUsersTable, AddUsersTable)
template_name = 'syspanel/tenants/users.html'
template_name = 'syspanel/projects/users.html'
def get_data(self, *args, **kwargs):
tenant_id = self.kwargs["tenant_id"]
@ -99,7 +99,7 @@ class UsersView(tables.MultiTableView):
self.all_users = api.keystone.user_list(self.request)
self.tenant_users = api.keystone.user_list(self.request, tenant_id)
except:
redirect = reverse("horizon:syspanel:tenants:index")
redirect = reverse("horizon:syspanel:projects:index")
exceptions.handle(self.request,
_("Unable to retrieve users."),
redirect=redirect)
@ -121,7 +121,7 @@ class UsersView(tables.MultiTableView):
class AddUserView(forms.ModalFormView):
form_class = AddUser
template_name = 'syspanel/tenants/add_user.html'
template_name = 'syspanel/projects/add_user.html'
context_object_name = 'tenant'
def get_object(self, *args, **kwargs):
@ -138,7 +138,7 @@ class AddUserView(forms.ModalFormView):
try:
roles = api.keystone.role_list(self.request)
except:
redirect = reverse("horizon:syspanel:tenants:users",
redirect = reverse("horizon:syspanel:projects:users",
args=(self.kwargs["tenant_id"],))
exceptions.handle(self.request,
_("Unable to retrieve roles."),
@ -156,7 +156,7 @@ class AddUserView(forms.ModalFormView):
class QuotasView(forms.ModalFormView):
form_class = UpdateQuotas
template_name = 'syspanel/tenants/quotas.html'
template_name = 'syspanel/projects/quotas.html'
context_object_name = 'tenant'
def get_object(self, *args, **kwargs):
@ -181,7 +181,7 @@ class QuotasView(forms.ModalFormView):
class TenantUsageView(usage.UsageView):
table_class = usage.TenantUsageTable
usage_class = usage.TenantUsage
template_name = 'syspanel/tenants/usage.html'
template_name = 'syspanel/projects/usage.html'
def get_data(self):
super(TenantUsageView, self).get_data()

View File

@ -2,10 +2,10 @@
{% load i18n %}
{% block form_id %}add_user_form{% endblock %}
{% block form_action %}{% url horizon:syspanel:tenants:add_user tenant_id user_id %}{% endblock %}
{% block form_action %}{% url horizon:syspanel:projects:add_user tenant_id user_id %}{% endblock %}
{% block modal_id %}add_user_modal{% endblock %}
{% block modal-header %}{% trans "Add User To Tenant" %}{% endblock %}
{% block modal-header %}{% trans "Add User To Project" %}{% endblock %}
{% block modal-body %}
<div class="left">
@ -15,11 +15,11 @@
</div>
<div class="right">
<h3>{% trans "Description" %}:</h3>
<p>{% trans "Select the user role for the tenant." %}</p>
<p>{% trans "Select the user role for the project." %}</p>
</div>
{% endblock %}
{% block modal-footer %}
<input class="btn primary pull-right" type="submit" value="{% trans "Add" %}" />
<a href="{% url horizon:syspanel:tenants:users tenant_id %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
<a href="{% url horizon:syspanel:projects:users tenant_id %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -2,10 +2,10 @@
{% load i18n %}
{% block form_id %}create_tenant_form{% endblock %}
{% block form_action %}{% url horizon:syspanel:tenants:create %}{% endblock %}
{% block form_action %}{% url horizon:syspanel:projects:create %}{% endblock %}
{% block modal_id %}create_tenant_modal{% endblock %}
{% block modal-header %}{% trans "Create Tenant" %}{% endblock %}
{% block modal-header %}{% trans "Create Project" %}{% endblock %}
{% block modal-body %}
<div class="left">
@ -15,11 +15,11 @@
</div>
<div class="right">
<h3>{% trans "Description" %}:</h3>
<p>{% trans "From here you can create a new tenant (aka project) to organize users." %}</p>
<p>{% trans "From here you can create a new project to organize users." %}</p>
</div>
{% endblock %}
{% block modal-footer %}
<input class="btn primary pull-right" type="submit" value="{% trans "Create Tenant" %}" />
<a href="{% url horizon:syspanel:tenants:index %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
<input class="btn primary pull-right" type="submit" value="{% trans "Create Project" %}" />
<a href="{% url horizon:syspanel:projects:index %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -2,7 +2,7 @@
{% load i18n %}
{% block form_id %}quota_update_form{% endblock %}
{% block form_action %}{% url horizon:syspanel:tenants:quotas tenant.id %}{% endblock %}
{% block form_action %}{% url horizon:syspanel:projects:quotas tenant.id %}{% endblock %}
{% block modal-header %}{% trans "Update Quota" %}{% endblock %}
@ -14,11 +14,11 @@
</div>
<div class="right">
<h3>{% trans "Description" %}:</h3>
<p>{% blocktrans with tenant_id=tenant.id %}From here you can edit quotas (max limits) for the tenant {{ tenant_id }}.{% endblocktrans %}</p>
<p>{% blocktrans with tenant_id=tenant.id %}From here you can edit quotas (max limits) for the project {{ tenant.name }}.{% endblocktrans %}</p>
</div>
{% endblock %}
{% block modal-footer %}
<input class="btn primary pull-right" type="submit" value="{% trans "Update Quota" %}" />
<a href="{% url horizon:syspanel:tenants:index %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
<a href="{% url horizon:syspanel:projects:index %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -2,10 +2,10 @@
{% load i18n %}
{% block form_id %}{% endblock %}
{% block form_action %}{% url horizon:syspanel:tenants:update tenant.id %}{% endblock %}
{% block form_action %}{% url horizon:syspanel:projects:update tenant.id %}{% endblock %}
{% block modal_id %}update_tenant_modal{% endblock %}
{% block modal-header %}{% trans "Update Tenant" %}{% endblock %}
{% block modal-header %}{% trans "Update Project" %}{% endblock %}
{% block modal-body %}
<div class="left">
@ -15,11 +15,11 @@
</div>
<div class="right">
<h3>{% trans "Description" %}:</h3>
<p>{% trans "From here you can edit a tenant." %}</p>
<p>{% trans "From here you can edit a project." %}</p>
</div>
{% endblock %}
{% block modal-footer %}
<input class="btn primary pull-right" type="submit" value="{% trans "Update Tenant" %}" />
<a href="{% url horizon:syspanel:tenants:index %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
<input class="btn primary pull-right" type="submit" value="{% trans "Update Project" %}" />
<a href="{% url horizon:syspanel:projects:index %}" class="btn secondary cancel close">{% trans "Cancel" %}</a>
{% endblock %}

View File

@ -1,11 +1,11 @@
{% extends 'syspanel/base.html' %}
{% load i18n %}
{% block title %}{% trans "Add User To Tenant" %}{% endblock %}
{% block title %}{% trans "Add User To Project" %}{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Add User To Tenant") %}
{% include "horizon/common/_page_header.html" with title=_("Add User To Project") %}
{% endblock page_header %}
{% block syspanel_main %}
{% include 'syspanel/tenants/_add_user.html' %}
{% include 'syspanel/projects/_add_user.html' %}
{% endblock %}

View File

@ -1,11 +1,11 @@
{% extends 'syspanel/base.html' %}
{% load i18n %}
{% block title %}Create Tenant{% endblock %}
{% block title %}Create Project{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Create Tenant") %}
{% include "horizon/common/_page_header.html" with title=_("Create Project") %}
{% endblock page_header %}
{% block syspanel_main %}
{% include 'syspanel/tenants/_create.html' %}
{% include 'syspanel/projects/_create.html' %}
{% endblock %}

View File

@ -1,11 +1,11 @@
{% extends 'syspanel/base.html' %}
{% load i18n %}
{% block title %}Tenants{% endblock %}
{% block title %}Projects{% endblock %}
{% block page_header %}
{% url horizon:syspanel:tenants:index as refresh_link %}
{% url horizon:syspanel:projects:index as refresh_link %}
{# to make searchable false, just remove it from the include statement #}
{% include "horizon/common/_page_header.html" with title=_("Tenants") refresh_link=refresh_link searchable="true" %}
{% include "horizon/common/_page_header.html" with title=_("Projects") refresh_link=refresh_link searchable="true" %}
{% endblock page_header %}
{% block syspanel_main %}

View File

@ -1,11 +1,11 @@
{% extends 'syspanel/base.html' %}
{% load i18n %}
{% block title %}Modify Tenant Quotas{% endblock %}
{% block title %}Modify Project Quotas{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Update Tenant") %}
{% include "horizon/common/_page_header.html" with title=_("Update Project") %}
{% endblock page_header %}
{% block syspanel_main %}
{% include 'syspanel/tenants/_quotas.html' with form=form %}
{% include 'syspanel/projects/_quotas.html' with form=form %}
{% endblock %}

View File

@ -1,11 +1,11 @@
{% extends 'syspanel/base.html' %}
{% load i18n %}
{% block title %}Update Tenant{% endblock %}
{% block title %}Update Project{% endblock %}
{% block page_header %}
{% include "horizon/common/_page_header.html" with title=_("Update Tenant") %}
{% include "horizon/common/_page_header.html" with title=_("Update Project") %}
{% endblock page_header %}
{% block syspanel_main %}
{% include 'syspanel/tenants/_update.html' %}
{% include 'syspanel/projects/_update.html' %}
{% endblock %}

View File

Can't render this file because it contains an unexpected character in line 1 and column 46.

View File

@ -0,0 +1,14 @@
{% extends 'syspanel/base.html' %}
{% load i18n sizeformat %}
{% block title %}{% trans "Project Usage Overview" %}{% endblock %}
{% block page_header %}
<div class='page-header'>
<h2>{% trans "Project Usage" %}</h2>
</div>
{% endblock %}
{% block syspanel_main %}
{% include "horizon/common/_usage_summary.html" %}
{{ table.render }}
{% endblock %}

View File

@ -1,10 +1,10 @@
{% extends 'syspanel/base.html' %}
{% load i18n %}
{% block title %}Tenant Users{% endblock %}
{% block title %}Project Users{% endblock %}
{% block page_header %}
<div class='page-header'>
<h2>{% trans "Users for Tenant" %}: <span>{{ tenant.name }}</span></h2>
<h2>{% trans "Users for Project" %}: <span>{{ tenant.name }}</span></h2>
</div>
{% endblock %}

View File

@ -1,9 +0,0 @@
{% load i18n %}
<form id="form_tenant_delete{{ tenant.id }}" class="form-tenant-delete" method="post">
{% csrf_token %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
<input name="tenant_id" type="hidden" value="{{ tenant.id }}" />
<input id="delete_{{ tenant.id }}" class="btn small delete" title="Tenant: {{ tenant.id }}" type="submit" value="{% trans "Delete" %}" />
</form>

View File

@ -1,8 +0,0 @@
{% extends 'syspanel/base.html' %}
{% load i18n sizeformat %}
{% block title %}{% trans "Tenant Usage Overview" %}{% endblock %}
{% block syspanel_main %}
{% include "horizon/common/_usage_summary.html" %}
{{ table.render }}
{% endblock %}

View File

@ -14,7 +14,7 @@
</div>
<div class="right">
<h3>{% trans "Description" %}:</h3>
<p>{% trans "From here you can create a new user and assign them to a tenant (aka project)." %}</p>
<p>{% trans "From here you can create a new user and assign them to a project." %}</p>
</div>
{% endblock %}

View File

@ -1,7 +1,7 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% block form_id %}update_tenant_form{% endblock %}
{% block form_id %}update_user_form{% endblock %}
{% block form_action %}{% url horizon:syspanel:users:update user.id %}{% endblock %}
{% block modal-header %}{% trans "Update User" %}{% endblock %}
@ -14,7 +14,7 @@
</div>
<div class="right">
<h3>{% trans "Description" %}:</h3>
<p>{% trans "From here you can edit users by changing their usernames, emails, passwords, and tenants." %}</p>
<p>{% trans "From here you can edit the user by changing their username, email, password, and default project." %}</p>
</div>
{% endblock %}

View File

@ -53,7 +53,7 @@ class CreateUserForm(BaseUserForm):
password = forms.CharField(label=_("Password"),
widget=forms.PasswordInput(render_value=False),
required=False)
tenant_id = forms.ChoiceField(label=_("Primary Tenant"))
tenant_id = forms.ChoiceField(label=_("Primary Project"))
def handle(self, request, data):
try:
@ -92,7 +92,7 @@ class UpdateUserForm(BaseUserForm):
password = forms.CharField(label=_("Password"),
widget=forms.PasswordInput(render_value=False),
required=False)
tenant_id = forms.ChoiceField(label=_("Primary Tenant"))
tenant_id = forms.ChoiceField(label=_("Primary Project"))
def handle(self, request, data):
updated = []

View File

@ -128,7 +128,7 @@ class UsersTable(tables.DataTable):
email = tables.Column(_('email'))
# Default tenant is not returned from Keystone currently.
#default_tenant = tables.Column(_('default_tenant'),
# verbose_name="Default Tenant")
# verbose_name="Default Project")
enabled = tables.Column(_('enabled'),
status=True,
status_choices=STATUS_CHOICES)

View File

@ -104,7 +104,7 @@ class HorizonTests(test.TestCase):
'<Panel: Services>',
'<Panel: Flavors>',
'<Panel: Images>',
'<Panel: Tenants>',
'<Panel: Projects>',
'<Panel: Users>',
'<Panel: Quotas>'])
self.assertEqual(syspanel.get_absolute_url(), "/syspanel/")
@ -120,7 +120,7 @@ class HorizonTests(test.TestCase):
settings_dash.register(MyPanel)
self.assertQuerysetEqual(settings_dash.get_panels(),
['<Panel: User Settings>',
'<Panel: Tenant Settings>',
'<Panel: Project Settings>',
'<Panel: My Panel>'])
def test_panels(self):

View File

@ -23,7 +23,7 @@ class BaseUsageTable(tables.DataTable):
class GlobalUsageTable(BaseUsageTable):
tenant = tables.Column('tenant_id', verbose_name=_("Tenant ID"))
tenant = tables.Column('tenant_id', verbose_name=_("Project ID"))
disk_hours = tables.Column('disk_gb_hours',
verbose_name=_("Disk GB Hours"))