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