mirror of https://github.com/jumpserver/jumpserver
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.8 KiB
65 lines
1.8 KiB
12 months ago
|
from typing import Callable
|
||
|
|
||
|
from django.conf import settings
|
||
|
from django.shortcuts import get_object_or_404
|
||
|
from rest_framework.request import Request
|
||
|
|
||
|
from common.api import JMSModelViewSet
|
||
|
from common.permissions import IsServiceAccount
|
||
|
from common.utils import is_uuid
|
||
|
from rbac.permissions import RBACPermission
|
||
|
from terminal.models import AppProvider
|
||
|
from terminal.serializers import (
|
||
|
VirtualAppPublicationSerializer
|
||
|
)
|
||
|
|
||
|
|
||
|
class ProviderMixin:
|
||
|
request: Request
|
||
|
permission_denied: Callable
|
||
|
kwargs: dict
|
||
|
rbac_perms = (
|
||
|
('list', 'terminal.view_appprovider'),
|
||
|
('retrieve', 'terminal.view_appprovider'),
|
||
|
)
|
||
|
|
||
|
def get_permissions(self):
|
||
|
if self.kwargs.get('host') and settings.DEBUG:
|
||
|
return [RBACPermission()]
|
||
|
else:
|
||
|
return [IsServiceAccount()]
|
||
|
|
||
|
def self_provider(self):
|
||
|
try:
|
||
|
return self.request.user.terminal.app_provider
|
||
|
except AttributeError:
|
||
|
raise self.permission_denied(self.request, 'User has no app provider')
|
||
|
|
||
|
def pk_provider(self):
|
||
|
return get_object_or_404(AppProvider, id=self.kwargs.get('provider'))
|
||
|
|
||
|
@property
|
||
|
def provider(self):
|
||
|
if self.kwargs.get('provider'):
|
||
|
host = self.pk_provider()
|
||
|
else:
|
||
|
host = self.self_provider()
|
||
|
return host
|
||
|
|
||
|
|
||
|
class AppProviderAppViewSet(ProviderMixin, JMSModelViewSet):
|
||
|
provider: AppProvider
|
||
|
serializer_class = VirtualAppPublicationSerializer
|
||
|
filterset_fields = ['provider__name', 'app__name', 'status']
|
||
|
|
||
|
def get_object(self):
|
||
|
pk = self.kwargs.get('pk')
|
||
|
if not is_uuid(pk):
|
||
|
return self.provider.publications.get(app__name=pk)
|
||
|
else:
|
||
|
return self.provider.publications.get(id=pk)
|
||
|
|
||
|
def get_queryset(self):
|
||
|
queryset = self.provider.publications.all()
|
||
|
return queryset
|