class Meta: _serializer_class = 'vstutils.api.serializers.VSTSerializer' _list_fields = ('name', 'local_filter_applied', 'filter_applied', 'string_filter_applied') _override_list_fields = { 'id': fields.RedirectIntegerField(read_only=True, operation_name='files'), 'name': fields.DependEnumField(field='id', choices={ 3: 'hello', 1: 'NOO!' }), 'local_filter_applied': fields.IntegerField(default=0, read_only=True), 'filter_applied': fields.IntegerField(default=0, read_only=True), 'string_filter_applied': DrfBooleanField(default=False, read_only=True) } _extra_serializer_classes = { 'serializer_class_test': serializers.EmptySerializer } _filterset_fields = ('id', 'name') _filter_backends = (TestFilterBackend, 'test_proj.models.hosts.TestStringFilterBackend')
class HostSerializer(VSTSerializer): id = fields.RedirectIntegerField(read_only=True) name = fields.DependEnumField(field='id', choices={ 3: 'hello', 1: 'NOO!' }) class Meta: model = Host fields = ( 'id', 'name', )
class InventoryVariableSerializer(VariableSerializer): key = vst_fields.AutoCompletionField(autocomplete=models.Variable.variables_keys) value = vst_fields.DependEnumField( allow_blank=True, field='key', types={ 'ansible_ssh_pass': '******', 'ansible_ssh_private_key_file': 'secretfile', 'ansible_become': 'boolean', 'ansible_port': 'integer', 'ansible_become_pass': '******', } )
class ProjectVariableSerializer(VariableSerializer): key = vst_fields.AutoCompletionField(required=True, autocomplete=models.Project.VARS_KEY) value = vst_fields.DependEnumField( allow_blank=True, field='key', choices={ 'repo_type': list(models.Project.repo_handlers.keys()), 'repo_sync_on_run': [True, False] }, types={ 'repo_password': '******', 'repo_key': 'secretfile' })
class ProjectCreateMasterSerializer(vst_serializers.VSTSerializer): types = list_to_choices(models.Project.repo_handlers.keys()) auth_types = list_to_choices(['NONE', 'KEY', 'PASSWORD']) status = vst_fields.VSTCharField(read_only=True) type = serializers.ChoiceField(choices=types, default='MANUAL', label='Repo type') repository = vst_fields.VSTCharField(default='MANUAL', label='Repo url') repo_auth = serializers.ChoiceField(choices=auth_types, default='NONE', label='Repo auth type', write_only=True) auth_data = vst_fields.DependEnumField(allow_blank=True, write_only=True, default='', field='repo_auth', label='Repo auth data', types={ 'KEY': 'secretfile', 'PASSWORD': '******', 'NONE': 'disabled' }) class Meta: model = models.Project fields = ( 'id', 'name', 'status', 'type', 'repository', 'repo_auth', 'auth_data', ) extra_kwargs = {'name': {'required': True}} def create(self, validated_data): repo_type = validated_data.pop('type') repo_auth_type = validated_data.pop('repo_auth') repo_auth_data = validated_data.pop('auth_data') instance = super(ProjectCreateMasterSerializer, self).create(validated_data) instance.variables.create(key='repo_type', value=repo_type) if repo_auth_type != 'NONE': # nocv key = 'repo_{}'.format(repo_auth_type.lower()) instance.variables.create(key=key, value=repo_auth_data) return instance
class ProjectVariableSerializer(VariableSerializer): project_keys = ( ('repo_type', 'Types of repo. Default="MANUAL".'), ('repo_sync_on_run', "Sync project by every execution."), ('repo_branch', "[Only for GIT repos] Checkout branch on sync."), ('repo_password', "[Only for GIT repos] Password to fetch access."), ('repo_key', "[Only for GIT repos] Key to fetch access."), ) key = serializers.ChoiceField(choices=project_keys) value = vst_fields.DependEnumField(allow_blank=True, field='key', choices={ 'repo_type': list(models.Project.repo_handlers.keys()), 'repo_sync_on_run': [True, False] }, types={ 'repo_password': '******', 'repo_key': 'secretfile' })
class Meta: _serializer_class = 'vstutils.api.serializers.VSTSerializer' _list_fields = ( 'id', 'name', 'local_filter_applied', 'filter_applied', ) _override_list_fields = { 'id': fields.RedirectIntegerField(read_only=True), 'name': fields.DependEnumField(field='id', choices={ 3: 'hello', 1: 'NOO!' }), 'local_filter_applied': fields.IntegerField(default=0, read_only=True), 'filter_applied': fields.IntegerField(default=0, read_only=True), } _filterset_fields = ('id', 'name') _filter_backends = (TestFilterBackend, )
class ProjectCreateMasterSerializer(vst_serializers.VSTSerializer, _WithPermissionsSerializer): types = models.list_to_choices(models.Project.repo_handlers.keys()) auth_types = ['NONE', 'KEY', 'PASSWORD'] branch_auth_types = { t: "hidden" for t in models.Project.repo_handlers.keys() } branch_auth_types['GIT'] = 'string' branch_types = dict(**branch_auth_types) branch_types['TAR'] = 'string' status = vst_fields.VSTCharField(read_only=True) type = serializers.ChoiceField(choices=types, default='MANUAL', label='Repo type') repository = vst_fields.VSTCharField(default='MANUAL', label='Repo url') repo_auth = vst_fields.DependEnumField(default='NONE', field='type', choices={"GIT": auth_types}, types=branch_auth_types, label='Repo auth type', write_only=True) auth_data = vst_fields.DependEnumField(allow_blank=True, write_only=True, default='', field='repo_auth', label='Repo auth data', types={ 'KEY': 'secretfile', 'PASSWORD': '******', 'NONE': 'hidden' }) branch = vst_fields.DependEnumField( allow_blank=True, required=False, allow_null=True, label='Branch for GIT(branch/tag/SHA) or TAR(subdir)', field='type', types=branch_types) class Meta: model = models.Project fields = ( 'id', 'name', 'status', 'type', 'repository', 'repo_auth', 'auth_data', 'branch', ) extra_kwargs = {'name': {'required': True}} def create(self, validated_data: Dict) -> models.Project: repo_type = validated_data.pop('type') repo_auth_type = validated_data.pop('repo_auth') repo_auth_data = validated_data.pop('auth_data') repo_branch = validated_data.pop('branch', None) instance = super(ProjectCreateMasterSerializer, self).create(validated_data) instance.variables.create(key='repo_type', value=repo_type) if repo_auth_type != 'NONE': # nocv key = 'repo_{}'.format(repo_auth_type.lower()) instance.variables.create(key=key, value=repo_auth_data) if repo_branch: # nocv instance.variables.create(key='repo_branch', value=repo_branch) return instance
class PeriodictaskSerializer(_WithVariablesSerializer): kind = serializers.ChoiceField(choices=[ (k, k) for k in models.PeriodicTask.kinds ], required=False, default=models.PeriodicTask.kinds[0], label='Task type') type = serializers.ChoiceField(choices=[ (k, k) for k in models.PeriodicTask.types ], required=False, default=models.PeriodicTask.types[0], label='Interval type') template_opt = vst_fields.DependEnumField(allow_blank=True, required=False, field='kind', types={ 'PLAYBOOK': 'hidden', 'MODULE': 'hidden', 'TEMPLATE': 'autocomplete', }) schedule = vst_fields.DependEnumField(allow_blank=True, field='type', types={ 'CRONTAB': 'crontab', 'INTERVAL': 'integer', }) mode = vst_fields.DependEnumField(allow_blank=True, required=False, field='kind', types={ 'PLAYBOOK': 'fk_autocomplete', 'MODULE': 'fk_autocomplete', 'TEMPLATE': 'hidden', }) inventory = InventoryDependEnumField(allow_blank=True, required=False, field='kind', types={ 'PLAYBOOK': 'fk_autocomplete', 'MODULE': 'fk_autocomplete', 'TEMPLATE': 'hidden', }) class Meta: model = models.PeriodicTask fields = ( 'id', 'name', 'kind', 'mode', 'inventory', 'save_result', 'template', 'template_opt', 'enabled', 'type', 'schedule', ) @transaction.atomic def _do_with_vars(self, *args, **kwargs): kw = kwargs['validated_data'] if kw.get('kind', None) == 'TEMPLATE': kw['inventory'] = '' kw['mode'] = '' kwargs['validated_data'] = kw return super(PeriodictaskSerializer, self)._do_with_vars(*args, **kwargs)