from rest_framework.generics import CreateAPIView from rest_framework.response import Response from accounts import serializers from accounts.tasks import verify_accounts_connectivity_task, push_accounts_to_assets_task from assets.exceptions import NotSupportedTemporarilyError __all__ = [ 'AccountsTaskCreateAPI', ] class AccountsTaskCreateAPI(CreateAPIView): serializer_class = serializers.AccountTaskSerializer def check_permissions(self, request): act = request.data.get('action') if act == 'push': code = 'accounts.push_account' else: code = 'accounts.verify_account' has = request.user.has_perm(code) if not has: self.permission_denied(request) def perform_create(self, serializer): data = serializer.validated_data accounts = data.get('accounts', []) params = data.get('params') account_ids = [str(a.id) for a in accounts] if data['action'] == 'push': task = push_accounts_to_assets_task.delay(account_ids, params) else: account = accounts[0] asset = account.asset if not asset.auto_config['ansible_enabled'] or \ not asset.auto_config['ping_enabled']: raise NotSupportedTemporarilyError() task = verify_accounts_connectivity_task.delay(account_ids) data = getattr(serializer, '_data', {}) data["task"] = task.id setattr(serializer, '_data', data) return task def get_exception_handler(self): def handler(e, context): return Response({"error": str(e)}, status=401) return handler