125 lines
5.4 KiB
Python
125 lines
5.4 KiB
Python
from django.db.models import Count, Q
|
|
from django.http import JsonResponse
|
|
from rest_framework.decorators import action
|
|
from rest_framework.mixins import ListModelMixin, RetrieveModelMixin, UpdateModelMixin, CreateModelMixin
|
|
from rest_framework.viewsets import GenericViewSet
|
|
|
|
from assets.constants import RESOLVED_STATUS
|
|
from assets.filters import AssetFilter
|
|
from assets.models.assets import Asset, OperatingSystem, AssetListGroup, AssetManufacturer
|
|
from assets.serializers.assets import AssetGroupSerializer, AssetInfoSerializer, OsSerializer, AssetDetailSerializer, \
|
|
AssetCsvExportSerializer, AssetListSerializer, AssetCreateUpdateSerializer, AssetActiveProblemsSerializer, \
|
|
AssetAuthorizeSerializer, AssetManufacturerSerializer
|
|
from core.mixins import ApiPermissionCheckMixin, ExportToCsvMixin, DestroyModelResponseStatus200Mixin
|
|
from perms.models import Perm
|
|
|
|
|
|
class AssetViewSet(ApiPermissionCheckMixin,
|
|
ListModelMixin,
|
|
RetrieveModelMixin,
|
|
UpdateModelMixin,
|
|
DestroyModelResponseStatus200Mixin,
|
|
ExportToCsvMixin,
|
|
GenericViewSet):
|
|
column_titles = AssetCsvExportSerializer.Meta.fields
|
|
console_permissions = {'csv_export': [Perm.can_export_assets], 'list': [Perm.can_view_assets_list],
|
|
'destroy': [Perm.can_delete_asset], 'retrieve': [Perm.can_view_asset],
|
|
'authorize_assets': [Perm.can_view_assets_list], 'update': [Perm.can_edit_asset],
|
|
'partial_update': [Perm.can_edit_asset],
|
|
}
|
|
filters = []
|
|
filterset_class = AssetFilter
|
|
|
|
class Meta:
|
|
model = Asset
|
|
|
|
def get_queryset(self):
|
|
return Asset.objects.annotate(count_incidents=Count('incidents', filter=~Q(status=RESOLVED_STATUS)))
|
|
|
|
def get_serializer_class(self):
|
|
if self.action == 'list':
|
|
return AssetListSerializer
|
|
if self.action in ['update', 'partial_update']:
|
|
return AssetCreateUpdateSerializer
|
|
return AssetDetailSerializer
|
|
|
|
@action(detail=False, methods=["POST"], name="authorize_assets")
|
|
def authorize_assets(self, request):
|
|
""" API for authorizing assets by changing its status from NEW to ALLOWED """
|
|
serializer = AssetAuthorizeSerializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
assets_to_change = serializer.validated_data['selected_assets']
|
|
Asset.objects.filter(pk__in=assets_to_change).update(status=Asset.AllowStatus.ALLOWED)
|
|
return JsonResponse({'status': 'ok'})
|
|
|
|
|
|
class AssetGroupViewSet(ApiPermissionCheckMixin,
|
|
ListModelMixin,
|
|
RetrieveModelMixin,
|
|
CreateModelMixin,
|
|
UpdateModelMixin,
|
|
DestroyModelResponseStatus200Mixin,
|
|
GenericViewSet):
|
|
serializer_class = AssetGroupSerializer
|
|
queryset = AssetListGroup.objects.order_by('name').all()
|
|
console_permissions = {'default': [Perm.can_view_assets_list]}
|
|
|
|
class Meta:
|
|
model = AssetListGroup
|
|
|
|
|
|
class AssetInfoViewSet(ApiPermissionCheckMixin,
|
|
RetrieveModelMixin,
|
|
ListModelMixin,
|
|
GenericViewSet):
|
|
serializer_class = AssetInfoSerializer
|
|
console_permissions = {'retrieve': [Perm.can_view_asset], 'list': [Perm.can_view_assets_list]}
|
|
queryset = Asset.objects.all()
|
|
|
|
class Meta:
|
|
model = Asset
|
|
|
|
|
|
class OsViewSet(ApiPermissionCheckMixin,
|
|
ListModelMixin,
|
|
RetrieveModelMixin,
|
|
CreateModelMixin,
|
|
UpdateModelMixin,
|
|
DestroyModelResponseStatus200Mixin,
|
|
GenericViewSet):
|
|
serializer_class = OsSerializer
|
|
queryset = OperatingSystem.objects.order_by('name')
|
|
console_permissions = {'list': [Perm.can_edit_assets_catalogs], 'destroy': [Perm.can_edit_assets_catalogs],
|
|
'retrieve': [Perm.can_edit_assets_catalogs], 'update': [Perm.can_edit_assets_catalogs],
|
|
'partial_update': [Perm.can_edit_assets_catalogs], 'create': [Perm.can_edit_assets_catalogs]
|
|
}
|
|
|
|
class Meta:
|
|
model = OsSerializer
|
|
|
|
|
|
class AssetProblemsViewSet(ApiPermissionCheckMixin, RetrieveModelMixin, GenericViewSet):
|
|
serializer_class = AssetActiveProblemsSerializer
|
|
console_permissions = {'retrieve': [Perm.can_view_incidents_list]}
|
|
queryset = Asset.objects.all()
|
|
|
|
class Meta:
|
|
model = Asset
|
|
|
|
|
|
class AssetManufacturersViewSet(ApiPermissionCheckMixin,
|
|
ListModelMixin,
|
|
RetrieveModelMixin,
|
|
CreateModelMixin,
|
|
UpdateModelMixin,
|
|
DestroyModelResponseStatus200Mixin,
|
|
GenericViewSet):
|
|
serializer_class = AssetManufacturerSerializer
|
|
queryset = AssetManufacturer.objects.all()
|
|
console_permissions = {'list': [Perm.can_edit_assets_catalogs], 'destroy': [Perm.can_edit_assets_catalogs],
|
|
'retrieve': [Perm.can_edit_assets_catalogs], 'update': [Perm.can_edit_assets_catalogs],
|
|
'partial_update': [Perm.can_edit_assets_catalogs], 'create': [Perm.can_edit_assets_catalogs]
|
|
}
|
|
|
|
class Meta:
|
|
model = AssetManufacturer
|