# coding: utf-8 # from django.http import Http404 from django.views.generic import TemplateView from django.views.generic.edit import CreateView, UpdateView from django.utils.translation import ugettext as _ from common.permissions import PermissionsMixin, IsSuperUser from terminal.models import ReplayStorage, CommandStorage from .. import forms, const __all__ = [ 'ReplayStorageListView', 'ReplayStorageCreateView', 'ReplayStorageUpdateView', 'CommandStorageListView', 'CommandStorageCreateView', 'CommandStorageUpdateView' ] class ReplayStorageListView(PermissionsMixin, TemplateView): template_name = 'terminal/replay_storage_list.html' permission_classes = [IsSuperUser] def get_context_data(self, **kwargs): context = { 'app': _('Terminal'), 'action': _('Replay storage list'), 'is_replay': True, 'type_choices': const.REPLAY_STORAGE_TYPE_CHOICES_EXTENDS, } kwargs.update(context) return super().get_context_data(**kwargs) class CommandStorageListView(PermissionsMixin, TemplateView): template_name = 'terminal/command_storage_list.html' permission_classes = [IsSuperUser] def get_context_data(self, **kwargs): context = { 'app': _('Terminal'), 'action': _('Command storage list'), 'type_choices': const.COMMAND_STORAGE_TYPE_CHOICES_EXTENDS, 'is_command': True, } kwargs.update(context) return super().get_context_data(**kwargs) class BaseStorageCreateUpdateViewMixin: permission_classes = [IsSuperUser] default_type = None form_class = None form_class_choices = {} def get_initial(self): return {'type': self.get_type()} def get_type(self): return self.default_type def get_form_class(self): tp = self.get_type() form_class = self.form_class_choices.get(tp) if not form_class: raise Http404() return form_class class ReplayStorageCreateUpdateViewMixin(BaseStorageCreateUpdateViewMixin): model = ReplayStorage default_type = const.REPLAY_STORAGE_TYPE_S3 form_class = forms.ReplayStorageS3Form form_class_choices = { const.REPLAY_STORAGE_TYPE_S3: forms.ReplayStorageS3Form, const.REPLAY_STORAGE_TYPE_CEPH: forms.ReplayStorageCephForm, const.REPLAY_STORAGE_TYPE_SWIFT: forms.ReplayStorageSwiftForm, const.REPLAY_STORAGE_TYPE_OSS: forms.ReplayStorageOSSForm, const.REPLAY_STORAGE_TYPE_AZURE: forms.ReplayStorageAzureForm } class ReplayStorageCreateView(ReplayStorageCreateUpdateViewMixin, PermissionsMixin, CreateView): template_name = 'terminal/replay_storage_create_update.html' def get_type(self): tp = self.request.GET.get("type") if tp: return tp.lower() return super().get_type() def get_context_data(self, **kwargs): context = { 'app': _('Terminal'), 'action': _('Create replay storage'), 'api_action': 'create' } kwargs.update(context) return super().get_context_data(**kwargs) class ReplayStorageUpdateView(ReplayStorageCreateUpdateViewMixin, PermissionsMixin, UpdateView): template_name = 'terminal/replay_storage_create_update.html' def get_initial(self): initial_data = super().get_initial() for k, v in self.object.meta.items(): _k = "{}_{}".format(self.object.type, k.lower()) initial_data[_k] = v return initial_data def get_type(self): return self.object.type def get_context_data(self, **kwargs): context = { 'app': _('Terminal'), 'action': _('Update replay storage'), 'api_action': 'update' } kwargs.update(context) return super().get_context_data(**kwargs) class CommandStorageCreateUpdateViewMixin(BaseStorageCreateUpdateViewMixin): model = CommandStorage default_type = const.COMMAND_STORAGE_TYPE_ES form_class = forms.CommandStorageTypeESForm form_class_choices = { const.COMMAND_STORAGE_TYPE_ES: forms.CommandStorageTypeESForm } class CommandStorageCreateView(CommandStorageCreateUpdateViewMixin, PermissionsMixin, CreateView): template_name = 'terminal/command_storage_create_update.html' def get_type(self): tp = self.request.GET.get("type") if tp: return tp.lower() return super().get_type() def get_context_data(self, **kwargs): context = { 'app': _('Terminal'), 'action': _('Create command storage'), 'api_action': 'create' } kwargs.update(context) return super().get_context_data(**kwargs) class CommandStorageUpdateView(CommandStorageCreateUpdateViewMixin, PermissionsMixin, UpdateView): template_name = 'terminal/command_storage_create_update.html' def get_initial(self): initial_data = super().get_initial() for k, v in self.object.meta.items(): _k = "{}_{}".format(self.object.type, k.lower()) if k == 'HOSTS': v = ','.join(v) initial_data[_k] = v return initial_data def get_type(self): return self.object.type def get_context_data(self, **kwargs): context = { 'app': _('Terminal'), 'action': _('Update command storage'), 'api_action': 'update' } kwargs.update(context) return super().get_context_data(**kwargs)