Source code for openstack_dashboard.dashboards.admin.projects.tables

# 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.

from django.core.exceptions import ValidationError  # noqa
from django.core.urlresolvers import reverse  # noqa
from django.utils.http import urlencode  # noqa
from django.utils.translation import ugettext_lazy as _  # noqa

from horizon import exceptions
from horizon import forms
from horizon import tables
from keystoneclient.exceptions import Conflict  # noqa

from openstack_dashboard import api
from openstack_dashboard.api import keystone


class ViewMembersLink(tables.LinkAction):
    name = "users"



[docs] verbose_name = _("Create Project") url = "horizon:admin:projects:create" classes = ("btn-launch", "ajax-modal",) policy_rules = (('identity', 'identity:create_project'),) def allowed(self, request, project): return api.keystone.keystone_can_edit_project()
[docs] class UpdateProject(tables.LinkAction): name = "update"
[docs] verbose_name = _("Edit Project") url = "horizon:admin:projects:update" classes = ("ajax-modal", "btn-edit") policy_rules = (('identity', 'identity:update_project'),) def allowed(self, request, project): return api.keystone.keystone_can_edit_project()
[docs] class ModifyQuotas(tables.LinkAction): name = "quotas"
[docs] verbose_name = _("Modify Quotas") url = "horizon:admin:projects:update" classes = ("ajax-modal", "btn-edit") policy_rules = (('compute', "compute_extension:quotas:update"),) def get_link_url(self, project): step = 'update_quotas'
[docs] data_type_plural = _("Projects") policy_rules = (("identity", "identity:delete_project"),) def allowed(self, request, project): return api.keystone.keystone_can_edit_project()
[docs] def delete(self, request, obj_id): api.keystone.tenant_delete(request, obj_id)
[docs] class TenantFilterAction(tables.FilterAction): def filter(self, table, tenants, filter_string):
[docs] """Really naive case-insensitive search."""
[docs] # FIXME(gabriel): This should be smarter. Written for demo purposes. q = filter_string.lower() def comp(tenant): if q in tenant.name.lower(): return True return False return filter(comp, tenants) class UpdateRow(tables.Row): ajax = True
[docs] def get_data(self, request, project_id): project_info = api.keystone.tenant_get(request, project_id,
[docs] admin=True) return project_info class UpdateCell(tables.UpdateAction): def allowed(self, request, project, cell):
[docs] return api.keystone.keystone_can_edit_project()
[docs] def update_cell(self, request, datum, project_id, cell_name, new_cell_value):
[docs] # inline update project info try: project_obj = datum # updating changed value by new value setattr(project_obj, cell_name, new_cell_value) api.keystone.tenant_update( request, project_id, name=project_obj.name, description=project_obj.description, enabled=project_obj.enabled) except Conflict: # Returning a nice error message about name conflict. The message # from exception is not that clear for the users. message = _("This name is already taken.") raise ValidationError(message) except Exception: exceptions.handle(request, ignore=True) return False return True class TenantsTable(tables.DataTable): name = tables.Column('name', verbose_name=_('Name'),
[docs] form_field=forms.CharField(required=True), update_action=UpdateCell) description = tables.Column(lambda obj: getattr(obj, 'description', None), verbose_name=_('Description'), form_field=forms.CharField( widget=forms.Textarea(), required=False), update_action=UpdateCell) id = tables.Column('id', verbose_name=_('Project ID')) enabled = tables.Column('enabled', verbose_name=_('Enabled'), status=True, form_field=forms.BooleanField( label=_('Enabled'), required=False), update_action=UpdateCell) class Meta: name = "tenants"
[docs] verbose_name = _("Projects") row_class = UpdateRow row_actions = (ViewMembersLink, ViewGroupsLink, UpdateProject, UsageLink, ModifyQuotas, DeleteTenantsAction) table_actions = (TenantFilterAction, CreateProject, DeleteTenantsAction) pagination_param = "tenant_marker"