3
from django.core.urlresolvers import reverse
4
from django.utils.translation import ugettext_lazy as _
6
from horizon import api
7
from horizon import tables
9
from ..users.tables import UsersTable
12
LOG = logging.getLogger(__name__)
15
class ModifyQuotasLink(tables.LinkAction):
17
verbose_name = _("Modify Quotas")
18
url = "horizon:syspanel:projects:quotas"
19
attrs = {"class": "ajax-modal"}
22
class ViewMembersLink(tables.LinkAction):
24
verbose_name = _("Modify Users")
25
url = "horizon:syspanel:projects:users"
28
class UsageLink(tables.LinkAction):
30
verbose_name = _("View Usage")
31
url = "horizon:syspanel:projects:usage"
34
class EditLink(tables.LinkAction):
36
verbose_name = _("Edit Project")
37
url = "horizon:syspanel:projects:update"
38
attrs = {"class": "ajax-modal"}
41
class CreateLink(tables.LinkAction):
43
verbose_name = _("Create New Project")
44
url = "horizon:syspanel:projects:create"
45
classes = ("ajax-modal",)
48
class DeleteTenantsAction(tables.DeleteAction):
49
data_type_singular = _("Project")
50
data_type_plural = _("Projects")
52
def delete(self, request, obj_id):
53
api.keystone.tenant_delete(request, obj_id)
56
class TenantFilterAction(tables.FilterAction):
57
def filter(self, table, tenants, filter_string):
58
""" Really naive case-insensitive search. """
59
# FIXME(gabriel): This should be smarter. Written for demo purposes.
60
q = filter_string.lower()
63
if q in tenant.name.lower():
67
return filter(comp, tenants)
70
class TenantsTable(tables.DataTable):
71
id = tables.Column('id', verbose_name=_('Id'))
72
name = tables.Column('name', verbose_name=_('Name'))
73
description = tables.Column(lambda obj: getattr(obj, 'description', None),
74
verbose_name=_('Description'))
75
enabled = tables.Column('enabled', verbose_name=_('Enabled'), status=True)
79
verbose_name = _("Projects")
80
row_actions = (EditLink, UsageLink, ViewMembersLink, ModifyQuotasLink,
82
table_actions = (TenantFilterAction, CreateLink, DeleteTenantsAction)
85
class RemoveUserAction(tables.BatchAction):
87
action_present = _("Remove")
88
action_past = _("Removed")
89
data_type_singular = _("User")
90
data_type_plural = _("Users")
91
classes = ('btn-danger',)
93
def action(self, request, user_id):
94
tenant_id = self.table.kwargs['tenant_id']
95
api.keystone.remove_tenant_user(request, tenant_id, user_id)
98
class TenantUsersTable(UsersTable):
100
name = "tenant_users"
101
verbose_name = _("Users For Project")
102
table_actions = (RemoveUserAction,)
103
row_actions = (RemoveUserAction,)
106
class AddUserAction(tables.LinkAction):
108
verbose_name = _("Add To Project")
109
url = "horizon:syspanel:projects:add_user"
110
classes = ('ajax-modal',)
112
def get_link_url(self, user):
113
tenant_id = self.table.kwargs['tenant_id']
114
return reverse(self.url, args=(tenant_id, user.id))
117
class AddUsersTable(UsersTable):
120
verbose_name = _("Add New Users")
122
row_actions = (AddUserAction,)