1# Licensed under the Apache License, Version 2.0 (the "License"); you may
2# not use this file except in compliance with the License. You may obtain
3# a copy of the License at
4#
5#      http://www.apache.org/licenses/LICENSE-2.0
6#
7# Unless required by applicable law or agreed to in writing, software
8# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10# License for the specific language governing permissions and limitations
11# under the License.
12
13
14from django.template import defaultfilters as filters
15from django.urls import reverse
16from django.utils.translation import ugettext_lazy as _
17from django.utils.translation import ungettext_lazy
18
19from horizon import exceptions
20from horizon import forms
21from horizon import tables
22
23from openstack_dashboard.api import cinder
24
25
26class CreateGroupType(tables.LinkAction):
27    name = "create"
28    verbose_name = _("Create Group Type")
29    url = "horizon:admin:group_types:create_type"
30    classes = ("ajax-modal",)
31    icon = "plus"
32    policy_rules = (("volume", "group:group_types_manage"),)
33
34
35class EditGroupType(tables.LinkAction):
36    name = "edit"
37    verbose_name = _("Edit Group Type")
38    url = "horizon:admin:group_types:update_type"
39    classes = ("ajax-modal",)
40    icon = "pencil"
41    policy_rules = (("volume", "group:group_types_manage"),)
42
43
44class GroupTypeSpecs(tables.LinkAction):
45    name = "specs"
46    verbose_name = _("View Specs")
47    url = "horizon:admin:group_types:specs:index"
48    classes = ("ajax-modal",)
49    icon = "pencil"
50    policy_rules = (("volume", "group:group_types_manage"),)
51
52
53class GroupTypesFilterAction(tables.FilterAction):
54
55    def filter(self, table, group_types, filter_string):
56        """Naive case-insensitive search."""
57        query = filter_string.lower()
58        return [group_type for group_type in group_types
59                if query in group_type.name.lower()]
60
61
62class DeleteGroupType(tables.DeleteAction):
63    @staticmethod
64    def action_present(count):
65        return ungettext_lazy(
66            "Delete Group Type",
67            "Delete Group Types",
68            count
69        )
70
71    @staticmethod
72    def action_past(count):
73        return ungettext_lazy(
74            "Deleted Group Type",
75            "Deleted Group Types",
76            count
77        )
78    policy_rules = (("volume", "group:group_types_manage"),)
79
80    def delete(self, request, obj_id):
81        try:
82            cinder.group_type_delete(request, obj_id)
83        except exceptions.BadRequest as e:
84            redirect_url = reverse("horizon:admin:group_types:index")
85            exceptions.handle(request, e, redirect=redirect_url)
86
87
88class UpdateRow(tables.Row):
89    ajax = True
90
91    def get_data(self, request, group_type_id):
92        try:
93            group_type = \
94                cinder.group_type_get(request, group_type_id)
95        except Exception:
96            exceptions.handle(request,
97                              _('Unable to retrieve group type.'))
98        return group_type
99
100
101class GroupTypesTable(tables.DataTable):
102    name = tables.WrappingColumn("name", verbose_name=_("Name"),
103                                 form_field=forms.CharField(max_length=64))
104    description = tables.Column(lambda obj: getattr(obj, 'description', None),
105                                verbose_name=_('Description'),
106                                form_field=forms.CharField(
107                                    widget=forms.Textarea(attrs={'rows': 4}),
108                                    required=False))
109    public = tables.Column("is_public",
110                           verbose_name=_("Public"),
111                           filters=(filters.yesno, filters.capfirst),
112                           form_field=forms.BooleanField(
113                               label=_('Public'), required=False))
114
115    def get_object_display(self, group_type):
116        return group_type.name
117
118    def get_object_id(self, group_type):
119        return str(group_type.id)
120
121    class Meta(object):
122        name = "group_types"
123        verbose_name = _("Group Types")
124        table_actions = (
125            GroupTypesFilterAction,
126            CreateGroupType,
127            DeleteGroupType,
128        )
129        row_actions = (
130            GroupTypeSpecs,
131            EditGroupType,
132            DeleteGroupType
133        )
134        row_class = UpdateRow
135