tables.py 9.28 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# Copyright 2014 Budapest University of Technology and Economics (BME IK)
#
# This file is part of CIRCLE Cloud.
#
# CIRCLE is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
#
# CIRCLE is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along
# with CIRCLE.  If not, see <http://www.gnu.org/licenses/>.

18 19
from __future__ import absolute_import

20
from django.contrib.auth.models import Group, User
21 22 23
from django.utils.translation import ugettext_lazy as _
from django.utils.html import mark_safe

24
from django_tables2 import Table, A
25 26 27 28
from django_tables2.columns import (
    TemplateColumn, Column, LinkColumn, BooleanColumn
)
from django_sshkey.models import UserKey
29

30
from vm.models import Node, InstanceTemplate, Lease
31
from dashboard.models import ConnectCommand
32 33


34 35 36 37
class NodeListTable(Table):

    pk = Column(
        verbose_name="ID",
38
        attrs={'th': {'class': 'node-list-table-thin'}},
39 40
    )

41
    overcommit = Column(
42
        verbose_name=_("Overcommit"),
43
        attrs={'th': {'class': 'node-list-table-thin'}},
44 45
    )

46 47
    get_status_display = Column(
        verbose_name=_("Status"),
48
        attrs={'th': {'class': 'node-list-table-thin'}},
49
        order_by=("enabled", "schedule_enabled"),
50 51 52
    )

    name = TemplateColumn(
53 54
        template_name="dashboard/node-list/column-name.html",
        order_by="normalized_name"
55 56 57 58 59 60 61
    )

    priority = Column(
        attrs={'th': {'class': 'node-list-table-thin'}},
    )

    number_of_VMs = TemplateColumn(
62
        verbose_name=_("Number of VMs"),
63
        template_name='dashboard/node-list/column-vm.html',
64
        attrs={'th': {'class': 'node-list-table-thin'}},
65 66
    )

67
    monitor = TemplateColumn(
Kálmán Viktor committed
68
        verbose_name=_("Monitor"),
69 70
        template_name='dashboard/node-list/column-monitor.html',
        attrs={'th': {'class': 'node-list-table-monitor'}},
71
        orderable=False,
72 73
    )

74 75 76 77 78 79
    minion_online = BooleanColumn(
        verbose_name=_("Minion online"),
        attrs={'th': {'class': 'node-list-table-thin'}},
        orderable=False,
    )

80 81 82 83
    class Meta:
        model = Node
        attrs = {'class': ('table table-bordered table-striped table-hover '
                           'node-list-table')}
84
        fields = ('pk', 'name', 'host', 'get_status_display', 'priority',
85
                  'minion_online', 'overcommit', 'number_of_VMs', )
86

87

88
class GroupListTable(Table):
89 90 91 92 93 94 95 96 97 98 99
    pk = TemplateColumn(
        template_name='dashboard/group-list/column-id.html',
        verbose_name="ID",
        attrs={'th': {'class': 'group-list-table-thin'}},
    )

    name = TemplateColumn(
        template_name="dashboard/group-list/column-name.html"
    )

    number_of_users = TemplateColumn(
100
        orderable=False,
101
        verbose_name=_("Number of users"),
102 103 104 105 106
        template_name='dashboard/group-list/column-users.html',
        attrs={'th': {'class': 'group-list-table-admin'}},
    )

    admin = TemplateColumn(
107
        orderable=False,
108
        verbose_name=_("Admin"),
109 110 111 112 113
        template_name='dashboard/group-list/column-admin.html',
        attrs={'th': {'class': 'group-list-table-admin'}},
    )

    actions = TemplateColumn(
114
        orderable=False,
115
        verbose_name=_("Actions"),
116 117 118 119 120
        attrs={'th': {'class': 'group-list-table-thin'}},
        template_code=('{% include "dashboard/group-list/column-'
                       'actions.html" with btn_size="btn-xs" %}'),
    )

121 122 123 124
    class Meta:
        model = Group
        attrs = {'class': ('table table-bordered table-striped table-hover '
                           'group-list-table')}
125 126 127 128
        fields = ('pk', 'name', )


class UserListTable(Table):
129 130 131
    username = LinkColumn(
        'dashboard.views.profile',
        args=[A('username')],
132
    )
133 134 135 136 137
    profile__org_id = LinkColumn(
        'dashboard.views.profile',
        accessor='profile.org_id',
        args=[A('username')],
        verbose_name=_('Organization ID')
138
    )
139 140 141 142 143 144

    is_superuser = BooleanColumn(
        verbose_name=mark_safe(
            _('<abbr data-placement="left" title="Superuser status">SU</abbr>')
        )
    )
145
    is_active = BooleanColumn()
146 147 148

    class Meta:
        model = User
149
        template = "django_tables2/table_no_page.html"
150 151 152
        attrs = {'class': ('table table-bordered table-striped table-hover')}
        fields = ('username', 'last_name', 'first_name', 'profile__org_id',
                  'email', 'is_active', 'is_superuser')
153 154


155
class TemplateListTable(Table):
156 157
    name = TemplateColumn(
        template_name="dashboard/template-list/column-template-name.html",
158
        attrs={'th': {'data-sort': "string"}}
159
    )
160 161
    resources = TemplateColumn(
        template_name="dashboard/template-list/column-template-resources.html",
162
        verbose_name=_("Resources"),
163
        attrs={'th': {'data-sort': "int"}},
164
        order_by=("ram_size"),
165 166 167 168
    )
    lease = TemplateColumn(
        "{{ record.lease.name }}",
        verbose_name=_("Lease"),
169 170 171 172 173 174 175
        attrs={'th': {'data-sort': "string"}}
    )
    system = Column(
        attrs={'th': {'data-sort': "string"}}
    )
    access_method = Column(
        attrs={'th': {'data-sort': "string"}}
176
    )
177 178 179 180 181
    owner = TemplateColumn(
        template_name="dashboard/template-list/column-template-owner.html",
        verbose_name=_("Owner"),
        attrs={'th': {'data-sort': "string"}}
    )
182 183 184 185
    created = TemplateColumn(
        template_name="dashboard/template-list/column-template-created.html",
        verbose_name=_("Created at"),
    )
186 187 188 189 190
    running = TemplateColumn(
        template_name="dashboard/template-list/column-template-running.html",
        verbose_name=_("Running"),
        attrs={'th': {'data-sort': "int"}},
    )
191 192
    actions = TemplateColumn(
        verbose_name=_("Actions"),
193 194
        template_name="dashboard/template-list/column-template-actions.html",
        attrs={'th': {'class': 'template-list-table-thin'}},
195
        orderable=False,
196 197 198 199 200 201
    )

    class Meta:
        model = InstanceTemplate
        attrs = {'class': ('table table-bordered table-striped table-hover'
                           ' template-list-table')}
202 203
        fields = ('name', 'resources', 'system', 'access_method', 'lease',
                  'owner', 'created', 'running', 'actions', )
204

205
        prefix = "template-"
206 207 208


class LeaseListTable(Table):
209
    name = LinkColumn(
210 211 212 213
        'dashboard.views.lease-detail',
        args=[A('pk')],
    )

214
    suspend_interval_seconds = TemplateColumn(
215 216 217
        "{{ record.get_readable_suspend_time }}"
    )

218
    delete_interval_seconds = TemplateColumn(
219 220 221 222 223
        "{{ record.get_readable_delete_time }}"
    )

    actions = TemplateColumn(
        verbose_name=_("Actions"),
224 225
        template_name="dashboard/template-list/column-lease-actions.html",
        orderable=False,
226 227 228 229 230 231
    )

    class Meta:
        model = Lease
        attrs = {'class': ('table table-bordered table-striped table-hover'
                           ' lease-list-table')}
232 233
        fields = ('name', 'suspend_interval_seconds',
                  'delete_interval_seconds', )
234
        prefix = "lease-"
235
        empty_text = _("No available leases.")
236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263


class UserKeyListTable(Table):
    name = LinkColumn(
        'dashboard.views.userkey-detail',
        args=[A('pk')],
        verbose_name=_("Name"),
        attrs={'th': {'data-sort': "string"}}
    )

    fingerprint = Column(
        verbose_name=_("Fingerprint"),
        attrs={'th': {'data-sort': "string"}}
    )

    created = Column(
        verbose_name=_("Created at"),
        attrs={'th': {'data-sort': "string"}}
    )

    actions = TemplateColumn(
        verbose_name=_("Actions"),
        template_name="dashboard/userkey-list/column-userkey-actions.html",
        orderable=False,
    )

    class Meta:
        model = UserKey
264 265
        attrs = {'class': ('table table-bordered table-striped table-hover'),
                 'id': "profile-key-list-table"}
266
        fields = ('name', 'fingerprint', 'created', 'actions')
267 268
        prefix = "key-"
        empty_text = _("You haven't added any public keys yet.")
269 270 271


class ConnectCommandListTable(Table):
272 273 274
    name = LinkColumn(
        'dashboard.views.connect-command-detail',
        args=[A('pk')],
275 276
        attrs={'th': {'data-sort': "string"}}
    )
277 278
    access_method = Column(
        verbose_name=_("Access method"),
279 280 281 282 283 284 285 286
        attrs={'th': {'data-sort': "string"}}
    )
    template = Column(
        verbose_name=_("Template"),
        attrs={'th': {'data-sort': "string"}}
    )
    actions = TemplateColumn(
        verbose_name=_("Actions"),
287 288
        template_name=("dashboard/connect-command-list/column-command"
                       "-actions.html"),
289 290 291 292 293
        orderable=False,
    )

    class Meta:
        model = ConnectCommand
294 295 296
        attrs = {'class': ('table table-bordered table-striped table-hover'),
                 'id': "profile-command-list-table"}
        fields = ('name', 'access_method',  'template', 'actions')
297
        prefix = "cmd-"
298 299 300 301
        empty_text = _(
            "You don't have any custom connection commands yet. You can "
            "specify commands to be displayed on VM detail pages instead of "
            "the defaults.")