tables.py 9.58 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
from django_tables2 import Table, A
22 23
from django_tables2.columns import (TemplateColumn, Column, LinkColumn,
                                    BooleanColumn)
24

25
from vm.models import Node, InstanceTemplate, Lease
26
from storage.models import Disk
27
from django.utils.translation import ugettext_lazy as _
28
from django_sshkey.models import UserKey
29
from dashboard.models import ConnectCommand
30 31


32 33 34 35 36 37 38 39
class FileSizeColumn(Column):
    def render(self, value):
        from sizefield.utils import filesizeformat

        size = filesizeformat(value)
        return size


40 41 42 43
class NodeListTable(Table):

    pk = Column(
        verbose_name="ID",
44
        attrs={'th': {'class': 'node-list-table-thin'}},
45 46
    )

47
    overcommit = Column(
48
        verbose_name=_("Overcommit"),
49
        attrs={'th': {'class': 'node-list-table-thin'}},
50 51
    )

52 53
    get_status_display = Column(
        verbose_name=_("Status"),
54
        attrs={'th': {'class': 'node-list-table-thin'}},
55
        order_by=("enabled", "schedule_enabled"),
56 57 58
    )

    name = TemplateColumn(
59 60
        template_name="dashboard/node-list/column-name.html",
        order_by="normalized_name"
61 62 63 64 65 66 67
    )

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

    number_of_VMs = TemplateColumn(
68
        verbose_name=_("Number of VMs"),
69
        template_name='dashboard/node-list/column-vm.html',
70
        attrs={'th': {'class': 'node-list-table-thin'}},
71 72
    )

73
    monitor = TemplateColumn(
Kálmán Viktor committed
74
        verbose_name=_("Monitor"),
75 76
        template_name='dashboard/node-list/column-monitor.html',
        attrs={'th': {'class': 'node-list-table-monitor'}},
77
        orderable=False,
78 79
    )

80 81 82 83 84 85
    minion_online = BooleanColumn(
        verbose_name=_("Minion online"),
        attrs={'th': {'class': 'node-list-table-thin'}},
        orderable=False,
    )

86 87 88 89
    class Meta:
        model = Node
        attrs = {'class': ('table table-bordered table-striped table-hover '
                           'node-list-table')}
90
        fields = ('pk', 'name', 'host', 'get_status_display', 'priority',
91
                  'minion_online', 'overcommit', 'number_of_VMs', )
92

93

94
class GroupListTable(Table):
95 96 97 98 99 100 101 102 103 104 105
    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(
106
        orderable=False,
107
        verbose_name=_("Number of users"),
108 109 110 111 112
        template_name='dashboard/group-list/column-users.html',
        attrs={'th': {'class': 'group-list-table-admin'}},
    )

    admin = TemplateColumn(
113
        orderable=False,
114
        verbose_name=_("Admin"),
115 116 117 118 119
        template_name='dashboard/group-list/column-admin.html',
        attrs={'th': {'class': 'group-list-table-admin'}},
    )

    actions = TemplateColumn(
120
        orderable=False,
121
        verbose_name=_("Actions"),
122 123 124 125 126
        attrs={'th': {'class': 'group-list-table-thin'}},
        template_code=('{% include "dashboard/group-list/column-'
                       'actions.html" with btn_size="btn-xs" %}'),
    )

127 128 129 130
    class Meta:
        model = Group
        attrs = {'class': ('table table-bordered table-striped table-hover '
                           'group-list-table')}
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
        fields = ('pk', 'name', )


class UserListTable(Table):
    pk = TemplateColumn(
        template_name='dashboard/vm-list/column-id.html',
        verbose_name="ID",
        attrs={'th': {'class': 'vm-list-table-thin'}},
    )

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

    class Meta:
        model = User
        attrs = {'class': ('table table-bordered table-striped table-hover '
                           'vm-list-table')}
        fields = ('pk', 'username', )
150 151


152 153 154 155 156
class UserListTablex(Table):
    class Meta:
        model = User


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

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

207
        prefix = "template-"
208 209 210


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

216
    suspend_interval_seconds = TemplateColumn(
217 218 219
        "{{ record.get_readable_suspend_time }}"
    )

220
    delete_interval_seconds = TemplateColumn(
221 222 223 224 225
        "{{ record.get_readable_delete_time }}"
    )

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

    class Meta:
        model = Lease
        attrs = {'class': ('table table-bordered table-striped table-hover'
                           ' lease-list-table')}
234 235
        fields = ('name', 'suspend_interval_seconds',
                  'delete_interval_seconds', )
236
        prefix = "lease-"
237
        empty_text = _("No available leases.")
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 264 265


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
266 267
        attrs = {'class': ('table table-bordered table-striped table-hover'),
                 'id': "profile-key-list-table"}
268
        fields = ('name', 'fingerprint', 'created', 'actions')
269 270
        prefix = "key-"
        empty_text = _("You haven't added any public keys yet.")
271 272 273


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

    class Meta:
        model = ConnectCommand
296 297 298
        attrs = {'class': ('table table-bordered table-striped table-hover'),
                 'id': "profile-command-list-table"}
        fields = ('name', 'access_method',  'template', 'actions')
299
        prefix = "cmd-"
300 301 302 303
        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.")
304 305 306 307 308 309 310 311 312 313 314 315 316


class DiskListTable(Table):

    size = FileSizeColumn()

    class Meta:
        model = Disk
        attrs = {'class': "table table-bordered table-striped table-hover",
                 'id': "disk-list-table"}
        fields = ("pk", "name", "filename", "size", "is_ready")
        prefix = "disk-"
        order_by = ("-pk", )
317
        per_page = 65536