diff --git a/apps/accounts/api/automations/gather_account.py b/apps/accounts/api/automations/gather_account.py index b7d10edf6..49f38d028 100644 --- a/apps/accounts/api/automations/gather_account.py +++ b/apps/accounts/api/automations/gather_account.py @@ -17,22 +17,22 @@ from orgs.mixins.api import OrgBulkModelViewSet from .base import AutomationExecutionViewSet __all__ = [ - "GatherAccountsAutomationViewSet", - "GatherAccountsExecutionViewSet", + "DiscoverAccountsAutomationViewSet", + "DiscoverAccountsExecutionViewSet", "GatheredAccountViewSet", ] from ...risk_handlers import RiskHandler -class GatherAccountsAutomationViewSet(OrgBulkModelViewSet): +class DiscoverAccountsAutomationViewSet(OrgBulkModelViewSet): model = GatherAccountsAutomation filterset_fields = ("name",) search_fields = filterset_fields - serializer_class = serializers.GatherAccountAutomationSerializer + serializer_class = serializers.DiscoverAccountAutomationSerializer -class GatherAccountsExecutionViewSet(AutomationExecutionViewSet): +class DiscoverAccountsExecutionViewSet(AutomationExecutionViewSet): rbac_perms = ( ("list", "accounts.view_gatheraccountsexecution"), ("retrieve", "accounts.view_gatheraccountsexecution"), @@ -76,9 +76,9 @@ class GatheredAccountViewSet(OrgBulkModelViewSet): filterset_class = GatheredAccountFilterSet ordering = ("status",) serializer_classes = { - "default": serializers.GatheredAccountSerializer, - "status": serializers.GatheredAccountActionSerializer, - "details": serializers.GatheredAccountDetailsSerializer + "default": serializers.DiscoverAccountSerializer, + "status": serializers.DiscoverAccountActionSerializer, + "details": serializers.DiscoverAccountDetailsSerializer } rbac_perms = { "status": "assets.change_gatheredaccount", diff --git a/apps/accounts/serializers/automations/base.py b/apps/accounts/serializers/automations/base.py index 828aa33c8..ab79e23a3 100644 --- a/apps/accounts/serializers/automations/base.py +++ b/apps/accounts/serializers/automations/base.py @@ -2,40 +2,19 @@ from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from assets.const import AutomationTypes -from assets.models import Asset, Node, BaseAutomation +from assets.models import BaseAutomation from assets.serializers.automations import AutomationExecutionSerializer as AssetAutomationExecutionSerializer -from common.serializers.fields import ObjectRelatedField +from assets.serializers.automations import BaseAutomationSerializer as AssetBaseAutomationSerializer from common.utils import get_logger -from ops.mixin import PeriodTaskSerializerMixin -from orgs.mixins.serializers import BulkOrgResourceModelSerializer logger = get_logger(__file__) __all__ = [ 'BaseAutomationSerializer', 'AutomationExecutionSerializer', - 'UpdateAssetSerializer', 'UpdateNodeSerializer', 'AutomationAssetsSerializer', ] -class BaseAutomationSerializer(PeriodTaskSerializerMixin, BulkOrgResourceModelSerializer): - assets = ObjectRelatedField(many=True, required=False, queryset=Asset.objects, label=_('Assets')) - nodes = ObjectRelatedField(many=True, required=False, queryset=Node.objects, label=_('Nodes')) - is_periodic = serializers.BooleanField(default=False, required=False, label=_("Periodic perform")) - - class Meta: - read_only_fields = [ - 'date_created', 'date_updated', 'created_by', - 'periodic_display', 'executed_amount', 'type' - ] - fields = read_only_fields + [ - 'id', 'name', 'is_periodic', 'interval', 'crontab', 'comment', - 'accounts', 'nodes', 'assets', 'is_active', - ] - extra_kwargs = { - 'name': {'required': True}, - 'executed_amount': {'label': _('Executions')}, - } - +class BaseAutomationSerializer(AssetBaseAutomationSerializer): def validate_name(self, name): if self.instance and self.instance.name == name: return name @@ -66,22 +45,3 @@ class AutomationExecutionSerializer(AssetAutomationExecutionSerializer): 'type_display': type_display, } return snapshot - - -class UpdateAssetSerializer(serializers.ModelSerializer): - class Meta: - model = BaseAutomation - fields = ['id', 'assets'] - - -class UpdateNodeSerializer(serializers.ModelSerializer): - class Meta: - model = BaseAutomation - fields = ['id', 'nodes'] - - -class AutomationAssetsSerializer(serializers.ModelSerializer): - class Meta: - model = Asset - only_fields = ['id', 'name', 'address'] - fields = tuple(only_fields) diff --git a/apps/accounts/serializers/automations/gather_account.py b/apps/accounts/serializers/automations/gather_account.py index 795fa95b2..8d3f48216 100644 --- a/apps/accounts/serializers/automations/gather_account.py +++ b/apps/accounts/serializers/automations/gather_account.py @@ -11,14 +11,14 @@ from orgs.mixins.serializers import BulkOrgResourceModelSerializer from .base import BaseAutomationSerializer __all__ = [ - 'GatheredAccountSerializer', - 'GatheredAccountActionSerializer', - 'GatherAccountAutomationSerializer', - 'GatheredAccountDetailsSerializer' + 'DiscoverAccountSerializer', + 'DiscoverAccountActionSerializer', + 'DiscoverAccountAutomationSerializer', + 'DiscoverAccountDetailsSerializer' ] -class GatherAccountAutomationSerializer(BaseAutomationSerializer): +class DiscoverAccountAutomationSerializer(BaseAutomationSerializer): class Meta: model = GatherAccountsAutomation read_only_fields = BaseAutomationSerializer.Meta.read_only_fields @@ -43,7 +43,7 @@ class AccountAssetSerializer(_AccountAssetSerializer): fields = [f for f in _AccountAssetSerializer.Meta.fields if f != 'auto_config'] -class GatheredAccountSerializer(BulkOrgResourceModelSerializer): +class DiscoverAccountSerializer(BulkOrgResourceModelSerializer): asset = AccountAssetSerializer(label=_('Asset')) class Meta(BaseAccountSerializer.Meta): @@ -63,12 +63,12 @@ class GatheredAccountSerializer(BulkOrgResourceModelSerializer): return queryset -class GatheredAccountActionSerializer(GatheredAccountSerializer): - class Meta(GatheredAccountSerializer.Meta): - read_only_fields = list(set(GatheredAccountSerializer.Meta.read_only_fields) - {'status'}) +class DiscoverAccountActionSerializer(DiscoverAccountSerializer): + class Meta(DiscoverAccountSerializer.Meta): + read_only_fields = list(set(DiscoverAccountSerializer.Meta.read_only_fields) - {'status'}) -class GatheredAccountDetailsSerializer(serializers.Serializer): +class DiscoverAccountDetailsSerializer(serializers.Serializer): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) request = self.context.get('request') @@ -78,6 +78,7 @@ class GatheredAccountDetailsSerializer(serializers.Serializer): params = request.query_params if params.get('format') == 'openapi': return + pk = request.parser_context['kwargs'].get('pk') obj = get_object_or_404(GatheredAccount, pk=pk) details = obj.detail diff --git a/apps/accounts/urls.py b/apps/accounts/urls.py index 45a0ad7a8..8f567a0d3 100644 --- a/apps/accounts/urls.py +++ b/apps/accounts/urls.py @@ -19,8 +19,8 @@ router.register(r'account-backup-plan-executions', api.BackupAccountExecutionVie router.register(r'change-secret-automations', api.ChangeSecretAutomationViewSet, 'change-secret-automation') router.register(r'change-secret-executions', api.ChangSecretExecutionViewSet, 'change-secret-execution') router.register(r'change-secret-records', api.ChangeSecretRecordViewSet, 'change-secret-record') -router.register(r'gather-account-automations', api.GatherAccountsAutomationViewSet, 'gather-account-automation') -router.register(r'gather-account-executions', api.GatherAccountsExecutionViewSet, 'gather-account-execution') +router.register(r'gather-account-automations', api.DiscoverAccountsAutomationViewSet, 'gather-account-automation') +router.register(r'gather-account-executions', api.DiscoverAccountsExecutionViewSet, 'gather-account-execution') router.register(r'push-account-automations', api.PushAccountAutomationViewSet, 'push-account-automation') router.register(r'push-account-executions', api.PushAccountExecutionViewSet, 'push-account-execution') router.register(r'push-account-records', api.PushAccountRecordViewSet, 'push-account-record') @@ -30,7 +30,6 @@ router.register(r'account-check-engines', api.CheckAccountEngineViewSet, 'accoun router.register(r'account-risks', api.AccountRiskViewSet, 'account-risks') router.register(r'integration-applications', api.IntegrationApplicationViewSet, 'integration-apps') - urlpatterns = [ path('accounts/bulk/', api.AssetAccountBulkCreateApi.as_view(), name='account-bulk-create'), path('accounts/tasks/', api.AccountsTaskCreateAPI.as_view(), name='account-task-create'), diff --git a/apps/assets/models/automations/base.py b/apps/assets/models/automations/base.py index 3c235ea9d..2df9aff61 100644 --- a/apps/assets/models/automations/base.py +++ b/apps/assets/models/automations/base.py @@ -159,6 +159,10 @@ class AutomationExecution(OrgModelMixin): ) verbose_name = _("Automation task execution") + @property + def short_id(self): + return str(self.id)[:8] + @property def is_finished(self): return bool(self.date_finished) diff --git a/apps/assets/serializers/automations/base.py b/apps/assets/serializers/automations/base.py index b50cd5254..184c6bd37 100644 --- a/apps/assets/serializers/automations/base.py +++ b/apps/assets/serializers/automations/base.py @@ -22,15 +22,20 @@ class BaseAutomationSerializer(PeriodTaskSerializerMixin, BulkOrgResourceModelSe class Meta: read_only_fields = [ - 'date_created', 'date_updated', 'created_by', 'periodic_display' + 'date_created', 'date_updated', 'created_by', + 'periodic_display', 'executed_amount', 'type' ] - fields = [ - 'id', 'name', 'is_periodic', 'interval', 'crontab', 'comment', - 'type', 'accounts', 'nodes', 'assets', 'is_active' - ] + read_only_fields + mini_fields = [ + 'id', 'name', 'type', 'is_periodic', 'interval', + 'crontab', 'comment', 'is_active' + ] + fields = mini_fields + [ + 'accounts', 'nodes', 'assets', + ] + read_only_fields extra_kwargs = { 'name': {'required': True}, 'type': {'read_only': True}, + 'executed_amount': {'label': _('Executions')}, } @@ -38,6 +43,7 @@ class AutomationExecutionSerializer(serializers.ModelSerializer): snapshot = serializers.SerializerMethodField(label=_('Automation snapshot')) trigger = LabeledChoiceField(choices=Trigger.choices, read_only=True, label=_("Trigger mode")) status = LabeledChoiceField(choices=Status.choices, read_only=True, label=_('Status')) + short_id = serializers.CharField(read_only=True, label=_('Short ID')) class Meta: model = AutomationExecution @@ -45,7 +51,7 @@ class AutomationExecutionSerializer(serializers.ModelSerializer): 'trigger', 'date_start', 'date_finished', 'snapshot', 'status', 'duration' ] - fields = ['id', 'automation'] + read_only_fields + fields = ['id', 'short_id', 'automation'] + read_only_fields @staticmethod def get_snapshot(obj):